Styles

jeudi 27 juillet 2017

OpenBSD passe le compilateur par défaut à clang sur amd64 et i386

Une petite nouvelle mais assez significative pour le projet OpenBSD : hier a été commité le changement du compilateur par défaut de amd64 et i386 de OpenBSD pour passer sur clang. Cela permet au projet OpenBSD de s'abstraire petit à petit d'une grosse dépendance envers le projet GCC sous licence GPL, et de profiter des avantages de clang/llvm par rapport au compilateur gcc, avantages que l'on peut résumer ainsi:

- clang utilise une licence BSD,
- clang n'est pas monolithique comme gcc, clang a été conçu depuis sa création, comme une API permettant ainsi sa réutilisation dans des outils d'analyse de code, des outils de 'refactoring' ainsi que des générateurs de code,
- clang est bien plus rapide et consomme moins de mémoire que gcc.

De plus, grâce à clang, le projet OpenBSD va bénéficier de technologies comme Control Flow Integrity (CFI) ou SafeStack.

Voir la discussion sur Lobste.rs.

lundi 29 mai 2017

Prolog est orphelin

Je viens d’apprendre le décès d’Alain Colmerauer. Alain est l’inventeur du langage Prolog, qui a joué un rôle clé dans le développement de l’IA. Prolog est un langage vraiment original qui pousse à réfléchir différement aux problèmes à résoudre. Prolog est donc un des langages absolument nécessaires d'avoir cotoyé dans sa vie d'informaticien.

Pour plus d'information : Prolog est orphelin.

samedi 14 janvier 2017

Ne plus avoir à saisir son mot de passe git sous OpenBSD

Par défaut, git demande votre login et mot de passe à chaque fois que vous accédez à un dépôt git protégé en HTTPS. Plusieurs techniques existent pour ne pas avoir à ressaisir le mot de passe, comme par exemple l'utilisation de clés SSH à la place de HTTPS. Cette dernière que je ne détaillerai pas ici, nécessite de mettre en place un agent SSH.

Je vous propose dans cet article de configurer votre OpenBSD pour les dépôts git sous HTTPS. Que vous soyez sous XFCE ou Gnome, c'est la même méthode vu qu'elle est à base de gnome-keyring. Si vous êtes sous KDE, allez voir du côté du KDE Wallet.

Etape 1: Ajouter les paquets suivants:

pkg_add -iv gnome-keyring
pkg_add -iv libgnome-keyring
pkg_add -iv gmake

Si vous êtes sous XFCE: Sous le compte utilisateur :
- Cliquer sur le menu XFCE Applications/Settings/Session and Startup
- Dans la boîte de dialoge "Session and Startup", cliquer sur l'onglet "Advanced"
- Dans l'onglet "Advanced" cliquer sur l'option "Launch GNOME services on startup"
- Cliquer ensuite sur "Close" et fermer votre session XFCE puis rouvrez-en une.

Etape 2: Compiler git-credential-gnomekeyring

git clone https://github.com/shugo/git-credential-gnomekeyring.git
cd git-credential-gnomekeyring
gmake
mkdir ~/bin
# Normalement ~/bin est déjà dans le PATH: à vérifier.
cp git-credential-gnomekeyring ~/bin

git config --global credential.helper gnomekeyring

Maintenant Git fait appel à Gnome Keyring pour stocker les mots de passe. A la première utilisation Gnome Keyring demande un mot de passe pour protéger le Keyring. Tout cela marche très bien aussi sous Emacs avec magit ou sous n'importe qu'elle application qui utilise les commandes git.

ATTENTION
Toujours mettre le username sur l'URL utilisée lors du git clone. Par exemple: git clone https://jradix@github.com/jradix/.emacs.d Sinon, git continuera toujours de vous demander avec quel compte vous souhaitez vous connecter.

Si vous souhaitez modifier l'URL du dépôt pour ajouter le username par exemple, faire, dans un répertoire du dépôt en question : git remote set-url origin https://jradix@github.com/jradix/.emacs.d

mercredi 4 janvier 2017

EmacsLisp et les processus réseaux

Emacs cache en son sein une machine virtuelle complète, qui, si elle accuse effectivement le poids des ans, n'en reste pas moins fonctionnelle, à défaut d'être performante.

EmacsLisp, le Lisp qu'elle supporte, ressemble plus à du Common Lisp qu'à du Scheme. Le fait que l'éditeur soit intimement lié avec la machine virtuelle facilite l'apprentissage de ce monde étrange et sinueux qu'est la programmation en EmacsLisp.

