U Classroom

Un blog collectif, orienté vers l'apprentissage et l'enseignement collaboratif et communautaire de techniques applicables aux unix libres.

En ce moment sur U Classroom

Session Apache/HTTP

Certains se croient encore en vacances et remettent sans cesse leurs projets au lendemain, mais il faut bien se mettre au travail à un moment donné.

Voila donc pour vous une session HTTP/Apache. Bien que l'on parlera du célèbre serveur web, son installation et sa configuration basique l'accent sera mis sur le principe des serveurs webs en général, d'ou une partie importante sur HTTP.

Rendez-vous le mardi 2 octobre à 20h30 heure de Paris (UTC+0200), comme toujours sur le channel irc #ubuntu-fr-classroom (serveur irc.freenode.net).


Prérequis pour ce cours qui s'annonce passionnant (sisi) :
  • Un système ubuntu (ou debian)
  • Avoir déjà utilisé la ligne de commande (se déplacer dans un répertoire, obtenir les droits root)
L'installation sera vue durant le cours mais les utilisateurs en 56k peuvent dès à présent télécharger les paquets suivants : apache2 apache2-mpm-prefork libapache2-mod-php5.

A bientôt !

Non, ce n'est pas la rentrée !

Bonjour à toutes et à tous,
comme vous l'aurez sûrement remarqué cela fait un petit peu de temps que la classroom est au repos (ceci n'ayant bien sûr aucun rapport avec les vacances).

