Quelques tips VirtualBox

Publié dans Geekeries | Laisser un commentaire

Partager des répertoires avec l’hôte

Configurer la machine virtuelle pour qu’elle accède à des dossiers de l’hôte  (Settings > Shared Folders) n’est pas suffisant pour que cela fonctionne ! Il faut aussi que l’OS de l’hôte l’accepte, et pour cela, il faut démarrer la machine virtuelle, puis dans la barre d’outil faire : « Devices > Insert Guest Additions CD image… ». Après avoir éventuellement télécharger ce que VirtualBox propose, VirtualBox devrait avoir chargé un fichier ISO dans le lecteur de CD virtuel. A vous de jouer pour l’installer !

Puis il faut encore avoir les droits pour accéder à ces dossiers :

sudo usermod -aG vboxsf $(whoami)

Reste à redémarrer ou se reloguer, et voilà !

Ah oui, une chose importante : la machine virtuelle ne peut créer de liens symboliques sur la machine hôte ! (pour des raisons de sécurité, cf. superuser) Cela peut se réactiver à l’aide de la commande suivante (pour chaque dossier partagé)(merci à Github) :

VBoxManage setextradata VM_NAME VBoxInternal2/SharedFoldersEnableSymlinksCreate/SHARE_NAME 1

Donc par exemple pour pouvoir créer des liens symboliques sur le dossier hôte « MyDoc », je fais :

VBoxManage setextradata MyVMName VBoxInternal2/SharedFoldersEnableSymlinksCreate/MyDoc 1

Cela implique de redémarrer la VM.

Augmenter la taille d’un disque dur

Visiblement, ça marche assez bien et sans perte de données. En ligne de commande :

VBoxManage modifyhd YOUR_HARD_DISK.vdi --resize SIZE_IN_MB

Structure d’un projet Qt

Publié dans C / C++ | Laisser un commentaire

Note: c’est un brouillon 🙂

Ma grande question du moment, comment architecture un projet Qt pour :

  • avoir une bonne structure de dossier,
  • pouvoir gérer plusieurs modules, et choisir ceux à utiliser lors de la compilation,
  • séparer le code source du code des tests unitaires,
  • choisir lors de la compilation de lancer les tests ou non.

Structure

src
   module1/
      src/
      test/
      module1.pro
   module2/
      src/
      test/
      module2.pro
   communication
   data
   service
   util
   ui/
      project.cpp
      project.h
      project.ui
      ui.pro
   main.cpp
   src.pro
test/
   testcase/
      MyGreatTest.cpp
      MyGreatTest.h
   test.pro
   IUnitTestCase.h
   TestRunner.cpp
   TestRunner.h
vendor/
   ...
   vendor.pri
.pro

En général, j’ai plusieurs projets liés entre eux qui partagent des fichiers. Si on passe donc un cran en dessous, j’ai quelque chose du style :

project1/
project2/
vendor/
   ...
   vendor.pri
release/

Quelques informations sur les les .pro et les .pri

Ah, et il est normal qu’un message s’affiche 3 fois dans les logs (lorsqu’on utilise les commandes « message » ou « system »), puisqu’il y a 3 Makefile à générer, donc le fichier .pro est consulté 3 fois.

Inspiration

Gestion de projet – Quelques règles d’or

Publié dans Geekeries | 2 commentaires
  • Ne jamais donner d’estimations à chaud
    • Certes on peut ne pas se tromper sur la partie technique, mais :
    • Il faut prendre en compte le coût des réunions de préparation.
    • Il faut prendre en compte le service après-vente.
    • Or une estimation est presque toujours prise comme argent comptant pour le client.
    • Il vaut donc mieux y réfléchir posément.
  • Ne jamais rendre un budget quand il est acquis
  • Prendre son temps pour les décisions importantes
Logo Qt

Installer Qt pour développer en 32bits et 64bits

Publié dans C / C++ | Un commentaire

Comment installer plusieurs versions de Qt en même temps, et surtout, comment gérer une cross-compilation 32bits / 64bits ? Voilà un problème qui peut prendre des heures à régler… C’est possible, autant sous Windows que sous Linux.

