PROJET AUTOBLOG


Nicolargo

source: Nicolargo

⇐ retour index

De Network Manager à une configuration manuelle

mercredi 17 octobre 2012 à 17:19

S'il y a bien une fonction que je trouve mal faite dans Gnome c'est le "Network Manager". Ce logiciel, accessible depuis la barre de menu, permet de configurer, à partir d'une interface graphique, les interfaces réseaux de sa machine. Ce n'est pas la première fois que je tombe sur une configuration que je n'arrive pas à appliquer en utilisant ce logiciel. Il faut dire que celle-ci mélange plusieurs interfaces réseaux avec des configurations DHCP, statiques et des routes spécifiques. J'ai donc décidé de désactiver Network Manager et de configurer mon réseau à la mimine.

Avant de pouvoir configurer manuellement son réseau à partir du fichier /etc/network/interfaces, il faut préalablement désactiver la gestion des interfaces par Network Manager. Nous allons voir comment procéder sur une distribution GNU/Linux Ubuntu 12.04.

Préparation de la manipulation

Avant toute chose, il faut arrêter toutes vos applications. En effet, nous allons toucher à la couche réseau du noyau Linux et il y a de forte chance que vous perdiez la connectivité.  Il est bien sûr totalement impossible de faire cette manip à distance (via SSH ou remote desktop).

Pour pouvoir revenir en arrière, nous allons sauvegarder la configuration de Network Manager:

sudo cp /etc/NetworkManager/NetworkManager.conf /etc/NetworkManager/NetworkManager.conf.OLD

Désactivation de Network Manager

On commence par éditer le fichier /etc/NetworkManager/NetworkManager.conf:

sudo vi /etc/NetworkManager/NetworkManager.conf

Puis passer la clé de configuration managed à true:

[ifupdown]
managed=true

Configuration manuelle des interfaces réseau

On passe ensuite à la configuration manuelle des interfaces réseau de notre machine en éditant le fichier /etc/network/interfaces. Le contenu du fichier dépend bien sûr de votre besoin. J'avais écris un billet sur le sujet il y a quelques années. Mais le mieux est de lire la documentation officielle et complète sur le site de Debian.

Il ne reste ensuite plus qu'à relancer le démon networking pour appliquer les changements et faire chauffer le semiconducteur de la carte mère:

sudo service networking restart

Bye bye Network Manager et son horrible interface graphique ! Bienvenu au fichier interfaces et sa syntaxe simple et claire.

Revenir en arrière ?

En cas de problème, pour revenir à votre configuration initiale ou les interfaces sont gérées par Network Manager, il suffit de saisir les commandes suivantes:

sudo cp /etc/NetworkManager/NetworkManager.conf.OLD /etc/NetworkManager/NetworkManager.conf
sudo service networking restart

Et hop, retour à la case départ.

Cet article De Network Manager à une configuration manuelle est apparu en premier sur Le blog de NicoLargo.

Il n’y a pas qu’Ubuntu dans la vie…

dimanche 14 octobre 2012 à 18:00

En mettant de côté le monde des serveurs et des smartphones, les systèmes GNU/Linux représentent plus ou moins 1 % des parts de marché sur les PC clients. Si ce chiffre peut paraître ridicule par rapport au nombre de machines sous Windows, il l'est encore plus quand on regarde les parts des systèmes GNU/Linux autres qu'Ubuntu.

Pourtant, en ne donnant pas une chance à ces distributions exotiques, vous pourriez passer à côté d'un système adapté à votre configuration. Le fond du problème est là. La cible de Canonical (l'éditeur d'Ubuntu) est la même que Microsoft : des PC costauds, avec des cartes graphiques supportant l'accélération 3D et une mémoire confortable pour faire tourner vos applications en même temps que l'environnement graphique système (Gnome3 ou KDE).

