vendredi 7 mars 2014

PostgreSQL : configuration de l'environnement psql

Quand il s'agit de configurer et manipuler une base de données, rien de mieux que d'utiliser le client sql en mode texte qui permet de manipuler directement les objets de la base dans tous les sens. Concernant PostgreSQL, le client psql est aussi complet qu'un client SQL*Plus pour Oracle Database par exemple.

Il s'agit de configurer correctement psql pour être plus productif. Pour cela, on stockera dans ~/.psqlrc la configuration de base qui sera chargée à chaque lancement de psql.

Voici mon fichier de configuration ~/.psqlrc que j'utilise tous les jours:

\set QUIET ON

\set PROMPT1 '%n@%M %~%R%# '
\set PAGER OFF
\set HISTFILE ~/.psql_history- :HOST - :DBNAME
\set HISTSIZE 2000
\set ECHO_HIDDEN ON
\set COMP_KEYWORD_CASE upper
\timing on
\encoding unicode
\pset null 'NULL'
\pset border 1

\set QUIET OFF

\echo 'Predefined queries:\n'
\echo '\t\t\t:settings\t-- Server Settings'
\echo '\t\t\t:dbsize\t\t-- Database Size'
\echo '\t\t\t:tablesize\t-- Tables Size'
\echo '\t\t\t:uptime\t\t-- Server uptime'

\set settings 'select name, setting,unit,context from pg_settings;'

\set dbsize 'SELECT datname, pg_size_pretty(pg_database_size(datname)) db_size FROM pg_database ORDER BY db_size;'

\set tablesize 'SELECT nspname || \'.\' || relname AS \"relation\", pg_size_pretty(pg_relation_size(C.oid)) AS "size" FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE nspname NOT IN (\'pg_catalog\', \'information_schema\') ORDER BY pg_relation_size(C.oid) DESC LIMIT 40;'

\set uptime 'select now() - pg_postmaster_start_time() AS uptime;'


Faites \? sous psql pour voir quel est le sens de chaque instruction. A noter le moyen bien pratique pour enregistrer des requêtes prédéfinies dans des variables.

Sous windows, ce fichier n'est pas dans %HOME%\.psqlrc mais à %APPDATA%\postgresql\psqlrc.conf On peut aussi indiquer explicitement où se trouve le fichier .psqlrc en mettant son chemin complet dans la variable d'environnement PSQLRC.

Une autre configuration intéressante est l'instruction \x qui permet d'indiquer vouloir afficher les lignes de données en colonne plutôt qu'en ligne : pratique quand on est en présence de lignes assez longues.

samedi 21 septembre 2013

Blender : mes débuts dans le monde de la 3D

La 3D, pour un informaticien, a toujours quelque chose d'attirant en soi : produire des images virtuelle par la simple entremise de la puissance de calcul d'un ordinateur et des algorithmes de rendu de plus en plus réalistes.

Quand j'étais un gamin, je jouais avec Sculpt4D sur Amiga, et je trouvais vraiment génial de pouvoir produire des images à partir d'une modélisation d'une scène.

Dans le monde de la source ouverte, un logiciel tient la dragée haute à nombre d'autres produits commerciaux. Il s'agit de Blender. Cet outil est magnifique pour créer des modèles en trois dimensions, créer des rendus de toute beauté, et va même jusqu'à permettre de faire de l'animation et du montage vidéo, et ce, avec une qualité digne de tous les autres produits professionnels.

Entrer dans le monde de Blender n'est pas chose aisée. L'interface utilisateur est très riche, et s'organise en fenêtres qui ne se chevauchent pas. De nombreuses touches de raccourcie existent et permettent d'être productif. Blender offre en standard, la capacité d'enregistrer des "screencasts", des enregistrements vidéos de ce que vous faites dans Blender. Grâce à ça, de nombreux tutoriels vidéos existent et sont maintenant la manière privilégiée d'apprendre à utiliser Blender.


Je viens de finir un tutoriel du site suisse kopilot.ch : Faire une pile de DVD avec projection d'ombre sur fond transparent et canal alpha de l'ombrage.

 

Voici le rendu que j'ai réalisé en suivant ce tutoriel :