Malgré tout, dans un élan de motivation collectif, quelques uns (FiFouille et moi même, pour ne citer qu'eux) on décidé de vous proposer une présentation de la cryptographie et de l'outil GnuPG. Seulement voila, il faut trouver le temps de faire ça entre les moments de travail (glande ?) et du fait de notre organisation pointue, cette session aura lieu dans le courant de la semaine 38. Nous vous tiendrons au courant de la date précise.

Je n'allais bien sûr pas faire un billet pour vous expliquer qu'une session allait avoir lieu dans deux semaines bien sûr, mais pour vous annoncer que mardi 11 septembre, à partir de 20 heures (heure de Paris) allait avoir lieu une petite session sur l'introduction au fonctionnement des réseaux locaux.
Pourquoi une petite session allez vous me demander ? En fait, petite n'est pas le mot approprié, mais le concept de cette session ne va pas être de faire une présentation théorique et complète sur les LANs (Local Area Network). Mais plutôt de vous présenter quelques concepts simples, démystifier un peu le fonctionnement, et vous amener ainsi à vous poser des questions et à suivre un raisonnement logique.
Cette session se déroulera en deux parties: la première permettra de vous présenter quelques concepts, et la deuxième donc, de répondre à vos innombrables questions.

A mardi !

Le point sur les PPAs

Depuis peu, on a vu apparaître une nouvelle fonctionnalité sur Launchpad : les Personal Package Archives, ou PPAs.
Cet outil permet aux packageurs de tous horizons et tous niveaux de construire et héberger leurs propres paquets en profitant de la structure déjà mise en place par Canonical pour les dépôts officiels.

L'annonce de la mise à disposition des PPAs par l'équipe de développement de Launchpad a été accueillie de façon très enthousiaste par bon nombre de packageurs.
Les PPAs ont en effet un avantage indéniable pour le développement et l'assurance qualité des paquets, en permettant par exemple de tester ces derniers avant leur envoi dans les dépôts officiels Ubuntu.
Les équipes ont également la possibilité de créer leur propre PPA, facilitant le travail collaboratif, puisque les membres d'une même équipe (telle que Medibuntu ou MOTUMedia) ont la possibilité d'utiliser un PPA commun pour travailler sur leurs paquets.

Mais au-delà de tous ces intéressants aspects (pour le développeur), réside une source de problèmes pour l'utilisateur.
Une dérive possible de l'utilisation des PPAs est le phénomène Pidgin.
En effet, lors du renommage de Gaim vers Pidgin, on a vu fleurir de nombreux paquets non-officiels... chacun se mettant à recréer depuis zéro son petit paquet personnel de plus ou moins bonne qualité (plutôt moins que plus d'ailleurs).
Il est aisé de prédire que ceci va s'étendre aux PPAs. D'ici quelques semaines, on disposera probablement d'une bonne demi-douzaine de PPAs proposant le même programme pour une même version d'Ubuntu (par exemple, pidgin pour Ubuntu 6.06). Comment s'assurer de la qualité des paquets, comment gérer les conflits qui naîtront entre les différents PPAs ? Le problème, qui a déjà été évoqué a plusieurs reprises concernant les dépôts tiers, pourrait donc prendre une dimension bien plus importante cette fois.

Il faut savoir que les PPAs sont également utilisés par les développeurs Ubuntu, et donc que la construction de 12 paquets Pidgin engendre une attente non négligeable pour ces packageurs.

L'argument récurrent concernant la légitimité de dépôts tiers est la mise à disposition de versions plus récentes de logiciels. C'est un argument fallacieux. Les versions stables d'Ubuntu le sont en grande partie grâce au gel des versions des logiciels. Importer une nouvelle version c'est ajouter un gros risque de bugs, de régressions ou de problèmes de dépendances, en particulier lors de mises à jours de bibliothèques ou de logiciels système (une mise à jour de dbus peut apporter beaucoup plus de soucis que de nouveautés). C'est d'ailleurs pour cette raison que les mises à jour pour les versions stables d'Ubuntu sont aussi limitées que possible (et n'apportent *jamais* de nouvelles versions de logiciels).

Un autre argument très souvent avancé est la mise à disposition de paquets n'existant pas dans Ubuntu (ou dans Debian). Il existe déjà des structures telles que http://mentors.debian.net/ ou encore http://revu.tauware.de/ qui permettent de proposer des paquets à l'inclusion dans les dépôts officiels Debian et Ubuntu.
De plus, si vous avez besoin d'aide, <pub>le chan #ubuntu-fr-classroom@irc.freenode.net est toujours peuplé de MOTU/core-dev/aspirants Développeurs Debian prêts à vous accueillir avec le sourire, dans la joie et la bonne humeur</pub>.

Conclusion: utilisez les PPA avec précaution (néanmoins si vous désirez réellement casser votre système, vous pouvez également utiliser Automatix2, efficacité garantie)

(Ce billet est fièrement propulsé par Gobby !)

LANG=C

Si un jour vous avez à écrire un script qui parse la sortie std{in,err} d'un programme, pensez à le lancer dans une langue donnée en mettant à jour la variable d'environnement LANG.

Ca peut vous éviter une prise de tête pas possible pour comprendre pourquoi le script a décidé de ne plus fonctionner du jour au lendemain (oui oui, c'est du vécu).

Exemple :

gauvain@joe:~# parted --script /dev/sda print | grep "^Disk" | awk '{print $3}' | sed 's/GB//'
160
gauvain@joe:~# LANG=fr_FR.UTF8 parted --script /dev/sda print | grep "^Disk" | awk '{print $3}' | sed 's/GB//'
gauvain@joe:~# 

Prochaine session classroom: Initiation au packaging Debian/Ubuntu

Une de vos application préférée pas encore packagée ? Vous souhaiteriez vous en charger vous-même, ou tout simplement apprendre à packager des softs pour Debian/Ubuntu ? Dans ce cas ce cours est fait pour vous, rendez-vous le vendredi 13 Juillet à 18H UTC (20H à Paris) sur le canal #ubuntu-fr-classroom du réseau freenode (irc.freenode.net).

Nous verrons dans un premier temps de quoi est constitué un package Debian, puis comment en créer un manière (pas puis plus) propre, et enfin comment faire pour que son paquet soit inclus dans les Dépôts officiels de notre distribution préférée :-)

Prérequis pour le cours:

  • Avoir installé pastbinit (sudo aptitude install pastebinit)
  • Avoir installé debhelper cdbs linda build-essential fakeroot devscripts pbuilder dh-make debootstrap (sudo aptitde install...)
  • Avoir installée la version suivante de lintian: http://people.dunnewind.net/arthur/... (wget puis dpkg -i, ou gdebi...)
  • Si possible avoir déjà Compilé un programme et éventuellement savoir ce qu'est un Makefile
  • Avoir déjà utilisé la ligne de commande

Rassurez vous si ces deux dernières notions ne vous sont pas encore familières, elle seront brièvement expliquées pendant le cours ;-)