Hors, tout le monde n'a pas les moyens ou tout simplement l'envie de dépenser plus de 700€ pour avoir un PC bureautique performant. C'est pourtant sur ce créneau spécifique des PC "low cost" que ces distributions apportent toute leur valeur ajoutée. En effet, elle sont pour la plupart basée sur des interfaces graphiques moins consommatrice de ressources hardware. Je pense notamment à LXDE et XFCE porté par Canonical sur les distributions dérivées Lubuntu et Xubuntu mais aussi à OpenBox comme dans le très bon CrunchBang Linux que j'ai testé sur un boîtier "Linutop 4" dans un dernier article. Le choix de l'interface graphique n'est pas le seul avantage de ces distributions. Elles sélectionnent également les applications proposées en standard aux utilisateurs, en préférant par exemple Midori ou Chromium à la place de Firefox.

Les plus barbus d'entre vous vont me retourner qu'il est tout à fait possible de prendre n'importe quelle distribution GNU/Linux (si possible la plus proche de la philosophie libre) et d'y installer à la main l'interface graphique et les applications de son choix. Cependant, cette démarche est justement réservée aux barbus et pas à Monsieur Lambda que l'on souhaite faire venir du bon côté de la force.

Alors que pouvons-nous faire ? Nous, défenseurs des logiciels libres. Pourquoi pas en donnant sa chance à une distribution alternative, en sortant un peu des pistes que l'on connait si bien (ne vous inquiétez pas, vous ne serez pas perdu bien longtemps). En choisissant tout simplement un système en adéquation avec nos besoins et le matériel associé. En ne refaisant pas les mêmes erreurs qui ont conduit et conduisent encore des utilisateurs vers des OS propriétaires et fermés.

Cet article Il n’y a pas qu’Ubuntu dans la vie… est apparu en premier sur Le blog de NicoLargo.

Test d’un Linutop 4 avec Linutop OS 5

mardi 9 octobre 2012 à 11:00

J'écris cet article depuis le Linutop 4 que j'ai eu gracieusement en test pendant quelques semaines (au passage merci à l'équipe Linutop). Pour rappel, le Linutop 4 est un mini PC Fanless et totalement silencieux (pas de disque dur mais une mémoire Flash) utilisant un OS maison nommé Linutop OS 5. Il a comme cible les entreprises souhaitant disposer d'un client bureautique léger et les utilisations de type bornes Internet ou affichages dynamique d'informations.

Les caractéristiques

On commence par un bref aperçu des caractéristiques du boîtier:

Note: le système Linutop OS 5, pré-installé par défaut, occupe environ 450 Mo des 2 Go de la mémoire flash interne.

Premier contact

C'est la première fois que j'utilise une machine totalement silencieuse et je dois avouer que lors du premier démarrage, j'ai vérifié que je n'avais pas oublié de brancher l'alimentation avant de voir apparaître la bannière de configuration sur mon écran. Même par rapport à l'utilisation d'un PC portable, le silence est vraiment total.

L'avantage d'utiliser l'OS maison (Linutop OS 5) est qu'il n'y a aucune configuration à faire sur la machine. Une simple fenêtre de configuration est affichée au première démarrage de la machine et permet de fixer les paramètres comme le langage, le clavier... Pour la majorité des utilisations, il n'y a rien à faire mis à part cliquer sur le bouton OK.

Une fois cette étape passée, on se retrouve sur une distribution GNU/Linux basée sur Ubuntu (et donc bénéficiant des paquets de cette distribution) avec XFCE comme gestionnaire graphique.

Les premières minutes d'utilisation ont été un peu difficile pour moi. En effet, étant habitué à travailler sur des machines puissantes (voir sur-dimensionnées), la relative lenteur du temps de réaction pour les opérations de bases (ouvrir et déplacer des fenêtres, charger des pages Web légères...) m'a sauté au yeux. Après quelques heures d'utilisation, je m'y suis habitué et si on ne demande pas des choses trop lourdes à ce boitier il s'acquitte parfaitement de ses tâches.

Une machine pour quoi faire ?

Les caractéristiques hardware de la machine limite l'utilisation à certain domaine. J'ai essayé, dans ce chapitre de résumer les choses que j'ai pu tester.

Machine parfaitement adapté pour:

Machine utilisable pour:

Machine inutilisable pour:

Résumé des + et des -

Le hardware: Linutop 4

Les +

Les -

Le systéme: Linutop OS 5

Les +

Les + et -

Les -

Quelques photos...

Pleins d'autres images à retrouver sur Flickr...

Alors j'achète ou j'achète pas ?

On arrive donc à la conclusion de cet article et à la question fatidique: est que, dans le rôle d'un décideur informatique (ce que je suis dans le cadre de mon boulot), j'achèterai cette solution...

Le hardware (Linutop 4) est vraiment de très bonne qualité, le silence total et il ne semble pas trop chauffer même après quelques jours d'utilisation sans extinction. Mais à plus de 400 € (avec livraison), je trouve quand même l'addition un peu salée. Donc à moins de négocier les prix à la baisse (321 € par exemple...) ou bien d'obtenir pour ce prix une configuration plus musclée (au minimum 2 Go de RAM et mémoire Flash plus importante), je regarderai attentivement du coté de la concurrence avant de lancer mes achats.

Donc j'achète le boîtier vierge (sans OS) au prix maximum de 320€.

Concernant l'OS Linutop 5, je suis beaucoup plus sévère. Bien que je comprenne la volonté de fournir aux utilisateurs un système clés en main, je ne trouve pas celui-ci adapté au hardware (XFCE, Firefox, pack logiciel graphique...). De plus, faire payer cet OS (qu'ils soit inclus dans le prix des boîtiers Linutop ou bien 79€) n'est pas constructif: cela limite la participation de la communauté et peut mettre à dos le clan des barbus qui peuvent y voir une vente liée de système GNU/Linux (un comble)...