Blender est un monde à lui tout seul et vaut vraiment le coup qu'on s'y attache.

samedi 6 juillet 2013

Mort de Douglas Engelbart, l’inventeur de la souris d’ordinateur

"Le monde virtuel pleure Doug Engelbart, l’inventeur de la souris d’ordinateur décédé mardi à son domicile de la Silicon Valley. A l’origine, la souris était une boîte en bois avec deux roues de métal. Ce dispositif de pointage pour ordinateur a été amélioré par l’informaticien suisse Jean-Daniel Nicoud de l’École polytechnique fédérale de Lausanne (EPFL)." [...]


La première souris au monde !

CI News


The Mother of all Demos

samedi 8 juin 2013

Rich Hickey, créateur de Clojure : l'orienté objet est très surfait

Écoutons ce que Rich Hickey, créateur du langage Clojure nous dit de l'orienté objet dans un article donnant les raisons qui l'ont poussées à construire Clojure:

L'orienté objet est surfait:
  • né de la simulation : maintenant utilisé pour tout, même quand cela est inapproprié : cela est encouragé par Java/C# dans toutes les situations du à leur manque de support (idiomatic) pour n'importe quoi d'autre
  • Les objets à état mutables sont maintenant les nouveaux codes spaghetti: difficiles à comprendre, tester et à raisonner dessus, un désastre pour gérer la concurrence.
  • L'héritage n'est pas la seule manière de faire du polymorphisme,
  • "C'est mieux d'avoir 100 fonctions autour d'une seule structure de données que 10 fonctions opérant autour de 10 structures de données", Alan J. Perlis
  • Clojure modèle ses structures de données autour d'objets immutables représentés par des interfaces, et pas son propre système de classes
  • Plusieurs fonctions définies sur peu de structures de données (seq, map, vector, set)
  • Ecrivez du Java avec Java, consommez et étendez Java à partir de Clojure.

Pour un besoin de programmation concurrente, clojure a de nombreux atouts, mais combien de programmeurs sont capable de produire du lisp aujourd'hui ? Le Lisp est pourtant une très bonne école pour comprendre l'ensemble des paradigmes de programmation, comme on peut le lire dans le magnifique livre Structure and Interpretation of Computer Programs.

L'emacsien codant déjà avec un dialecte de lisp (Emacs Lisp) ira plus facilement vers clojure. Et puis, ce n'est pas un certain Gosling qui a créé une première version de Emacs, et plus tard un autre language ... appelé Java ? Le monde est petit...

mardi 4 juin 2013

Nous entrons dans une nouvelle ère dont la sécurité sera l'enjeu

Nous entrons définitivement dans une nouvelle ère car des ordinateurs quantiques sont maintenant disponibles à l'achat (pas pour tout le monde quand même, prix d'entrée : 10M$). Cela va rendre complètement obsolète toutes nos technologies de cryptage et sécurité associées que nous utilisons aujourd'hui. Bien que tout cela soit "en cours" de déploiement chez Google et à la Nasa, cela augure de nouvelles menaces et failles de sécurité si nous ne prenons pas pleinement conscience du saut technologique que représente un ordinateur quantique (suite).

La limite de Landauer enfin démontrée

Des scientifiques européens ont montré qu'un principe énoncé il y a 50 ans limitant le futur des processeurs CMOS est vrai : effacer de l'information rend de la chaleur (suite) 

lundi 3 juin 2013

GoboLinux : une nouvelle façon d'organiser les fichiers sous linux

GoboLinux est une distribution Linux modulaire : elle organise les programmes de votre système d'une nouvelle manière logique. Au lieu d'avoir des bouts d'un programme jetés dans /usr/bin, d'autres bouts dans /etc et encore d'autres /usr/share/quelquechose/ou/autrechose, chaque programme possède sa propre arborescence de répertoires, les gardant tous bien séparés et vous permettant de voir tout ce qui est installé sur le système et quels fichiers appartiennent à quels programmes d'une manière simple et évidente. (Suite)

samedi 1 juin 2013

La fin de la souris