Note: ce cours est aussi valable pour Debian que Ubuntu, donc utilisateurs Debian, venez nombreux !

A vendredi !

Création et restauration d'images de disques sous Linux

Lors de l'utilisation de postes dans un cadre d'entreprise, il est fréquent de vouloir reproduire la même configuration sur plusieurs postes. L'idéal est donc de configurer un premier ordinateur, puis de faire une image (appelée 'ghost') du disque pour la reproduire sur les autres ordinateurs. Voici donc un petit tutorial tout simple vous permettant de le faire :)

Prérequis

  • Un ordinateur près à cloner
  • Une distribution linux live

Environnement

Cette manipulation a été effectuée dans les conditions suivantes :

  • Système Ubuntu feisty
  • Live grml 1.0
  • Répertoire de stockage de l'image sur serveur distant accessible via samba

Création de l'image

Bon voila, mon système est tout beau tout propre sur mon premier ordinateur, je veux donc créer une image.

1) Redémarrez sur la live 2) Avant toute manipulation, installez lzop sur le système live si ce n'est pas déjà fait (lzop est un utilitaire de compression plus rapide que gzip / bzip)

apt-get install lzop

3) Montez le répertoire devant contenir l'image finale

mkdir /mnt/smb && mount -t smbfs -o username=usersmb //<monserveur>/<monpartage> /mnt/smb

4) On va donc récupérer le contenu du disque à l'aide de l'utilitaire dd et le compresser via lzop. De plus, si le système de fichier qui va contenir l'image ne peut dépasser 2Go par fichier, il va falloir découper l'image à l'aide de l'utilitaire split . Je suppose que le disque devant être cloné est en /dev/sda . A vous d'adapter.

dd if=/dev/sda | lzop -5 | split -b 2000m - /mnt/smb/images/monimage_

Explications :

dd nous permet de récupérer le contenu du disque. Ensuite, on compresse ce contenu en l'envoyant à l'aide d'un pipe à la commande lzop. L'option -5 correspond, comme pour gzip, au taux de compression (-1 : peu compressé, -9 : compression maximum). Enfin, on envoi le contenu compressé à split, auquel on demande de découper ce qu'il reçoit sur l'entrée standard (via l'argument - ) en fichier de 2000m, soit 2Go. On donne à split le path de destination, il s'occupera de suffixer le nom du fichier donné par 'aa', 'ab' ...

Et voilà, le temps d'aller prendre un (voire deux ou trois) café(s), vous aurez votre disque en images compressées.

Réplication de l'image

Bon, on a notre image, maintenant on aimerait bien la copier sur les autres ordinateurs :) Rien de plus simple.

1) On commence par remonter notre système de fichier distant :

mkdir /mnt/smb && mount -t smbfs -o username=usersmb //<monserveur>/<monpartage> /mnt/smb

2)Ensuite, il faut concaténer les images, décompresser le fichier obtenu et le recopier sur le disque, ce qui donne :

cd /mnt/smb/images && cat monimage_aa monimage_bb monimage_cc | lzop -d | dd of=/dev/sda

Simple ... non ? cat concatène les différentes images < 2Go, passe l'image recomposée à lzop qui va la décompresser, et l'image une fois décompressée est passée à dd en lui demandant de l'écrire sur le disque /dev/sda .

Allez, un (deux, trois) autre(s) café(s), et votre clonage est fini. Il ne reste plus qu'à redémarrer sur votre nouveau système !