Je n'achète pas l'OS Linutop 5, et j'utilise sur les boîtiers Linutop des OS GNU/Linux gratuits, léger et alternatifs.

Cet article Test d’un Linutop 4 avec Linutop OS 5 est apparu en premier sur Le blog de NicoLargo.

Et si on jouait un peu avec Redis et Python ?

mardi 2 octobre 2012 à 07:45

Dans la mouvance NoSQL, Redis se classe dans la catégorie "data structure server"  (que l'on peut traduire en Français par "serveur de dictionnaire distant"). C'est  un système permettant de traiter, de manière très performante, des données sous la forme clés/valeurs. Contrairement à des solutions comme MemCache, Redis est capable de gérer la persistance des données en stockant, sur demande, son contenu sur disque.

La clé, qui peut être comparée au nom d'une variable dans un langage de programmation, permet d'identifier de manière unique la donnée. Lors de la création de votre application, vous allez rapidement vous rendre compte que le choix de cette clé n'est pas négligeable. C'est elle qui définira "la structure" de votre base de donnée.

La clé est dans la définition de la clé.

Quant aux valeurs, elles peuvent appartenir aux types suivants:

Comme on peut le voir, on retrouve la plupart des structures du langage Python. En étant un fervent admirateur, je me suis donc penché sur l'API Python Redis.

C'est parti pour un peu de bac à sable...

Installation de Redis

Pour mes tests, j'ai fait une installation standard depuis les paquets Ubuntu du serveur Redis, de l'API Python et de la CLI iPython pou illustrer mes exemples:

sudo apt-get install redis-server python-redis ipython

Les commandes de bases

La librairie Python permet d'envoyer des commandes (voir la liste des commandes ici) au serveur.

On commence par se connecter un serveur (local en écoute sur le port TCP par défaut).

J'utilise iPython pour mes tests de la librairie Python mais il est également possible de passer par la CLI Python classique.

# ipython
In [1]: import redis
In [2]: r = redis.Redis('localhost')

Premier exemple clés / valeur (chaîne de caractères):

In [3]: r.set("cles", "valeur")
Out[3]: True
In [4]: r.get("cles")
Out[4]: 'valeur'

Stocker des valeurs numériques:

In [5]: r.set("clesnum", 666)
Out[5]: True
In [6]: r.get("clesnum")
Out[6]: '666'
In [7]: r.incr("clesnum")
Out[7]: 667
In [8]: r.decr("clesnum")
Out[8]: 666

Attention, la méthode get retourne des chaines, il faut les convertir avant de s'en servir comme des entiers.

In [9]: a = 10
In [10]: a + r.get("clesnum")
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/home/nicolargo/<ipython-input-10-06c75e85d988> in <module>()
----> 1 a + r.get("clesnum")
TypeError: unsupported operand type(s) for +: 'int' and 'str'
In [11]: a + int(r.get("clesnum"))
Out[11]: 676

Des listes comme valeurs:

In [12]: r.rpush("clesliste", "a")
Out[12]: 1L
In [13]: r.rpush("clesliste", "b")
Out[13]: 2L
In [14]: r.rpush("clesliste", "c")
Out[14]: 3L
In [15]: r.lrange("clesliste", 0, -1)
Out[15]: ['a', 'b', 'c']
In [16]: r.lindex("clesliste", 2)
Out[16]: 'c'
In [17]: r.llen("clesliste")
Out[17]: 3
In [22]: r.lpush("clesliste", "z")
Out[22]: 4L
In [23]: r.lrange("clesliste", 0, -1)
Out[23]: ['z', 'a', 'b', 'c']

Pour des listes avec des valeurs uniques (set), il faut utiliser les méthodes sadd (pour ajouter) et smembers (pour récupérer le set).

In [27]: r.sadd("clesset", "a")
Out[27]: True
In [28]: r.sadd("clesset", "b")
Out[28]: True
In [29]: r.sadd("clesset", "c")
Out[29]: True
In [30]: r.sadd("clesset", "a")
Out[30]: False
In [31]: r.smembers("clesset")
Out[31]: set(['a', 'c', 'b'])

Une autre structure de liste intéressante est la liste avec des valeurs uniques et ordonnées. On ajoute un troisième champs à notre couple clés/valeur qui s'appelle score (3em paramètre dans la méthode zadd). C'est ce score qui va déterminer l'ordre de la liste:

In [32]: r.zadd("clessetsort", "a", 4)
Out[32]: True
In [33]: r.zadd("clessetsort", "b", 1)
Out[33]: True
In [34]: r.zadd("clessetsort", "c", 3)
Out[34]: True
In [35]: r.zadd("clessetsort", "a", 5)
Out[35]: False
In [36]: r.zrange("clessetsort", 0, -1, withscores = True)
Out[36]: [('b', 1.0), ('c', 3.0), ('a', 5.0)]
In [37]: r.zrange("clessetsort", 0, -1)
Out[37]: ['b', 'c', 'a']

Pour stocker un dictionnaire, c'est également très simple:

In [38]: r.hset("cleshash", "a", "A")
Out[38]: 1L
In [39]: r.hset("cleshash", "b", "B")
Out[39]: 1L
In [40]: r.hset("cleshash", "c", "C")
Out[40]: 1L
In [41]: r.hgetall("cleshash")
Out[41]: {'a': 'A', 'b': 'B', 'c': 'C'}
In [42]: r.hget("cleshash", "b")
Out[42]: 'B'

Gérer l'expiration de vos données

... importance du garbage...

In [3]: r.set("key", "value")
Out[3]: True
In [4]: r.exists("key")
Out[4]: True
In [5]: r.expire("key", 10)
Out[5]: True
In [6]: r.exists("key")
Out[6]: True
Attendre 10 secondes ou plus...
In [7]: r.exists("key")
Out[7]: False

Egalement de manière statique avec la méthode expireat (http://redis.io/commands/expireat).

Pour être plus fin, il est aussi possible d'utiliser les "scores" avec les méthodes z* (zadd, zrangebyscore) pour supprimer les données qui ont des valeurs de clés les plus faibles (ou forte selon votre structure).  Par exemple pour supprimer les données de plus faible score (< 3) de notre liste "clesetsort" créée dans le chapitre précédant:

In [37]: r.zrange("clessetsort", 0, -1)
Out[37]: ['b', 'c', 'a']
In [60]: r.zremrangebyscore("clessetsort", 0, 3)
Out[60]: 2
In [61]: r.zrange("clessetsort", 0, -1)
Out[61]: ['a']

 

Les pipelines

Si Redis vous intéresse, c'est que vous avez à gérer un volume important de données. Les commandes que nous venons de voir dans le chapitre précédant sont unitaires. C'est à dire que pour une exécuter une commande, une requête (TCP) est faite au serveur Redis. Pour optimiser les performances et donc réduire le nombre de requêtes fait au serveur, nous disposons des Pipelines (lire ce billet comparatif sur le sujet).

Par exemple pour entrer 100.000 clés/valeurs dans votre serveur, il faut environ 11 secondes sur mon PC de test:

import time
import redis
_MAX_ITER = 100000
r = redis.Redis('localhost')
print "Start bench without Pipeline"
start=time.clock()
for i in range(_MAX_ITER):
   r.set("cles%d" % i, i)
stop=time.clock()
print "Result: %s" % str(stop-start)

alors qu'il faut un peu de plus de 4 secondes en utilisant une pipeline (soit un gain de plus de 50%):

import time
import redis
_MAX_ITER = 100000
r = redis.Redis('localhost')
print "Start bench with Pipeline"
start=time.clock()
p = r.pipeline()
for i in range(_MAX_ITER):
   p.set("cles%d" % i, i)
p.execute()
stop=time.clock()
print "Result: %s" % str(stop-start)

Ressources:

 

Cet article Et si on jouait un peu avec Redis et Python ? est apparu en premier sur Le blog de NicoLargo.

Installer facilement NodeJS et NPM sur une Debian Stable

mercredi 26 septembre 2012 à 12:15

A l'heure actuelle, il n'existe pas de dépôt officiel pour installer NodeJS et NPM sur une distribution Debian Stable. Voici donc un nouveau script d'installation automatique qui va installer sur votre système Debian:

Comme toujours, mon script est hébergé sur GitHub. C'est à partir de là que vous pouvez me remonter vos questions et remarques...

Procédure à suivre

Le plus simple est de saisir les commande suivantes dans un terminal:

cd /tmp
wget https://raw.github.com/nicolargo/nodeautoinstall/master/nodeautoinstall.py
sudo python ./nodeautoinstall.py -d

Le script va normalement se dérouler sans problème en installant le tout dans le répertoire /opt/node (qu'il est possible de modifier avec l'option -o du script).

L'option -d permet de générer un fichier de log de l’exécution du script (à consulter en cas de problème...) dans le fichier /tmp/nodeautoinstall.log.

Pour que votre/vos utilisateurs puisse utiliser node, il faut également qu'ils ajoutent les lignes suivantes au fichier .profile:

# --- NodeJS
export PATH=$PATH:/opt/node/bin
export NODE_PATH=/opt/node:/opt/node/lib/node_modules
# ---

Le résultat...

Vous devriez alors disposer des dernières versions des deux composants:

Il ne vous reste plus qu'à suivre mon billet d'introduction à NodeJS en passant le chapitre sur l'installation que vous venez de faire automatiquement dans ce billet:)

Cet article Installer facilement NodeJS et NPM sur une Debian Stable est apparu en premier sur Le blog de NicoLargo.