Des mauvaises raisons de changer de distribution

That’s it, I’m switching to ArchLinux

Ce running-gag, pratiquement devenu un meme, qu’on peut rencontrer fréquemment sur les commentaires du site OMG! Ubuntu! est devenu depuis peu la rengaine d’un nombre important d’(ex) utilisateurs d’Ubuntu. (Il est possible de remplacer ArchLinux par autre chose comme Fedora, Debian, Gentoo, LFS, Windows 3.11 for Workgroups, etc).

Mais qu’est ce qui provoque ainsi l’exode massif de ces Ubunteros vers d’autres territoires ? Ici, il n’est point question de la politique commerciale de Canonical qui refuse de payer ses employés en amour et en eau fraiche (le seul salaire légitime d’un vrai libriste qui se respecte). Ici nous parlons d’un plugin Compiz.

Oui, un plugin Compiz, et deux ou trois bricoles supplémentaire, c’est tout.

J’imagine une réalité alternative ou ma distribution favorite aurait été installée par défaut avec le switcher du bureau sur une sphère, avec des poissons en 3D a l’intérieur et où les fenêtres s’enflamment lorsqu’on les ferme. Pris d’une rage incontrôlable, j’aurais probablement pris ma machine (une bonne grosse tour Cooler Master avec 12 baies 3″½) et l’aurais propulsée violemment par la fenêtre de mon immeuble. Puis je me serais précipité vers l’Apple Store le plus proche pour y acquérir un Mac Book Pro afin d’y installer DragonflyBSD et le tiling window manager wmii.

Dans une réalité moins alternative, j’aurais simplement ouvert CompizConfig Settings Manager et décoché les options ne me plaisant pas. C’est certes moins drôle, mais je tiens a ma tour Cooler Master, et je n’ai pas particulièrement envie d’un Mac Book Pro.

Le problème, c’est que le plugin Compiz en question s’appelle Unity, et il représente une grosse partie de l’apparence globale de la distribution Ubuntu Oneiric Ocelot, fraîchement sortie en version finale. Le simple fait de désactiver le plugin crée plus de problèmes qu’il n’en résout puisqu’on se retrouve sans rien : plus de lanceur, plus de barre des tâches, plus d’indicateurs, plus grand chose en fait.

Mais c’est facile ! Il suffit d’installer Gnome Shell !

Oui mais non. Si on donne un 14/20 à Unity pour sa stabilité, Gnome Shell n’aurait qu’un 16/20, ce qui est bien mais pas top. Les deux projets sont jeunes, se cherchent, vivent une adolescence difficile. Ils sont tous deux de bons projets, avec un bon potentiel, mais il est encore trop tôt pour les adopter. Et puis si je ne suis pas franchement gêné de la disparition des boutons minimiser et maximiser, ou que la fonction Éteindre/redémarrer soit cachée derrière une touche Alt, il n’en est pas de même avec les bureaux virtuels. Le paradigme des bureaux sur une grille a bien fonctionné jusqu’à présent et je ne souhaite pas avoir entre 1 et l’infini bureaux disposés sur une seule colonne.  Et le moniteur secondaire configuré par défaut pour ne pas avoir de bureaux virtuels ? Sérieusement Gnome ? Même l’option à aller changer dans les tréfonds de dgconf-editor ne permet pas de rendre a mon second moniteur les capacités d’un vrai bureau virtuel. (pour information, c’est /desktop/gnome/shell/windows/workspaces_only_on_primary)
Et enfin il y a mutter. Mutter le compiz pauvre, ou le metacity amélioré selon le point de vue. Mutter, ou comment des milliers de personnes ont tourné le dos a ce qui se faisait de mieux en terme de Window Manager. Non, décidément, je ne peux pas me résoudre a quitter Compiz.

A ce qu’il parait, on peut installer gnome-panel et le faire fonctionner avec compiz. Manque de bol, ça n’a jamais fonctionné chez moi. Je me retrouve toujours avec un window manager dénommé gnome-wm qui n’est rien autre qu’un metacity rebaptisé. Non merci. Peu importe car j’ai déjà une session avec compiz qui fonctionne, celle qui s’appelle « Ubuntu » et qui normalement affiche Unity. Si gnome-panel est trop attaché a son WM archaïque, on va utiliser autre chose, j’ai nommé Wingpanel ! Pour information, wingpanel est l’équivalent de gnome-panel pour le projet Elementary.

