Shadoware.Org

samedi, 12 janvier 2013

Passage du site sous Pelican

Bonjour à tous,

Cela fait bien longtemps que je n'ai rien écrit sur ce site. Et pour cause, je suis bien occupé :D.

J'ai quand même pris un peu de temps récemment pour passer entièrement mon site sous Pelican.

C'est mon cadeau de Noël de Geek ;).

Qu'est-ce que Pelican ?

Pelican est un gestionnaire de blog statique.

Qu'est-ce que ça veut dire ?

Cela signifie que je vais écrire mes billets avec mon éditeur de texte préféré (kwrite), au format Markdown (ou restructuredText), et que je génère mon blog au format HTML avant publication. (De la même manière que l'on compilerait un programme).

Le serveur n'a alors besoin de servir que des fichiers statiques, il n'y a donc pas de surplus de mémoire, ou de délai dû à la nécessité de générer les pages.

Les pages n'étant pas modifiées tous les jours, il n'y a de toute façon pas d'intérêt de générer les pages à chaque accès.

Les avantages indéniables sont les suivants :

  • Pas de base de données, pas de page générée à la volée : donc pas de temps de latence. La page est servie dés qu'elle est demandée. De plus il existe un plugin permettant de générer les pages au format pré-zippé, ce qui fait un traitement de moins sur le serveur.
  • Pas de faille de sécurité dû à un script mal paramétré.
  • Je peux gérer mes billets sous un gestionnaire de version (exemple Mercurial).

Par contre les inconvénients sont :

  • Plus de commentaire direct sur le blog (sauf à utiliser des plateformes tel que disqus)
  • Je dois installer le générateur de blog sur la/les machines que je souhaite utiliser pour générer le blog.
  • Je dois ensuite utiliser SCP pour transférer mon blog.

Pour les deux derniers points, ils sont de mon choix. D'autres installent ces outils sur le serveur, ils peuvent donc générer leur page directement à partir du serveur.

Les implications

Les conséquences pour ce blog sont donc : plus de commentaire (jusqu'à nouvel ordre). Vous pouvez toujours m'envoyer un mail, pour poser une question, je l'ajouterai manuellement en tant que commentaire.

Je garde tout de même les anciens commentaires, qui peuvent contenir parfois quelques informations utiles.

J'ai également profité de ce petit changement pour faire un petit nettoyage et j'ai supprimé tous les billets d'humeur, pour ne garder que les articles réellement intéressant.

Comment s'est déroulé la conversion ?

Dans cette partie, je vais décrire le déroulement de la conversion du blog.

Cette conversion comprend les articles, les commentaires et le thème.

Exportation des billets provenant de dotclear

Il a d'abord fallu exporter les billets depuis le site sous Dotclear. Sous Dotclear, dans la partie administration, il est possible d'utiliser le plugin Import/Export pour exporter le site dans un fichier texte.

Export

Le fichier texte se présente alors comme un mixte entre un fichier INI et un ensemble de fichier CSV. Il contient, les catégories, les articles, et les commentaires.

Ce fichier peut alors être utilisé avec l'outil d'import de pelican pour récupérer les différents billets.

Création d'un environnement pour pelican

La création de l'environnement se fait comme décrit sur le site de pelican. Je ne vais donc pas le décrire une fois de plus.

Une fois installé, les billets sont à placer dans le dossier content. Les fichiers générés par l'import seront donc placés dans ce dossier.

Importation des billets au format Markdown

L'import est décrit dans la documentation de pelican. Après différents tests, l'import au format Markdown a été celui qui a donné de meilleurs résultats.

Voici donc la commande qui m'a permis de réaliser cet import :

pelican-import --dotclear -m markdown --dir-cat 2012-12-11-shadoware-backup.txt -o content

Cela m'a généré une liste de 65 fichiers : 1 par billet. Parmi ces billets, j'ai fait le tri, et j'ai supprimé les billets d'humeur. J'ai ajouté également un tag indiquant l'état de draft sur quelques billets qui sont en cours d'écriture et que je n'ai pas encore eu le temps de terminer et de publier.

Puis j'ai effectué une passe sur chaque billet, pour

  • reprendre les parties de code (coloration syntaxique),
  • reprendre les tableaux,
  • reprendre les tags (qui n'ont pas été importés),
  • corriger les dates (la date était celle de création du poste, et non celle de publication),
  • modification des catégories.

Sous dotclear, j'avais fait plusieurs niveaux de catégories, alors que sous pelican, il n'y a qu'un seul niveau de catégorie. J'ai donc dû mettre à plat les différentes catégories.

Pour les tableaux, ces derniers étaient repris directement au format HTML, ils étaient donc exploitables directement. J'ai préféré refaire les tableaux au format Markdown.

Ajustement du fichier de configuration

Viennent ensuite les ajustements faits dans le fichier de configuration, pour que les URL des articles sous dotclear soient les plus proches possibles des nouvelles URL.

Pour cela, j'ai choisi d'avoir les mêmes adresses que sur le site dotclear suivies de .html ou de .xml.

Dans le fichier, j'ai positionné les variables pelicanconf.py

ARTICLE_URL = 'post/{slug}.html'
ARTICLE_SAVE_AS = 'post/{slug}.html'
AUTHOR_SAVE_AS = False

FEED_DOMAIN = SITEURL
FEED_ALL_ATOM = 'feed/atom.xml'
CATEGORY_FEED_ATOM = 'feed/category/%s/atom.xml'
TAG_FEED_ATOM = 'feed/tags/%s/atom.xml'
TRANSLATION_FEED_ATOM = False

Dans le fichier, j'ai positionné les variables publishconf.py

ARTICLE_URL = 'post/{slug}'
PAGE_URL = 'pages/{slug}'
CATEGORY_URL = 'category/{slug}'
TAG_URL = 'tag/{slug}'

Du coté de nginx, le serveur d'application, j'ai ajouté les lignes suivantes :

rewrite ^/dotclear/index.php/post/\d+/\d+/\d+/\d+-(.*)$ /post/$1 permanent;
rewrite ^/post/\d+/\d+/\d+/\d+-(.*)$ /post/$1 permanent;
rewrite ^/post/\d+/\d+/\d+/(.*)$ /post/$1 permanent;

location / {
    try_files $uri.html $uri.xml $uri $uri/ =404;
}

Les premières lignes permettent de reprendre les anciennes adresses dotclear, et la commande try_files permet de reprendre les adresses existantes et de les compléter par .html et par .xml selon le besoin.

Modification du thème

Enfin j'ai écrit un nouveau thème dans le dossier themes/shadoware. Ce thème est fait pour coller le plus possible à celui que j'avais sur le site dotclear.

Il génère donc la page de la même manière que dotclear le faisait (à quelques différences prés) pour éviter de devoir ré-écrire la feuille de style CSS.

L'écriture du thème n'est en soit pas très compliqué, car jinja2 est assez simple d'utilisation. Je me suis inspiré des thèmes simple et notmyidea pour écrire le thème, basé sur celui que j'avais sous dotclear.

Vous pouvez trouver le thème au lien suivant.

Theme

Importation des commentaires.

Les commentaires existants sur mon blog actuel peuvent parfois contenir des informations complémentaires. Les ignorer lors de la migration est tout a fait possible, mais j'ai préféré les récupérer.

Pour cela j'ai installé le plugin comments. Ensuite j'ai modifié le thème pour ajouter l'affichage des commentaires :

{% if article.comments %}
<div id="comments">
    <h3>Commentaires</h3>
    <dl>
        {% for comment in article.comments %}
        <dt>
            <a class="comment-number" href="#">{{ loop.index }}.</a>
            Le {{ comment.date }} par {{ comment.author }}
        </dt>
        <dd>
            <p>{{ comment.content }}</p>
        </dd>
        {% endfor %}
    </dl>
</div>
{% endif %}

Cela permet d'afficher les commentaires à l'aide du plugin. Par contre le problème est que les commentaires provenant de dotclear ne sont pas importés.

Du coup j'ai modifié le script d'import, pour en faire un qui importe les commentaires. Il doit être lancé séparément du script d'import traditionnel.

Voici donc le script permettant de récupérer les commentaires.

Gestion du tag planet libre

Afin de pouvoir publier des articles sur le planet libre, je proposais jusqu'ici des articles sur le planet libre à l'aide d'un tag de type planet.

L'utilisation d'un tag de type planet permet de filtrer les articles que je souhaite mettre sur le planet libre. Par contre avec pelican, l'utilisation de ce tag fausse le calcul des billets liés.

Du coup j'ai décidé que la génération du flux ATOM donné au planet sera générée avec les articles qui posséderont un metatag déposé au début de chaque billet. Sous la présence du tag avec la valeur true, le billet est ajouté dans le flux ATOM des planets.

Pour ajouter le tag, il faut donc au début de l'article écrire le texte suivant :

Title: Passage du site sous Pelican
Tags: dedie
Planet: true

Bonjour à tous,

Cela fait bien longtemps que je n'ai rien écrit sur ce site. Et pour
cause, je suis bien occupé :D.

Pour ce faire j'ai écrit une extension à pelican qui génére un flux nommé {OUTPUT_PATH}/{TAG_FEED_ATOM} (avec %s remplacé par planet). Vous pouvez télécharger l'extension au lien suivant.

Création d'une page 404

Afin d'avoir une belle page 404 si la page n'est pas correctement trouvée (par exemple si certaines URLs ne correspondent plus à celle de dotclear), j'ai défini au niveau de pelican, la création d'une belle page 404 de la manière suivante :

TEMPLATE_PAGES = {'error404.html': 'error404.html'}

J'ai alors créé dans le dossier content le fichier error404.html avec le contenu suivant :

{% extends "base.html" %}
{% block title %}Page non trouvée{% endblock %}
{% block piwik_title %}404{% endblock %}
{% block content %}
<section id="content">
    <div id="content-info">
        <h2>Document non trouvé</h2>
    </div>
    <div class="content-inner">
        <p>Le document que vous cherchez n'existe pas.</p>
    </div>
</section>
{% endblock %}

Enfin, comme j'utilise le serveur nginx pour servir mes pages j'ai ajouté la règle (toute simple) suivante pour définir ma page 404 :

error_page 404 /error404.html;

dimanche, 01 juillet 2012

Cross-Compilation - Compiler un programme pour MS/Windows sous Gnu/Linux

Qu'est que la cross-compilation1 ?

La cross compilation est la possibilité sur une machine avec un matériel spécifique (architecture) et avec un système d'exploitation donné, de compiler des programmes pour une autre architecture, ou pour un autre système d'exploitation.

Cela peut être utilisé par exemple pour compiler un programme sur votre ordinateur de tous les jours (sous Gnu/Linux, avec une architecture i386) à destination de votre téléphone mobile, qui lui est sous Symbian avec un processeur ARM.

Les raisons de faire de la compilation croisée peuvent donc être multiples :

  • Éviter de redémarrer votre machine pour compiler vos binaires.
  • Disponibilité des outils sur votre machine / Indisponibilité des outils de compilation sur la machine de destination (on trouve rarement des outils de compilation sur des téléphones portables2).
  • Puissances des calculs (la compilation prendra moins de temps sur votre PC de bureau que sur votre appareil mobile3).
  • Licence : Vous voulez compiler à destination d'un système d'exploitation que vous ne possédez pas

Attention: La compilation croisée ne garantie pas que programme fonctionnera, vous devrez toujours faire quelques tests à partir d'un émulateur ou à partir du système d'exploitation final.

Bref, à partir du moment ...

Lire la suite ...

dimanche, 14 août 2011

KMDAlert - Logiciel de surveillance de périphérique RAID - Version pour KDE 4.0

Présentation

Possédant chez moi des disques durs en RAID logiciels sous Gnu/Linux, en 2007 (cela fait déjà 4 ans), j'avais écrit un petit logiciel dont le but était de faire du monitoring RAID.

En cas de reconstruction du RAID ou de disque défectueux, le logiciel affiche une notification à l'utilisateur, et change le statut affiché dans la barre de notification (systray). L'icône change bien sur en fonction de l'état du RAID :

  • dégradé (avec un point d'exclamation)
  • en cours de synchronisation (avec une barre de progression)
  • disque RAID dans un état normal

Ce logiciel ne tournait que sous KDE 3.X.

Voici donc une nouvelle version (qui a mis le temps de sortir) qui est un portage de l'application sous KDE 4.X. Elle utilise donc le nouveau système de notification de KDE (pour l'instant en passant uniquement par les notifications standard). Quelques améliorations y seront apportées plus tard.

Requis

Pour fonctionner KMDAlert nécessite que le dossier /sys soit monté et que /sys/block/ soit renseigné pour chaque volume RAID (exemple /sys/block/md0, /sys/block/md1, ...). KMDAlert observe ensuite les modifications faites sur les fichiers pour informer l'utilisateur des modifications faites ...

Lire la suite ...

samedi, 06 août 2011

qGenConfig - Générateur de classe

Présentation

Ce logiciel permet de générer des objets Qt héritant de QConfig à partir d'un fichier écrit au format XML.

Lors de la sauvegarde de paramètres avec Qt, il faut généralement écrire des choses ainsi :

QSettings settings("MaBoite", "MonLogiciel");

settings.beginGroup("Ma fenêtre");
settings.setValue("Taille", win->size());
settings.setValue("Pleine écran", win->isFullScreen());
settings.endGroup();

Puis pour récupérer les mêmes paramètres, il faut écrire :

QSettings settings("MaBoite", "MonLogiciel");

settings.beginGroup("Ma fenêtre");
QSize size = settings.value("Taille").toSize();
bool fullscreen = settings.value("Pleine écran").toBool();
settings.endGroup();

Si les valeurs doivent être récupérées dans toute l'application et qu'un jour l'un des paramètres change de nom, de type, ou de groupe, il ne sera pas possible d'être sûr que tous les endroits de l'application sont bien modifiés lors de la compilation.

C'est là qu'intervient qGenConfig.

Le but est d'écrire un fichier XML représentant la configuration du logiciel et possédant une certaine structure (des groupes, et des valeurs). Le programme parcourt ensuite ce fichier et génère une classe permettant de lire et d'enregistrer la configuration à l'aide de qGenConfig. Le contenu des données est alors stocké dans une structure C ...

Lire la suite ...

dimanche, 26 juin 2011

[C++/Qt] CMake et Qt

Suite à un billet datant de 2008, je reviens vers vous pour ajouter quelques précisions sur la compilation de programme Qt avec CMake. En effet, pour mon programme XINX, j'ai modifié la chaîne de compilation actuelle utilisant QMake par une chaîne de compilation CMake.

CMake est un puissant générateur de Makefile, il permet de remplacer les anciens (mais pas complètement révolus) autotools. CMake ne remplace donc pas le programme make mais vient se placer en amont.

CMake permet de compiler un programme à différents endroits du dossier des sources, ce qui permet de garder le répertoire des sources propre.

Nous allons considérer dans la suite le dossier projet suivant :

  • projet
    • source
    • build

Compilation

Nous passerons sous silence la compilation d'un programme non Qt qui peut être retrouvé dans la documentation et nous nous limiterons aux explications liées aux programmes écrits en ''Qt' (qui peuvent également être retrouvés dans d'autres tutoriels sur Internet).

Package à utiliser

Pour utiliser Qt4 avec CMake, il faut inclure le package Qt4 :

project(lenomdemonprojet) 
cmake_minimum_required(VERSION 2.8.0)
find_package(Qt4 REQUIRED)

Définir les modules Qt à utiliser :

Il est ensuite possible d'activer ou de désactiver les différents modules de Qt à ...

Lire la suite ...

mardi, 03 mai 2011

XINX v0.10.1

Bonjour à tous,

Je suis heureux de vous annoncer la nouvelle version de XINX. Cette version apporte, en plus de la ré-écriture complète de la gestion du contenu et de la complétion, son petit lot de nouveautés et de corrections.

La version 0.10.1 est beaucoup plus stable que sa grande soeur 0.9. Un soin particulier a été apporté à la recherche des sources d'anomalie possible, ainsi que des fuites mémoires. Ces opérations ont été faites grâce à des outils tels que valgrind, mais aussi grâce aux béta-testeurs (Merci à eux).

De plus l'utilisation des pointeurs intelligents de Qt ont permis de passer plus de temps, sur la gestion des structures et moins de temps sur la gestion de la mémoire, sur des parties du code assez critiques (comme ContentView et CodeCompletion). Ils ont également permis un partage plus facile des structures entre les différents threads avec moins de contrôle de synchronisation.

Liens

Gestion Projet et Gestion des sessions

Multi-projet

Project

XINX est maintenant capable d'ouvrir plusieurs projets en même temps. Cela permet donc plusieurs choses :

  • Rechercher un fichier pouvant ...

Lire la suite ...

mardi, 25 janvier 2011

[C++/Qt] Performance de l'utilisation de QSharedPointer

Présentation

Qt est un framework orienté objet écrit en C++ et permettant de faire des interfaces graphiques. Ce framework est utilisé par le projet KDE depuis ses débuts pour en faire un environnement de bureau très complet.

Qt fournit un ensemble de pointeur intelligent1 permettant de gérer plus facilement la mémoire. Le but est alors de ne plus avoir à supprimer des objets. La suppression se fera soit par un pointeur intelligent soit par le système de hiérarchie d'objet existant en Qt (l'objet père qui supprime l'ensemble des objets fils qui lui sont rattachés).

Qt propose l'ensemble des pointeurs intelligents suivants:

  • QSharedDataPointer / QSharedData : ces deux classes utilisées ensemble permettent d'écrire un objet avec partage implicite. Cela signifie que l'objet fonctionnera comme la classe QString. Tant que l'objet est copié, passé en paramètre, .... l'objet n'est pas dupliqué (tous les objets pointes vers le même espace mémoire). Au moment où l'objet est modifié, l'objet est dupliqué. C'est ce qu'on appelle le COW2.
  • QExplictlySharedDataPointer / QSharedData : QExplicitlySharedDataPointer est une variante de QSharedDataPointer. Ce pointeur intelligent, comme son nom l'indique, est détaché uniquement lorsque la méthode detach() est appelée ...

Lire la suite ...

mercredi, 22 décembre 2010

[C++/Qt] Concaténation de chaînes de caractères

Présentation

Qt est un framework orienté objet écrit en C++ et permettant de faire des interfaces graphiques à l’aide de ces widgets. Ce framework est utilisé par le projet KDE depuis ses débuts pour en faire un environnement très complet.

Qt permet donc de faire des interfaces graphiques mais aussi d’accéder à des bases de données SQL, de faire de la communication réseau, une gestion simplifiée des threads, la lecture de fichier XML. Qt intègre aussi le moteur HTML Webkit.

Qt ajoute une couche supplémentaire au C++ permettant de faire de l’introspection de classe un peu plus poussée (comme l’appel d’une méthode dont on ne connaît le nom qu’à l’exécution). Qt permet également la gestion d’évènement par l’intermédiaire d’un système puissant de SIGNALS et de SLOTS.

Dans la suite de cet article nous allons nous concentrer sur une très petite partie de Qt mais qui est utilisée dans beaucoup d’applications écrites en Qt : les chaînes de caractères, et plus précisément, la concaténation de chaînes de caractères.

Concaténation de chaînes de caractères.

Comme dans d’autres langages, la concaténation de chaînes de caractères se fait à l'aide de l ...

Lire la suite ...

dimanche, 06 juin 2010

Calcul de la distance entre deux fichiers

Présentation

Suite à un billet sur LinuxFR, où je demandais comment calculer la distance (ou le pourcentage de similitude entre deux logiciels), j'ai obtenu la formule suivante :

distance = 1 - ( C(A) + C(B) - C(AB) ) / Max(C(A), C(B))

où C(X) est la taille du fichier X compressé1.

Après avoir testé les formats gzip, bzip2 et lzma, j'ai conclu que le format de compression le plus performant pour le calcul, est le format lzma, car le dictionnaire avec la mise en commun était le plus gros, et donc le calcul de distance est plus efficace.

Le programme

J'ai donc décidé d'écrire un programme parcourant un dossier (avec plusieurs milliers de fichiers) et de calculer pour toutes les combinaisons des fichiers la distance entre chaque fichier. Ce programme consommant énormément de mémoire, il se peut que pour un grand nombre de fichier, le programme se plante avec une erreur d'allocation de mémoire.

Ce programme permet de pouvoir faire une cartographie de ces fichiers et ainsi de pouvoir les classer. Testé sur des fichiers textes (sources de logiciels), le programme est assez efficace.

Testé sur des images, ou des vidéos, les fichiers sont considérés ...

Lire la suite ...

dimanche, 02 mai 2010

Présentation de XINX

Ce billet fait suite à la sortie de la version 0.9.0 de XINX et va vous décrire ce logiciel. XINX est éditeur de feuille de style XSL (il fait également éditeur JavaScript et CSS mais actuellement moins bien que ce que peuvent faire d'autres).

Il permet l'édition des feuilles de styles en proposant de compléter sur le nom des balises (normal), sur les attributs (normal), sur les valeurs d'attributs : les variables, les paramètres, ... Il propose également automatiquement les différents paramètres lors de l'utilisation d'un call:template.

L'éditeur est fortement tourné vers l'édition de feuille de style XSL pour génération d'HTML mais peut être utilisé pour générer du XML.

XINX

Historique

Depuis un certain temps déjà (5 ans), je travaille pour la société Generix Group éditant et intégrant un ERP1 du nom de GCE.

Sur la partie Web de cet ERP, il est possible d'intervenir à plusieurs endroits pour modifier son fonctionnement :

  • Le paramétrage (BDD) : Modification d'un paramètre pour agir sur le comportement du logiciel
  • La couche métier (JAVA) : Lit le paramétrage (BDD) et réalise les traitements. Il est possible de développer de nouveaux objets, mais aussi de dériver ...

Lire la suite ...

Page 1 / 4 »