J'ai voulu tester les capacités réseaux offertes par EmacsLisp pour apprendre notamment à ouvrir des connexions et développer de véritables serveurs. Emacs propose déjà des applications réseaux intéressantes comme Elnode (serveur Web asynchrone) ou tout simplement l'outil TRAMP qui permet d'accéder à n'importe quel fichier sur le réseau et de l'éditer comme tout autre fichier dans Emacs sans différence aucune.

Le programme  suivant réalise un test automatisé (avec ERT) de la création d'un serveur et d'un client, ce dernier envoyant un "Hello World" au serveur:

;;; -*- coding: utf-8; lexical-binding: t -*-

;;; Test of network functions.

(require 'ert)

(defvar net-server-port 10000
  "port of the net-test server")

(defun net-test-server-log (string &optional client)
  "If a *net-test-server* buffer exists, write STRING to it for
logging purposes."
  (if (get-buffer "*net-test-server*")
      (with-current-buffer "*net-test-server*"
 (goto-char (point-max))
 (insert (current-time-string)
  (if client (format " %s:" client) " ")
  string)
 (or (bolp) (newline)))))

(defun net-test-server-sentinel (proc msg)
  "Server sentinel"
  (if (string= msg "connection broken by remote peer\n")
      (net-test-server-log (format "client %s has quit" proc))
    (if (string= msg "deleted\n")
 (net-test-server-log (format "server %s has been deleted" proc))
      (net-test-server-log (format "unknown message for %s : %s" proc msg)))))

(defun net-test-server-filter (proc string)
  "Server filter function"
  (net-test-server-log string proc))

(ert-deftest net-test ()
  "Test the opening of a TCP network connection to a server."
  (let ((server (make-network-process
   :name "net-test-server"
   :buffer "*net-test-server*"
   :family 'ipv4
   :service net-server-port
   :sentinel 'net-test-server-sentinel
   :filter 'net-test-server-filter
   :server 't
   )))
    (should (processp server))
    (should (equal (process-contact server :service) net-server-port))
    (let ((client
    (open-network-stream "net-test-client"
    "*net-test-client*"
    "localhost"
    net-server-port)))
      (sit-for 1)
      (should (processp client))
      (should (equal (process-contact client :service) net-server-port))
      (process-send-string client "hello world\n")
      (sit-for 1)
      (delete-process client)
      (sit-for 1))
    (delete-process server)))


Les connexions réseaux en EmacsLisp sont gérées comme des "processus" d'un type particulier.

La programmation réseau en EmacsLisp tourne autour des points suivants:
- une fonction "sentinel" qui est appelée quand le processus réseau change d'état,
- une fonction "filtre" qui est appelée à chaque fois qu'un message est reçu par le processus réseau.

A chaque processus réseau peut être associé ou non un tampon ("buffer"), la fonction "filtre" par défaut réalisant une écriture du message reçu dans le tampon.

Comme l'indique la documentation officielle EmacsLisp, il faut laisser à Emacs des moments de respiration pour lui permettre d'appeler de façon asynchrone les méthodes "filtre" et "sentinel". C'est le rôle des appels à la fonction "sit-for" qui fait une pause d'1 seconde, pour éviter que le test unitaire ne ferme le client ou le serveur avant même qu'ils aient pu entrer en communication et s'envoyer des messages.

lundi 15 février 2016

Linux, cups, gutenprint : installation d'une imprimante réseau avec pilote en source ouverte

Comme moi, vous souhaitez configurer une imprimante réseau sur votre linux sans faire appel à des pilotes propriétaires. En effet, les pilotes propriétaires sont souvents fournis en binaires pour certaines distributions seulement, donc en ayant des pré-requis implicite sur la distribution que vous avez. Et puis au bout de certaines années, vous êtes sûr que ces pilotes propriétaires disparaitront de la surface d'internet, ou seront pleins d'anomalies non corrigées.

Ainsi, mû par une volonté de fer, vous souhaitez n'utiliser que des logiciels à source ouverte pour gérer votre imprimante.

Je vous propose l'installation suivante: linux + CUPS (gestionnaire d'imprimantes) + Gutenprint (pilotes en source ouverte)

Voici un résumé des étapes à franchir pour arriver à vos fins:

1. Installer CUPS, gutenprint et les fichiers nécessaires au développement autour de CUPS

Il s'agit d'installer les paquets de votre distribution permettant le fonctionnement de CUPS et Gutenprint. Ce sont généralement:

cups
cups-devel
cups-filters
libcups
libcups-filters
libcups-filters-devel
tiff
tiff-devel
libjpeg-turbolibjpeg-turbo-devel
libpng
libpng-devel
libressl (ou openssl)
libressl-devel (ou openssl-devel)

Si vous avez de la chance, vous avez aussi un paquet gutenprint tout prêt dans votre distribution, sinon, téléchargez les sources de gutenprint, compilez et installez gutenprint sur votre système avec les commandes suivantes:

./configure   # vérifier qu'il n'y a pas d'erreur et qu'il a bien CUPS : yes
make
make install


Il faut maintenant s'assurer que le démon cupsd est bien démarré automatiquement au démarrage du système. Cela dépend de votre distribution. Consultez la documentation associée à la gestion des services pour savoir comment installer cupsd en tant que service.

Pour voidlinux, ma distribution préférée en ce moment, il suffit de faire un ln -s /etc/sv/cupsd /var/service/cupsd et le tour est joué.

2. Configurez votre imprimante dans CUPS

Vous pouvez  maintenant configurer votre imprimante par l'intermédiaire de l'interface Web de CUPS, en ouvrant votre navigateur sur http://localhost:631/

Cliquez sur "Adding Printers and Classes", cliquez sur le bouton "Add printer".

Vous entrez alors dans une série de formulaire pour configurer votre nouvelle imprimante. Plusieurs options s'offrent à vous, comme la découverte d'imprimante. Essayez cette fonction de découverte, mais si votre imprimante n'est pas découverte vous devez choisir un protocole de communication avec votre imprimante réseau.

Tout d'abord essayez de trouver l'adresse IP de votre imprimante. Cela se fait classiquement par l'écran de contrôle de l'imprimante qui doit vous permettre d'afficher les paramètres réseau de l'imprimante. Certaines imprimantes vous propose d'imprimer une "page de configuration" complète, ce qui est bien pratique.

Pour mon exemple, sur mon réseau local, mon imprimante est 192.168.1.100.

J'ai une imprimante par très "ouverte", une Canon Pixma MP640, et le seul protocole qu'elle comprenne est le LPR. Donc dans CUPS, je choisi "LPD/LPR Host or Printer" comme protocole puis je clique sur le bouton "Continue".

Je saisi la ligne de connexion suivante (peut-être le moins facile à trouver de tout ce petit tutoriel):

lpd://192.168.1.100/queue

Puis je clique sur le bouton "Continue". Je peux alors saisir un nom (sans espace), une description, un lieu (Location). Je peux aussi indiquer si je veux offrir un service d'impression accessible par réseau pour cette imprimante ("Share This Printer").

Je clique sur le bouton "Continue". Je peux alors choisir le pilote d'imprimante dans la liste "Make". Je choisi d'abord le fabricant "Canon" puis je clique sur le bouton "Continue". Une liste de pilote d'imprimantes Canon s'affiche alors. Je sélectionne l'imprimante qui correspond à PIXMA MP640.

Je clique enfin sur le bouton "Add printer" pour créer cette configuration d'imprimante dans CUPS. Et voilà, mon imprimante est disponible est prête à l'emploi. Vous pouvez modifier la configuration par défaut de cette imprimante en mettant notamment "A4" comme taille de feuille par défaut.

Vous pouvez tester le bon fonctionnement de l'ensemble sur la page de gestion de l'imprimante (Bouton "Manage Printer" dans le menu "Administration"). Sur l'écran de gestion de l'imprimante, vous avez un menu déroulant "Maintenance": choisi l'option "Print Test Page" de ce menu déroulant. Une page de test en couleur doit sortir de votre imprimante !

jeudi 28 mai 2015

Void linux, la distribution qui vous fera oublier Debian 8, systemd et Gnome 3

Ainsi Debian vient de sortir sa nouvelle version 8.0 "Jessie". La distribution Debian avait l'avantage de privilégier la simplicité, le respect des standards ouverts, la stabilité. Par une politique de version lente (tous les 5 ans) et des mises à jour au compte-goutte sauf au niveau sécurité, Debian était resté en version 7.0 "wheezy" sous Gnome 2 jusqu'à récemment. Nombreux sont ceux qui ont passés leurs vieux PC sous Debian à la suite notamment de la fin du support de Windows XP, car, chose étonnante, l'obsolescence programmée n'est pas aimée de tout le monde.