Voila, j’ai mon panel, juste histoire d’afficher l’heure et les indicators, tout ça pour ça… Maintenant j’installe docky, synapse, conky-colors, covergloobus, les icônes Faenza, le thème Orta Squared pour les bordures de fenêtres et blam, je me retrouve avec un bureau qui me plaît.

Au passage, j’installe Hotot comme client Twitter (ou Tweetdeck comme on peut le voir sur le screenshot, et *oui* je tourne en 64bit), terminator mon émulateur de terminal préféré et Clementine parce que je suis un inconditionnel de la branche 1.4 d’Amarok. Ah oui, et j’allais oublier:  je m’empresse d’aller désinstaller tous les paquets que me renvoie une recherche de « appmenu » dans synaptic pour me débarrasser de ces foutus menus globaux.

Donc on récapitule: d’une installation Ubuntu de base je n’utilise ni Unity, ni les menus globaux, ni Gwibber, ni Banshee, ni gnome-terminal, ni le thème Ambiance, ni le thème d’icônes Ubuntu. Et est ce que je vais changer de distribution pour autant ? Non.

Pour être honnête, je vais avouer qu’Ubuntu Oneiric 64bit n’est pas le seul système installé sur ma machine principale. J’ai aussi ArchLinux, une Debian Wheezy/Sid avec du pinning, OpenSuse 11.4, Fedora 15, Ubuntu Natty qui va migrer sur Precise dès que possible et Ubuntu Oneiric 32 bit qui a sans problèmes fait toutes les upgrades depuis Karmic Koala (mais c’est une 32bit, elle doit dégager). Bon, je vais être vraiment honnête, j’ai même un Windows XP. Il ne me sert a rien mais je l’ai sur ma machine. Pourquoi tous ces systèmes ? J’aime voir ce qui se fait ailleurs, je suis curieux de tester les différentes distributions qui existent et comparer leur fonctionnement avec mon système principal. Toujours est il que je reviens toujours vers la distribution que je maîtrise le mieux, celle que je préfère et qui chez moi fonctionne mieux que toutes les autres.

Parce que la distribution que j’utilise pour faire mon boulot, celle qui me permet de payer mon loyer et mes courses ne se résume pas à un plugin Compiz. C’est un cycle de développement qui me plaît, ce sont des outils de packaging puissants, c’est une communauté vivante et riche, c’est une vrai valeur ajoutée sur certains projets, c’est une plate-forme de développement incroyablement mieux conçue que tout ce qui se fait ailleurs.

Certes je suis plein d’éloges sur Ubuntu mais n’allez pas croire que je dénigre pour autant les autres distributions. Tous les systèmes que j’ai cités plus haut et que j’ai installé sur ma machine sont excellents (sauf Fedora :p) et toute personne qui se sent attiré par des aspects de cette distribution tels que la communauté, les outils de packaging, la plate-forme de développement ou le cycle de release aurait fortement raison de se diriger vers celle ci. Mais par pitié, ne changez pas de distribution à cause d’un plugin compiz, d’un window manager, d’une clé gconf ou d’un package installé ou pas installé par défaut.
A moins de vouloir être ridicule. Et bon nombre de personnes ont été pitoyablement  ridicule ces derniers mois.

Publié dans Open Source | Marqué avec , | 36 commentaires

Le clash Oracle/LibreOffice ou le danger des forks politiques

Ceux qui suivaient mon ancien blog savent connaissent peut être l’aversion que je peux avoir envers les forks. Nombreux sont ceux qui considère le fork comme une pratique légitime, faisant parti de l’écosystème du logiciel libre et pour certains la pratique du fork n’est pas une chose grave. Une des raisons à cela est que chacun se fait sa propre petite définition du fork. Même un site très populaire vulgarise le terme : « Fork me on Github » peut-on lire sur de nombreux projets. Répétez après moi; une branche: bien, un fork: pas bien.
La seule définition valide est celle d’Eric S. Raymond exposée dans le Jargon File . Ce n’est pas négociable, les autres définition sont en parti ou totalement fausses.