Pour ma part, je compile sous Debian testing (jessie) pour Qt5.3 ou Qt5.4 en 32bits ou 64bits, et grâce à Wine, je compile aussi pour Windows pour Qt5.1, Qt5.3 ou  Qt5.4 en 64bits. Je garde toujours un Qt5.1 sous Windows car c’est la dernière version à fonctionner convenablement pour Windows XP.

Compiler est une chose, et je ne m’y attarderai pas trop dans ce billet, mais installer est la première étape. La méthode 1 ne fonctionne que sous Linux (et ne marche pas d’ailleurs). La méthode 2 conviendra à Windows et Linux.

Continuer la lecture

Etude – Lire un document Word, OpenDocument, PDF avec Qt (ou autre)

Publié dans C / C++ | Laisser un commentaire

Lire un document Office, OpenDocument ou PDF, ou autre format riche  programmatiquement en Qt / C++ / autre… comme il fallait s’y attendre, ce n’est pas de la tarte ! Apparemment, il est relativement faisable d’afficher un document PDF, Office ou LibreOffice directement via un objet Qt, ou une bibliothèque. Mais ici, je cherche à lire le contenu, afin de pouvoir en extraire des morceaux suivant un patron (vous l’aurez deviné, c’est un document de norme, dont j’aimerai extraire la liste des exigences ><).

Voici une liste des ressources que j’ai pu trouver sur le sujet. Je n’ai rien testé pour l’instant.

Continuer la lecture

UTM_showing_testresults_over_time1

Architecture de tests en C++ avec Qt

Publié dans C / C++ | Laisser un commentaire

Si vous êtes développeur, je pense que vous avez surement entendu parler des tests unitaires (unit test) et j’espère que vous êtes convaincu de leur utilité ! Tester unitairement un morceau de code, c’est vérifier que celui-ci fait ce que l’on souhaite dans de multiples situations. Ensuite, on peut passer sereinement aux tests d’intégration qui vont tester plusieurs morceaux de codes (ou d’applications) entre eux. On peut encore raffiner avec des tests de performances, tests système, etc, etc… Tout dépend jusqu’où on souhaite aller.

Si on est capable de lancer régulièrement l’exécution de nos tests unitaires, alors on est capable de dire que notre code continue de fonctionner comme voulu malgré les mises à jours ou les refactoring. Cela n’empêche pas les erreurs ni les bugs, car on ne peut pas tester tout notre code unitairement, ou cela peut lamentablement planter lors de l’intégration. Néanmoins, on sait qu’une base solide « fonctionne comme prévu », ce qui facilite grandement la correction d’une erreur.

Pour des myriades de raisons :
tester son code c’est génial !!!

Des études prouvent même qu’une bonne gestion des tests permet au final de gagner du temps. Si vous n’y croyez pas, je vous invite sérieusement à reconsidérer votre opinion.

Ce que j’ai déjà vu dans certains environnements et ce que j’aimerai reproduire dans mon environnement Qt / C++, se résume ainsi :

Continuer la lecture

droit-oubli-cnil

Le droit à l’oubli : une porte ouverte vers la censure ?

Publié dans Geekeries | Laisser un commentaire

Dire que le « droit à l’oubli » est la porte ouverte vers la censure, me semble être une pente glissante qui me parait un peu simpliste. Je trouve même ce point de vue particulièrement dangereux pour le Web.
Alors même si je n’ai pas le temps de faire un dossier un peu complet sur le sujet, permettez-moi d’expliquer en quelques mots : pourquoi je pense que le « droit à l’oubli » est un bon garde-fou contre les problèmes de vie privée qui pourraient arriver, malgré toutes nos lois / moyens techniques protecteurs.

Continuer la lecture

Logo Git

Configuration de Git

Publié dans Geekeries | Laisser un commentaire

Configurer Git (un gestionnaire de version décentralisé qui change la vie), est particulièrement utile et pas si compliqué. Il suffit de modifier un fichier de configuration.
La configuration globale s’appliquant à tous les repository Git se trouve dans le fichier .gitconfig se trouvant dans votre dossier utilisateur (i.e. ~/.gitconfig). Celle-ci peut-être surchargée par une configuration spécifique à chaque repository, via le fichier .git/config de chaque repository.

