Fedora-Fr - Communauté francophone Fedora - Linux

Planet de Fedora-Fr : la communauté francophone autour de la distribution Linux Fedora

A propos

Cette page est actualisée toutes les heures.

Cette page est une sélection de blogs autour de Fedora. Fedora-Fr.org décline toute responsabilité au sujet des propos tenus par les auteurs des blogs de ce planet. Leurs propos sont leur entière responsabilité.

Le contenu de ce planet appartient à leurs auteurs respectifs. Merci de consulter leur blogs pour obtenir les licences respectives.

Premiers pas avec QtScript

Fabien Nicoleau

Dans un précédent billet, j'avais parlé de la possibilité d'intégrer très facilement dans vos applications Java des scripts écrits en JavaScript, et de la facilité avec laquelle vos applications peuvent interagir avec les scripts. J'avais ensuite proposé un exemple d'utilisation avec un robot IRC fonctionnant avec des plugins écrits en JavaScript.

La bibliothèque Qt permet elle aussi d'intégrer des scripts JavaScript dans vos applications. Je propose ici de découvrir comment le faire, à travers quelques exemples simples.

Avant de commencer

Avant d'entrer dans le vif du sujet, préparons d'abord le terrain. Je proposerai pour chaque exemple le code dans ce billet, mais je vous conseille, si vous voulez tester, de télécharger l'archive jointe à ce billet contenant les sources des exemples. Une fois décompressée, déplacez vous dans le dossier qtscripting, puis ouvrez une console, et tapez :

qmake-qt4
make

Tous les exemples sont alors compilés. Bien sûr, pour que la compilation fonctionne, ils vous faut installer le paquet qt-devel. Sous Fedora, tapez :

# yum install qt-devel

Une fois les exemples compilés, vous pouvez vous déplacer dans les dossiers, et lancer les exécutables.

Notez que pour ajouter le support des scripts au projet, il a simplement suffit d'ajouter script à la directive QT (voir le QT += script dans le fichier common.pri), et d'include QtScript dans les sources.

Exemple 1 : 1 + 1

Pour le premier exemple, faisons simple ! Il s'agit ici simplement de voir comment exécuter un code JavaScript depuis du code C++, et de récupérer le résultat.

On commence direct avec le code :

#include <QtScript>
#include <QApplication>
int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QScriptEngine engine;
    QScriptValue resultat = engine.evaluate("1+1");
    qDebug() << resultat.toString() ;
    return 0;
}

Rien de complexe. On créé d'abord un objet de type QScriptEngine, qui sera notre moteur de script, indispensable. On demande ensuite à notre moteur d'évaluer le code "1+1". Le résultat de l'évaluation est stocké dans un objet de type QScriptValue. Enfin on affiche le résultat. En parcourant la doc sur QScriptValue, vous pourrez vous rendre compte qu'il est possible d'effectuer de nombreuses vérifications afin de s'assurer que le résultat est exploitable, notamment en contrôlant son type.

Voilà pour un début, il n'y a rien d'exceptionnel bien sûr, mais les base sont posées : notre programme a affiché le résultat d'un code externe (en l'occurrence du JavaScript, même si ce n'est qu'une addition, et que le code est "en dur" dans le programme). Pour les plus sceptiques, j'affiche la sortie du programme :

[eponyme@localhost exemple1]$ ./exemple1
"2"
[eponyme@localhost exemple1]$

Surpris ? :D

Passons à la suite.

Exemple 2 : appel d'une fonction

Nous allons dans cette exemple appeler une fonction et lui passer un paramètre, puis afficher ce qu'elle nous renvoie. Le code :

#include <QtScript>
#include <QApplication>
int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QScriptEngine engine;
    engine.evaluate("function disMoiBonjour(prenom) { return \"Bonjour \"+prenom; }");    
    QScriptValue disBonjour = engine.globalObject().property("disMoiBonjour");
    qDebug() << disBonjour.call(QScriptValue(),QScriptValueList() << "Fabien").toString() ;
    return 0;
}

Comme dans le premier exemple, on créé un moteur, mais cette fois ci au lieu de lui faire évaluer une addition, nous demandons d'évaluer la définition d'une fonction, appelée disMoiBonjour. Cette fonction retourne une phrase "disant bonjour" à la personne dont le prénom est passé en paramètre. La ligne suivante nous permet de récupérer parmi les objets du script (globalObject())  notre fonction disMoiBonjour (property()), conservée dans la variable disBonjour. Il ne nous reste plus qu'à l'appeler grâce à la méthode call(). Notez le second paramètre, qui est une liste de valeurs qui sont passées en arguments à la fonction appelée. Ici, on envoie juste la chaîne "Fabien".

Voici la sortie du programme :

[eponyme@localhost exemple2]$ ./exemple2
"Bonjour Fabien"
[eponyme@localhost exemple2]$

Cet article ayant juste pour but de découvrir des choses simples et basiques possibles avec QtScript, je ne rentre pas plus dans les le détail concernant les différentes méthodes utilisées ici, mais la documentation vous fera découvrir que l'on peut aller beaucoup plus loin.

Au passage, on voit déjà que du code JavaScript dans une chaine de caractères, ça n'est pas très pratique. Vivement qu'on puisse le mettre dans un fichier !

Exemple 3 : code JS dans un fichier et objet global