Si j’en viens a écrire ce billet aujourd’hui, ce n’est pas bien dur a deviner par rapport a l’actualité récente, je veux bien sur parler du fork LibreOffice! Le projet a déjà fait couler beaucoup de pixels et après avoir reçu le soutient de nombreuses sociétés (dont IBM, Canonical, …), le principal intéressé, Oracle, refuse de s’intégrer au projet, refuse de donner le nom OpenOffice mais par contre propose aux développeurs employés d’Oracle qui travaillent sur LibreOffice de prendre la porte. Bien sur dans l’histoire, Oracle joue le rôle du grand méchant. Quoi de plus normal d’ailleurs, c’est toujours la multi-nationale le méchant, n’est ce pas? Pourtant en y pensant bien, toute cette vision des choses est très manichéenne, la gentille communauté contre la méchante corporation, ce n’est pas un peu trop simple?

Quand on y réfléchi quel mal avait fait jusqu’à présent Oracle a OpenOffice? Aucun a ma connaissance… Alors c’est soit disant pour s’émanciper, pour ne plus être dépendant d’une société qui tiendrait les rennes et qui briderai le développement du logiciel. Au dernières nouvelles le projet se portait plutôt bien, avec une nouvelle interface (Renaissance) en cours de développement. Ah oui, je sais! Il parait qu’Oracle est l’ennemi juré de l’OpenSource et qu’il veux rendre tous les projets de Sun fermés et commerciaux, enfin il parait seulement, parce que je me rappelle quand même d’avoir visité cette page en 2007 ou 2008, et elle était déjà bien remplie. Et je dois me faire vieux, ma mémoire doit me jouer des tours car j’ai clairement le souvenir d’un employé de chez Oracle disant « we love OpenSource » dans une vidéo LinuxCon ou autre conférence du même type. Ah mais attends, ils ont déjà commencé le massacre, ils ont arrêté de financer OpenSolaris, c’est bien la preuve qu’ils en veulent aux projets Open Source, non ? Oui, ou bien parce que tout le monde utilise Linux ou BSD aujourd’hui … vous connaissez personnellement un utilisateur d’OpenSolaris ? Moi non …
Ou alors il y a l’histoire de Java et de Google, qui est totalement risible au passage. Chers lecteurs, sachez que c’est ce que les multinationales font pour gagner malhonnêtement mais légalement encore plus d’argent : se foutre sur la gueule a grands coups de brevets. C’est un peu leur passe temps, comme il y en a qui vont troller sur DLFP ou d’autre qui font du tennis. C’est quelque chose qu’on ne peut pas comprendre, nous, humains. Toujours est il que j’utilise majoritairement des logiciels ex-Sun / Oracle : OpenOffice, VirtualBox, MySQL, Java (pour jouer a Minecraft),Netbeans (beaucoup moins maintenant, depuis que j’utilise vim). Je ne me suis jamais senti menacé par l’acquisition de Sun par Oracle, jamais.

Ce qui est plus dangereux a mon avis, c’est la réaction actuelle de la « communauté » et leur prise de position soit disant défensive envers Oracle. Les projets qui sont conçus pour nous protéger du grand méchant loup me font beaucoup plus douter sur l’avenir des logiciels concernés que si aucune mesure de ce type n’avais été prise. Qu’on soit bien clair, ces forks, LibreOffice mais aussi MariaDB, Drizzle et SkySQL (juste trois forks, vous êtes sur que c’est suffisant?), ces forks la sont tout sauf défensif étant donné qu’aucune attaque n’a eu lieu. Ces forks sont purement et simplement offensifs, du genre je prends mon gant et je le claque bien fort a la figure d’Oracle. Quoi de plus normal après cela qu’Oracle n’ai plus très envie d’être sympa et indique aux développeurs d’OpenOffice la direction pour prendre la sortie la plus proche a partir du moment ou ils ont montré un peu trop d’intérêt a LibreOffice. Je n’apprécie pas particulièrement Oracle, je ne les déteste pas non plus. Mon point de vue sur Oracle est neutre tout comme mon point de vue sur Sun était neutre: ce sont des sociétés et je ne peux pas éprouver de sentiments envers une société. Ce que j’apprécie en revanche, ce sont les projets libres supportés financièrement parce qu’il faut bien reconnaître qu’un projet 100% communautaire, ça ne décolle jamais vraiment sauf cas particuliers comme Debian qui dispose d’une réelle organisation interne.
Oracle a justement le rôle de financer les développements de plusieurs projets Open Source et jusqu’à présent il s’y est tenu, sauf pour OpenSolaris que personne n’utilise. En forkant, non seulement les développeurs ont montré leur aversion envers Oracle mais ils ont aussi fait sentir qu’ils étaient trop biens pour recevoir de l’argent de la part d’Oracle. « Non merci, on ne veux pas de votre argent sale, rendez le a Google, nous on va faire notre truc à coté sans subventions. »

