Julien Bert

vendredi 4 juillet 2008

Memo : installation serveur Debian

Petit memo des etapes et des bouts de code pour deployer et configurer un serveur Debian


1. Installer Debian
Pour info une install netinstall de base (X11) ~ 1,4 Go et 40 Mo de RAM (a revoir pour une installe plus legere, du moins sans X11).
Dans le cas ou c'est installe avec un autre OS nottament aussi un GNU/Linux, ne pas ecraser le MBR, regarder le point de montage pour booter Debian

fdisk -l

Par exemple si c'est la troisieme partition sur le premier disque (hd0), le point de montage de la Debian est hd0.2. Ensuite rajouter dans le menu de Grub ou pointer pour booter Debian, l'exemple et trouve dans le menu.lst de la Debian

emacs /boot/grub/menu.lst
title		Debian GNU/Linux, kernel 2.6.18-6-486
root		(hd0,2)
kernel		/boot/vmlinuz-2.6.18-6-486 root=/dev/hda3 ro vga=791
initrd		/boot/initrd.img-2.6.18-6-486

vga=791, permet d'avoir la console en 1024x768. Si le menu de Grub n'est pas propose au demarrage, appuyer sur Echap au moment du boot, la liste apparaitra, ou alors changer dans le menu.lst


2. Installer quelques logiciels

Premierement enlever le cd-rom comme liste de source de paquet, je prefere telecharger les applis, commenter la ligne du cd-rom dans /etc/apt/sources.list, puis installer emacs

apt-get install emacs

Les commandes de gestions des paquets

apt-get install
apt-get remove
apt-get update
apt-get upgrade
apt-cache search

Pour connaitre si un paquet est dejas installe

dpkg -l | grep emacs

3. Installer ssh

Commencer par installer ssh (serveur et client)

apt-get install ssh

Verifier que le servie ssh en tant que serveur est installer et fonctionne

/etc/init.d/ssh reload

jeudi 3 juillet 2008

Memo : installation serveur FreeBSD

Petit memo des etapes et des bouts de code pour deployer et configurer un serveur FreeBSD


1. Installer FreeBSD
Pour info une install user ~ 300 Mo.
Ne pas oublier d'ajouter les paquets pour bash et emacs, afin de se sentir comme a la maison.
Dans le cas ou c'est installe avec un autre OS comme GNU/Linux, ne pas ecraser le MBR, regarder le point de montage pour booter FreeBSD

fdisk -l

Par exemple si c'est la troisieme partition sur le premier disque (hd0), le point de montage de la FreeBSD est hd0.2.a. Ensuite rajouter dans le menu de Grub ou pointer pour booter FreeBSD

emacs /boot/grub/menu.lst
# FreeBSD 7.0:
title      FreeBSD
root       (hd0,2,a)
kernel     /boot/loader

Si le menu de Grub n'est pas propose au demarrage, appuyer sur Echap au moment du boot, la liste apparaitra, ou alors changer dans le menu.lst


2. Configurer le shell

Par default c'est un shell csh, pour verifier

echo $SHELL

Installer un shell de type bash

cd /usr/ports/shells/bash
make install clean

Apres telechargement, compilation, installation et nettoyage, on verfiie ou est installer bash

whereis bash
bash: /usr/local/bin/bash

Maintenant il faut switcher sur notre nouveau shell, a faire pour chaque session des utilisateurs (avec le mdp de passe de la session)

chsh -s /usr/local/bin/bash

Supprimer l'horrible beep de la console

xset -b
kbdcontrol -b off
sysctl hw.syscons.bell=0
set bell-style none

Apres essaie dans mon cas seul cette commande est suffisante, a placer dans le /etc/profile

kbdcontrol -b off
3. Installer emacs

On installe sous editeur favorie. Pour cela on va commencer par mettre a jours les ports, si portsnap n'est pas installe le faire

pkg_add -r portsnap
portsnap fetch
portsnap extract
portsnap update

On installe emacs

cd /usr/ports/editors/emacs
make install clean

Bon, je n'arrive pas a regler le probleme de l'ACPI a cause de mon portable (en faite y a pas encore de soluce), avec un petit

sysctl -a | grep acpi

J'obtient la temperature du proc qui est a 97 C, proche de la compure, alors qu'il est charge a 0,4% a peine avec une RAM charger a 8 Mo. Javais eu le meme probleme avec Gentoo. Tous sa pour dire, que je reprends tous a zero pour le serveur avec une petite Debian Etch... a suivre

vendredi 27 juin 2008