Voici typiquement à quoi ressemble mon fichier de configuration globale :

[user]
	name = Fylhan
	email = bnmaster@ahahah.fr
[color]
	ui = always
	branch = always
	diff = always
	interactive = always
	status = always
[push]
	default = simple
[alias]
	co = checkout
	br = branch
	st = status
	ci = commit -a -m
	last = log -1 HEAD
	lasts = log -35 --pretty=tformat:"%C(red)%h%x20%C(magenta)%ad%C(auto)%d%x20%C(green)%s%C(white)%x20-%x20%an%C(auto)" --date=short --abbrev-commit --graph --decorate
	lastpull = !git lasts HEAD --stat --no-merges
	showtag = !sh -c 'git rev-parse $1 | xargs git cat-file -p' -
	unstage = reset HEAD --
	undo = git reset --soft HEAD^

Continuer la lecture

Récupèrer une liste contenant une partie des noms de fichiers

Publié dans Snippet | Laisser un commentaire

But

Dans un dossier, j’ai quelques fichiers se nommant LocalSettings_Wikimachin.php, LocalSettings_Wikitruc.php, … Je souhaite récupérer une liste contenant seulement « machin » et « truc ».

Snippet

wikis=`ls my-folder | sed \'/^LocalSettings_Wiki/!d\' | sed -e \'s/^LocalSettings_Wiki\\(.\\+\\)\\.php/\\1/g\'`
for wiki in $wikis
do
   echo $wiki
done

Ce qui donne :

machin
truc

Explication

  • ls my-folder : Liste les fichiers et répertoires du dossier « my-folder »
  • sed \'/^LocalSettings_Wiki/!d\' : On ne garde que les lignes commençant par « LocalSettings_Wiki ».
    En effet, le flag « d » permet de supprimer les lignes correspondantes au pattern. Donc le flag « !d » ne conserve que les lignes correspondant au pattern.
  • sed -e \'s/^LocalSettings_Wiki\\(.\\+\\)\\.php/\\1/g\'` : Le flag « s » lance une substitution : « s/pattern/replacement/g ».
    On cherche toutes les lignes qui contiennent par « LocalSettings_Wiki(quelque chose).php » et on les remplace par « quelque chose ».
    En ligne de commande, j’avais une étoile à chaque fin de ligne, j’ai donc modifié la commande comme suite : sed -e \'s/^LocalSettings_Wiki\\(.\\+\\)\\.php\\*/\\1/g\'`

Corriger une string JSON en Qt

Publié dans Snippet | Laisser un commentaire

La méthode ci-dessous permet d’autoriser une syntaxe moins rigoureuse en prenant soin de modifier les petites erreurs qui ont pu être commises.

/**
 * Clean a string
 * * Remove comments ("//" and "/*")
 * * Add first and last braces ("{" and "}") if missing
 * * Remove unauthorized commas
 *
 * @param data Almost JSON string that will be cleaned to become a valid JSON string
 * @return Valid JSON string (or at least, a more valid one)
 */
QString cleanJsonString(QString data)
{
    // Remove inline comms
    QRegExp pattern = QRegExp("(^|\\[|\\{|,|\\n|\\s)//.*($|\\n)");
    pattern.setMinimal(true); //ungreedy
    data.replace(pattern, "\\1\n");
    data.replace(pattern, "\\1\n"); //2 times, I am not sure why...
    // Remove bloc comms
    pattern = QRegExp("/\\*.*\\*/");
    pattern.setMinimal(true); //ungreedy
    data.replace(pattern, "");
    // Add first and last brace
    if (!data.startsWith("{")) {
        data = "{\n"+data;
    }
    if (!data.endsWith("}")) {
        data += "\n}";
    }
    // Remove commas before } or ]
    pattern = QRegExp(",(\\s*[}\\]])");
    pattern.setMinimal(true); //non-greedy
    data.replace(pattern, "\\1");
    return data;
}

J’ai commis une méthode similaire en PHP : Manipuler du JSON en PHP.