4
nov

Un dauphin qui obéit au doigt et à l’oeil ?

   Posted by: freshdaz   in Non classé

En cherchant des images pour ma prochaine conférence MySQL, pour le forum PHP/MySQL 2009, je suis tombé, tout à fait par harsard (je tiens à le préciser ;) ) sur ceci:

Dolphin Finger

Dolphin Finger

Finalement, c’est peu être un bon moyen d’augmenter la popularité de MySQL chez la gente féminine, cependant je n’arrive pas bien à voir où placer cette image dans ma présentation…

Rappel: Offre LeMug / forum PHP: http://dasini.net/blog/2009/10/20/conferences-mysql-au-forum-php/

20
oct

Conférences MySQL au Forum PHP

   Posted by: freshdaz   in Conférence, MySQL, PHP

Le MySQL User Group Francophone est partenaire avec l’AFUP du Forum PHP, qui se tient les 12 et 13 novembre 2009, à la Cité des Sciences et de l’Industrie.


Au programme des conférences dédiées à MySQL et MariaDB :

  • mysqlnd / « MySQL native driver for PHP » : Les améliorations de la stack avec Serge Frezefond
  • Au secours, ma base de données fait ramer mon application ! avec Stéphane Combaudon
  • MariaDB, the future of MySQL avec Michael Widenius aka Monty
  • Retour d’expérience sur l’utilisation de MySQL Chez Orange Business Services avec Olivier DASINI
  • Réplication MySQL : retours d’expérience avec Jean-François Bustarret

Participez à cet événement et bénéficiez d’une offre exceptionnelle :
les deux journées du Forum PHP
+
l’adhésion 2009/2010 au MySQL User Group France
pour 140 euros au lieu de 200 euros !*

Suivez ce lien pour adhérer au MUG et recevoir votre badge pour le Forum PHP

*Tarif normal de l’accès deux jours au Forum PHP 180 euros + Adhésion annuelle au MySQL User Group 20 euros.

Tags: , , , , ,

12
oct

MySQL Query cache

   Posted by: freshdaz   in MySQL, optimisation

En tant que boulimique de MySQL, je me promène souvent sur la toile à la recherche d’informations, de bonnes et de moins bonnes…