Pour le moment, nos scripts étaient "en dur" dans le code C++, ce qui n'a que très peu (aucun ?) intérêt. Voyons ici comment externaliser ce code et le placer dans un fichier. La méthode evaluate() prenant en paramètre une chaine de caractères, il sera très simple (surtout avec Qt) de récupérer le contenu d'un fichier texte pour le faire évaluer. Je profite aussi de cet exemple pour montrer comment exporter depuis le code C++ un objet global dans le script. Comme d'habitude, on attaque directement avec le code :

#include <QtScript>
#include <QApplication>
int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QScriptEngine engine;
    QFile file("script.qs");
    file.open(QIODevice::ReadOnly);
    engine.globalObject().setProperty("name","Fabien");
    engine.evaluate(file.readAll());   
    file.close();
    return 0;
}

Comme on pouvait s'y attendre, la chose est très simple à réaliser grâce à l'objet QFile. On ouvre en lecture seule un fichier nommé script.qs, et on passe son contenu à la méthode evaluate() via la méthode readAll(). Le contenu du fichier est ainsi entièrement évalué. L'autre nouveauté ici est que l'on "envoie" dans le script l'objet "name", dont la valeur est "Fabien", avec la méthode setProperty(). Ainsi, à n'importe quel endroit du script, il sera possible d'accéder à cet objet.

Voyons d'ailleurs le contenu du script (fichier script.qs) :

print('Bonjour '+name);

Ce petit script se contentera donc d'afficher dans la console un bonjour à la personne dont le prénom est stocké dans l'objet name (et assigné depuis le code C++).

Voyons ce que ca donne à l'exécution :

[eponyme@localhost exemple3]$ ./exemple3
Bonjour Fabien
[eponyme@localhost exemple3]$

La encore, pas de grande surprise ! Mais désormais, vous pouvez stocker votre code JS dans un fichier, ce qui ouvre un grand nombre de possibilités, notamment celui de stocker différents scripts afin de charger différentes fonctions, pour un système de plugins.

Exemple 4 : envoi d'un QObject dans le script

L'exemple 3 nous a montré qu'il est possible d'envoyer un objet avec une valeur dans le script, et ce depuis le code C++. Cependant cet objet ne peut prendre qu'une valeur simple. Nous allons voir ici comment envoyer dans le script un QObject (et donc un de ses objets hérités, ce qui en fait beaucoup).

Pour illustrer cet exemple, je vais utiliser un QLabel, habituellement utilisé pour afficher un libellé dans une interface graphique. Voici le code :

#include <QtScript>
#include <QApplication>
#include <QLabel>
int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QLabel lbl;
    QScriptEngine engine;
    QFile file("script.qs");
    file.open(QIODevice::ReadOnly);
    lbl.setText("UN");
    QScriptValue object = engine.newQObject(&lbl);
    engine.globalObject().setProperty("label",object);   
    engine.evaluate(file.readAll());
    file.close();
    qDebug() <<"Dans le code : " <<  lbl.text();
    return 0;
}

Le QLabel ne sera pas utilisé ici dans une interface, mais on utilise ses méthodes pour le manipuler. Après l'habituelle création du moteur, on créé donc un objet QLabel, pour lequel on modifie le libellé en le passant à "UN", grâce au slot setText(). Ensuite, la méthode newQObject() du moteur est appelée, prenant en paramètre un pointeur sur notre objet de type QLabel. C'est la valeur renvoyée par newQObject qui est utilisée pour le setProperty() de la ligne suivante, déjà utilisé dans l'exemple 3. Ainsi, dans notre script, on pourra utiliser notre objet QLabel n'importe quand grâce à la variable label, dont le nom est passé en premier argument à setProperty(). Comme dans les autres exemples, on évalue le script, puis on ferme le fichier. Enfin, on affiche la valeur de notre QLabel grâce à sa méthode text(). En toute logique, elle devrait renvoyer "UN", à moins que la valeur ait été changée depuis le script ... Voyons justement le code de ce dernier (fichier script.qs) :

print("Dans le script : "+label.text);
label.setText("DEUX");

Deux lignes, très simples. La première affiche la valeur du QLabel accessible grâce à la variable label. La valeur du QLabel est obtenue grâce à la propriété text de ce dernier. Sur la seconde ligne, on change la valeur du QLabel à "DEUX", grâce à setText().

Voyons ce que donne l'exécution :

[eponyme@localhost exemple4]$ ./exemple4
Dans le script : UN
Dans le code :  "DEUX"
[eponyme@localhost exemple4]$

On voit ici l'évolution de notre QObject ! La première valeur affichée ("UN") depuis le script (avec print()) est celle qui avait été fixée dans le code C++. Après avoir affiché la valeur, le script JS a changé la valeur du QLabel, et depuis le code, la valeur affichée est bien "DEUX".

Nous pouvons donc de façon très simple passer à notre script JS des QObject et lui permettre d'en modifier les propriétés.

Exemple 5 : gestion des erreurs

Lorsque l'on débute, ou lorsque l'on commence à faire des choses compliquées, il arrive souvent que l'on bloque car le code JS n'est pas évalué. Dans la plupart des cas, il s'agit juste d'une erreur de syntaxe. Mais il est parfois difficile de savoir pourquoi est ce que notre script n'est pas évalué, et donc qu'il est impossible d'interagir avec lui ensuite. On peut aussi être parfois sûr de son code, et ne pas penser qu'il y a une erreur. Heureusement il est possible, lorsqu'une erreur est rencontrée, d'afficher un message. Voici un code d'exemple :