Utilisation de pickle, sauvegarde de variables

Le premier reflexe lorsqu'on veut sauvegarder un fichier, c'est de se demander qu'elle strucutre je vais utiliser ? Si c'est un fichier contenant des resultats, comme une liste de flottant, je vais ecrire ligne par ligne dans mon fichier la valeur de chaque entree de la liste. Si c'est un fichier de configuration ou autres, on va reflechire a une structure plus complexe, si je prends l'exemple d'un carnet d'adresse contenant NOM, PRENOM, NUMERO, ADRESSE, ... on va ecrire pour chaque individue dans le carnet d'adresse, la sequence NOM_0, PRENOM_0, NUMERO_0, ADRESSE_0, NOM_1, PRENOM_1, ... l'une a la suite de l'autre dans le fichier de sauvegarde. Si maintenant j'ai quelque chose d'encore plus complexe par exemple, je ne sais pas, une note a personnel pour chaque personne de mon carnet, on voie tres bien que cela devient vite une usine a gaz pour sauvegarder et lire les donnes. On est tous passer par la, lorsqu'on a fait un peu de C/C++. Il existe dans certain language (genre Matlab) la possibilite de sauvegarder ses variables dans le but de les re-utilisers plus tard. Bien evidemment, python a une fonction qui utilise se merveilleux principe qui nous simplifie la vie pour la sauvegarde/lecture de donnees.


pickle est un module d'une simplicite, s'en est presque deprimant, lorsque je me rememore le temps perdus a la programmation de fichier de sauvegarde....pfff. Avec pickle, vous prennez la variable et vous la sauvegardee. Pour la lire il suffit de la charger. C'est finie. Je prend un exemple : je desire sauvegarder des mesures de temperatures (flottant de 0 a 100), avec le nom de l'endroie de la mesure (chaine de caracteres taille inconnue), ainsi que l'humidite (entier de 0 a 100). Pour chaque mesure j'ai des types de variable differentes, flottant, entier et chaine de caracteres. Pour chaque mesure je sauvegarde dans un dictionnaire comme ceci :


nombre_de_mesure = 10

# on fait sa petite structure
data = {}
data['nom']   = [None] * nombre_de_mesure
data['temp']  = [0.0]  * nombre_de_mesure
data['hygro'] = [0]    * nombre_de_mesure

for n in xrange(nombre_de_mesure):
     data['nom'][n]   = 'nom_%d' % n       # je met des trucs bidons
     data['temp'][n]  = (n * 10)/2.1       # je remplit de flottant
     data['hygro'][n] =  n * 10            # je remplit d'entier

si on fait un print data, on obtient ca :
{'hygro': [0, 10, 20, 30, 40, 50, 60, 70, 80, 90], 'nom': ['nom_0', 'nom_1', 'nom_2', 'nom_3', 'nom_4', 'nom_5', 'nom_6', 'nom_7', 'nom_8', 'nom_9'], 'temp': [0.0, 4.7619047619047619, 9.5238095238095237, 14.285714285714285, 19.047619047619047, 23.80952380952381, 28.571428571428569, 33.333333333333329, 38.095238095238095, 42.857142857142854]}
vous vous imaginez devoir sauvegarder ca en C, c'est faisable mais bon, moi je fais comme cela :


import pickle
f = open('monfichier.toto', 'w')        # ouverture du fichier en ecriture
pickle.dump(data, f)
f.close()

C'est rapide hein... je sais c'est deprimant de ne pas avoir connu sa plus tot, c'est ce que je me suis dit le jour ou c'est decouver pickle. Bon, si on va voir maintenant dans le fichier monfichier.toto, pickle a cree une structure de sauvegarde pour vous, regardons le fichier :