Or, la version 8.0 de Debian impose maintenant systemd par défaut, à la place de l'init SysV. Systemd a été conçu par les employés de Red Hat pour ne fonctionner qu'avec un noyau linux© avec beaucoup de pré-requis et ne cherche plus ni la simplicité ni la portabilité du code. En bref, systemd ne suit pas la philosophie d'Unix.

Mais pourquoi Debian a-t-il fait le choix de systemd ? Que des entreprises commerciales comme Red Hat souhaitent développer des systèmes monolithiques et fermés ne pose aucun problème : ce sont ses affaires. Red Hat appelle ça "la modernité":



Et j'imagine que les utilisateurs de Red Hat Entreprise Linux© en sont satisfait. Mais si Debian est aujourd'hui obligé d'utiliser systemd, c'est parce qu'elle souhaite offrir la nouvelle interface Gnome 3 par défaut. Or Gnome 3 est très lié à systemd, et séparer systemd de Gnome 3 n'est pas simple et introduit des instabilités (sans parler de la maintenance d'une telle séparation dans le temps).

Gnome 3, non content d'avoir alourdit l'interface, se lie fortement à une technologie qui n'est disponible que sous linux©

Gnome 3, non content d'avoir alourdit l'interface, se lie fortement à une technologie qui n'est disponible que sous linux©. Bien que Gnome 3 soit considéré comme portable, dans le détail, on s'aperçoit que de nombreuses fonctionnalités sont désactivées par défaut car dépendantes de systemd. Par exemple, les développeurs ayant essayé de porter Gnome 3 sous OpenBSD l'ont noté.

Gnome 3, sous l'influence d'Ubuntu et d'autres, a changé de paradigme en essayant de s'adapter aux nouveaux terminaux tactiles. En souhaitant être considéré comme "moderne", Gnome a fait le choix d'abandonner les PC plus anciens à leur sort, au détriment de ces utilisateurs.

Ainsi, j'ai voulu installer Debian 8.0 "jessie" sur mon vieux PC de 2004, maintenu sous Debian depuis 2009. Et maintenant sous Gnome 3, mon PC rame comme jamais il n'a ramé. Comme si l'OS libre était devenu un boufficiel. Mon sang n'a fait qu'un tour. Trop c'est trop : systemd, Gnome 3, mon PC qui rame, ... j'ai décidé de changer de crèmerie, et j'ai choisi d'installer la distribution Void Linux:
  • c'est une distribution linux (car seul linux a certains pilotes pour mon matériel, sinon j'aurais pris du BSD)
  • elle a fait le choix de ne pas mettre systemd par défaut,
  • elle permet d'installer par défaut MATE Desktop, qui est la continuation et la simplification de l'interface classique Gnome 2,
  • elle dispose d'un système de gestion d'initialisation et de gestion des services portable, performant et respectant la philosophie d'Unix : runit
  • elle met en oeuvre un système de gestion original de paquets transactionnel et toujours à jour grâce à une compilation automatisée d'après les dépôts git des projets : xbps
  • cette gestion de paquets toujours à jours permet une publication continue de void linux (pas de version de void linux, le système est toujours à jour)
  • elle a fait le choix d'utiliser libressl par défaut à la place de openssl suite aux découvertes des nombreuses vulnérabilités d'openssl,
  • runit et xbps sont sous licence BSD, ce qui est, à mon avis, beaucoup plus respectueux des utilisateurs de ces logiciels qu'une licence GPLv3 ou Apache v2.0 imposant des contraintes sur les ajouts que pourraient faire les utilisateurs.
  • l'outil de construction de paquet xbps-src permet une grande flexibilité et autorise l'emploi de différentes librairies C (notamment musl) : important dans le cas de ressources limitées.


J'ai donc téléchargé une image ISO de void linux avec MATE Desktop et ai installé sans problème l'OS sur mon vieux PC en utilisant l'outil d'installation (un peu rugueux comme outil, mais il rend le service). Et là, le miracle s'est produit : je retrouve une interface connue (comme Gnome 2), beaucoup, beaucoup, mais alors, BEAUCOUP plus rapide que sous Debian. Le démarrage et l'arrêt du PC sont eux-même très accélérés grâce à runit qui marche à merveille. J'ai l'impression de retrouver un PC tout neuf, bien équilibré. J'arrive même à lire des vidéos HD dans Firefox en HTML5, sans accélération graphique, sans ralentissement de la vidéo. En force pure, mon vieux PC de 2004 est certainement dépassé, mais en utilisation quotidienne pour naviguer sur internet, même sur de gros sites bien lourds et avec des vidéos, ça marche nickel sans ralentissement. J'ai même installé ma tablette graphique Wacom et l'outil MyPaint et hop, voilà que je fais du dessin sans problème et à une vitesse vraiment surprenante vu la taille de ma mémoire (512Mo mémoire graphique incluse !)