#include <QtScript>
#include <QApplication>
int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QScriptEngine engine;
    QScriptValue result = engine.evaluate("print('Bonjour !'");
    if (result.isError()) {
        qDebug() << result.property("message").toString();
    }
    return 0;
}

Dans ce code, on demande au moteur d'évaluer du JavaScript devant afficher "Bonjour !", mais la parenthèse fermante est volontairement oubliée. On se sert de la valeur renvoyée par l'évaluation pour vérifier s'il y a eu une erreur avec isError(). Si c'est le cas, on peut afficher un message explicatif en récupérant la propriété message du résultat d'évaluation.

Voyons l'exécution du programme :

[eponyme@localhost exemple5]$ ./exemple5
"Parse error"
[eponyme@localhost exemple5]$

Notre code n'est pas évalué, et le moteur nous indique une Parse error. On sait au moins ou chercher. Cette vérification vous permettra de gagner un peu de temps si vous n'obtenez pas le résultat espéré.

Exemple 6 : signaux et slots

Les signaux et slots sont l'un des avantages du développement avec la bibliothèque Qt, et n'ont pas été oubliés avec QtScript. Dans ce dernier exemple, nous allons créer une fenêtre basique comprenant deux boutons. Le premier, appelé "Bonjour", devra afficher "Bonjour !" dans la console lorsque l'on clique dessus, et le second, "Au revoir", devra afficher ... "Au revoir !" (et oui !)  lorsque l'on clique dessus. La particularité est que ces affichages dans la console se feront depuis un script JS, et non pas directement depuis des slots dans le code C++. L'intérêt ? Ici, aucun. Il s'agira simplement de montrer que l'on peut connecter un signal à un slot dont l'implémentation est faite dans un script JS, ce qui permet de personnaliser facilement une application en changeant le comportement du slot dans les scripts. Pour l'exemple, nous verrons deux façons différentes de connecter un signal à un slot implémenté dans un script, la première sera faite depuis le code C++, pour le bouton "Bonjour", et la seconde directement dans le script JS, pour le bouton "Au revoir".

Passons au code :

#include <QtScript>
#include <QApplication>
#include <QtGui>
int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QWidget fenetre;
    QVBoxLayout vbox(&fenetre);
    QPushButton bBonjour("Bonjour");
    QPushButton bAuRevoir("Au revoir");
    vbox.addWidget(&bBonjour);
    vbox.addWidget(&bAuRevoir);

    QScriptEngine engine;
    QFile file("script.qs");
    file.open(QIODevice::ReadOnly);
    QScriptValue objBonjour = engine.newQObject(&bBonjour);
    QScriptValue objAuRevoir = engine.newQObject(&bAuRevoir);
    engine.globalObject().setProperty("objAuRevoir",objAuRevoir);
    engine.evaluate(file.readAll());
    file.close();
    QScriptValue slot = engine.globalObject().property("bonjourHandler");
    qScriptConnect(&bBonjour, SIGNAL(clicked()), objBonjour, slot);

    fenetre.show();
    return app.exec();
}

C'est un peu plus long que d'habitude, certes, mais le premier pavé ne concerne que l'interface graphique, ce qui n'est pas le sujet de ce billet. On y créé les deux boutons et on les place sur la fenêtre.

Ensuite, comme d'habitude, on créé un moteur, qui évaluera du code JS placé dans un fichier. Deux "objets QtScript" sont créés à partir des deux boutons, grâce à newQObject() : objBonjour et objAuRevoir. Ils nous serviront à réaliser les connexions avec les slots du script. L'objet objAuRevoir est exporté dans le script car nous en aurons besoin pour réaliser la connexion au slot

Une fois l'évaluation du script faite, on récupère la propriété bonjourHander, qui est une fonction dans le script JS, que l'on stocke dans la variable slot. Cette variable est utilisée ensuite pour réaliser la connexion entre le signal clicked du bouton "Bonjour" et le slot bonjourHandler, grâce à la fonction qScriptConnect().

Voyons maintenant le contenu du script (fichier script.qs) :

function bonjourHandler () {
    print('Bonjour !');
}
function auRevoirHandler () {
    print('Au revoir !');
}
objAuRevoir.clicked.connect(this.auRevoirHandler);

On y trouve les deux fonctions qui seront appelées lors des clics sur les boutons. bonjourHandler est déjà connectée au bouton "Bonjour" via l'appel à qScriptConnect() dans le code C++. La fonction auRevoirHandler est elle connectée au bouton "Au revoir" à la dernière ligne du script, qui utilise l'objet objAuRevoir exporté dans le programme. Ainsi nos deux fonctions sont connectées à leur bouton respectif, l'une depuis le code C++, l'autre depuis le script JS. A vous de voir ce que vous préférez !

Une petite image pour l'exécution du programme :

tuto_qtscript_exemple6.jpg


C'est sur cet exemple que ce termine cette initiation. Je n'ai pas la prétention avec cet article de donner une vue d'ensemble des possibilités offertes par QtScript. J'en suis d'ailleurs encore au stade de la découverte. Mais ces exemples pourrons vous permettre de vous lancer, et de démystifier un peu les choses ! Je proposerai dans un prochain article un exemple concret d'utilisation de QtScript pour un système de plugins.

Hormis les liens disséminés un peu partout dans l'article, les deux sources qui m'ont le plus aidé sont :

Bon dev' !


Fabien (eponyme)

Bleachbit et votre PC souffle un peu

Patrice Ferlet