Je suis tombé sur un article traitant du cache de requêtes de MySQL (MySQL Query Cache) sur le blogue de Patrick Lafontaine (http://www.noidea.ca/)

Je me permet de faire quelques commentaires ici.

En préambule, quelques informations nécessaires sur le cache de requêtes:

Système de cache interne à MySQL qui ne stocke que les requêtes SELECT et leur résultat ie pas d’INSERT, UPDATE, DELETE…

Les requêtes ( SELECT donc) doivent être strictement identiques ie même casse, mêmes espaces entre les mots,…

Ex 3 requêtes différentes pour le cache :

SELECT nom, prenom FROM client WHERE client_id=123;
select nom, prenom FROM client WHERE client_id=123; /* la casse du select*/
SELECT nom, prenom FROM client        WHERE client_id=123; /*plusieurs espaces entre client et WHERE*/

Le cache est toujours à jour car en cas de modification d’une table, toutes les requêtes en relations avec cette table sont invalidées.

Le cache de requêtes est en général utile lorsque:

  • Les modifications sur les tables ne sont pas très fréquentes
  • Beaucoup de requêtes de lectures identiques
  • Utilisation de tables MyISAM. Moins intéressant pour InnoDB

Pour rebondir sur l’article de Patrick Lafontaine

« puisqu’elle est activée par défaut. »

Le cache de requêtes n’est pas activé par défaut, car la variable query_cache_size vaut 0. Si vous voulez vous en servir, il faut lui donner une taille en octet. Mettez le tout dans votre fichier de configuration. Assurez vous également que la variable query_cache_type est différente de OFF

« c’est-à-dire que la ou les applications qui s’en servent n’ont pas besoin d’être modifiées »

Pour une optimisation optimale, il est parfois nécessaire de modifier les requêtes SELECT avec SQL_CACHE ou SQL_NO_CACHE. On choisit alors quelles requêtes seront mis en cache.

« Si quelqu’un modifie la valeur directement dans MySQL, la cache possèdera la vieille valeur jusqu’à ce qu’un processus l’invalide. »

Sur une machine de production, ce type de manipulation reste quand même exceptionnel, sinon c’est qu’il y a des choses à revoir dans les process.

« Puisque les données ne changent pratiquement jamais, je ne me casserais pas la tête à réinventer la roue. MySQL fait déjà pour vous ce que APC ferait, sans le moindre effort. »

Si le contenu ne change JAMAIS, il n’a à priori rien à faire en base ! Il vaut mieux utiliser un menu statique et laisser la base faire son boulot avec du contenu dynamique. Dans le même ordre d’idée, plus le cache est éloigné du disque plus il est performant. En d’autres termes, le goulet d’étranglement est souvent (parfois) la base de données, de plus elle est souvent (parfois) plus difficilement scalable que le reste. L’utilisation d’un cache applicatif est rarement une mauvaise idée (il suffit de connaître l’identité du plus gros consommateur de memcached au monde http://www.facebook.com/note.php?note_id=39391378919)

« Il est donc plus avantageux de cacher les processus lourds que les légers. »

Malheureusement, avec le cache de requêtes ce n’est pas aussi simple. Admettons qu’une requête renvoyant un gros résultat prenne plus de temps qu’une renvoyant un plus petit. Si cette grosse requête vire toutes les autres requêtes du cache, l’apport du cache pour les autres requêtes est perdu, elle devront être misent à nouveau dans le cache ca qui implique des recherches inutiles dans le caches et de nouveaux accès disque…

« Lorsque la Query Cache de MySQL est activée, le processus de cacher les résultats et de les invalider s’effectue tout seul de manière invisible. Ainsi, d’autres requêtes que vous ne soupçonnez même pas bénéficient de la cache »

L’efficacité du cache de requêtes est vraiment lié à l’application. Il dépend du type de requêtes SELECT, de leur fréquence et de la fréquence des écritures dans les tables. Le gain n’est pas évident et est loin d’être immédiat, car pour chaque requête « cachable » MySQL devra l’analyser, devra la hacher, devra vérifier s’il elle est dans le cache ou non. Et ceci à un coût…

Vous pouvez calculer le taux d’efficacité du cache de requêtes avec la formule suivant:

Qcache_hits / (Qcache_hits + Com_select )

Pour finir, quelques paramètres et commandes

Paramètres principaux:

query_cache_size: Doit être différent de zéro pour activer le cache

query_cache_type:

  • ON: les requêtes select sont misent en cache

    • Sauf (SQL_NO_CACHE, result set trop grand, fonction non déterministe..)

  • DEMAND: SELECT SQL_CACHE

  • OFF

Commandes principales:

FLUSH QUERY CACHE

  • Défragmente le cache de requêtes

  • Ne vide pas le cache

Vider le cache de requêtes:

  • RESET QUERY CACHE

  • FLUSH TABLES

  • Redémarrer le serveur

Variables d’état: SHOW STATUS LIKE ‘Qcache%’ ;

Qcache_free_blocks : nombre de blocs libres

Qcache_free_memory : mémoire libre

Qcache_hits : nombre de fois qu’il a servi

Qcache_inserts : nombre de requêtes insérées

Qcache_lowmem_prunes : nombre de requêtes supprimées car plus de place

Qcache_not_cached : nombre de requêtes non « cachables »

Qcache_queries_in_cache : nombre de requêtes dans le cache

Qcache_total_blocks : nombre de blocs de mémoire

Tags:

1
oct

Utiliser XML avec MySQL 5.1 (part 5/5)

   Posted by: freshdaz   in MySQL

(<- précédent)

Jusqu’ici, la récupération des informations ne s’est opérée qu’en lisant un flux XML stocké dans une variable. Cependant, il est également possible de récupérer des informations XML stockées dans la base : il suffit pour cela de remplacer la variable par le nom du champs dans lequel est enregistré ce flux.

Comment trouver le type et les URL des flux RSS qui contiennent le mot France ?

Extraire les données d’un flux XML stocké en base

SELECT type, extractValue( flux_rss, « /rss/channel/item/link[ ../title[contains(.,'France')]] ») AS url FROM rss GROUP BY url HAVING url NOT LIKE  »\G
*************************** 1. row ***************************
type: international
url: http://www.lemonde.fr/asie-pacifique/article/2008/08/21/en-france-le-debat-s-intensifie-sur-le-renfort-des-troupes-en-afghanistan-decide-par-m-sarkozy_1086214_3216.html?xtor=RSS-3210
*************************** 2. row ***************************
type: technologie
url: http://www.lemonde.fr/aujourd-hui/article/2008/08/07/en-france-des-adversaires-des-jo-s-expriment-en-video-sur-la-toile_1081170_3238.html?xtor=RSS-651865

MySQL 5 implémente une autre commande pour pouvoir traiter des flux XML, la fonction updateXML(). Elle permet de modifier la sortie d’un document XML, sans modifier ce dernier.

Une remarque, cette fonction ne modifie que le premier nœud trouvé qui correspond à l’expression, ce qui limite son intérêt. De plus, la chaîne de remplacement est figée, il n’est donc pas possible de faire une transformation:

Remplacement de données XML avec updatexml

SELECT updatexml(load_file( ‘c:/formateur.xml’), ‘/opensource/formateur[2]/prenom’, ‘<prenom>aka XML fan</prenom>’) AS result \G
*************************** 1. row ***************************
result:
<opensource>
Les formateurs de l’équipe sont :
<formateur domaines= »MySQL PHP »>
<nom>Dasini</nom>
<prenom>Olivier</prenom>
</formateur>
<formateur domaines= »PHP XML »>
<nom>Allard</nom>
<prenom>Aka XML fan</prenom>
</formateur>
<formateur domaines= »Linux MySQL »>
<nom>Dumont</nom>
<prenom>Pierre</prenom>
</formateur>
et sont passionnés par l’open source.
</opensource>
/*Le fichier XML original n’est pas modifié*/

Conclusion

Voilà un petit panorama de l’utilisation des fonctionnalités XML de MySQL. Comme nous l’avons vu, générer le résultat d’une requête au format XML reste très simple avec le client texte mysql, idem pour la génération d’une sauvegarde (mysqldump). De plus, bien que n’étant pas un base de données XML, ont peut aisément y stocker des flux XML, et les parcourir ou les modifier grâce aux fonctions extractValue et updatexml, et une bonne dose d’XPath. Le support de ce dernier, par MySQL, reste encore assez basique, mais ce manque sera comblé progressivement dans les prochaines versions.

Article co-écrit avec Fabien Allard qui est formateur et développeur certifié PHP, Ajax et Linux chez Anaska Alter Way Group. Fabien est également spécialiste des technologies XML.

(Début de l’article)

Tags: , , , ,

logo ARTICLE 390

L’édition 2009 du rendez-vous incontournable des utilisateurs PHP en France s’installe à la Cité des Sciences de La Villette, les 12 et 13 novembre 2009.
Une édition qui mettra à l’honneur le couple PHP/MySQL, avec un invité de marque, pour la 1ère fois en France : Michael « Monty » Widenius.
L’événement estampillé AFUP (Association Française des Utilisateurs de PHP) réunira durant 2 jours quelques grands experts internationaux du monde PHP, qui viendront échanger autour des problématiques phares du langage open source. L’occasion de faire le point sur les évolutions fonctionnelle et technique, communautaire et entreprise de PHP.

Cette 9ème édition sera axée sur le couple PHP/MySQL, avec 8 conférences dédiées. LEMUG.fr, l’association francophone des utilisateurs de MySQL et partenaire de l’événement animera 3 conférences.

Le Forum PHP accueillera en exclusivité et pour la première fois en France, Michael « Monty » Widenius, le créateur de MySQL. Suite au rachat de MySQL AB dont il était le co-fondateur, Monty a créé l’Open Database Alliance, un consortium et un lieu d’échanges pour tous les acteurs de l’écosystème de la base de données. Par ailleurs il fonde Monty Program ab, et poursuit le développement de MariaDB. A ce titre Monty présentera une conférence intitulée : « MariaDB the future of MySQL ».

Le PHP se décline au féminin avec la participation de : Zoe Slattery, PHP Women. Zoe a œuvré pour le compte d’IBM pendant 20 ans. En 2007, elle s’implique dans la promotion de PHP et développe des phases de tests. Anna Filina, PHP Québec, animera une conférence dédiée aux décideurs sur l’analyse des comportements des développeurs.

Reconnu mondialement comme une alternative de choix aux langages de programmation .Net ou J2EE, PHP est aujourd’hui une technologie mature qui entre dans une phase d’industrialisation. Largement adopté dans le monde de l’entreprise, PHP est un élément clé des infrastructures Web.

L’édition 2009 sera l’opportunité d’aborder l’industrialisation, la professionnalisation et la maturation du langage PHP avec une formule qui fait son succès chaque année : des conférences animées par les meilleurs experts internationaux des retours d’expérience issus des grands comptes des ateliers pratiques

… :: FOCUS PROGRAMME – À NE PAS MANQUER ::…

Conférences

« MariaDB the future of MySQL » – Michael « Monty » Widenius, le père de MySQL « Oui, PHP est industriel ! » – Damien Seguy, Alter Way Consulting Conférences LEMUG.FR : Stéphane Varoqui consultant MySQL; Serge Frezefond, Directeur technique MySQL France, Sun Microsystems ; Olivier Dasini, Retour d’epérience de  MySQL à Orange Business Service. « Jouons avec PHP 5.3 » – Fabien Potencier, créateur du framework PHP Symfony et Co-fondateur de Sensio Labs. « PHP and MySQL : a good match » – Johannes Schlüter, Sun Microsystems. Johannes est responsable de la publication de la version 5.3 de PHP, Julien Pauli, architecte certifié PHP et ZendFramework chez Anaska Alter-Way Formation

Témoignages utilisateurs

Réplication MySQL, WAT TV Migration de J2EE vers PHP, M6 Web Ultimedia et Jukebo 2.0, Digiteka Retour d’expérience, Orange

A propos de l’AFUP L’Association Française des Utilisateurs de PHP (AFUP), est une association dont le principal but est de promouvoir le PHP auprès des professionnels et de participer à son développement.

Contact : bureau@afup.org

En savoir plus : http://afup.org/pages/forumphp2009/

Inscription: http://afup.org/pages/forumphp2009/inscription.php

Conférenciers: http://afup.org/pages/forumphp2009/conferenciers.php

Tags: , ,

16
sept

Utiliser XML avec MySQL 5.1 (part 4/5)

   Posted by: freshdaz   in MySQL

(<- précédent)

Les fonctionnalités XPath de MySQL 5

MySQL 5 offre la possibilité de pouvoir exécuter des requêtes XPath sur un flux XML, grâce à la fonction extractValue().

Le résultat récupéré est la concaténation de la valeur textuelle de chacun des nœuds trouvés (chaque valeur étant dissociée des autres par un espace blanc).

Comment récupérer la valeur de l’élément racine d’un flux XML ?

Extraire des données d’une variable contenant du XML

/*Contenu du fichier XML */

shell> cat formateur.xml
<opensource>
Les formateurs de l'équipe sont :
<formateur domaines="MySQL PHP">
<nom>Dasini</nom>
<prenom>Olivier</prenom>
</formateur>
<formateur domaines="PHP XML">
<nom>Allard</nom>
<prenom>Fabien</prenom>
</formateur>
<formateur domaines="Linux MySQL">
<nom>Dumont</nom>
<prenom>Pierre</prenom>
</formateur>
et sont passionnés par l'open source.
</opensource>

/* Initialisation de la variable @xml avec le contenu du fichier formateur.xml */

mysql> SET @xml = LOAD_FILE( './formateur .xml');

/* Récupération de la valeur de l’élément racine */

mysql> SELECT extractValue( @xml, '/opensource')\G
*************************** 1. row ***************************
extractValue( @xml, '/opensource'):

Les formateurs de l’équipe sont :

et sont passionnés par l’open source.

Comme vous pouvez le constater les éléments enfants de l’élément racine sont supprimés de la sélection : seul le contenu propre des éléments recherchés est donc intégré au résultat.

Autre exemple, on veut sélectionner le deuxième formateur de notre flux XML, ainsi que les formateurs qui ont pour domaine de compétence MySQL:

Extraire le deuxième formateur et les formateurs MySQL

mysql> SELECT extractValue( @xml, ‘/opensource/formateur[2]/nom’) AS Deuxieme, extractValue( @xml, ‘/opensource/formateur[contains( @domaines, "MySQL")]/nom’) AS MySQL;
+———-+—————+
| Deuxieme | MySQL |
+———-+—————+
| Allard | Dasini Dumont |
+———-+—————+

Comme vous avez pu le constater, XPath est également un langage d’interrogation. Examinons d’un peu plus près sa syntaxe.

Une expression XPath représente ce qui est appelé un chemin de localisation (très similaire au chemin permettant d’identifier un fichier) dans lequel chaque nœud est séparé des autres avec un /.

Généralement, la recherche s’effectue en fonction de deux types de nœuds distincts :

  • les nœuds éléments, renseignés par leur nom,

  • les attributs, indiqués par un @ accolé à leur nom.

Ainsi l’expression formateur/@domaines réfère l’attribut appelé domaines des éléments nommés formateur.

Pour pouvoir filtrer plus finement les éléments, XPath dispose des prédicats.

Chacun de ces prédicats est spécifié dans une paire de crochets [expression].

Une expression peut être soit une simple évaluation, soit utiliser une (ou plusieurs) fonction(s).

Par exemple formateur[@domaines="Linux MySQL"][contains( nom, "Dumont")]/prenom retrouve tous les prénoms des formateurs qui ont pour domaines Linux MySQL et qui possèdent un nom valant Dumont.

Les chemins de localisation utilisés peuvent être indiqués de façon absolue ou de façon relative. Dans ce deuxième cas, la recherche s’effectue en fonction du nœud contexte.

Dans l’expression précédente, l’attribut domaines testé est celui de l’élément formateur.

Enfin, il est possible de se déplacer dans l’arborescence (un . représente le nœud courant, et .. le nœud parent).

Ainsi formateur/prenom[../@domaines="Linux MySQL"][contains( ../nom, "Dumont")] est équivalente à l’expression précédente.

(à suivre… utiliser XML avec MySQL 5.1 : Extraire les données d’un flux XML stocké en base)

Tags: ,

8
sept

Forum MySQL: 12 et 13 Novembre 2009

   Posted by: freshdaz   in Conférence, MySQL, PHP

L’association LeMug.fr (MySQL User Group francophone) organisera son forum MySQL avec l’aide de l’Association Française des Utilisateurs de PHP (http://www.afup.org) les 12 et 13 Novembre 2009 à la Cité des Sciences et de l’Industrie.

Plusieurs conférences sont prévues sur la base de données MySQL avec des intervenants de renom. Le programme est en cours de finalisation !

Les membres de l’association LeMug.fr bénéficient d’une réduction sur le tarif global !

Pour vous inscrire ou vous tenir au courant : http://afup.org/pages/forumphp2009/inscription.php

Tags: , , , ,

4
sept

L’Europe hésitante sur le rachat de Sun par Oracle

   Posted by: freshdaz   in Divers, MySQL

Avalisé par les autorités américaines de la concurrence, le rachat de Sun par Oracle patauge encore en Europe. Rien n’indique que l’exécutif européen donnera son feu vert pour le moment, car il vient d’ouvrir une enquête approfondie.

Rien n’est encore joué ! Bien que les autorités américaines aient donné leur accord pour le rachat de Sun par Oracle, à Bruxelles, le dossier est encore en standby.

C’est en tout cas ce que rapporte Reuters, expliquant que l’intégration de Sun, et notamment celle de MySQL, au portefeuille d’Oracle est relativement gênante. Car purement et simplement, ceci pourrait faire d’Oracle un acteur sur les bases de données en position dominante. Ce qui n’a pas semblé choquer les autorités américaines.

La Commission Européenne a d’ailleurs ouvert aujourd’hui une enquête approfondie sur la fusion des deux groupes. Celle-ci doit être conclue au plus tard le 19 janvier 2010 ! Le commissaire à la concurrence a déclaré que « La Commission doit examiner très soigneusement les effets sur la concurrence en Europe lorsque la première entreprise mondiale de base de données se propose de racheter la première entreprise mondiale de base de données open-source ». D’où les doutes entretenus jusqu’ici…

Soulignons également que Sun a très récemment annoncé une perte sèche de 147 millions de dollars (contre un bénéfice de 88 millions de dollars sur un an) et un recul des ventes de 31% sur le dernier trimestre fiscal.

http://www.linformaticien.com/Actualit%C3%A9s/tabid/58/newsid496/6900/l-europe-hesitante-sur-le-rachat-de-sun-par-oracle/Default.aspx

Récapitulatif de la saga:

http://dasini.net/blog/2009/04/21/oracle-achete-sun-donc-mysql/

http://dasini.net/blog/2009/06/30/oracle-et-sun-sous-la-loupe-de-la-justice-americaine/

http://dasini.net/blog/2009/07/03/rachat-de-sun-par-oracle-la-communaute-reagit-sur-php-tv/

http://dasini.net/blog/2009/08/05/bruxelles-mene-son-enquete-sur-le-rachat-de-sun-par-oracle/

http://dasini.net/blog/2009/08/26/oracle-sun-cest-valide-cote-americain/

Tags: , ,

28
août

Combien de casquettes avez-vous ?

   Posted by: freshdaz   in Divers

Un article de mon ami Julien Pauli, qui traite du grand écart entre les compétences requises et demandées pour un projet web et les salaires proposés…

Le Web est un ensemble de métiers. Je suis étonné de voir qu’on en demande toujours plus à des personnes ayant principalement un profil de développeur Web, mais à la fin du mois, c’est pas toujours plus. Allons, le métier de Webmaster n’est plus le même qu’il y a 10 ans, réveillons nous !

Soyons raisonnables, 2 personnes ne peuvent assurer la gestion d’un projet Web complet, orienté MVC (disons à 15 contrôleurs)
De la conception, en passant par l’architecture, la modélisation et le traitement des données, jusqu’au développement, testé, documenté, sécurisé, l’hébergement du projet et le dimensionnement matériel; on peut compter déjà une bonne dizaine de corps de métiers différents, pouvant chacun être composé de plusieurs personnes.

Saurez-vous analyser le besoin ? Le modéliser sous forme d’objets, en utilisant UML et ses nombreux schémas ? L’architecturer façon patterns de manière à rendre l’application évolutive, testable et compréhensible ?
Saurez vous créer un modèle ? A savoir modéliser les données métiers, créer des procédures stockées, des déclencheurs, des patterns d’accès ?
Si l’application nécessite scalabilité, saurez-vous la faire monter en charge ? Partitionner vos tables ? Répliquez vos données et balancez votre charge correctement ? Serez-vous capables de développer ce projet, en écrivant bien sûr des tests, tout en gérant des caches. Etes-vous d’attaque pour présenter des données avec xHTML et CSS de manière valide ? Maitrisez-vous Javascript et Ajax pour offrir une expérience utilisateur poussée ?

Vous avez le droit de répondre oui, à ce moment là j’envie réellement votre salaire ! On peut savoir tout faire, mais ouvrons les yeux sur les métiers du Web : on ne peut pas savoir tout faire bien, déja parce que le Web est trop complexe pour cela, et ensuite parce qu’une journée ne compte que 24h dans laquelle on travaille en moyenne 8h (officiellement payées).

Alors restons raisonnables. Il existe beaucoup de projets dans lesquels les responsabilités sont clairement définies, et les colles que sont les chefs de projets, très compétents.
En parallèle il existe aussi trop de projets dans lesquels seules 2 à 4 personnes sont comptées, et doivent à elles seules tout gérer, le tout en un temps record.

Une compétence se paye, si vous les additionnez, vous additionnez donc les paies qui vont avec, sinon lâchez vite l’affaire (en tout cas moi c’est ce que je ferai). On ne peut pas demander à quelqu’un de savoir (bien) faire du SQL, du PHP, du CSS et mettre en place un serveur de production. C’est affolant les offres d’emplois qu’on retrouve demandant ces savoir-faire combinés, mais avec des salaires qui ne sont souvent pas à la hauteur.
D’un autre coté les offres Java (Web), elles, sont bien plus précises, et en général un projet se compose de sommes de compétences très pointues et très distinctes. Pourquoi pas en PHP ?

Moralité : un projet sera beaucoup plus abouti (et coutera donc moins cher, en partant de la conception jusqu’à la maintenance) s’il est la somme de quelques compétences très qualifiées et poussées dans un domaine restreint, plutôt que la somme de beaucoup plus de compétences mais trop variées et disparates.

http://blog.developpez.com/julienpauli/p7994/dev-web-generaliste/combien-de-casquettes-avez-vous/

Tags: , ,

28
août

The Linux Foundation Video Site:: Linux pub

   Posted by: freshdaz   in Divers

Dans quelques heures c’est le week-end qui commence :) Pour fêter cela, voici une petite pub pour la linux fondation, qui vente les mérites de tux.

Cette pub n’est pas récente mais est assez sympathique. A voir ou à revoir :)

http://video.linuxfoundation.org/video/1057

Tags: