~bohwaz/blog/

Avec de vrais morceaux de 2.0 !

Dropbear : réparer les locales

Dropbear est un super petit serveur et client SSH, très léger, que j'utilise sur du matériel embarqué ou des vieilles machines, qui n'ont que peu de RAM.

Y'a juste un petit bug : dropbear ne propage pas la locale utilisée par le client SSH, ce qui fait qu'on se retrouve avec des trucs comme ça :

$ locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

Du coup bon forcément l'unicode ça marche moins bien.

Une solution palliative est d'utiliser la locale par défaut au démarrage du shell. Pour cela, créer en root le fichier texte /etc/profile.d/locale.sh contenant :

#!/bin/sh

. /etc/default/locale

export LANG

Maintenant normalement ça devrait vous donner la locale système par défaut (dans mon cas fr_FR.UTF-8) lors de vos sessions SSH.

Si ça ne marche pas, c'est peut-être que /etc/profile ne charge pas /etc/profile.d/*. En ce cas, rajouter ceci à /etc/profile :

for script in /etc/profile.d/*.sh
do
  source $script
done
unset script

Utilisation des cartes sons nommées dans ALSA

D'habitude quand on veut choisir la carte son de sortie d'un logiciel spécifique, l'exemple est de ce genre (pris de la config par défaut de MPD) :

device "hw:0,0"

Problème : vas-y pour savoir quelle carte est reconnue comme étant numéro 0, 1, 2 ou plus. Sans compter qu'en fonction de la pression atmosphérique et de l'orientation des étoiles en accord avec Vénus, ALSA donnera des numéros différents aux cartes sons à chaque redémarrage. Un vrai casse-tête !

En fait la solution est très simple, il suffit d'utiliser les cartes nommées plutôt que numérotées. Pour cela, un petit aperçu des cartes présentes est nécessaire :

$ cat /proc/asound/cards
 0 [Intel          ]: HDA-Intel - HDA Intel
                      HDA Intel at 0xfebdc000 irq 16
 1 [Live           ]: EMU10K1 - SB Live! Value [CT4830]
                      SB Live! Value [CT4830] (rev.7, serial:0x80261102) at 0xcce0, irq 18
 2 [v2             ]: USB-Audio - USB Oxygen 8 v2
                      M-Audio USB Oxygen 8 v2 at usb-0000:00:1a.0-1, full speed
 3 [default        ]: USB-Audio - USB Audio CODEC 
                      Burr-Brown from TI               USB Audio CODEC  at usb-0000:00:1a.1-2, full

Vous voyez ici le numéro de la carte, suivi du nom entre crochets, puis de la description. Le nom entre crochets peut être utilisé dans tous les logiciels parlant avec ALSA.

Par exemple moi je veux que mon MPD joue de la musique sur la carte son USB externe, sur laquelle est branché l'ampli hifi. Je veux donc la carte "default" (pas "v2" qui est un clavier MIDI en fait) et ça donne :

device "hw:default"

Par contre pour MPlayer je veux la carte son Intel pour que le son sorte sur les enceintes de l'écran :

$ mplayer -ao alsa:hw=Intel http://bohwaz.net/videos/Night_Of_The_Living_Dead/Films-Night_Of_The_Living_Dead.flv

Et oui c'est aussi simple que ça, mais hélas très peu connu. Maintenant, vous savez que c'est possible ;-)

On reprend de zéro, et on recommence.

  • 2000 : Webzine personnel
  • 2001 : Wiki personnel
  • 2003 : Journal en ligne
  • 2004 : Blog sur FBlog.fr
  • 2005 : Blog avec DotClear
  • 2012 : On mixe tout !

Voilà ça faisait 7 ans que j'utilisais DotClear, qui m'a rendu bien des services mais ne me convenait pas vraiment. Cela fait presque un an maintenant que j'ai commencé le développement de son remplaçant, qui n'est pas un simple blog mais plutôt une espèce de créature de Frankenstein, entre blog, CMS et wiki.

En effet ce nouveau système, à base de code perso, est basé sur un postulat simple : pas de catégories, de rubriques, que des pages et des commentaires. Les pages peuvent avoir une hiérarchie, mais aussi des méta-données qui les relient (pour l'instant peu exploité car les billets proviennent de l'import de dotclear), un peu comme des tags mais en beaucoup plus évolué. J'espère qu'à terme cette organisation plus flexible me conviendra mieux que le carcan de Dotclear. On verra.

Si pour le moment ce nouveau médium ne comprends que les billets du blog, il intègrera aussi bientôt les pages du wiki ainsi que divers autres trucs éparses, comme des événements ou du micro-blogging.

Techniquement derrière tout ça repose du PHP5 (forcément) accompagné du magnifique SQLite3. Au niveau code ça utilise un poil de JS pour les commentaires et le reste c'est du simple HTML5 (malgré le fait que je déteste cette spéc il va bien falloir y aller un jour), et du CSS3.

Au niveau ergonomie je pense que le nouveau design est largement au dessus du précédent en termes de lisibilité, et l'utilisation des commentaires a été aussi grandement améliorée. J'ai aussi rajouté un captcha textuel à base de figlet, j'ai repiqué l'idée à Fossil. C'est pas forcément super accessible, mais avec le javascript activé le captcha se remplit tout seul, on ne le voit même pas.

Enfin, d'un point de vue réseau, les médias intégrés sont désormais automatiquement recopiés ici pour éviter leur disparition du réseau.

Vous remarquerez que le blog change d'adresse au passage, pour rejoindre bohwaz.net. Normalement toutes les anciennes adresses sont redirigées. Mais si vous avez l'ancienne adresse en favori (ainsi je suis donc le favori de quelqu'un !) ou dans votre agrégateur, mettez à jour pour la nouvelle adresse : http://bohwaz.net/p/

Sebsauvage bientôt bloqué ?

Quand j'arrête pas de dire qu'on vit dans un pays totalitaire...

Sebsauvage fait partie des sites que Claude Guéant demande à bloquer. Son crime ? Avoir mis en place un miroir du site Copwatch Nord/Paris-IDF, comme des centaines d'autres internautes. Le miroir n'existe même plus, mais c'est pas grave.

L'assignation demande également l'autorisation de procéder au blocage préventif de tous les futurs miroirs.

Je rappelle juste au cas où que : le site Copwatch n'a jamais été condamné ni même poursuivi devant la justice, donc sauf preuve du contraire son contenu est toujours légal, tout comme ses miroirs. Ni l'hébergeur, ni les éditeurs du site n'ont été inquiétés, alors pourquoi ?

Je dois dire que voir un camarade comme sebsauvage risquer de se faire censurer pour avoir simplement défendu la liberté d'expression, ça fait mal au cœur.

Vous pourrez évidemment retrouver sebsauvage via l'autoblog de KD2.org : http://autoblog.kd2.org/sebsauvage.net/

PHP, affreux ?

Je pense qu'il est important de rester critique par rapport aux langages que nous utilisons, mais dénigrer sans raison me semble une perte de temps complète. Je reviens ainsi sur l'article de sebsauvage sur PHP qui critique le langage en ces termes :

un langage assez amobifreux (de la contraction de "abominable" et "affreux")

Et de s'étonner ensuite du choix effectué par des projets comme Facebook, Wikipedia ou Wordpress d'utiliser ce langage, pourtant "abominable", "affreux" et "moche".

Je suis d'accord pour accepter le fait que PHP a une histoire plutôt anarchique, avec des incohérences et des comportements bizarres. Mais dire que c'est un langage "abominable", qui serait horrible en comparaison par exemple de Python, c'est un peu se tromper je pense.

De nos jours PHP, depuis au moins la version 5.2 et plus encore depuis la version 5.3, est un vrai langage moderne et agréable à utiliser au quotidien, il permet un peu tout ce dont on attendrait d'un vrai langage objet, et souvent de manière simple et efficace, avec toujours l'avantage de pouvoir déployer de manière très simple un peu partout et surtout de bénéficier d'une excellente documentation (et notamment les commentaires associés qui sont souvent très utiles).

Après, je me demande si la critique est réellement fondée. Autant j'apprécie beaucoup sebsauvage, que je lis depuis des années, et autant j'apprécie ses idées, autant son code PHP me semble dater d'un autre âge : souvent procédural, rarement objet, mélangeant allègrement définition de fonctions et code fonctionnel, etc.

Par exemple le code de Shaarli commence par la configuration du logiciel :

$GLOBALS['config']['DATADIR'] = 'data'; // Data subdirectory

Suivi de :

ini_set('max_input_time','60');  // High execution time in case of problematic imports/exports.

et autres gestion des directives INI, puis des define, puis un appel à des fonctions, puis des inclusions, suivi d'envoi de headers HTTP (alors qu'on n'a même pas encore défini à ce stade dans quel contexte nous sommes), puis des define, du code, des require, et enfin des définitions de fonctions, puis des define et des définitions de directives INI, encore des définitions de fonctions, suivies d'includes, de code procédural, puis ensuite de classes, etc etc. Je vous laisse regarder le code de Shaarli si ça vous intéresse.

Rien que dans tout ça on peut voir que le code est anarchique, pas structuré, bref impossible à maintenir à long terme car impossible de savoir où se trouve telle ou telle partie. Le problème n'est pas qu'au niveau de l'organisation du code, mais dans tout le reste aussi, par exemple parfois les erreurs sont gérées avec des exceptions, parfois avec des die().

Le code en lui-même est parfois alambiqué, par exemple :

$last=strtolower($val[strlen($val)-1]);

Il faut relire deux fois la ligne pour comprendre ce que ce code est censé faire, alors qu'il aurait été plus simple de faire :

$last = strtolower(substr($val, -1));

Évidemment on est très loin de la lisibilité du Javascript (un autre langage "horrible" mais pourtant tellement génial) :

var last = val.toLowerCase().substr(-1);

Mais c'est dû à la syntaxe de PHP surtout.

On peut également noter que le code semble avoir été réalisé en PHP4, et n'utilise aucun avantage d'un PHP moderne, par exemple :

function linkdate2timestamp($linkdate)
{
    $Y=$M=$D=$h=$m=$s=0;
    $r = sscanf($linkdate,'%4d%2d%2d_%2d%2d%2d',$Y,$M,$D,$h,$m,$s);
    return mktime($h,$m,$s,$M,$D,$Y);
}
<snip ... />
return date('r',linkdate2timestamp($linkdate));

Pourrait très bien gagner en clarté et en efficacité comme cela :

$date = DateTime::createFromFormat('Ymd_His', $link_date);
return $date->format(DATE_RFC822);

Je ne vais pas procéder comme cela pour tout le code, mais il est assez simple de se rendre compte que PHP n'est pas si terrible que ça, si on a la rigueur de vouloir l'utiliser de manière correcte. Mais il semble que pour de nombreuses personnes PHP n'a pas évolué depuis PHP 3 ou PHP 4, alors que PHP 5 est disponible depuis 8 ans, et PHP 5.2 depuis 6 ans.

Au final, la question n'est pas vraiment celle du langage qui est plus une affaire de préférence personnelle mais, comme pointé dans l'article de Jeff Atwood cité par sebsauvage, de la compétence du développeur rapport au langage utilisé.

Critiquer pour critiquer n'apporte rien, si on utilise un langage le plus utile est de participer à son évolution, par les rapports de bugs, par les corrections de documentation, et les changements apportés au langage lui-même. Un excellent exemple est le travail de suivi et explication du développement de PHP sur le Mageekblog de Frédéric Hardy ou encore les billets du blog de Pascal Martin.

Un téléphone intelligent ?

La durée de vie moyenne d'un téléphone en france est de 18 mois. Soit un an et six mois. C'est pas lourd quand même, surtout quand on sait que chez les plus jeunes c'est seulement 10 mois en moyenne. Personnellement j'ai commencé par un Ericsson T20e en 2002, très classe (le clapet qu'on ouvre d'un geste, han la classe quoi !) mais hélas trop fragile, le micro (situé dans le clapet) était mort au bout d'un an et demi, la classe a un prix. J'ai ensuite eu un Sagem myX-3 contre un ré-engagement de 12 mois chez Orange, qui m'a franchement appris à ne plus rien toucher de Sagem, en effet c'était une horreur à utiliser comme téléphone, c'était plein de bugs, ça plantait, ça s'éteignait tout seul, bref la galère. Quand la partie communication s'est mise à ne plus fonctionner j'ai décidé de changer pour quelque chose de plus fiable.

J'ai donc acquis un Nokia 1100 en 2006, écran noir et blanc, suite logique et remise au goût du jour du célèbre et increvable 3310. Cette fois le téléphone était débloqué tout opérateur, et j'ai pu dire bybye à Orange. Et franchement ça a été un vrai plaisir de l'utiliser, grande autonomie, écran lisible, lampe torche intégrée, fiable et solide. Au bout de 3 ans hélas l'écran était bien rayé et le clavier complètement effacé à force de traîner dans ma poche. Je l'ai donc remplacé en 2009 par son successeur, le Nokia 1200, avec une lampe plus lumineuse, et une interface un peu revue, encore plus d'autonomie mais un clavier un poil en dessous niveau confort. Tellement solide et protégé qu'il me servait aussi tous les jours de lampe avant sur mon vélo, même sous la pluie il n'a jamais déclaré forfait. Il est également tombé à l'eau à plusieurs reprises, pas de souci. Bref du solide. L'autonomie était de 8 à 10 jours sans recharger, ce qui est pas mal mais encore loin de ce que j'aimerais attendre d'un téléphone (30 jours et plus ça serait bien).

Nokia 1200

Par contre même problème que le 1100 : le clavier s'est effacé, mais encore plus rapidement, j'ai donc changé de coque au bout de 2 ans, mais les coques chinoises disponibles sur eBay sont de mauvaise qualité et le clavier s'est effacé encore plus rapidement. Sans compter qu'un bug assez gênant est apparu ces derniers mois : parfois les SMS ne partent plus. Ils ne sont plus envoyés. Il faut éteindre et rallumer le téléphone pour relancer la queue d'envoi. Pas génial.

J'ai donc décidé de profiter récemment d'une vente flash Orange pour acquérir le Nokia C3-00, un smartphone à clavier azerty que j'avais repéré auparavant de par ses caractéristiques alléchantes. Le téléphone revenait donc à 19 € après remboursement de 30 € par Nokia, difficile de faire moins cher. J'ai bien observé les téléphones Android mais la plateforme me semble encore trop jeune, pas assez ouverte, et surtout aucun téléphone non-tactile avec clavier physique (type Blackberry) n'existe avec Android. Chez Android il n'y a que du tactile (berk), parfois avec un clavier rétractable (horreur !), et toujours relativement cher. Sans compter l'ergonomie qui me semble quand même un bon cran en dessous des interfaces de Nokia.

L'aventure Orange

J'ai pensé que ça serait simple en prenant un téléphone chez Orange, celui-ci étant lié simplement à une carte "Mobicarte" prépayée, donc sans engagement. Sauf que Orange est l'opérateur qui adore enfermer ses clients. Donc le téléphone était vendu simlocké, et le firmware avait été "personnalisé" aux couleurs d'Orange. Moralité : les logiciels type E-Mail, Chat, Facebook, Twitter et Web avaient été supprimés et remplacés par des liens vers les portails Orange via un navigateur inutilisable. Sans compter le thème et les plugins ajoutés par Orange qui rendaient le téléphone horriblement lent. Après de multiples manipulations avec des logiciels obscurs dans une machine virtuelle Windows, j'ai pu flasher le téléphone avec le firmware original, bien plus agréable et utilisable. Premier progrès. Mais pourquoi pourrir à ce point le téléphone avec des trucs maison alors que le firmware de base est juste bien ? Je ne comprends pas pourquoi Orange perds du temps et de l'argent à pourrir les téléphones et donc l'expérience du client.

Le second problème était le simlockage. Bien que l'ARCEP exige que le désimlockage puisse être effectué immédiatement en cas d'offre sans engagement, Orange m'opposa un refus grossier et insultant, me demandant de payer 76 € ou d'attendre 3 mois pour obtenir le désimlockage. J'ai eu droit à tout un tas d'arguments, allant du simple "c'est la loi" au stupide "la Mobicarte est une offre avec engagement" (quel engagement ?!). Après multiples appels, emails et un recommandé au service réclamation avec copie à l'ARCEP et au médiateur télécoms, je n'ai obtenu aucune réponse, Orange refusant toujours de désimlocker le téléphone. Étant donné que l'accès à la justice est désormais payant dans notre beau pays (35 €), j'ai décidé d'attendre 3 mois, à l'issue de ce délai le désimlockage s'est passé sans problème, mais jamais plus de ma vie je ne retournerais acheter quoi que ce soit chez cet opérateur qui ose me raccrocher au nez ou ne pas même appliquer la loi à ses clients.

Le téléphone

Le téléphone en lui-même est plutôt agréable à utiliser, il ne possède pas de 3G, car ça ne m'intéresse pas, mais le WiFi et ça marche plutôt bien avec Opera Mini, agréable de surfer et lire ses mails avec. Le clavier est vraiment confortable à utiliser pour taper du texte. Au point qu'on se demande pourquoi il n'existe pas un traitement de texte intégré. Par contre il manque vraiment une lampe torche hélas.

On est encore loin d'un ordinateur portable, impossible d'avoir la main sur l'OS, et les applis J2ME sont quand même limitées au niveau possibilités système, peut-être qu'Android fait mieux mais j'ai pas l'impression. WebOS semblait plus intéressant, mais hélas son avenir semble incertain et le nombre d'appli est ridicule par rapport à la gigantesque logithèque existante en J2ME.

Les logiciels utiles

Le "Store" intégré est pas mal du tout, assez fourni, mais beaucoup de trucs sont payants hélas, et souvent pour pas grand chose, voir de la belle merde, un peu comme sur tous les "stores" de ce genre.

Navigateurs web

  • Opera Mini (freeware) est juste obligatoire. Le téléphone est fourni avec une version 4.2 spécifique pour l'OS S40 de Nokia, ça commence à dater un peu. Il n'est pas possible de le mettre à jour, mais il est possible d'installer à côté la version 6.5 (avec les tabs notamment), il suffit de la télécharger sur le site m.opera.com
  • Nokia Browser (freeware), c'est un navigateur déporté comme Opera Mini, mais créé par Nokia. La différence principale c'est que le navigateur de Nokia est mieux intégré avec le reste de l'OS, mais c'est quand même plus lent. Pour la petite histoire ça utilise Gecko comme moteur de rendu.
  • UC Browser (freeware) est un excellent petit navigateur, déporté également. Il est très rapide et dispose d'une option "nuit" très utile qui affiche les pages web en texte clair sur fond sombre, bien reposant pour les yeux. Le rendu est un poil moins bon qu'Opera Mini tout de même. Et la gestion du clavier complet n'est pas parfaite, il est difficile de taper des chiffres par exemple (reconnus comme les touches numériques d'un téléphone à clavier numérique).
  • Je n'ai pas pu trouver de navigateur "normal" qui ne passe pas par un serveur tiers. C'est problématique je trouve. Le navigateur "OVI" intégré passe également par un serveur tiers.

Mise à jour mars 2014 : je conseille maintenant UC Browser plutôt qu'Opera Mini. UC Browser est plus rapide et mieux foutu, sans compter que les serveurs d'Opera Mini sont passés à WebKit et renvoient maintenant beaucoup d'erreurs en plus d'une compression moins bonne.

Messagerie

  • Le téléphone intègre déjà un client de messagerie compatible avec OVI (service de Nokia), MSN, Yahoo Messenger et Google Talk, qui est correct, sans plus.
  • BombusMod (libre) est un client XMPP (donc MSN, Google Talk, Facebook en plus de tous les serveurs Jabber) qui est pas mal du tout.
  • Le téléphone intègre un client mail correct également, même si pas très bien foutu, notamment la liste de mails est limitée à 10 messages, il faut après cliquer sur "Plus de messages" qui charge une nouvelle page de la liste. Bof.
  • http://funambol.com/ a une client mail (libre) qui synchronise ses mails avec un serveur Funambol. Perso ça m'intéresse pas trop mais c'est intéressant.
  • L'application officielle GMail (freeware) est bien foutue, mais ne fonctionne qu'avec les comptes GMail forcément. Par contre Google ne la propose plus au téléchargement (résultat de la politique d'abandon de tous les produits qui ne rapportent pas...), il faut aller la chercher ici : http://m.google.com/mail/download/binaries/L2/2.0.6/mail_m2.jar (n'est plus dispo)
  • MujMail (libre, plus développé depuis 2009) est un client mail générique très bien fourni (IMAP, POP3, SMTP, support de SSL/TLS), le meilleur en fait, à avoir absolument.
  • PicoMail semble être un service web et non pas un vrai client POP/IMAP, donc il transmet vos identifiants à un serveur distant, qui récupère vos mails. Bof autant utiliser un webmail.
  • WLIRC est un client IRC qui fonctionne, sans plus.

Voyage : localisation, cartes, etc.

  • Nokia Nearby (freeware) est une petite appli qui indique les lieux utiles à proximité pour les téléphones sans GPS.
  • Google Maps (freeware) est l'équivalent du site web, c'est limité (pas de possibilité de placer ses propres marqueurs) mais ça marche bien, avec itinéraire animé et affichage de la quantité de données téléchargées.
  • Nokia fournit une horloge mondiale qui affiche l'heure locale dans quatre villes du monde, pas mal mais il n'est pas possible de l'utiliser en fond d'écran, donc faut forcément lancer l'appli pour voir les fuseaux.
  • MGMaps (libre) est sans contexte la meilleure appli pour les cartes, elle supporte les fonds de carte de Yahoo! Maps, Bing Maps, Ask.com et OpenStreetMap et permet de s'interfacer avec un GPS externe en BlueTooth (!). Il est également possible de télécharger sur son PC les fonds de cartes pour des zones et des zooms déterminés, puis les placer sur le téléphone pour avoir des fonds de carte consultables hors-ligne. Il sait gérer les fichiers KML et afficher les lieux qui y sont indiqués, de même qu'afficher les cartes de métro de plusieurs grandes villes ou les points d'accès FON. On peut placer ses propres marqueurs, enregistrer une liste d'endroits favoris, et encore plein d'autres choses.
  • L'excellent Métro, si connu sur Palm, n'existe hélas pas en version J2ME.
  • (Ajout mars 2014 :) TrekBuddy semble très apprécié pour la randonnée et permet de visualiser des atlas/cartes créées avec Mobile Atlas Creator. Ça permet par exemple de charger les cartes IGN d'une région avant de partir en rando, pas mal.

Sécurité

  • CryptoSMS (libre) est un petit programme qui utilise un algorithme à clé publique/secrète pour chiffrer/déchiffrer le contenu des SMS envoyés. C'est plutôt bien foutu techniquement, mais l'ergonomie est pas idéale.
  • J2ME-OTP (libre) est un générateur de mot de passe à usage unique, conforme à S/Key (et donc utilisable avec SSH par exemple, voir ici pour comment activer S/Key dans OpenSSH).
  • midpSSH est un client SSH fonctionnel pour se connecter à ses machines.
  • Mars 2014 : KeePass Mobile ou KeePassJ2ME permettent de stocker ses mots de passe de manière sécurisée.

Divers

  • MeBoy (libre) est un émulateur Game Boy / Game Boy Color. Le fonctionnement est un peu compliqué, il faut intégrer les ROMS au fichier JAR avant installation, mais sinon c'est que du bon, les piles LR6 en moins ;-)
  • Mars 2014 : Albite Reader (libre) est un lecteur d'EPUB, TXT et HTML pour J2ME. Très joli et fonctionnel, super.

D'autres logiciels J2ME libres sont dispos sur http://ngphone.com/j2me/opensource/. Et des logiciels freeware sont dispos sur boostapps.com.

Suivi et archivage des offres LIDL

Depuis quelques jours, le site http://lidl.dofollow.be/ archive automatiquement les offres et produits publiés sur le site http://www.lidl.fr/. Toutes les 24 heures, le site va chercher les nouvelles offres et en enregistre une copie dans sa base de données.

Le site peut ensuite servir pour :

  • consulter les offres et produits passés et à venir
  • suivre les nouveaux produits par flux RSS
  • rechercher un produit spécifique grâce à un moteur de recherche puissant
  • voir la périodicité de vente d'un type de produit (recherche par date)
  • être prévenu de la mise en vente d'un nouveau produit correspondant à une recherche (par flux RSS)
  • etc.

Le site est également disponible en version adaptée aux mobiles.

Sous le capot c'est surtout SQLite qui fait toute la magie, c'est rapide et efficace, notamment la recherche texte qui utilise FTS4 et permet des choses assez sympa : scie jardin OR pliable OR pliante (chercher toutes les scies de jardin ou scies pliantes ou scies pliables) ou encore title:LED (tous les produits avec "LED" dans le titre). J'en ai profité pour traduire en PHP la fonction de rank indiquée dans la doc. de FTS4 : Pure PHP rank function for SQLite FTS4 (adapted from SQLite doc).

Is serving files from PHAR slower? (PHAR benchmark)

PHP PHAR archives allow you to put a whole application in one file, including code and static content (CSS, images, etc.). Serving static files from a PHAR archive might look attracting as you don't have to ship these files separately from your code, and you can say ship a PHAR file instead of a ZIP file, which will work out of the box (except with Suhosin). But isn't serving static content from PHP too slow? Well let's benchmark that.

Benchmark context

  • Hardware: Atom N450 @ 1.66GHz, RAM 1GB, 7200 rpm hard drive
  • PHAR configuration: cache not enabled for this archive
  • Tool used for benchmark: ab -n 1000 (repeated 5 times)
  • PHAR archive: native Phar format (not Tar)

Serving dynamic index file (PHP code)

  • Average request time : 8.894 ms
  • Average uncompressed PHAR request time : 12.816 ms (+44%)
  • Average GZ-compressed PHAR request time : 13.455 ms (+4% from uncompressed)
  • Average BZ2-compressed PHAR request time : 14.211 ms (+5% from GZ, +10% from uncompressed)

Serving static CSS file

  • Average request time : 7.150 ms
  • Average uncompressed PHAR request time : 12.275 ms (+63%)
  • Average GZ-compressed PHAR request time : 12.909 ms (+5% from uncompressed)
  • Average BZ2-compressed PHAR request time : 13.710 ms (+6% from GZ, +11% from uncompressed)

Obviously, serving static content from PHAR archives is a huge overhead. Serving dynamic PHP content from PHAR archives is "just" 44% slower. But as you can notice, compressing the archive and serving content from it is not really noticeable.

If you still want to distribute your static files inside the PHAR archive, I'd advise you to extract those files from archive at first run so that they will be served directly by the HTTP server, or maybe just use the PHAR file as a self-contained installer that will extract application files at first run?

PHP PHAR archives and Debian

If you get blank pages and no error message when trying to access a PHAR archive on a Debian or Ubuntu server, this is probably Suhosin's fault as it doesn't allow execution of code from PHAR archives by default. To allow PHAR archives, just add this line to /etc/php5/conf.d/suhosin.ini:

suhosin.executor.include.whitelist="phar"

Exim: whitelist senders to pass the sender verify callout

Some mail servers don't comply with the RFC, and as a result you won't be able to receive mails from them, because your mail server is too well-configured. Exim is one of those good mail servers, and nichandle.ovh.net is one those ill-configured mail servers.

nichandle.ovh.net is used by OVH (french ISP) to send important e-mails to its clients, like your password for your new xDSL connection. But if you use exim, since some time you won't receive OVH mails anymore, because of this:

H=xx.mail-out.ovh.net [XX] sender verify defer for <xxxx-ovh@nichandle.ovh.net>: could not connect to robot.ovh.net [XX]: Connection refused
H=xx.mail-out.ovh.net [XX] F=<xxxx-ovh@nichandle.ovh.net> rejected RCPT <root@mailserver>: relay not permitted
H=xx.mail-out.ovh.net [XX] incomplete transaction (QUIT) from <xxxx-ovh@nichandle.ovh.net>

As you can see, Exim tries to check that xxxx-ovh@nichandle.ovh.net is a real email address by connecting to nichandle.ovh.net and doing this simple stuff :

EHLO mailserver
MAIL FROM: <>
RCPT TO: <xxxx-ovh@nichandle.ovh.net>

It won't really send a mail to the sender, it will just check on the senders mail server if the address exists. This is a simple but effective idea to fight against spam, and it's well known and implemented. You can read more on wikipedia on this subject: Callback verification.

For OVH, there's a problem: nichandle.ovh.net (who is in fact an alias for robot.ovh.net) is not a mail server. It's SMTP port 25 isn't even open. So that will be hard for Exim to connect and check if the senders address exists, because nichandle.ovh.net doesn't appear to be a mail server at all, so it rejects the mail.

I opened a ticket on OVH tracking interface but meanwhile I wanted to receive the OVH emails so I added a sender verify whitelist to Exim. For that you'll have to add to the beginning to your exim configuration:

addresslist whitelist_senders = wildlsearch;/etc/exim4/whitelist_senders

Then replace:

require verify = sender

(Note that it might also be require verify = sender/callout.) With this:

 deny !verify = sender
 senders = +whitelist_senders
 deny !verify = sender/defer_ok/callout=10s
 !senders = +whitelist_senders

Then you'll have to edit /etc/exim4/whitelist_senders and add whitelisted senders. It can be a single email address, or a wildcard:

*@nichandle.ovh.net
bohwaz@othermailserver.tld
abuse@*

Notes rapides... ↓