On télécharge, on joue avec des compilations de programme, on se teste au package, on ferme brutalement des éditeurs de texte, on utilise firefox et google-chrome... et puis un jour on se rend compte que son PC est un peu lent, que le disque "craque" et que l'espace disque commence à manquer. Je vais vous présenter l'outil magique qui va vous soulager la douleur.

Bleachbit est un outil très intéressant pour tout utilisateur qui remplis son disque dur très vite, qui navigue énormément sur internet ou encore qui fait pas mal de code... en fait, il est bon pout tout le monde, y compris l'utilisateur bureautique.

Bleachbit vient en fait avec des "plugins" qui s'activent si il découvre une utilisation possible sur votre PC, par exemple si vous utilisez aMule alors l'outil vous proposera de nettoyer votre espace aMule, idem pour Firefox, Google-Chrome, etc...

Pour utiliser ce programme, installez le via l'outil de gestion de paquets ou dans une console:

su -lc "yum -y install bleachbit"

Vous pouvez alors le lancer en tant qu'utilisateur ou root. Pour le second cas, cela sera utile pour nettoyer les cache de yum par exemple... Bref, lancez l'outil avec la commande "bleachbit" (le plus simple étant de presser ALT+F2 et de taper dans l'invite: bleachbit)

S'ouvre alors une fenêtre de ce type: Bleachbit

En cochant des cases, vous activerez alors les opérations possible de bleachbit. En tant qu'utilisateur vous ne pourrez pas toucher à yum, mais par contre les fichiers temporaires (inutiles en général) ou l'optimisation les bases SQLite de firefox ou chrome est une opération qui peut vous faire gagner beaucoup de place.

Personnellement, je code beaucoup sous vim, gedit et geany. J'ai pas mal de compilation dans mon répertoire de rpm (rpmbuild) et j'utilise énormément de cache dans mes navigateurs étant donné le nombre de site que je visite en une journée. J'ai gagné 9 gigas lors de mon dernier nettoyage.

En tant que root, c'est une opération qui peut vous faire gagner quelques centaines de mégas rien qu'en vidant les cache yum et les traduction inutiles (désolé mais les man pages en polonais ça m'aide pas des masses..)

Pour ce dernier cas notez bien que les mises à jour de page de manuels vous feront apparaître un "warning" qui stipule que des fichiers sont manquants. Oui, c'est normal et pas grave du tout...

Voilà, moi je vous conseille d'utiliser cet outil de temps en temps. Commencez toujours par utiliser le bouton "Prévisualiser" qui vous donnera une estimation de l'espace que vous allez retrouver (presque toujours inférieur au gain réél). Et surtout, lisez bien les informations sur la gauche quand vous sélectionner une option pour savoir ce que va faire Bleachbit.

Mais dans l'ensemble, il ne fait rien de bien dangereux.

La GUI du Jeudi : System-config-services - Une interface de gestion de service

Paquet Fedora du jour

system-config-servicesSystem-config-services est un petit utilitaire vous permettant de configurer l'arrêt, le démarrage ou encore redémarrage de vos services. Il ne s'arrête pas à ces fonctionnalités là puisqu'il permet aussi de déterminer si tel ou tel service doit être lancé automatiquement au démarrage !
Enfin, si vous le désirez, il permettra aussi de personnaliser le niveau dexécution de chacun de vos services.

Bref, petit utilitaire indispensable si l'on ne souhaite pas utiliser service et chkconfig en ligne de commande !

Installation en ligne de commande : yum install system-config-services yum install system-config-services-docs

Installation avec l'interface graphique : Outils Système > Utility to start and stop system services

Localisation dans le menu : Système > Administration > Services

Lancement en ligne de commande : /usr/bin/system-config-services

Site web : http://fedorahosted.org/system-config-services

Désactiver les bips système sous Linux/BSD.

Sébastien Natroll Les bips système, c’est geek, c’est chouette, mais ça peut vite devenir importunant lorsque l’on est pas seul. Pour le désactiver : GNU/Linux # modprobe -r pcspkr # echo "blacklist pcspkr" >> /etc/modprobe.d/blacklist.conf /!\ N.B : Ne pas inscrire rmmod pcspkr dans /etc/rc.local comme l’indiquent certains sites. C’est un peu crade… BSD # sysctl hw.syscons.bell=0 La suite >

Désactiver les bips système sous Linux/BSD.

Sébastien Natroll Les bips système, c’est geek, c’est chouette, mais ça peut vite devenir importunant lorsque l’on est pas seul. Pour le désactiver : GNU/Linux # modprobe -r pcspkr # echo "blacklist pcspkr" >> /etc/modprobe.d/blacklist.conf /!\ N.B : Ne pas inscrire rmmod pcspkr dans /etc/rc.local comme l’indiquent certains sites. C’est un peu crade… BSD # sysctl hw.syscons.bell=0 La suite >

Firefox 4.0 Beta 12

Remi Collet

Les RPM de la douzième beta de la prochaine version majeure du navigateur de la Fondation Mozilla est disponible dans le dépôt remi pour Fedora >= 10. Disponible en 78 langues.

Le paquet firefox4-4.0-0.26.beta12 installe cette nouvelle version à côté de la version 3.x. Vous aurez donc 2 options dans le menu Internet. Commencez par lire : Mozilla Firefox 4 Beta Release Notes (Notes de version en anglais) A propos de Firefox 4 Beta (Tristan Nitot). Comme toujours : yum remove firefox4yum --enablerepo=remi install... Lire Firefox 4.0 Beta 12

Mardi Artistique : Wallpapoz - Avoir un fond d'écran différent par bureau

Paquet Fedora du jour

WallpapozCet outil vous permet d'avoir un fond d'écran différent par bureau Gnome ! Wallpapoz est véritablement très simple à configurer, vous choisissez le bureau, un fond d'écran et celui-ci se voit défini un fond d'écran spécifique !
Un démon est alors lancé, ainsi wallpapoz tourne en tache de fond. Vous avez aussi la possibilité de changer de fond d'écran après un temps que vous définissez.
Il est à noter qu'avec Compiz d'activé, le chargement du fond d'écran n'est pas instantané, il y a un petit décalage de 1 ou 2 secondes tout au plus ... mais j'avoue ne pas avoir cherché plus loin comment résoudre ce problème.
Voilà de quoi bidouiller votre belle Fedora pour ce début de semaine hivernale !

Installation en ligne de commande : yum install wallpapoz

Installation avec l'interface graphique : Bureau Gnome > Gnome Multi Backgrounds and Wallpapers Configuration Tool

Localisation dans le menu : Applications > Accessoires > Wallpapoz

Lancement en ligne de commande : /usr/bin/wallpapoz

Site web : http://wallpapoz.akbarhome.com/

Réseau en mode bridge avec KVM sous F-14

Johan Cwiklinski

Depuis un certain temps maintenant, j'utilise les fonctionnalités de virtualisation offertes de base par Fedora, à savoir : KVM/Qemu, libvirt et les outils virt-manager, virsh, etc.

Par défaut, les machines virtuelles utiliseront un réseau NAT avec un sous réseau 192.168.122.0. J'ai voulu récemment que le routeur de mon réseau local s'occupe d'attribuer une adresse IP à l'une de mes machines virtuelles ; il fallait donc revoir la configuration du réseau pour passer en mode bridge sur mon unique carte réseau.

Sous Fedora 14 ; une partie du travail est déjà faite... La configuration par défaut ajoute une interface nommée virbr0 que nous allons pouvoir utiliser en tant que bridge.

Pour ce faire, on va créer le fichier de configuration pour l'interface virbr0 (/etc/sysconfig/network-scripts/ifcfg-virbr0) avec le contenu suivant :

DEVICE=virbr0
ONBOOT=yes
BOOTPROTO=dhcp
TYPE=Bridge
USERCTL=yes
NM_CONTROLLED=no
IPV6INIT=no
NAME="bridge"
PEERNTP=yes

Ici, on spécifie entre autres qu'il s'agit d'un bridge et que la configuration se fait par DHCP (puisque c'est mon routeur qui doit se charger de ça).

Ensuite, on indiquera à l'interface eth0 qu'elle doit utiliser le bridge , en ajoutant à la fin du fichier /etc/sysconfig/network-scripts/ifcfg-eth0:

 BRIDGE=virbr0

Un petit service network restart après, on peut constater que les adresses IP des machines virtuelles sont désormais gérées par le routeur, ainsi que l'attribution d'adresses IP fixes en fonction des adresses MAC, etc.

Notez que la configuration énoncée ici se réfère à l'utilisation du service network, et non NetworkManager. Il faudra donc veiller à ce que ce dernier soit désactivé au profit du service network.

Mon hébergeur : KalyHost !

Sébastien Natroll J’ai récemment renouvelé Kenshin-blog.com pour un an. Aujourd’hui je me suis dit : « Pourquoi ne pas en parler ? ». Vous allez me dire : « C’est un billet sponsorisé, ça craint. » ou alors « On s’en fout », et je tiens à clarifier de suite les choses. Ce billet n’est pas sponsorisé, je n’ai pas besoin d’être payé La suite >

Mon hébergeur : KalyHost !

Sébastien Natroll J’ai récemment renouvelé Kenshin-blog.com pour un an. Aujourd’hui je me suis dit : « Pourquoi ne pas en parler ? ». Vous allez me dire : « C’est un billet sponsorisé, ça craint. » ou alors « On s’en fout », et je tiens à clarifier de suite les choses. Ce billet n’est pas sponsorisé, je n’ai pas besoin d’être payé La suite >

Fedora 15: journée de tests pour le pilote intel

Edouard Bourguignon

Cette fois, il s'agit d'une journée de tests pour les pilotes libres des cartes graphiques Intel. C'est donc les possesseurs de carte graphique intégrée Intel qui pourront contribuer à Fedora en testant le pilote sur la Fedora 15. Pour cela il faut suivre la procédure suivante:

http://fedoraproject.org/wiki/Test_Day:2011-02-24_Intel

La documentation concernant l'utilisation des LiveCD à l'adresse suivante:

http://fedoraproject.org/wiki/FedoraLiveCD

On ne rappelle jamais assez l'intérêt de ce genre de test ciblé à grand échelle, mais cela permet d'éradiquer certain bugs et de valider que tout fonctionne sur un maximum de matériels.

Mise à jour de Dotclear

Mehdi Bahri

Bonsoir à tous

Certains l'ont peut être remarqué, le blog était down ces derniers jours. Je pense que c'est lié à la version de Dotclear qui posait problème probablement à la suite des récentes mises à jour des serveurs de servhome.org. Honteusement je l'avoue, je n'avais pas mis à jour Dotclear depuis quelques temps, c'est maintenant chose faite et le blog tourne sous la dernière version disponible de Dotclear à la date de la rédaction de ce billet.

Etant à l'internat et non chez moi, je n'ai pas pu le faire plus tôt dans la semaine, études obligent. Par ailleurs, j'en profite pour vous conseiller, si vous ne connaissez pas déjà, un outil extrêmement pratique lorsque le FTP classique est bloqué : net2ftp.com, c'est un client FTP web avec des fonctionnalités pratiques telles que l'upload groupé de fichiers sous forme d'archives etc.

Sur ce je vous souhaite une bonne nuit, mon accès internet coupe à 23h ;)" class="smiley

