Alianth - Linux ++ ! [ Alianth ] [ Développement ] [ Internet ]
  Alianth - Linux ++ !
Révision le 01 décembre 1999

Voilà deux nouveautés pour Linux++:
le prompt de bash simple et utile, compiler et installer votre kernel rapidement et sans bavure.


Truc et astuces :
  • N'oubliez pas votre .bash_history !
  • Customisez la barre de titre de vos xterm !
  • En C/C++, lancez des programmes externes et récupérez le résultat.
  • Utilisez ical, exploitez votre .calendar !
  • C++: les tables qui ont la classe ne débordent pas.
  • NEW Le prompt de bash ...
  • NEW (Re)Compiler votre kernel, installer votre kernel !
  • Programmation réseau :
  • Les bases de la programmation IP en C.
  • Les sources de base.

  • [HAUT] N'oubliez pas votre .bash_history !
    Quand vous utilisez bash (/bin/bash) comme shell vous avez automatiquement un fichier ~/.bash_history qui contient la liste des commandes que vous avez tapper depuis ... que vous utilisez bash sur ce compte.
    C'est très pratique, vous n'avez qu'à appuyer sur la flèche haut pour réutiliser les lignes que vous avez déjà tappées, mais cela peut aussi servir à voir ce que vous avez fait... Si le coeur vous en dit et que le fichier en question a des droits vous permettant de le voir, vous pouvez regarder ce que d'autres ont fait sur la machine.

    Bien entendu, je suis sûr que vous n'avez pas envie que d'autres vous espionnent.. pour cela plusieurs méthodes:
    - ne pas utiliser bash (passer à tcsh ou autre) mais c'est contraignant.
    - mettre votre .bash_history en mode 0600 mais "root" ou quelqu'un qui peut aller sur votre compte peut le voir.
    - effacer régulièrement: echo "" > ~/.bash_history
    Attention ici votre .bash_history gardera ce que vous avez tapper ou utiliser durant la dernière session y compris la ligne ci dessus.
    - idem mais dans votre .bashrc: efface à chaque login et la ligne n'apparait plus mais .bash_history garde quand même les dernières lignes tappées.
    - mettre dans votre .bashrc HISTFILE="/dev/null"
    ceci est la meilleure solution, bash va considérer que votre .bash_history s'appelle /dev/null, il sera donc toujours vide :) (NB: effacer .bash_history après !)
    - mettre dans votre .bashrc HISTFILE="unnomsecret"
    permet de cacher votre history sans vous en priver, évidemment quelqu'un qui connait le truc se ramêne à la 2e situation.

    [faites moi parvenir vos solutions :)]


    [HAUT] Customiser la barre de titre de vos xterm !
    Voici un exemple qui met votre nom d'user, le hostname et le chemin dans la barre de titre quand vous utiliserez "c" au lieu de "cd"...
    Ajouter ceci dans votre .bashrc ou .bash_profile si vous utiliser bash biensûr:


     c () { cd $* ; /bin/echo -ne "\033]2;" $USER@$HOSTNAME $PWD "\007" }
     c .
    Puis lancer un nouveau xterm.... le plus dur est d'utiliser "c" au lieu de "cd" :)
    BUG: sur la console et avec un screen ca donne un résultat pas génial donc à vous de voir (utilisez cd)...

    La version pour tcsh (dans votre .tcshrc):


     alias cd 'cd \!*; /bin/echo -ne "\033]2;"$USER@$HOSTNAME $PWD"\007"; set prompt = "`hostname | cut -d: -f1`:`pwd`> "'
     cd .
    Ici pas de problème, vous pouvez utiliser cd comme d'habitude.
    NB: ici on modifie le prompt en même temps, à vous de jouer pour faire votre version !
    [Thanks: TheRaphit (pour le \033]2..), Linux gazette (pour aide sur bash)]

    [HAUT] En C/C++, lancer des programmes externes et récupérer le résultat.
    C'est une opération très simple d'exécuter un autre programme à partir d'un programme en C/C++ avec "system" mais pour en récupérer le résultat c'est moins évident.
    Dans d'autres langages (perl par exemple) c'est plus simple certes mais le C à ses avantages :), voici donc une fonction qui remplace "system" et renvoie un "int" contenant le file descriptor à lire (read) pour avoir la sortie du programme (cf exemple plus loin).


    L'exemple (includes + main => rajouter la fonction) :


    [HAUT] Utilisez ical, exploitez votre .calendar !
    Ical est un petit utilitaire livré avec la RedHat (en autres probablement) qui sert de calendrier. On peut y enregistrer des rendez-vous et autres (une date, une heure, une durée et un texte), ical vous rappel alors à l'heure dite votre rendez vous et possède toutes les fonctions de base et plus encore.

    Un autre de ses avantages est d'enregistrer vos rendez vous sous un format texte dans ~/.calendar (Remarque: mettez le en mode 0600).
    Il est assez facile d'exploiter ce fichier dans d'autres programmes et je vous en propose d'ailleurs un plus loin. Je vous conseille donc d'utiliser ical si vous travaillez sous Linux :).

    Le programme suivant vous donne la liste de vos rendez vous de la journée (fomat texte, sortie standard), il est fait en perl et est un bon exemple pour exploiter ".calendar".
    Je vous conseille d'en faire une version modifiée qui donne le nombre de rendez-vous de la journée et de l'exécuter depuis votre .bashrc (ou équivalent).



    [HAUT] C++: les tables qui ont la classe ne débordent pas.
    Votre programme en C++ à des lacunes ? Il fait des segmentations fault ?
    Ce n'est pas irrémédiable, n'aller pas laisser tomber le C++ pour si peu, la première chose à faire est de ne pas oublier la rigueur dans votre programme (et surtout dans la conception), faire des petites fonctions, et tester chacune d'entre elles suffisemment !

    Ca ne suffit pas ? Alors voilà un peu d'aide ...
    Ici il s'agit de détecter et corriger les débordements de tableaux. C'est en effet l'un des problèmes courant du C/C++, comme il n'y a pas de test de débordement par défaut, de telles erreurs provoquent des comportements incohérents du programme, et c'est souvent difficile à diagnostiquer (sur de gros projets cela peut même mettre le programme en péril).

    Je vous propose d'utiliser une classe à la place de vos tableaux, en redéfinissant l'opérateur [], ainsi vous pouvez tester le débordement et agir en conséquence: afficher un message d'alerte précis, éviter le segmentation fault et au choix poursuivre ou stopper le programme. voici le code nds.h:

    Comme vous le voyez il s'agit d'un tableau de int implémenté par une classe (la taille du tableau est passée au constructeur).
    L'opérateur [] va permettre d'utiliser les objets comme des tableaux :).

    Voici l'implémentation de la classe avec un exemple nds.cc:

    Comme vous pouvez le voir le code ne diffère pas tellement d'un utilisation d'un tableau: pour la déclaration ont utilise "Tablo" à la place de "int" et (40) au lieu de [40], ensuite c'est identique..
    Au résultat près car ici on va voir que 2 débordement de tableau font afficher 2 messages d'erreur et le programme reste stable :)

    Mais ce n'est rien comparé à l'avantage de pouvoir adapter ce que fait la classe en cas de débordement: ignorer, stopper le programme, donner une valeur par défaut, envoyer un message d'erreur (sortie normale, ou mail, ou fichier de log..) etc..
    Ici vous pouvez voir que le constructeur réserve une place de plus qui sera utilisé dans tous les cas où l'index (de l'opérateur []) n'est pas valide: T[-1]==T[5000].

    Si vous avez d'autres bonnes idées dans le genre, je suis preneur !
    [Thanks: magazine programmez]


    [HAUT] Le prompt de bash ...
    Encore un article sur bash ! Et oui, si vous avez lu les articles précédant vous savez que bash est un shell sans problème qui a le mérite d'être compatible avec le sh historique (ce n'est pas le cas de tcsh).

    Alors pour apprendre à bien utiliser bash ... faites man bash :) Vous verrez comment définir des alias, des fonctions et des prompts !
    En résumé pour changer votre prompt il faut faire PS1='description de votre prompt' et pour rendre permanent ce prompt il faut ajouter cette ligne à la fin de votre ".bashrc". (attention à ne pas avoir de commande cd qui change le prompt).

    Voici quelques idées pour un beau prompt: mettre l'hostname ou plutôt une ou deux lettres qui l'identifient, mettre l'heure (très pratique quand on utilise beaucoup le shell :), suivi du répertoire courant et enfin le symbole '$' suivi d'un espace.
    En ne mettant que la dernière partie du répertoire cela donne: PS1='Z(\t) \W$ '
    A vous de jouer avec vos prompts :)

    Un peu de couleur ? essayer donc PS1='\033[1;31mZ\033[0m(\t) \W\033[1;32m$\033[0m '
    "[\033['code couleur'm" permet de mettre ce qui suit en couleur :)
    NB: Les codes couleurs sont de la forme "'0 ou 1';'30 à 37'"

    Aller, bon bash :)


    [HAUT] (Re)Compiler votre kernel, installer votre kernel !
    Voilà un sujet bien plus technique que les précédents mais qui intéresse tout bon root qui se respecte ...
    Le plus gros problème de la recompilation de noyaux reste le choix des bonnes options d'autant plus qu'il faut du temps pour les tester :)

    Se faire un nouveau noyau c'est:

  • Avoir le source dans /usr/src/linux (décompresser l'archive...)
  • Installer les patchs nécessaire depuis /usr/src: patch -p0 < votrepatch
  • Choix des options: make xconfig (ou autre méthode de config)
  • Compilation du noyau et des modules (cf. plus loin)
  • Optionnel: test du noyau avec une disquette (ex: avec mkbootdisk)
  • Installation du kernel: copie des fichiers, réglage de lilo.conf ...

    Pour le choix des options vous devez connaître bien les composants de votre PC et faire les choix les plus logiques (utilisez l'aide en ligne).
    Une remarque cependant à propos du choix entre 'y' et 'm': les modules permettent certes de diminuer la taille du kernel mais il ne sont accessibles qu'à partir d'un certain moment du boot, il est par exemple obligatoire d'inclure dans le kernel (pas dans les modules) les block devices, et types de partitions que vous utilisez.

    Pour la compilation en elle même, il faut d'abord préparer la compilation une fois les options fixées en exécutant dans /usr/src/linux la commande "make clean dep".
    Puis vient la compilation elle même, en général vous devrez faire "make bzImage" (pour avoir une image compressée du kernel). Pour accélérer la compilation utilisez l'option '-j n', par exemple "make -j 3 bzImage". Et pour finir sur cette commande, redirigez la sortie vers un fichier log et mettez le tout en tâche de fond (au cas ou votre X11 plante): "make -j 3 bzImage >& log &".
    Prenez votre temps et après compilation regardez la fin du fichier "log" pour vérifier que tout c'est bien passé.

    Passons aux modules en faisant "make modules" ou plutot "make -j 3 modules >& log&", puis vérifiez "log" et faites "make modules_install" si vous voulez installer les modules en question, mais vous pouvez aussi tester votre noyau sans les modules (utile pour ne pas à avoir à écraser les autres modules dans le cas où vous ne changer pas de version)

    Pour tester le kernel avec une disquette il faut mettre le kernel dessus et rebooter avec cette disquette :) Avec mkbootdisk de RedHat c'est assez simple mais il faut d'abord avoir mis le kernel sous le nom approprié dans /boot.

    Voilà, vous avez compilé le kernel; maintenant pour l'installer il est bien agréable de faire un petit script ou un /usr/src/Makefile :)
    Voici le mien, il résume les tâches à faire pour bien installer le kernel:

    Copier ceci sous le nom /usr/src/Makefile en mettant le bon numéro de kernel.
    NB: Makefile: il faut des tabulations devant les lignes exécutées (echo, cp, ..)
    Rm: il considère que le kernel source est dans /usr/src/linux.

    Ensuite comme indiquer dans le Makefile, éditer /etc/lilo.conf mettez le bon nom de kernel (vmlinuz-*) et lancer "/sbin/lilo" si vous utilisez lilo biensûr. (cf.: man lilo)

    Bonnes compilations et reboots :)


    EOF Document réalisé avec gimp, emacs, vi. Testé avec bash, tcsh, netscape, gcc, ls ...