Je ne pensais pas obtenir une telle accelération en changeant de distribution linux© mais je suis obligé de constater le contraire ! Je suis tombé amoureux de void linux, je ne pense pas en changer de si tôt.

mardi 14 avril 2015

Qui peut constuire une maison sans dessiner un plan ?

Article de Leslie Lamport à lire sur la nécessité de rédiger des spécifications avant de coder. Ce qui est assez désespérant c'est que ce genre d'article ait encore besoin d'être publié aujourd'hui: cette "bonne pratique" était déjà recommandée dans les années 60.

Une des phrases à retenir :
Si nous ne commençons pas par une spécification, chaque ligne de code que nous écrivons est un "patch".

lundi 6 avril 2015

Installation de PostgreSQL sous OpenBSD et utilisation de psql sous Windows pour y accéder

Cet article montre comment ne pas se fatiguer avec la gestion de l'encodage des caractères entre des serveurs et clients très différents.

Sous OpenBSD

- installer le package postgresql-server
- lire le fichier et exécuter les instructions pour créer le répertoire de données :
more /usr/local/share/doc/pkg-readmes/postgresql-server-9.3.4p0
se connecter en root :
su -
puis se connecter avec _postgresql pour créer le répertoire de données:
su - _postgresql
mkdir /var/postgresql/data
initdb -D /var/postgresql/data -U postgres -E LATIN9 -A md5 -W
exit
Ce qui est important dans ces commandes c'est LATIN9 qui sera à utiliser dans l'appel à psql sous Windows pour s'assurer que ça fonctionne bien entre les deux systèmes.

Editer /var/postgresql/data/postgresql.conf:
listen_addresses = '*'

Editer /var/postgresql/data/pg_hba.conf:
host    all             all             0.0.0.0/0               md5

Pour démarrer/redémarrer/arrêter la base de données à partir du compte root:
/etc/rc.d/postgresql start
/etc/rc.d/postgresql restart
/etc/rc.d/postgresql stop
Pour démarrer/arrêter automatiquement postgresql au démarrage et arrêt de la machine, ajouter postgresql à la variable pkg_scripts dans /etc/rc.conf.local :
pkg_scripts="postgresql"
Tous les services doivent être séparés par un espace dans cette variable, comme par exemple pkg_scripts="postgresql service2 service3" où chaque entrée doit être dans /etc/rc.d/

psql sous windows pour accéder à un serveur postgresql sous unix

Installez PostgreSQL sous windows pour disposer de psql. Créer un fichier psqlopenbsd.bat :
@@echo off
set PGCLIENTENCODING=LATIN9
chcp 1252 > nul
set PSQLRC=d:\jrx\jrxemacs\.psqlrc
"c:\Program Files\PostgreSQL\9.3\bin\psql.exe" -h adresse_ip -U postgres postgres
en remplaçant adresse_ip par l'adresse ip du serveur, en s'assurant que PGCLIENTENCODING correspond à l'encoding des data du serveur (encoding utilisé lors de la création de la base de données avec initdb).

lundi 30 mars 2015

Outils de sécurité réseau avec OpenBSD et PF - Matthieu Herrb

Matthieu Herrb. Outils de sécurité réseau avec OpenBSD et PF. Journées Réseaux (JRES), Nov 2011, Toulouse, France.

Cet article présente la mise en place de solutions de sécurité réseau basées sur des logiciels libres au LAAS du CNRS. Dans le domaine de la sécurité réseau, deux composants clé utilisés dans le laboratoire sont le pare-feu principal et le portail captif destiné à accueillir les connexions de visiteurs. Les outils retenus se basent sur le filtre de paquets PF ainsi que sur des extensions du serveur DHCP du système OpenBSD.
Après avoir étudié plusieurs scénarios de déploiement, le pare-feu principal du laboratoire est constitué de deux serveurs redondants contrôlant le trafic à l'aide de PF en mode transparent.
Pour l'accueil de connexions réseaux de visiteurs, le laboratoire souhaite continuer à leur proposer un accès ouvert. Un portail captif « auto déclaratif » sur lequel chaque visiteur s'enregistre pour accéder à l'Internet a été réalisé à l'aide d'outils présents dans OpenBSD.