Mise à jour de Dotclear

Mehdi Bahri

Bonsoir à tous

Certains l'ont peut être remarqué, le blog était down ces derniers jours. Je pense que c'est lié à la version de Dotclear qui posait problème probablement à la suite des récentes mises à jour des serveurs de servhome.org. Honteusement je l'avoue, je n'avais pas mis à jour Dotclear depuis quelques temps, c'est maintenant chose faite et le blog tourne sous la dernière version disponible de Dotclear à la date de la rédaction de ce billet.

Etant à l'internat et non chez moi, je n'ai pas pu le faire plus tôt dans la semaine, études obligent. Par ailleurs, j'en profite pour vous conseiller, si vous ne connaissez pas déjà, un outil extrêmement pratique lorsque le FTP classique est bloqué : net2ftp.com, c'est un client FTP web avec des fonctionnalités pratiques telles que l'upload groupé de fichiers sous forme d'archives etc.

Sur ce je vous souhaite une bonne nuit, mon accès internet coupe à 23h ;)" class="smiley

Mise à jour de Dotclear

Mehdi Bahri

Bonsoir à tous

Certains l'ont peut être remarqué, le blog était down ces derniers jours. Je pense que c'est lié à la version de Dotclear qui posait problème probablement à la suite des récentes mises à jour des serveurs de servhome.org. Honteusement je l'avoue, je n'avais pas mis à jour Dotclear depuis quelques temps, c'est maintenant chose faite et le blog tourne sous la dernière version disponible de Dotclear à la date de la rédaction de ce billet.