Tout est "mobile" aujourd'hui, avec son corollaire, si vous ne l'êtes pas vous êtes statique. Quand changer de bureau avec son ordinateur portable devient régulier, la souris devient un véritable boulet dont vous ne savez que faire à chaque fois que vous portez votre ordinateur sous le bras. Au bout d'un moment, vous vous jurez que plus jamais vous n'utiliserez de souris de votre vie ! J'ai rangé ma souris dans mon sac, plus jamais je ne la ressortirai, le monde est bien plus facile sans fil à la patte !

Quelques jours sans souris et vous regarderez maintenant cette chose comme une relique du passé !

La première souris au monde !
Le mousepad devenu le remplaçant logique de la souris, celui-ci commence à se faire manger par la technologie des écrans tactiles. Certains constructeurs reléguant le mousepad au delà du clavier comme sur le nouveau Acer Aspire R7 :

mardi 14 mai 2013

Niveaux de Gravité d'une Erreur : Peuvent-ils (doivent-ils) être standardisés ?

Traduction d'un article de Conrad Weisert "Error Severity Levels".

Contexte: les conventions du système d'exploitation

Je viens de lire une longue discussion sur Linked-In sur les niveaux de gravité d'erreur dans un programme, et j'ai été frappé par le sentiment d'une redécouverte des techniques que nous utilisions il y a déjà quelques décennies. Je ne connais pas de livre traitant cette question de manière approfondie, alors permettez-moi d'essayer de commencer. D'abord étudions un peu l'histoire:

1959 : Système d'exploitation de second génération (709-7090)
Le système d'exploitation SHARE (SHARE Operating System - SOS) introduit la notion de niveaux de gravité. Une expression de contrôle d'un batch pouvait spécifier :

- GOIF : Execute uniquement si aucune erreur ou avertissement n'a eu lieu,
- GO : Execute si aucune erreur sérieuse a eu lieu,
- GOGOGO1 : Execute quoi qu'il en soit.

Certains programmes SOS n'observèrent pas ces conventions et certaines installations 709-7090 n'utilisaient pas SOS, mais cette convention inspira les fonctionnalités plus générales des systèmes suivant.

SOS etablit aussi la notion d'interception d'évènements anormaux sous le contrôle du programme, ce qui amena à la gestion des conditions de PL/I, qui à son tour inspira le traitement des exceptions des langages de programmation de la famille C d'aujourd'hui.

1965 : Système d'exploitation de troisième génération
OS/360 systématisa la notion de code de condition applicables à des travaux par lot (batch jobs) de plusieurs étape. Des conventions pour des niveaux de gravité numériques étaient observées par tous les processus système et programmes utilisateurs. Chaque étape d'un job fixait un code retour qui des étapes suivantes peuvent tester avec le Job Control Language (JCL):

00 Aucune erreur n'a eu lieu.
04 Une condition de niveau d'avertissement (trivial) a eu lieu, continuez le traitement,
08 Une erreur sérieuse a eu lieu, supprimez les étapes suivantes dans ce job,
12 Une erreur fatale a eu lieu, terminez l'exécution de ce job immédiatement !

Les codes et ces actions étaient, bien sûr, uniquement des conventions. Vous pouviez mettre en place un job pour faire tout ce que vous vouliez pour n'importe quelle valeur de retour, tant que le programme ne faisait pas ABEND.2


Conventions de programmation

Certaines applications ont étendu les conventions OS/360, en particulier dans le cas des programmes de traitement des transactions. Notre propre entreprise et plusieurs de nos clients ont adopté les conventions suivantes et ont développé une sous-routine standard pour émettre des messages d'erreur de diagnostic, d'abord en PL/I, plus tard en COBOL, et finalement, avec les adaptations nécessaires, en C++ et Java:

1. Lorsqu'il rencontre une erreur, le programme fait un
    CALL SYSERR (lvl, msg);
où le texte de msg suivait la convention demandant à commencer par un identifiant3 qui contenait le nom de la routine d'exécution de l'appel, et le code lvl était un équivalent symbolique d'un des codes conventionnels de retour de JCL.

2. À la fin du programme, une routine de sortie fixait le code de retour OS à la valeur la plus élevée rencontrée pendant l'exécution.