Le pire c’est qu’au final, ce n’est pas la crédibilité d’Oracle ou des forks communautaires qui est en jeu, c’est la crédibilité du modèle de développement OpenSource. Un modèle OpenSource n’oblige pas ses utilisateurs a avoir confiance dans la société ou dans les individus qui développent les applications. L’OpenSource permet a quiconque de garder un contrôle total sur tout logiciel, et si un jour quelque chose de réellement grave se produit, alors oui, un fork sera légitime. Tant qu’aucune attaque, qu’aucun mauvais comportement n’est constaté, autant rester ‘amis’ avec ceux qui financent le projet, faire le contraire c’est cracher sur de l’argent qui n’est jamais de trop dans notre écosystème. En forkant un projet qui aux dernières nouvelles se porte bien on montre uniquement deux choses: 1) qu’on souhaite insulter publiquement une société qui apporte des fonds au développement logiciels et 2) qu’on a pas confiance dans le modèle de développement OpenSource.

Publié dans Open Source | Marqué avec , , | 31 commentaires

[ubuntu] packager etherpad sur Maverick Meerkat

Aujourd’hui nous allons voir que déployer un etherpad en local ce n’est pas très compliqué. Et pour faire les choses bien, nous allons créer notre propre paquet. Il y a un dépôt pour etherpad mais ici nous allons l’installer sans ajouter de dépôts tiers et nous allons utiliser openjdk-6-jdk a la place de sun-java6-jdk. sun-java6 n’est pas encore disponible dans les dépôts de Maverick, et nous allons tout de même avoir besoin de sun-java6-jre…

Pour cela, la situation dépends de si vous avez effectué une mise à jour de lucid vers maverick (avec sun-java6-jre déjà installé), ou si vous avez installé maverick sans mise a jour. Dans le 2ème cas, il faut ajouter le dépot lucid-partners et installer la jre:

sudo add-apt-repository "deb http://archive.canonical.com/ubuntu lucid partner"
sudo apt-get update
sudo apt-get install sun-java6-jre

Ensuit on installe quelques dépendances :

sudo apt-get install dbconfig-common openjdk-6-jdk mysql-client libmysql-java scalascala-library debhelper po-debconf devscripts mysql-server m4 git-core

puis on récupère le code source :

git clone http://github.com/ether/pad.git

on édite le fichier debian/control :

vim debian/control

et on remplace sun-java6-jdk par openjdk-6-jdk:

:%s/sun-java6-jdk/openjdk6-jdk
:wq

on lance la construction du paquet, sans le signer car on ne va pas le distribuer:

debuild -us -uc

et on installe :

cd ..
sudo dpkg -i etherpad_1.0.1_all.deb

Une dernière chose a régler, on va écouter sur toutes les ip pour pouvoir utiliser etherpad sur son réseau :

sudo vim /etc/etherpad/etherpad.local.properties

Remplacer listen = 9000 par listen = 0.0.0.0:9000

Il ne reste plus qu’a lancer etherpad :

cd /usr/share/etherpad/etherpad
sudo bin/run-local.sh

Si tout s’est bien passé, le serveur etherpad tourne maintenant sur le port 9000 :

nmap localhost -p 9000
...
PORT STATE SERVICE
9000/tcp open cslistener

Vous pouvez maintenant utiliser etherpad!

chromium-browser http://$HOSTNAME:9000

Si vous rencontrez des problèmes dans le packaging ou le lancement du serveur, copiez les messages d’erreurs et postez les dans les commentaires ci dessous, j’essayerai de vous aider =)
Vous pouvez aussi essayer de RTFM ici ou ici

Publié dans Développement Web, Web temps réel | Marqué avec , , , | 3 commentaires

yui-compressor disponible dans les dépots Debian/Ubuntu

Pas vraiment une nouvelle très fraîche puisque que cela date depuis début 2010 tout de même mais cela vaut quand même la peine d’être signalé car le paquet est passé relativement inaperçu.

yui Compressor, l’outil de compression de Yahoo pour le Javascript et le CSS est accessible très facilement pour tous les utilisateurs de Debian (testing et +) ou Ubuntu (Lucid et +).