Etant à l'internat et non chez moi, je n'ai pas pu le faire plus tôt dans la semaine, études obligent. Par ailleurs, j'en profite pour vous conseiller, si vous ne connaissez pas déjà, un outil extrêmement pratique lorsque le FTP classique est bloqué : net2ftp.com, c'est un client FTP web avec des fonctionnalités pratiques telles que l'upload groupé de fichiers sous forme d'archives etc.

Sur ce je vous souhaite une bonne nuit, mon accès internet coupe à 23h ;)" class="smiley

Mise à jour de Dotclear

Mehdi Bahri

Bonsoir à tous

Certains l'ont peut être remarqué, le blog était down ces derniers jours. Je pense que c'est lié à la version de Dotclear qui posait problème probablement à la suite des récentes mises à jour des serveurs de servhome.org. Honteusement je l'avoue, je n'avais pas mis à jour Dotclear depuis quelques temps, c'est maintenant chose faite et le blog tourne sous la dernière version disponible de Dotclear à la date de la rédaction de ce billet.

Etant à l'internat et non chez moi, je n'ai pas pu le faire plus tôt dans la semaine, études obligent. Par ailleurs, j'en profite pour vous conseiller, si vous ne connaissez pas déjà, un outil extrêmement pratique lorsque le FTP classique est bloqué : net2ftp.com, c'est un client FTP web avec des fonctionnalités pratiques telles que l'upload groupé de fichiers sous forme d'archives etc.

Sur ce je vous souhaite une bonne nuit, mon accès internet coupe à 23h ;)" class="smiley

Prosody (serveur Jabber) sur Fedora

Johan Cwiklinski

Depuis pas mal de temps, j'ai un serveur Jabber qui tourne sur ma machine personnelle, j'avais mis en place ce service à l'origine pour pouvoir discuter en réseau local avec mon voisin de l'époque lorsque notre accès internet était planté (ce qui arrivait souvent :-p).

J'ai utilisé Jabberd2 pendant des années, il me convenait parfaitement.

L'an dernier, j'ai décidé d'en changer pour voir un peu ce qui se faisait ailleurs, je me suis initialement tourné vers ejabberd qui est présent dans les dépôts Fedora. Seulement voilà, je ne suis pas parvenu à m'y faire :-(" class="smiley
Les possibilités offertes par eJabberd sont prometteuses, il semble que ce soit un bon système ; mais que je ne suis pas parvenu à utiliser correctement. À plusieurs reprises par exemple, je me suis retrouvé avec un service ejabberd qui refusait de se lancer, les raisons en étant souvent très obscures (en ce qui me concerne en tous cas).
Bref, je n'ai pas accroché, ça arrive ;)" class="smiley

C'est alors que j'ai entendu parler de Prosody, un autre serveur XMPP qui n'était malheureusement pas disponible dans les dépôts Fedora. J'ai donc décidé d'en faire un paquet à soumettre aux dépôts (voir la demande de revue de Prosody).

J'utilise Prosody depuis, et j'avoue en être très content :-)" class="smiley

Un bémol cependant... Pour le support SSL, Prosody se base sur lua-sec, qui n'est pas présent non plus dans les dépôts, il fallait donc l'y soumettre (voir la demande de revue pour lua-sec). Le problème se situe ici ; lua-sec duplique des fonctionnalités apportées par lua-socket, présent dans les dépôts et dont lua-sec dépend également par ailleurs. Vous pourrez trouver d'avantage de détails à ce sujet dans la demande de revue, notamment les commentaires de Adam Goode.