Avertissement :

Votre système cloné est parfaitement identique au premier. Pensez donc à changer les paramètres tels que l'IP si celle ci est configurée en statique, le nom d'host, etc ...

Prochaine session Classroom : Votre propre Live CD

Avoir LE LiveCD qui va bien, celui qui fait juste ce qu'il vous faut, et rien d'autre, avaec votre propre thème graphique, votre fond d'écran, ça vous branche ? Tant mieux, car on en parlera Jeudi 05 Juillet sur freenode (canal #ubuntu-fr-classroom) à 20H00, heure Parisienne (18H00 UTC).

Une session en deux parties sera proposée. La première vous proposera une solution pour installer/desinstaller les paquets que vous voulez, et changer la configuration par défaut. La seconde, pour les utilisateurs un peu plus avancés, partira à la découverte de casper, logiciel qui gère le lancement du LiveCD.

Pour préparer la session, pensez juste à télécharger une iso Ubuntu Desktop quelconque (pour éviter des problèmes de compatibilité, récupérez la même version que votre système principal).

A jeudi !

Medibuntu.org, ça y est !!!

Des semaines que vous en entendez parler, des jours que vous l'attendiez, mais ça y est, medibuntu.org est là !!!

Enfin prêt, le domaine medibuntu.org est maintenant le domaine officiel du projet MEDIBUNTU.

Vous êtes certainement très nombreux à utiliser les dépots Medibuntu sur votre distribution favorite. Rappelons que Medibuntu propose des paquets non disponibles sur les dépôts officiels essentiellement pour des raisons légales. Jusqu'à présent, il fallait se rendre sur http://medibuntu.sos-sts.com pour effectuer les modifications dans votre gestionnaire de paquets ou en éditant le fichier /etc/apt/sources.list.

En plus de la nouvelle adresse, la venue de medibuntu.org apporte un lot considérable de réorganisations.

1) Les dépôts sont maintenant découpés en 3 sous groupes :

  • http://fr.packages.medibuntu.org : mirroirs français
  • http://de.packages.medibuntu.org : mirroirs allemand
  • http://packages.medibuntu.org : mirroirs généralistes

Ceci afin d'optimiser votre utilisation.

2) Les listes de diffusions sont maintenant :

  • general@lists.medibuntu.org : Discussion généraliste
  • bugs@lists.medibuntu.org : Rapports de bugs, utilisée lors d'un rapport sur Launchpad
  • announce@lists.medibuntu.org : Liste permettant d'effectuer des annonces sur un changement dans Medibuntu
  • servers@lists.medibuntu.org : Liste de discussion sur l'aspect technique de Medibuntu

Nous vous encourageons à vous inscrire aux listes pour nous faire part de vos avis et pour nous permettre de vous tenir facilement au courant. Vous trouverez une interface d'inscription ici

Bien évidemment, les anciennes adresses (medibuntu.sos-sts.com) resteront actives un certains temps, néanmoins, pensez à changer votre configuration dès que possible (cf le Wiki Ubuntu-fr)

Vous trouverez toutes les informations nécessaires à l'utilisation de Medibuntu sur le site officiel : http://www.medibuntu.org .

L'équipe Medibuntu vous souhaite une agréable utilisation de son service .

Des sous-menus déroulants non obstrusifs avec Jquery

A la demande générale (les absents ont toujours tord), voici une reprise de mon billet qui va vous expliquer comment réaliser assez rapidement un système de menus déroulant grâce à Jquery, le tout de manière non obstrusive (un navigateur texte ou avec javascript désactivé doit pouvoir accéder à tous les éléments).

Je cherchais ici à réaliser une page d'accueil qui comprend plusieurs rubriques et sous-menus.
Le nombre d'éléments à présenter étant trop important il fallait cacher les sous-menus et les afficher à la demande.
Le tout devant être non obstrusif j'ai finalement décidé d'utiliser Jquery pour réaliser des menus déroulant.