sudo apt-get install yui-compressor

Auparavant, il était nécessaire de télécharger le programme Java sur le site de yahoo et d’écrire un script shell pour avoir accès a la commande dans votre PATH. Désormais le programme est prêt a être utilisé sans efforts supplémentaires. Et pour ceux qui se demanderaient, oui, il s’agit bien de la dernière version en date !

Pour rappel, yui Compressor permet de réduire de manière significative la taille de vos fichiers CSS et Javascript afin d’améliorer les performances de vos sites en production. Son utilisation fait parti des bonnes pratiques à adopter pour offrir des sites performants. Même en utilisant yui compressor, pensez a activez la compression sur ces types de contenus.

Pour vous aider a mettre en place ces bonnes pratiques, une extension Firefox (plus précisément une extension de Firebug) nommée yslow permet de tester les performances de votre site et vous indique les points a travailler en priorité pour l’améliorer.

Pour finir, un article de Douglas Crockford, vénérable guru du Javascript, qui présente les différences entre la minification (ou compression) et l’obfuscation (tentative désespérée pour rendre le code difficile a comprendre).

Publié dans Développement Web | Marqué avec , , | 4 commentaires

Controler l’attribut ‘disabled’ d’un sfWidgetFormDoctrineChoice

Dans symfony, le widget sfWidgetDoctrineChoice permet de générer des tags <select>, <input type=’checkbox’> ou <input type=’radio’> a partir d’enregistrement dans la base de donnée.
Nous allons voir dans ce billet comment désactiver certains de ces choix dynamiquement dans le cas d’un tag <select> en contrôlant l’attribut ‘disabled’. J’ai mis cette méthode en application dans le cadre d’un outil de mailing où je ne souhaite pas qu’un client puisse faire un envoi sur une liste qui n’a pas fini d’être importée (l’import se fait en tache de fond et peut durer longtemps, j’expliquerai cette technique dans un autre article).

On pourrais se contenter de lister uniquement les listes dont les imports sont terminés mais l’utilisateur se demandera alors ou sont passé ses listes en cours d’importation. Une autre solution de facilité serait de faire une validation une fois le formulaire soumis en affichant une erreur si une des mauvaises listes a été choisie, pas très user friendly…

La technique expliquée ici semble être ‘inédite’, je n’ai pas trouvé de documentation expliquant cette façon de faire et les questions posées sur le sujet dans les forums et les listes étaient sans réponses ou avec des réponses incomplète, j’espère donc que cet article aidera quelques codeurs.

Commençons par la mise en place du widget dans le formulaire et changer les options par défaut du sfWidgetFormDoctrineChoice:

        $this->widgetSchema['list_id'] = new sfWidgetFormDoctrineChoice(
            array(
                'model' => 'AddressListTable',
                'add_empty' => 'Select a list',
                'query' => AddressListTable::getForProfile($profile),
                'method' => 'getWithStatus',
                'renderer_class' => 'sfWidgetFormSelectAcid'
            ),
            array()
        );

Passons en revue les différentes options du widget :

  • model n’est pas utile dans notre cas, mais il est obligatoire donc on le laisse.
  • add_empty rajoute une option par défaut avec une valeur nulle dont le texte sera ‘Select a list’
  • query sert a récupérer les objets qui peupleront le widget, ici rien d’exceptionnel c’est une requête qui filtre les listes par profil. Notez bien le nom : ‘query’ et renvoyez bien un Doctrine_Query et pas un Doctrine_Collection
  • method, par défaut symfony utilise la méthode __toString() de l’objet en question mais ici nous allons nous servir de cette option pour récupérer davantage de données
  • renderer_class : c’est ici que se passe le travail et où nous allons manipuler l’attribut ‘disabled’.

Nous allons voir maintenant la méthode getWithStatus() dans la classe AddressList :

    public function getWithStatus()
    {
        $disabled = ($this->getImport()->getJobStatus()) ? true : false;
        $working = ($this->getImport()->getJobStatus()) ? " (un import est en cours, la liste n'est peut être pas complête)" : "";
        return array(
            'label' => $this->name . $working,
            'disabled' => $disabled
        );
    }


On ne renvoie plus une chaîne comme ce qui est attendu mais un tableau avec les clés ‘label’ et ‘disabled’. Dans le cas ou on passe l’option a disabled, on affiche la raison dans le label.