Maintenant que je ne maintiens plus aucun paquet dans les dépôts Fedora ; ces deux revues deviennent orphelines :-(" class="smiley

Puisque je continue d'utiliser ce serveur moi même, les paquets Prosody et lua-sec sont disponibles dans mon dépôt personnel ; les dernières versions sont disponibles via bitbucket :

Évidemment, si quelqu'un se sentait l'âme aventureuse, il pourrait proposer ces paquets en se basant sur le travail déjà effectué :)" class="smiley

Fedora 15: journée de tests pour le pilote radeon

Edouard Bourguignon

Cette fois, il s'agit d'une journée de tests pour les pilotes libres des cartes graphiques ATI/AMD. C'est donc les possesseurs de carte graphique AMD/ATI qui pourront contribuer à Fedora en testant le pilote radeon sur la Fedora 15. Pour cela il faut suivre la procédure suivante:

http://fedoraproject.org/wiki/Test_Day:2011-02-23_Radeon

La documentation concernant l'utilisation des LiveCD à l'adresse suivante:

http://fedoraproject.org/wiki/FedoraLiveCD

On ne rappelle jamais assez l'intérêt de ce genre de test ciblé à grand échelle, mais cela permet d'éradiquer certain bugs et de valider que tout fonctionne sur un maximum de matériels.

Fedora 15: journée de tests pour le pilote nouveau

Edouard Bourguignon

Les journées tests sont l'occasion de tester un point précis afin de remonter le maximum de bugs sur le sujet. Forcement cela se passe sur la version encore en développement de la prochaine Fedora (ici la Fedora 15), mais tout est mis en œuvre pour faciliter son utilisation avec un LiveCD dédié pour la journée de tests.

Aujourd'hui il s'agit du tests sur le pilote nouveau, donc les possesseurs de carte graphique Nvidia qui voudraient contribuer à Fedora peuvent suivre la procédure suivante avec les images ISO des LiveCD:

http://fedoraproject.org/wiki/Test_Day:2011-02-22_Nouveau

La documentation concernant l'utilisation des LiveCD à l'adresse suivante:

http://fedoraproject.org/wiki/FedoraLiveCD

On ne rappelle jamais assez l'intérêt de ce genre de test ciblé à grand échelle, mais cela permet d'éradiquer certain bugs et de valider que tout fonctionne sur un maximum de matériels.

Cython pour optimiser Python

Patrice Ferlet

Cython permet de coder des extensions python compilées via un mécanisme de traduction en C. Mais il permet aussi de créer un exécutable de votre programme python. Les performances sont spectaculaires et nous allons le voir dans ce billet

Python est l'un des langages les plus aboutis de notre génération. Tant au point de vue sémantique que la souplesse qu'il permet en terme d'environnement et de possibilités. Outre les outils et modules qui permettent de travailler efficacement, des projets existent pour rendre python encore plus optimal. Beaucoup savent déjà que, comme dans pas mal de langages, il est possible de développer des extension en C pour augmenter la vitesse d'exécution d'un programme python. Mais l'écriture est un peu complexe et il souvent on préfère laisser de coté la performance en faveur de la vitesse de développement.

Python étant interprété, le programme que vous aurez créé sera alors soumi à une dépendance forte: Python lui même. Car pour exécuter un programme python, il faut python. Or comme je vous l'ai dit Python a un univers autour de lui qui permet de faire des miracles. Nous allons donc voir l'un des ses astres qui gravite autour de Python: Cython. Avec lui, vous allez pouvoir développer simplement des extension plus optimisées, et en plus pouvoir compiler un programme python en un exécutable binaire natif.

La seule dépendance sera alors la librairie python.

Voici, sous Fedora, ce que vous allez faire:

yum install Cython

Cela installe les librairies Cython + un outil de compilation qui porte le même nom. C'est parti pour l'explication.

Cython est un outil qui va permettre la traduction de votre code python en C. Un peu comme le fait shedskin. La différence est que Cython permet de générer un code en C qui sera exploitable par python. En d'autres termes, et pour être plus exact, Cython crée du code C pour générer une extenion python valide.

Prenon un simple exemple:

#file: hello.py
def printHello:
        print "Hello you !"

Ce code est simple, c'est une fonction qui, lorsqu'on l'appelle, affiche un message "Hello you !". Pour générer l'extension il existe plusieurs méthodes. La plus simple étant de faire un fichier "setup.py" (un standard python qui utilise distutils) ou utiliser Cython.

Comme je péfère expliquer les choses complexe pour les rendre simples après coup, on commence par la méthode Cython.

cython hello.py

Cela génère un fichier hello.c. Oui il est énorme, près de 1000 lignes. Le but n'est pas de faire léger mais rapide :)" class="smiley

Bon, on va compiler le fichier pour en faire une librairie partagée pour Python:

gcc hello.c -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing $(pkg-config python --cflags) -o hello.so

voilà donc un fichier hello.so qui est une extension python que nous pouvons utiliser:

#fichier: test.py
import hello

printHello()

Pour le moment, c'est pas super utile car nous ne faisons qu'une opération très simple. Mais Cython ne s'arrête pas à ça. Il permet d'utiliser des type C et même des librairies C. De plus, nous allons voir que nous pouvons faire un exécutable de notre programme. Procédons par étapes.

Passons à l'utilisation de type C, ce qui va rendre un programme plus rapide. Vous connaissez fibonacci ? voici le code qui permet de trouver le résultat de la suite à un rang donné:

#fichier fibo.py
def fibo(n):
        if n == 0 or n == 1: 
                return n
        return fibo(n-2) + fibo(n-1)