La solution est ainsi très élégante et ne requiert que peu de Javascript. Le balisage HTML reste également très propre et valide même si on peut encore améliorer ce côté-ci.
Analysons ce dernier :

<div id="menus">
    <div id="enfants">
        <h2>Accueil d'enfants</h2>
        <ul>
            <li id="enfants_da">
                <a href="#">Déficients auditifs</a>
                <ul>
                    <li><a href="#">Centre 1</a></li>
                    <li><a href="#">Centre 2</a></li>
                    <li><a href="#">Centre 3</a></li>
                </ul>
            </li>
            <li>
                <a href="#">Déficients visuels</a>
                <ul id="enfants_dv">
                    <li><a href="#">Centre 1b</a></li>
                    <li><a href="#">Centre 2b</a></li>
                    <li><a href="#">Centre 3b</a></li>
                </ul>
            </li>
        </ul>
    </div>

    <div id="adultes">
    <!-- Même balisage que pour les enfants -->
    </div>
</div>


Par défaut on doit voir uniquement le titre de la rubrique (le <h2>) ainsi que les liens.
Le tout doit également être visible avec un navigateur ayant le javascript désactivé mais utilisant les CSS, on ne va donc pas utiliser directement ceux-ci pour cacher le <ul> des sous-rubriques.

Voici le code javascript qui utilise donc Jquery.

<script type="text/javascript">
    $(document).ready(function(){

    $("#menus div ul ul").hide();
    $("#menus div ul ul ul").show(); //sous-sous-menus

    $("#menus div ul li a").click(function(){
        $(this).parent().parent().children("li").find("ul.montre").slideToggle("").removeClass("montre").addClass("matched");
        $(this).parent().children("ul").not(".matched").addClass("montre").slideToggle("slow");
        $(this).parent().parent().children("li").find("ul.matched").removeClass("matched");
        if ($(this).attr("href") == "#") {
            return false;
        }
    });

    }); //fin onready
</script>

    
Notez que ce code suffit pour _tous_ les menus (les <div id="enfants">, <div id="adultes"> etc).
Le tout est donc assez compact et élégant en plus d'être adaptable facilement.

Commencons par la fonction de base à utiliser : $(document).ready();
Le paramètre à passer à cette fonction est une fonction qui sera appelée lorsque le DOM sera prêt (entre le chargement du HTML et celui des éléments externes tels que les images).
Remarquez si vous ne le saviez pas que Javascript nous permet d'utiliser ici une fonction anonyme : function(){} en paramètre, ce qui évite de créer la fonction ailleurs.

Le code commence donc réellement à l'intérieur de cette fonction.
La première ligne permet de cacher les sous-menus. La fonction $() retourne les éléments Jquery qui correspondent aux sélecteurs demandés en paramètre. On peut utiliser comme ici du CSS mais aussi Xpath par exemple.
Cette fonction est comparable à la fonction $$() de Prototype.
On applique donc ici la méthode hide() à tous ces éléments. Tous les sous-menus seront ainsi cachés (facile non ? :) ).
La deuxième ligne est nécessaire pour éviter aux sous-sous-menus (des <ul> dans les <ul> des centres, ici cela peut-être des services internes d'un centre) de rester constamment cachés à cause de la première règle.

Passons donc au coeur de la technique avec la fonction suivante. Ici on applique à tous les liens une méthode qui permet de leur associer une action lors d'un clic (au lieu d'utiliser onclick directement dans le HTML).
Comme pour le $(document).ready(); on passe une fonction anonyme en paramètre qui représentera l'action à effectuer.