3. Une limite, que le programme pouvait outrepasser, définissait le nombre maximum d'erreurs autorisées pendant l'exécution. Lorsque ce nombre est dépassé, le programme prend fin. Cette fonction est utile pour empêcher un programme hors-contrôle de générer des centaines de pages de sortie incohérentes (par exemple si l'on a accidentellement fourni un programme source à un autre programme attendant un fichier de transactions).

Il y avait d'autres fonctionnalités, mais vous voyez l'idée. Les programmeurs appréciaient l'aide de cette routine, et elle est toujours utilisé dans presque tous les programmes développés dans ces organisations.4

D'autres améliorations évidentes étaient nécessaires pour supporter les programmes multi-thread. Quand une sous-tâche devrait être autorisée à terminer la tâche principale et comment?

D'autres idées?


Faites-nous savoir si vous avez développé ou si vous connaissez une meilleure façon de gérer les erreurs découvertes par les programmes, les messages de diagnostic, et les niveaux de gravité. Quels standard, le cas échéant, seriez-vous prêt à utiliser?

 

1—Dave Farber de Bell Telephone Laboratories appelait ce niveau "GO DAMMIT!" a une conférence SHARE.
2-ABnormal END (fin anormale) : l'action la plus radicale quand une continuation du traitement pourrait causer des dégâts considérables. (En fait, les versions suivantes de l'OS supportaient l'exécution conditionnelle d'étape même si une ABEND a eu lieu, mais les programmeurs prudents évitaient ça).
3-Dans certains langages de programmation cet identifiant peut être généré automatiquement, mais dans la plupart des languages, c'était juste une convention que les programmeurs étaient tenus de se conformer. Cela évitait aux utilisateurs la frustration ressentie lorsqu'ils reçoivent un message mystérieux de, disons, Windows®, indiquant que "le programme spécifié ne peux pas ...".
4- Si vous souhaitez une copie nous contacter à cweisert@acm.org et dites nous pour quel langage et environnement vous en avez besoin.

samedi 16 mars 2013

Linux : Jenkins en tant que service lancé au démarrage, stoppé à l'arrêt de la machine

Voici mon script de gestion d'un service Jenkins sous linux (debian) pour maitriser entièrement mon serveur d'intégration local.

Tout d'abord, j'ai créé un utilisateur cijenkins dans un groupe ciserver. Ensuite j'ai créé un répertoire /var/run/jenkins pour recevoir le fichier jenkins.pid contenant le pid du process de jenkins. Ce pid servira au script du service de savoir quel process terminer. Bien sûr, faites un petit chown cijenkins:ciserver /var/run/jenkins

Ensuite j'ai aussi créé le répertoire /var/log/jenkins qui recevra le fichier de log en cours jenkins.log. De même, faites un petit chown cijenkins:ciserver /var/log/jenkins J'ai ensuite créé le fichier /etc/init.d/jenkins (avec un petit chmod 755 dessus) :

#! /bin/sh
# /etc/init.d/jenkins
#

# Some things that run always
touch /var/lock/jenkins

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting script jenkins "
    start-stop-daemon -b --start --oknodo --user cijenkins --group ciserver --pidfile /var/run/jenkins/jenkins.pid --chuid cijenkins:ciserver --make-pidfile --exec /bin/bash -- -c "exec /usr/bin/java -jar /opt/jenkins-1.505.war &>> /var/log/jenkins/jenkins.log"
    ;;
  stop)
    echo "Stopping script jenkins"
    start-stop-daemon --stop --oknodo --user cijenkins --group ciserver --name java --pidfile /var/run/jenkins/jenkins.pid --retry=TERM/30/KILL/5
    ;;
  *)
    echo "Usage: /etc/init.d/jenkins {start|stop}"
    exit 1
    ;;
esac

exit 0

Comme on le voit dans ce script on peut démarrer ou arrêter le service jenkins par l'option start ou stop. Le script permet d'écrire la sortie standard vers le fichier de log ainsi que de démarrer le service avec un utilisateur différent (ce script est lancé par root).

Si vous souhaitez lancer ce script au démarrage et à l'arrêt de votre PC il faut créer les liens dans le système d'initialisation de linux : update-rc.d jenkins defaults Plus de détail dans cet article.

Ensuite, vous pouvez vous amuser à configurer votre jenkins pour prendre en charge vos développements, notamment les développements python.