Cette fonction est particulièrement lente, d'abord parcce que nous n'avons pas optimisé le code pour garder en mémoire les suite déjà calculées, mais en plus parce que nous allons passer par Python...

Testons:

#fichier test_fibo.py
from fibo import fibo
fibo(32)

et lançons le test avec la commande "time" qui nous donnera le temps d'éxécution:

time python test_fibo.py
3524578

real    0m1.574s
user    0m1.561s
sys     0m0.008s

1,6 seconde environ... autant dire que c'est pas fameux... Voyons avec cython.

cython fibo.py
gcc fibo.c -o fibo.so -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing $(pkg-config python --cflags)

time python test_fibo.py 
3524578

real    0m1.229s
user    0m1.137s
sys     0m0.089s

Ha y'a du mieux ! 1,2 secondes, on dirait pas mais là on a gangé 30% de temps d'éxécution...

Encore mieux ? possible oui et vous allez voir, pas des moindres !

Entrons dans le vif du sujet, Cython n'est pas python mais un language à part entière. Il permet de créer des types C, je vous l'ai dit. Cela se fait avec le mot clef "cdef". Avec ce mot clef, on peut donc créer une fonction ou variable C, donc en typant et en jouant avec les retours de fonctions. Fibonacci n'utilise que des entiers. Voyons comment redéfinir notre fonction pour la rendre pure C.

En premier lieu, vous renommez fibo.py en fibo.pyx. Pourquoi ? parce que Cython a besoin de savoir que cette fois-ci nous allons utiliser un fichier prévu pour le développement C. Notre fonction va donc ressembler à cela:

#fichier fibo.pyx
cdef int fibo(int n):
        if n == 0 or n == 1: 
                return n
        return fibo(n-2) + fibo(n-1)

Souci , cette fonction ne sera pas vu par des appels externes... en d'autres termes si vous voulez appeler la fonction "fibo" depuis test_fibo.py, ça ne marchera pas. Il faut donc utiliser une des deux méthodes:

  • soit vous définissez en plus une méthode avec "def" qui apelle "fibo"
  • soit vous n'utilisez pas cdef, mais cpdef qui fera l'alias tout seul (pratique hein)

Alors la méthode 2 me parraissant plus sympa:

#fichier fibo.pyx
cpdef int fibo(int n):
        if n == 0 or n == 1: 
                return n
        return fibo(n-2) + fibo(n-1)

Allez on lance la compilation, pensez bien qu'on utilise le fichier .pyx maintenant, pas le .py:

cython fibo.pyx
gcc fibo.c -o fibo.so -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing $(pkg-config python --cflags

Et le miracle:

time python test_fibo.py 
3524578

real    0m0.070s
user    0m0.058s
sys     0m0.012s

Et oui, 70 millisecondes ! Incroyable non ?

Et si maintenant on créait un exécutable ? Soyons fou ! On va utiliser une option de Cython qui permet d'intégrer l'exécutable python dans la fonction "main", cette option s'appelle "--embed" pour "embarquer":

cython --embed test_fibo.py -o test.c

Ici j'ai demandé à sortir un fichier nommé test.c, sinon on aurait test_fibo.c et j'aime pas les underscores :)" class="smiley

Compilons ce source:

gcc test.c -o test $(pkg-config python --cflags) -lpython2.7

l'option "-lpython2.7" est celle qui est valable pour Fedora 14 (qui utilise python 2.7) sinon on adaptez le numéro de version à celle de votre installation. Et nous avons maintenant un fichier "test" exécutable:

./test
3524578

Il marche :)" class="smiley par contre on ne gagne pas grand chose en temps d'éxécution par rapport à test_fibo.py. Mais le but ici était d'avoir un exécutable qui ne demande plus que la librairie python (dans le paquet python-libs de Fedora) et non plus Python lui même.

Voyons ce que demande notre exécutable en dépendance:

ldd test
        linux-vdso.so.1 =>  (0x00007fffba369000)
        libpython2.7.so.1.0 => /usr/lib64/libpython2.7.so.1.0 (0x00007f180b44a000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f180b0ae000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f180ae92000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f180ac8e000)
        libutil.so.1 => /lib64/libutil.so.1 (0x00007f180aa8b000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f180a806000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f180b81c000)

Effectivement il demande libpython et, évidamment, fibo.so est appelé lors de l'exécution, donc pensez à avoir ce fichier dans le même répertoire ou bien placé dans le répertoire de librairies (LD_LIBRARY_PATH, ou dans les lib de python)

Voilà, c'est une "courte" introduction car en fait Cython est bien plus puissant que cela, vous aurez à loisirs d'utiliser les librairies C existante (stdlib, math...) et de rendre vos développement extrêmement puissant et rapide... Voilà encore un point qui me rend de plus en plus fan de Python.

Je vous conseille vivement d'aller voir le site de documentation de cython et notamment la page qui traite de distutils dans le tutoriel cython

Voilà voilà

French speaking Fedora NPO

Pierre-Yves Chibon

English version (French version)

Today at 2pm the general assembly of the French speaking Fedora community NPO took place. After presenting the results and the statement of accounts for 2010 of the NPO for 2010 (soon to be available in English), the new board of the NPO was elected.

It is therefore a great pleasure for me to present you the third board of our NPO:

I am really pleased to see that so many people are interested by this NPO and I am already sure that the coming two years will be a great experience for all of us.

Page générée le 28 juil 2015 à 16:21