La première ligne de cette fonction montre la particularité de Jquery qui est le chaînage des méthodes. Chaque méthode renvoie en effet l'élément sur lequel il agit.
Le $(this) représente ici l'élément sur lequel on greffe l'évènement, c'est donc la balise <a> dans notre cas.
Les deux parent() permettent de remonter dans le DOM : on se retrouve donc à agir sur la balise (on devrait parler de noeud plus exactement) <ul>.
Avec children("li") on peut voir que Jquery va gérer sans problème le fait que l'on se retrouve avec plusieurs éléments.
find() permet ensuite de 'trier' les éléments trouvés, ici un <ul> qui possède la classe montre.
On applique ensuite la méthode slideToggle() qui est celle qui permet d'obtenir l'effet de menu déroulant (voir la démo sur le site de Jquery).
On enlève ensuite la classe "montre" avec une simple méthode.

La deuxième ligne est celle qui va montrer le sous-menu demandé (le <ul> présent dans le même <li> que le lien) et y ajouter la classe montre.
La troisième enlève la classe "matched" à tous les éléments qui la possédaient auparavant.

Un peu d'explications : les éléments montrés se voient ici appliqués la classe "montre" ce qui permet de savoir quels éléments sont affichés ou non.
En effet on souhaite n'afficher qu'un seul sous-menu à la fois, il faut donc cacher les sous-menus déjà montrés (ceux qui possèdent la classe montre).
La classe matched permet d'éviter de cacher puis remontrer directement un sous-menu sur lequel on a cliqué deux fois :
en effet, on peut imaginer que si l'utilisateur clique sur un sous-menu une deuxième fois ce sera pour le cacher.
On trie donc dans la règle d'affichage les éléments matched car on sait que ceux-ci ont déjà été cachés. On enlève ensuite cette classe pour éviter des problèmes à la prochaine utilisation.

Le dernier test permet de renvoyer false si le lien a pour cible '#'. Cela permet de ne pas remonter en haut de la page, mais laisse la possibilité d'utiliser de vrais liens dans le menus (si l'on ne souhaite pas de sous-menus dans une partie précise).

C'est tout ! Je ne propose pas de capture d'écran ou de démo, mais voici une partie du CSS que j'utilise :

#menus {
margin-left: 20px;
overflow-y: auto;
overflow-x: hidden;
font-size: 14px;
font-family: Verdana, sans-serif;
font-weight: bold;
color: #456b90;
height: 700px;
}
#menus a {
text-decoration: none;
}
#menus div {
position: absolute;
margin-top: 10px;
}
#menus div ul {
width: 150px;
margin-top: 0px;
margin-left: 0;
padding-left: 20px;
background-color: #FFFFFF;
}
#menus div h2 {
font-size: 19px;
font-family: "Trebuchet MS", sans-serif;
margin-bottom: 7px;
}
#menus div ul li p {
margin: 1px;
padding: 4px;
}
#menus div ul li ul {
background-color: #75b9e4;
padding: 4px;
font-size: 12px;
font-weight: normal;
list-style-type: none;
margin: 0;
}

#enfants {
left: 700px;
top: 30px;
}
#enfants h2 {
color: #6be32f;
}


Chaque sous-partie (enfants, adultes etc) est positionnée de manière absolue dans la page avec left et top.

On peut donc conclure en affirmant sans problèmes que Jquery permet de réaliser plusieurs effets graphiques dans la page, de manière assez simple et surtout en restant accessible et non obstrusif :)

J'ai peu parlé de Jquery, on aurait pourtant pu dire que la lib est légère (une version compressée étant de plus disponible), rapide, bref un bon candidat au remplacement de Prototype. Voici quelques liens pour en savoir plus :

Python pour dynamiser vos sites (épisode IV - un nouvel espoir)

Chez Ubuntu on aime bien python, et on aime bien faire des petits scripts qui génèrent des pages web (pour des stats par exemple). Et on a même la chance de pouvoir créer des pages dynamiques avec python !

J'ai eu un peu de mal à trouver une documentation pas trop mal faite qui donne les bases de l'utilisation de mod_python de manière simple et efficace. Essayons de remédier à ça.

Notes à propos de ce document

  • Mieux vaut connaître un minimum python pour le suivre ;
  • pour faciliter les choses, on suppose que les fichiers créés le sont à la racine du serveur web.

Lire la suite...

- page 4 de 5 -

haut de page