Passons a la dernière étape, la classe sfWidgetFormSelectAcid (Pourquoi le nom de cette classe d’appelle t’elle sfWidgetFormSelectAcid ? Je vous laisse le découvrir :D). Symfony offre quelques classes de base dérivées de sfWidgetFormChoiceBase : sfWidgetFormSelectCheckbox pour une liste de cases a cocher, sfWidgetFormSelectMany pour un select a choix multiples, sfWidgetFormSelectRadio pour les boutons radios et sfWidgetFormSelect qui est celui qui nous intéresse dans le cas présent. sfWidgetFormSelectAcid va donc étendre cette classe :

class sfWidgetFormSelectAcid extends sfWidgetFormSelect
{

    /**
     * Returns an array of option tags for the given choices
     *
     * @param  string $value    The selected value
     * @param  array  $choices  An array of choices
     *
     * @return array  An array of option tags
     */
    protected function getOptionsForSelect($value, $choices)
    {
        $mainAttributes = $this->attributes;
        $this->attributes = array();
        if (!is_array($value)) {
            $value = array($value);
        }
        $value = array_map('strval', array_values($value));
        $value_set = array_flip($value);

        $options = array();
        foreach ($choices as $key => $option) {
            $attributes = array('value' => self::escapeOnce($key));
            if (isset($value_set[strval($key)])) {
                $attributes['selected'] = 'selected';
            }
            if (is_array($option)) {
                $label = $option['label'];
                $attributes['disabled'] = $option['disabled'];
            } else {
                $label = $option;
            }
            $options[] = $this->renderContentTag('option',
                    self::escapeOnce($label), $attributes);
        }
        $this->attributes = $mainAttributes;

        return $options;
    }
}

De la classe de base, nous n’avons surchargé qu’une seule méthode getOptionsForSelect qui s’occupe justement de générer les tags option. La plus grande partie est une copie directe de la méthode de base et la partie qui nous intéresse vraiment commence a la ligne

if (is_array($option)) {

. On prends toujours en compte le cas ou l’option est une chaine de caractère pour prendre en charge l’option ‘add_empty’ du widget et dans le cas d’un tableau, on construit le tag avec les données renvoyées par le modèle.

Le widget spécialement conçu pour désactiver des options a partir d’états dans la base de donnée est maintenant opérationnel. Le résultat sera utile dans de très rares occasion mais c’est surtout la méthode utilisée pour y arriver qui a été enrichissante : La documentation montrant ses limites, il faut apprendre a connaitre le framework en plongeant dans son code, les docstrings et un IDE tel que Netbeans 6.9 aidant beaucoup.

Publié dans Développement Web, Symfony | Marqué avec , , | Un commentaire

Démenagement du blog

Après avoir moi même déménagé de Montpellier vers Bordeaux, j’ai décidé de faire subir le même sort a mon blog francophone et quitter les pages persos de Free.fr.

Certaines choses changent :

  • L’hébergement passe d’une page perso Free.fr a un serveur dédié OVH RPS
  • Dotclear disparaît au profit de WordPress 3 (Désolé Dotclear mais WordPress fait des sauvegardes automatiques des brouillons, je me rappelle encore des longs billets perdus suite a un crash !)
  • Le nom de domaine change, le projet ‘tweekers’ est en sommeil est il est amené a changer de nom, j’utilise mon propre nom comme domaine et pour signer mes billets.
  • Le public visé change sensiblement avec une orientation vers le développement Web, notamment avec symfony. Préparez vous a lire des billets dont les 3/4 sont des lignes de code ;) La première chose que j’ai installé sur mon WordPress est l’extension Syntax Highlighter.

D’autres choses ne changent pas :

  • Je ne fais toujours pas de tutos sur le développement RubyOnRails sur un MacBook Pro en utilisant Textmate.
  • Je compte rester sur Planet Libre, peut être m’inscrire sur Planet Ubuntu-fr (j’ai un autre blog consacré exclusivement a Ubuntu donc j’en doute) et éventuellement Planet PHP
  • Les billets présenteront, sauf cas très exceptionnel, des solutions Libres et Open Source.

Pour l’instant c’est encore un peu le chantier, le thème WordPress est partiellement traduit et un peu austère, mais je ‘release early’ (et j’espère ‘release often’ =)

Publié dans Misc | Marqué avec | Un commentaire