Guillaume Hormiere Un gros pense-bete

24nov/110

Ce week end a Toulouse

Un gros évènement à ne pas manquer ce weekend: Le capitole du libre 2011!
Cette année en plus de l'habituel Ubuntu Party on a droit au DrupalCamp ainsi qu'à la première Akademy-fr.

Tout ce beau monde se retrouvera samedi à l'ENSEEIHT vers 13h afin de nous offrir une après midi de
conférences et dimanche pour des ateliers.

DrupalCampPour ce qui est du Drupal camp, c'est une suite de conférences parlant de Drupal, comme son nom l'indique, et de l'utilisation que l'on peut en faire.

Au menu, dans le désordre et de manière non exhaustive : Intégration continue, démonstration de Drupal dans le commerce, un peu de NoSQL, et de la sécurité. Donc plein de bonnes choses pour les personnes intéressées par le monde de l'internet.

Pour ceux qui ne le savent pas, Drupal est un CMS opensource permettant de créer des sites internet rapidement. Pour plus d'informations.

Ubuntu, pour les personnes qui ne connaissent pas, c'est une système d'exploitation libre de type Linux (mot qui fait peur aux néophytes en informatique, et pourtant il n'y a pas de quoi).

Dans la journée du samedi, pour les conférences, il y aura un soupçon d'Ubuntu à 14h, et pour le reste du libre, du libre, et encore libre : Wikipedia, OpenData, l'histoire du noyau Linux, un logiciel 3D et j'en passe! De quoi rassasier les personnes ayant soif de connaissances dans ce domaine.

Tout le long de la journée, à coté des salles de conférences, se déroulera une install party où vous pourrez vous essayer à l'apprenti libriste en testant par vous-même ce système d'exploitation, où vous vous improviserez professeur d'un jour en accompagnant les curieux.

Pour les personnes voulant se renseigner sur Ubuntu, voici deux liens: Ubuntu-fr et wikipedia

Enfin, la première Akademy-fr, qui sera donc consacrée à KDE et que se déroulera en français ! KDE est un des environnements de bureau pour les systèmes UNIX ainsi qu'un Framework pour les développeurs.

Bien que ce soit une première en France, cette partie va être tout aussi riche que les autres : QML, Plasma Active pour les interfaces tablette, un présentation du Framework animé par Kevin Ottens et David Faure, Skrooge un logiciel de gestion bancaire et plein d'autres sujets ...

Pour plus d'informations: KDE, Plasma active.

Le lendemain, dimanche, les intervenants participeront à des ateliers tout au long de la journée.

Voilà plein de bonnes raisons pour vous lever ce weekend.

Share
13juin/110

How to edit a wiki with Libmediawiki

Libmediawiki allows to edit a wiki easily. To reach its goal it uses the PHP API of Mediawiki.
In this paper I will present how to edit a wiki with Libmediawiki. You can find the code in the edit sample stored in the library repository.
https://projects.kde.org/projects/extragear/libs/libmediawiki
Before being able to use the library functions you must create a MediaWiki object which will contain the information needed for the request to interact with the Wiki.

MediaWiki mediawiki = new MediaWiki(QUrl(this->ui->mWikiEdit->text()));

Load a page

After the MediaWiki creation you can use the library features. First, we need to load the page which will be updated:

QueryRevision* const queryrevision(new QueryRevision(*mediawiki));
queryrevision->setPageName(this->ui->mPageEdit->text());
queryrevision->setProperties(QueryRevision::Content);
queryrevision->setExpandTemplates(true);
queryrevision->setLimit(1);
connect(queryrevision, SIGNAL(revision(const QList&)),
this, SLOT(revisionHandle(const QList&)));
connect(queryrevision, SIGNAL(result(KJob* )),
this, SLOT(revisionError(KJob*)));
queryrevision->start();

We first create a request object, QueryRevision, which takes as parameter the previous MediaWiki object. With the setter, we define request options ( page name, content type... ). We connect signals and slots to handle request feedback which are page revision list and potentially an error
message (WrongRevisionId, MultiPagesNotAllowed, TitleAccessDenied...). Finally we start the job which will process the asynchronous request.
In revisionHandle slot we can find the following code which gets the revision content requested:

this->ui->plainTextEdit->setPlainText(revisions[0].content().toUtf8());

That's all we have to do to load a page!

Login

The second step is needed to update a wiki page. This part is difficult and you need a really powerful mind...

Login* login = new Login(*mediawiki,
this->ui->mLoginEdit->text(),
this->ui->mMdpEdit->text());
connect(login, SIGNAL(result(KJob* )),
this, SLOT(loginHandle(KJob*)));
login->start();

Has you can see the login constructor take tree parameters, one MediaWiki object, the user name and the password ( the other request in Libmediawiki take MediaWiki object in constructor and should be customized later on using setter ). We connect the job result signal to catch request feedback. Finaly, we start the job which will trigger the login asynchronously.

Update a page

For the last example, we will update the wiki page. The Edit request can be used to create a non existing page, or update an existing page.
To apply our update, the process is the same has QueryRevision request ( and all other request in Libmediawiki ), we create a request object with a MediaWiki instance as parameter, we customize our request with the setters and we start the job.

Edit* job = new Edit(*mediawiki,NULL);
job->setPageName(this->ui->mPageEdit->text());
job->setText(this->ui->plainTextEdit->toPlainText());
connect(job, SIGNAL(result(KJob *)),this, SLOT(editError(KJob*)));
job->start();

Questions, comments and feedback are welcome.

Share
31mai/110

Utiliser Gcov

Lors du bureau d’étude de mon master 1, portant sur Libmediawiki, un de nos objectifs principaux était de produire un bibliothèque de qualité. Qualité indispensable pour garantir aux développeurs que notre nouvel outil est fiable et robuste.

Pour atteindre cet objectif, on s'est armé d'outils classiques, comme les bons vieux tests unitaires, mais aussi de moyens plus intéressants, nous permettant de mesurer la pertinence de nos tests, ainsi que de suivre l’évolution de ces métriques dans le temps.

Aujourd'hui, je vais traiter de la manière d'acquérir ces mesures grâces à GCov, et je publierai dans un prochain article l'outil de suivi.

GCov est un outil permettant d’acquérir des métriques sur couverture de  code. Couplé à Gcc et CMake, il permet de mettre en place des mesures de façon simple et efficace. Dans le cadre du projet, son utilisation a permis d'avoir un retour sur la pertinence de nos tests unitaires. Ainsi quand on jouait nos tests, on avait deux retours : le résultat des tests et le pourcentage de codes couverts par ceux-ci.

Par la suite on vas utiliser le code source suivant, tiré de l'exemple de la documentation de Gcc:

#include <stdio.h>
 int main (void){
 int i;
 for (i = 1; i < 10; i++)
 {
 if (i % 3 == 0)
 printf ("%d is divisible by 3\n", i);
 if (i % 11 == 0)
 printf ("%d is divisible by 11\n", i);
 }
 return 0;
 }

GCov est un outil très simple à utiliser. Il suffit de passer les options "-fprofile-arcs -ftest-coverage" à Gcc lors de la compilation. Ces "flags" permettent au compilateur d'ajouter des instructions qui comptent le nombre de fois où la ligne de code est exécutée.

gcc -fprofile-arcs -ftest-coverage main.c

Lors de l’exécution d'un des tests unitaire des fichiers .gcno et .gcda sont générés. Ces fichiers contiennent les informations sur la couverture de code.

Étape suivante, on utilise la commande gcov pour interpréter les fichiers générés. Cette commande s'utilise de la manière suivante :

gcov main.c

Une fois exécuté, le pourcentage de couverture de code s'affiche et un fichier .gcov est généré.

$ gcov main.c
 File 'main.c'
 Lines executed:85.71% of 7
 main.c:creating 'main.c.gcov'

Dans ce fichier, on trouve un copie des sources, le numéro des lignes et le nombre de passages sur la ligne ( les lignes n’étant pas couverte sont marquées ##### ).

  -:              0:Source:main.c
 -:               0:Graph:main.gcno
 -:               0:Data:main.gcda
 -:               0:Runs:1
 -:               0:Programs:1
 -:               1:#include <stdio.h>
 -:               2:
 -:               3:int
 1:               4:main (void)
 -:               5:{
 -:               6:  int i;
 -:               7:
10:               8:  for (i = 1; i < 10; i++)
 -:               9:    {
 9:              10:      if (i % 3 == 0)
 3:              11:        printf ("%d is divisible by 3\n", i);
 9:              12:      if (i % 11 == 0)
 #####:          13:        printf ("%d is divisible by 11\n", i);
 -:              14:    }
 -:              15:
 1:              16:  return 0;
 -:              17:}

C'est dur de faire de la couverture de code...

Il existe des manières de faire plus poussées, mais je ne les traiterai pas, car elles ne sont pas nécessaires pour le prochain article. Aussi, si elles vous intéressent, je vous conseille de faire un tour sur le site de Gcc.

Tout cela ajouté à une pincé de T.D.D., afin d'avoir un maximum de tests représentatifs, ainsi qu'un soupçon d'automatisation, grâce notamment a CTest, et vous aurez alors un vrai début de  suivi pour la qualité de votre code.

Prochain article : CDash.

Share
26mai/110

Ce week end a Toulouse

Deux évènements à ne pas manquer (pour nous geek) ce week end dans la ville rose.

Premièrement, l'atelier KDE, qui se passe au premier étage du Centre Culturel Bellegarde de 10h à 18h. Cette semaine, présentation de KDevelop qui est un très bon IDE. Principalement utilisé pour développer en C++, il propose aussi le support de beaucoup d'autres langages.

Cet IDE a été un sujet de bureau d’étude cette année à l'IUP ISI de l'université Paul Sabatier, et c'est donc des amis qui vont faire la présentation. Si vous cherchez un nouvel IDE libre et puissant, venez le découvrir samedi.

Second évènement, le Hacker Space de Toulouse. Le Hacker Space est une rencontre de personnes venant de divers milieux et ayant un point commun : une utilisation créative des  technologies, des sciences et des arts numériques... Donc gros évènement qui se déroulera au Mix'Art Myrys Toulouse tout le week end, de vendredi à dimanche, et qui vous permettra de faire le plein de conférences et d'ateliers.

Lien des deux évènements :

Ateliers kde : KDevelop

Le Hacker Space

Bon week end.

Share
24mai/110

Compilation croisee Ada/C++

Lors du master 1 à l'IUP ISI de l'université Paul Sabatier, les étudiants effectuent un projet temps réel afin de pouvoir apprécier les joies du multithreading ainsi que des conteneurs non thread-safe.

Le sujet cette année, a été de réaliser une simulation de tramway qui comprenait une partie Ada, ainsi qu'une partie C++.  Ces deux parties devaient pouvoir communiquer ensemble afin combiner la puissances des taches Ada à la beauté du C++.

Avant toute chose,  cet article ne porte que sur une fonction CMake (et donc l’étape compilation). Aussi il ne faut pas oublier d'utiliser les macros pour indiquer au compilateur d'exporter les fonctions Ada vers le C chose que je ne traite pas (encore?) sur ce blog. Donc je vous propose ce lien pour vous renseigner sur les différentes macros qui existent.

Donc, pour pouvoir lier Ada et C++ on a, avec un autre groupe de travail, développé une fonction CMake qui permet de compiler les fichiers Ada en fichiers .a qui sont liés par la suite avec le reste du projet.

Les sources du projet se trouve à cette adresse je vous conseil fortement d'aller chercher le fichier CMakeLists.txt afin d'avoir le contexte d'utilisation sous les yeux.

La fonction est assez simple:

MACRO( ADA_COMPILE_LINK )
FOREACH( _adafilename ${ARGN})
add_custom_target(${_adafilename} gnatmake "-A${CMAKE_CURRENT_SOURCE_DIR}" ${_adafilename}
COMMAND
gnatbind ${_adafilename} -n -C -o "${_adafilename}.binder.c"
COMMAND
gcc -c -o "${_adafilename}.binder.o" "${_adafilename}.binder.c"
COMMAND
ar rcs libstatic${_adafilename}.a *.o
)
ENDFOREACH( _adafilename )

ENDMACRO( ADA_COMPILE_LINK )

Elle créé une cible dans le MakeFile qui vas permettre de générer des fichiers .a ,donc des bibliothèques statiques, a partir des fichiers Ada qu'on lui passe en paramètre. Ces fichiers devront êtres pas la suite liés au reste du projet.

Cette fonction est appelée de la manière suivante :

set( ada_SRCS api)
ADA_COMPILE_LINK( ${ada_SRCS})

Comme le CMakeLists ne rajoute que des cibles dans le MakeFiles il faut, avant de construire le reste du projet, appeler ces cibles afin de construire les fichiers .a. Fichier que l'on lie par la suite au reste du projet.

Dans notre cas cette commande est donc nécessaire avant le reste de la compilation:

make api

Retour au CMakeLists, la liaison entre les fichiers .a et le reste du projet se trouve dans les deux lignes suivantes:

set( staticada_LIBS staticapi)
target_link_libraries(Project-STR-ISI ${QT_LIBRARIES} ${QT_QTTEST_LIBRARIES} gnat gnarl ${staticada_LIBS})

nb : Le staticapi vient de la façon dont on a définis le nom des fichiers .a dans la macro. En effet elle construit les bibliothèques à la ligne suivante : ar rcs libstatic${_adafilename}.a *.o.

Pour ceux qui on bien suivit la compilation se fait donc en deux parties, tout d'abord on appel la commande Make avec pour paramétre la cible correspondante au fichier Ada. Puis on construit le reste du projet qui vas se lier aux fichiers .a précédemment généré.

Voila,  j’espère avoir été clair

Share
23mai/110

Editer Wiki avec Libmediawiki

Libmediawiki permet d'éditer facilement, et en toute transparence une page d'un wiki en passant par l'api php de MediaWiki.

Je vais vous décrire les éléments important de l'exemple d’édition de page que vous pouvez trouver sur le dépôt de la bibliothèque:

https://projects.kde.org/projects/extragear/libs/libmediawiki

Tout d’abord avant d'utiliser les fonctionnalités de la bibliothèque il faut créer un objet MediaWiki qui contient les informations nécessaires aux requêtes pour interagir avec le Wiki.

MediaWiki mediawiki = new MediaWiki(QUrl(this->ui->mWikiEdit->text()));

Charger une page

Une fois notre wiki définit, on peut maintenant utiliser les fonctionnalités de la bibliothèque. Dans un premier temps, on charge la page que l'on veut éditer :

QueryRevision* const queryrevision(new QueryRevision(*mediawiki));
queryrevision->setPageName(this->ui->mPageEdit->text());
queryrevision->setProperties(QueryRevision::Content);
queryrevision->setExpandTemplates(true);    
queryrevision->setLimit(1);
connect(queryrevision, SIGNAL(revision(const QList<Revision>&)),
            this, SLOT(revisionHandle(const QList<Revision>&)));
connect(queryrevision, SIGNAL(result(KJob* )),            
            this, SLOT(revisionError(KJob*)));
 queryrevision->start();

Pour charger une page, on créé un objet QueryRevision, qui prend en paramètre l'objet MediaWiki qui défini les informations du wiki sur lequel on veut travailler. Puis, grâce aux assesseurs, on définit les options de la requête ( nom de la page, type de contenu...) .  Ensuite, on connecte les signaux de la requête à des slots, afin de traiter les retours de la fonction qui sont, la liste des révisions et les erreurs qui auraient pu se produire lors de la requête. Et enfin, on lance le job qui vas traiter la requête de manière asynchrone.

Dans le slot revisionHandle, on trouve le code suivant afin de récupérer le contenu de la révision demandée :

this->ui->plainTextEdit->setPlainText(revisions[0].content().toUtf8());

Voila, on a chargé la page d'un wiki.

Se connecter a un Wiki

La seconde étape, se connecter au wiki, est impérative afin de pouvoir appliquer les modifications de la page sur le wiki. Cette partie  d'une grande complexité nécessitera toute votre concentration...

Login* login = new Login(*mediawiki,
           this->ui->mLoginEdit->text(),
           this->ui->mMdpEdit->text());
connect(login, SIGNAL(result(KJob* )),
            this, SLOT(loginHandle(KJob*)));
login->start();

Voila, donc on peu remarquer que le constructeur prend trois arguments, l'objet MediaWiki, le login et le mot de passe. Ensuite, on connecte le job à une fonction traitant les retours de la requête. Enfin, on lance le job qui  effectue la connection au Wiki de manière asynchrone.

Appliquer nos modifications

Dernière étape, on applique les modifications que l'on a effectué en local sur la page. Il est à noter que la fonction d’édition sert aussi a créer la page, si celle-ci n'existe pas.
Pour appliquer les modifications, la logique est la même que pour QueryRevision ( ainsi que pour le reste de la bibliothèque ), on créé un objet avec en paramètre le MediaWiki, on définit les options grâce a des assesseurs et on lance le job.

Edit* job = new Edit(*mediawiki,NULL);
job->setPageName(this->ui->mPageEdit->text());
job->setText(this->ui->plainTextEdit->toPlainText());
connect(job, SIGNAL(result(KJob *)),this, SLOT(editError(KJob*)));
job->start();

Voila aussi complexe que QueryRevision.

Share
22mai/110

Libmediawiki a fini la phase de review!

Libmediawiki vient de passer dans les dépôts extragear de kde, elle est donc fin prête pour être utilisée par les développeurs voulant interagir avec un wiki dans leurs applications.

Pour accéder au dépôt, ça se passe par là :

https://projects.kde.org/projects/extragear/libs/libmediawiki

Toujours pareil, vous avez le code, les exemples et la documentation de la librairie pour bien commencer vos projets.

Share
30avr/110

Libmediawiki

Lors du Master 1 de l'IUP ISI, les étudiants réalisent un bureau d'étude de 7 mois leur permettant de mettre en application les connaissances acquises lors de la formation.

Cette année j'ai participé grâce à ce bureau d'étude à un projet open source appelé Libmediawiki. Le but est de créer une librairie en C++/Qt permettant d'acquérir et d'éditer des informations venant d'un Mediawiki (tel que Wikipedia).

Cette librairie fruit de notre passion et d'effort acharné (sueur, sang, etc etc...), est maintenant en phase de review sur le git KDE et a donc atteint un certain niveau d'utilisabilité.

On peut donc dès à présent l'utiliser pour:

  • Éditer une page wiki.
  • Se loger a un wiki.
  • Uploader une image.
  • Acquérir le contenu d'une page wiki.
  • Voir les révisions d'une page.
  • Voir les informations d'un wiki.

Et ce très simplement.

Vous pouvez facilement trouver le code de la librairie sur KDE review:

https://projects.kde.org/projects/extragear/libs/libmediawiki

Vous trouverez des exemples ainsi qu'un Doxyfile pour générer la documentation.

Share
26avr/110

Bonjour tout le monde!

Voila cela fait un petit moment que je comptai faire un blog afin de mettre en ligne mes découvertes informatiques.

C'est fait!

Bonne lecture.

Share
Remplis sous: Autre Aucun commentaire