(dp0
S'hygro'
p1
(lp2
I0
aI10
aI20
aI30
aI40
aI50
aI60
aI70
aI80
aI90
asS'nom'
p3
(lp4
S'nom_0'
p5
aS'nom_1'
p6
aS'nom_2'
p7
aS'nom_3'
p8
aS'nom_4'
p9
aS'nom_5'
p10
aS'nom_6'
p11
aS'nom_7'
p12
aS'nom_8'
p13
aS'nom_9'
p14
asS'temp'
p15
(lp16
F0.0
aF4.7619047619047619
aF9.5238095238095237
aF14.285714285714285
aF19.047619047619047
aF23.80952380952381
aF28.571428571428569
aF33.333333333333329
aF38.095238095238095
aF42.857142857142854
as.

Maintenant d'un autre logiciel, on d'une autre session de votre soft, pour lire votre fichier c'est comme ceci :


import pickle
f    = open('monfichier.toto', 'r')    # ouverture du fichier en mode lecture
data = pickle.load(f)
f.close()

si vous demandez les donnees pour la 3ieme mesure


print 'nom: %s   T = %6.2f C  hyg = %2d %%' % (data['nom'][2], data['temp'][2], data['hygro'][2])

on obtient ceci:
nom: nom_2 T = 9.52 C hyg = 20 %
on aurrait put definir la strucutre du dictionnaire differemment au lieu de data['nom'] = [liste des nom], travailler par mesure :


data[0] = ['nom_1', 12.3456, 20]

de toute facons dans tous les cas c'est pickle qui gere la structure du fichier, et on peut sauvegarder bien plus que list et dictionnaire, allez voir sur le net.

jeudi 26 juin 2008

Memo : travailler sur les chaines de caracteres

Quelques morceaux de codes sur le traitement des chaines de caracteres en Python, parce que j'en ai marre de ne jamais retrouver le petit bout de papier griffone ou j'avais le petit code qui va bien.


* Formattage des sorties textes:


print '%6.2f %%' % 15.26

-> ' 15.26 %'


print '%s test' % 'petit'

-> 'petit test'


print '%5d' % 15

-> ' 15'


print '%11.4e' % 12345.678

-> ' 1.2346e+04'


print '%.1f' % 12345.678

-> '12345.7'


print 'run%s%d' % ('_'*10, 2)

->'run__________2;


v = [1, 2, 3]
print 'vecteur : %s' % v

-> 'vecteur : [1, 2, 3]'


* Obtenir la chaine formatter d'un nombre i (12) pour n (4) chiffres:


print str(i).rjust(n, '0')

-> '0012'


print str(i).ljust(n, '0')

-> '1200'


print 'run_%s%s' % (str(i).rjust(n, '0'), '[OK]'.rjust(15, '.'))

-> 'run_0012...........[OK]'


* Rechercher, remplacer, decouper...


txt  = 'xx(mot)xx'
ind1 = txt.index('(')
ind2 = txt.index(')')
txt  = txt[ind1 + 1:ind2]
print txt

-> 'mot'


txt  = 'xx(mot)xx'
ind1 = txt.find('mot')
txt  = txt[ind1:]
print txt

-> 'mot)xx'


txt = 'xx(mot)xx'
txt = txt.replace('mot', 'tom')
print txt

-> 'xx(tom)xx'


txt = 'xx(mot)xx'
txt = txt.replace('x', '=')
print txt

-> '==(mot)=='


txt = 'mot(xx)mot'
txt = txt.replace('mot', 'tom')
print txt

-> 'tom(xx)tom'


txt = 'xx(mot)xx'
txt = txt.rstrip('x')
print txt

-> 'xx(mot)'


txt = 'xx(mot)xx'
txt = txt.lstrip('x')
print txt

-> '(mot)xx'


txt = 'xx(mot)xx'
txt = txt.strip('x')
print txt

-> '(mot)'


txt = 'xx(mot)xx'
txt = txt.strip('x()')
print txt

-> 'mot'


txt = 'xx:mot:xx'
txt = txt.split(':')
print txt
print txt[1]

-> ['xx', 'mot', 'xx']
-> 'mot'


txt = 'un petit test'
txt = txt.split(' ')
print txt

-> ['un', 'petit', 'test']


* Petit exemple avec enchainement des commandes. Sous linux la memoire du pc est detaillee dans le fichier /proc/meminfo:


MemTotal:      2053268 kB
MemFree:         20380 kB
Buffers:        240812 kB
Cached:         951020 kB
SwapCached:          4 kB
Active:         927920 kB
Inactive:       474204 kB
HighTotal:           0 kB

la premiere ligne est la memoire totale, voici l'exemple pour recuper et afficher la valeur en 2 lignes avec python:

data = open('/proc/meminfo', 'r').readline()
print 'La memoire du pc est de %s' % data.split(':')[1].strip('\n ')

- > 'La memoire du pc est de 2053268 kB'


Quelques mots d'explication, on commence par lire la premiere ligne avec readline():

'MemTotal:      2053268 kB\n'

Pourquoi separer avec le caractere ':' et non pas avec le caractere ' ', voila ce qu'on obtient sinon:

'['MemTotal:', '', '', '', '', '', '2053268', 'kB\n']'

difficile de garantire que le nombre de caracteres blancs soit tout le temps le meme, preferer separer les blocs de textes:

'['MemTotal', '      2053268 kB\n']'

on termine par nettoyer la derniere chaine avec '\n' et ' ' en choisisant le deuxieme elements de la liste [1]:

'2053268 kB'

C'est ti pas beau python !

mercredi 11 juin 2008

Affichage en boucle d'un fichier log

Si vous faites des fichiers log comme celui-ci Timestamp et logfile, il serait bien utile de pouvoir l'afficher en permanence l'etat d'avancement du log. Rien de plus sous linux, ouvrer une console puis:

tail -f logfile

Si votre fichier s'appel logfile, bien evidement

mardi 15 janvier 2008

Ouvrir un fichier et nettoyer les chaines...



TODO: Change, check and color

... de caractÚre. Souvent lorsqu'on sauvegarde des infos dans un fichier, c'est généralement pour le relire et utiliser son contenu. Pour des raisons de simplicité le fichier que l'on a créer contient les infos séparé par des lignes ou d'autres caractÚres. Voila un p'tit bout de code qui permet d'une part d'ouvrir le fichier proprement et de nettoyer les infos des caractÚres inutiles. Soit un fichier de type texte qui contient sur différentes ligne la valeur d'une donné avec un caractÚre d'en-tête '@', nommé toto.dat, par exemple comme celui-ci :

@128
@36
@345

PremiÚrement on ouvre le fichier proprement, c'est-à-dire en gérant l'erreur d'ouverture si il y a. Commençons par supposer la variable de notre nom de fichier suivant :


filename = 'toto.dat'

Ouvront le fichier proprement dit, en chargeant toute les lignes dans la liste buffer :


try:
    fileID = open(filename, 'rU')
    try:
        buffer = fileID.readlines()
    finally:
        fileID.close()
except IOError:
    print 'Impossible to open the file %s.' % filename

Si on affiche la valeur de la premiÚre ligne par buffer[0], on obtient :

@128\n

Soit le caractÚre d'en-tête définie par le programmeur précédent et le caractÚre '\n' qui correspond au saut de ligne. Ce qui nous intéresse c'est d'avoir la valeur nettoyer, c'est-à-dire directement 128 sans '@' et '\n'. Pour cela il existe une commande trÚs simple à exécuter sur la liste pour la nettoyer.


buffer.strip('@\n')

Un print de la premiÚre valeur vous retoune cette fois-ci :

128

jeudi 3 janvier 2008

Timestamp pour fichier log

En programmation on a souvent le besoin de créer des fichiers logfile. Ces fichiers sont bien pratique pour déboguer ou mémoriser les résultats dans un algo. Une des donnée importante d'un fichier log c'est son Timestamp. C'est le marquage temporel du fichier (voir wiki ici). Le format date, année et heure est souvent un case tête en programmation. Voici un exemple trÚs simple pour le générer sous Python, avec le code suivant :


import time
time.ctime()

Si vous écrivez ce Timestamp dans un fichier log, vous obtiendrez ceci :

Thu Jan 03 14:17:50 2008

Maintenant, si vous voulez spécifier votre propre format :


import time
time.strftime('%a, %d %b %Y %H:%M:%S', time.localtime())

On obtient ceci :

Thu, 03 Jan 2008 14:17:50

Easy, peasy !

vendredi 28 décembre 2007

Double-Helix

Dans le genre programme qui sert à rien en voila un bien dodue. Ce programme permet de faire virtuellement tourner une double hélice dans le shell linux. Avec un peu de fatigue dans les yeux on arrive réellement à voir la double hélice tourner. Le programme est écrit en deux parties. La premiÚre est une fonction qui permet de tracer graphiquement avec un caractÚre les valeurs d'un vecteur qui contient une fonction mathématique. La deuxiÚme partie génÚre les deux fonctions mathématique de chaque hélice et invoque la fonction de tracer. Le programme est écrit de façons compact volontairement pour des raisons de mise en page. Il n'est pas forcément optimisé, mais il permet de montrer différents aspects du langage Python. Voici la premiÚre partie, la fonction d'affichage :


import time
def Readfun(fun, valtxt, nmax):
    i, istop = -1, len(fun[0])-1
    jstop    = len(fun)-1
    while i < istop:
        i += 1
        line, j = [0]*nmax, -1
        while j < jstop:
            j += 1
            line[fun[j][i]] = 1
        txt, n, nstop = '', -1, nmax-1
        while n < nstop:
            n += 1
            if line[n] != 0: txt += valtxt
            else:            txt += ' '
        print txt
        time.sleep(.05)

DerniÚre partie, le programme principal qui va à la suite du premier bout de code. Il définit les fonctions des deux hélices :


from math import sin, pi
fun, u, v  = {}, [], []
f          = 1 / float(50)
for t in xrange(500):
     u.append(int(50 + 25 * sin(2*pi*f*t)))
     v.append(int(50 + 25 * sin(2*pi*f*t + pi / 3)))
fun[0] = u
fun[1] = v
Readfun(fun, 'X', 110)

Il ne reste plus qu'à essayer, copier le programme dans un fichier toto.py, puis ouvrez une console (assez large). Vous pouvez ajuster la taille de votre fenêtre shell (si fenetré) pour obtenir le meilleur résultat. Pour lancer le code comme d'habitude, directement dans le shell :

python toto.py

vendredi 21 décembre 2007

Commande shell dans un code Python

Vous voulez créer un dossier, ou supprimer un fichier en Python ?! Comment utiliser une commande shell dans du code Python. Tout simple voici les quelques lignes... bien utile:


from os
os.system('mkdir Toto')

samedi 15 décembre 2007

Sortie shell python en couleur

Les sorties de consoles sont bien pratique en python, un petit print, par ci un petit print par là, rien de plus simple. L'ennuie c'est que sa manque sacrément de couleur, que ce soit pour débuguer ou sortire des infos utilisateurs, quelques couleurs seraient le bien venu. En faite l'astuce consiste tout simplement à donner les commandes de coloration syntaxique du bash dans les paramÚtres du print de python. Exemple, j'ai un retour de fonction qui m'indique si tout c'est bien passé :


if MyEgine:          print 'Initialisation moteur : [ok]'

On obtient en sortie de console ceci :

Initialisation moteur : [ok]

Maintenant avec sa version coloré:


if MyEngine:
          print 'Initialisation moteur : \033[32m[ok]\033[37m'
else:
          print 'Initialisation moteur : \033[31m[erreur]\033[37m'

Cette fois-ci on obtient :

Initialisation moteur : [ok]

ou ceci :

Initialisation moteur : [erreur]

Quelques mots rapide sur les fonctions de coloration du bash. Par exemple \033[32m colore le texte du bash en vert. Pour revenir en blanc c'est la commande \033[37m. Ne pas oublier de revenir en blanc sinon tout le shell restera en vert. Maintenant pour le rouge \033[31m et pour le bleu \033[36m. En cherchant un peu sur le net on trouve d'autres couleurs.

vendredi 14 décembre 2007

La commande ll

Quand on passe sa journée à déboguer on pragrammer sous shell linux, il y a un moment où la centaine de frappes d'une commande shell commence à vous taper sur le crâne :-(0). Notamment la commande listing all. Donc, aujourd'hui un petit mémo pour définir une commande dans le shell, dans mon cas, ma commande simplifiera mon listing complet coloré par la commande simple ll. PremiÚrement on édite le fichier où je dois définir ma commande :

vi ~/.bashrc

Regarder si la commande n'existe déjàs pas, ou si elle est simplement commenter. Sinon ajouter l'aliase suivant :


alias ll="ls -l --color=tty -F -b -T 0"

enregistrer et sortir de vi, si vous ne savez pas:

:wq

les options de couleur de sont pas obligatoires. Reloguer vous pour faire prendre en compte la nouvelle commande.

samedi 8 décembre 2007

Titre sympa pour les sections

Titre sous latex

Un titre sympa pour les sections, à centrer verticalement dans une seule page. Je définis une commande Titre comme suit :

01.  \newcommand{\Titre}[2]{
02.  \noindent\rule[0.5ex]{.4\textwidth}{0.5mm}
03.  ~~\large{\textsc{Section #1}}~~
04.  \rule[0.5ex]{.41\textwidth}{0.5mm}
05.
06.  \begin{center}
07.  \textbf{\LARGE{#2}}
08.  \end{center}
09.  
10.  \noindent\rule[0.5ex]{\textwidth}{0.5mm}
11.  \newpage
12.  }

Il faut ajuster un peu le code en jouant soit sur la longueur des barres ou soit sur les caractÚres invisible ~. L'utilisation est simple, à l'endroit d'insertion du titre il faut invoquer la commande \Titre{1}{Résumé du dossier}. C'est du bidouillage, il peut encore être amélioré notamment en rendant le paramÚtre du numéro de section automatique.


Ouverture du site

Bonjour à tous,

Remise à zéros de mon ancien site avec un petit dotclear.

Bienvenu sur mon site.

Julien