Dessin Visio dans Latex

March 17th, 2010

Ma situation est la suivante : j’ai des dessins vectoriels créés avec Visio que je dois inclure dans un document Latex.

Dans Latex, j’utilise la package graphics, qui permet d’inclure des fichiers PDF.

Le problème : enregistrer un dessin Visio en PDF.

Ma première tentative a été de sauvegarder le dessin en SVG, puis de le convertir en PDF avec InkScape. Malheureusement, si le dessin Visio contient des textes (de surcroît avec des polices de caractères spéciales ou avec des espaces entre lettres et entre lignes non standards), le fichier SVG produit est inutilisable.

Restaient alors deux solutions pour sauvegarder un dessin Visio en PDF : imprimer avec un distilleur PDF (par exemple PDF Creator) ou installer une extension fournie par Micro$oft qui s’intègre directement à Visio, solution que j’ai retenue.

Cette extension peut être téléchargée ici.

Une fois cette extension installée, le menu Fichier offre la fonctionnalité suivante : Publier comme PDF ou XPS...

Mais, un nouveau problème doit être résolu : le dessin que je veux inclure dans Latex n’a pas la dimension d’une page A4, il est plus petit. Or, la publication en PDF de Visio exporte toute la page. Il est possible dans les options d’exportation de n’exporter que la sélection, mais l’élément sélectionné est quand même placé sur une page A4, ce qui ne convient pas à une inclusion dans Latex.

Pour résoudre ce dernier problème, il faut utiliser une macro très pratique (DissMacros.vss) que j’ai trouvée ici (miroir local : DissMacros).

L’intégration de cette macro dans un document Visio nécessite quelques étapes simples :

  1. Télécharger la macro DissMacros.vss et l’enregistrer dans Mes Documents\Mes formes.
  2. Ajouter ces formes au document : Fichier->Formes->Mes Formes->DissMacros (activer les macros si cela vous est demandé).
  3. S’assurer que le dessin à exporter est seul sur une page.
  4. Appeler la macro ExportActivePage avec le menu Outils->Macros->DissMacros->Module 1->ExportActivePage.
  5. Cette macro redimensionne temporairement la page pour s’adapter aux dimensions du dessin et l’exporte en PDF (ainsi que dans d’autres formats).
  6. Les fichiers créés sont stockés dans un répertoire du même nom que le document Visio, situé au même emplacement que ce document.

MISE À JOUR DU 24.8.2012

Voici la marche à suivre pour Visio 2010 :

  1. Télécharger la macro DissMacros.vss et l’enregistrer dans Mes Documents\Mes formes.
  2. Ajouter ces formes au document : Fichier->Formes->Mes Formes->DissMacros (activer les macros si cela vous est demandé).
  3. Activer l’onglet Développeur : Fichier->Options->Personnaliser le ruban, cocher Développeur dans la liste à droite nommée Onglets principaux.
  4. S’assurer que le dessin à exporter est seul sur une page.
  5. Appeler la macro ExportActivePage : menu Onglet Développeur->Macros. Choisir DissMacros.vss dans la liste déroulante Macros dans.
  6. Cette macro redimensionne temporairement la page pour s’adapter aux dimensions du dessin et l’exporte en PDF (ainsi que dans d’autres formats).
  7. Les fichiers créés sont stockés dans un répertoire du même nom que le document Visio, situé au même emplacement que ce document.

Votre installation PHP ne dispose pas de MySQL. Extension requise pour WordPress

February 26th, 2010

Un beau jour, ce message d’erreur (en anglais : Your PHP installation appears to be missing the MySQL extension which is required by WordPress) est apparu à la place de deux blogues WordPress que je gère.

Ces blogues sont situés chez mon hébergeur et se trouvent chacun dans leur propre répertoire.

Le support de mon hébergeur m’a suggéré de désactiver les extensions (plugins) et les thèmes. Pour le faire sans passer par l’interface WordPress (qui n’est bien sûr pas disponible lorsque le blogue est inaccessible), il faut se connecter par FTP au serveur de fichiers et renommer les plugins à désactiver, de sorte que WordPress ne les retrouve plus.

Cette solution n’a pas fonctionné.

Par contre, j’ai découvert en me connectant par FTP que deux fichiers trônaient dans le répertoire racine du blogue : php.ini et fastphp.ini. Je n’avais jamais vu ces fichiers. J’ai tenté de les renommer (plutôt que de les effacer) et bingo ! Mon blogue fonctionne à nouveau !

Ouvrir une invite de commande ici

February 4th, 2010

Lorsqu’on développe sous Windows, il arrive fréquemment que l’on ait besoin d’une invite de commande dont le chemin soit directement positionné dans un répertoire spécifique.

Le but serait donc d’avoir dans le menu contextuel du répertoire sélectionné une action permettant d’ouvrir une invite de commande positionnée sur ce répertoire.

Windows XP

La façon la plus simple d’y arriver avec Windows XP est de passer par un petit script VBS dont voici le contenu :

Set objShell = CreateObject("WScript.Shell")
objShell.RegWrite "HKCR\Folder\Shell\MenuText\Command\", "cmd.exe /k cd " & chr(34) & "%1" & chr(34)
objShell.RegWrite "HKCR\Folder\Shell\MenuText\", "Ouvrir une fenêtre de commandes ici"

Une fois ce script exécuté, un clic droit sur un répertoire dans l’explorateur de fichiers affichera un menu contextuel possédant l’action désirée :

La fenêtre de commandes obtenue est directement positionnée dans le répertoire sélectionné.

Windows 7

Avec Windows 7, c’est beaucoup plus simple ! Mais c’est caché !

Voici le menu contextuel standard d’un répertoire :

Il suffit d’appuyer sur la touche Shift (Maj) au moment d’afficher le menu contextuel pour qu’une version étendue apparaisse :

L’action Ouvrir une fenêtre de commandes ici peut être sélectionnée.

Il semblerait que cette technique fonctionne également avec Windows Vista, mais ne possédant pas cet OS, je ne peux pas le confirmer.

Programme en mode console avec Qt Creator

February 4th, 2010

Lorsqu’on souhaite développer une application en mode console avec Qt Creator (1.3.1) qui soit multi-plateforme Mac et Windows, il y a quelques problèmes à régler.

Comme exemple, nous allons essayer de faire fonctionner correctement le petit programme suivant :

#include <iostream>

int main() {
   std::cout << "Quel est ton nom : ";
   std::string Nom;
   std::cin >> Nom;
   std::cout << "Salut " << Nom << " !\n";
   return 0;
}

Mac OS X

ur Mac OS X, avec la configuration par défaut, la sortie standard est dirigée sur l’onglet Sortie de l'application de Qt Creator. Cela pose néanmoins un problème de taille : cet onglet ne gère pas l’entrée standard. Notre programme simple ne fonctionnera donc pas.

Pour résoudre ce problème, il faut forcer l’exécution de notre programme dans un terminal.

Pour ce faire, il faut modifier les paramètres d’exécution du projet. Afficher les détails et cocher la case Exécuter dans un terminal.

Malheureusement, cette façon de faire amène encore un petit problème à résoudre.
Sur Mac OS X, c’est un terminal XTerm qui sera utilisé, mais dans la configuration standard de Qt Creator, l’application XTerm n’est pas trouvable. Il faut en fait préciser le chemin complet de l’application.

Ouvrir les préférences de Qt Creator et aller dans la configuration Environnement : Général.

Dans la zone Terminal, indiquer le chemin complet :

/usr/x11/bin/xterm -e

Windows

Sur Windows, la configuration par défaut démarre une fenêtre de commande, dans laquelle s’affiche la sortie standard. L’entrée standard est correctement gérée.

Par contre, il subsiste deux problèmes :

  • Lorsque le programme est terminé, la fenêtre de commande disparaît immédiatement, ce qui empêche de voir la sortie finale du programme.
  • Si l’on souhaite déboguer notre programme, la fenêtre de commande n’est plus ouverte et la sortie standard s’affiche dans l’onglet Sortie de l'application de Qt Creator. L’entrée standard n’est pas gérée.

Pour résoudre ces problèmes, il faut forcer l’exécution de notre programme dans un terminal.

Pour ce faire, il faut modifier les paramètres d’exécution du projet. Afficher les détails et cocher la case Exécuter dans un terminal.

Les deux

Notre programme fonctionne maintenant correctement, aussi bien en ce qui concerne la sortie standard que l’entrée standard. Le déboguage se fait également au travers du terminal.

Reste le problème des accents concernant la phrase automatique Appuyez sur ENTRÉE pour fermer cette fenêtre.

Pour se débarrasser de ces caractères cabalistiques, la solution la plus simple est de démarrer Qt Creator en anglais.

Qt Creator en anglais

February 3rd, 2010

Mise à jour avril 2010 :

La technology preview de Qt Creator 2.0 montre qu’il est maintenant possible de changer la langue de l’interface depuis les préférences de l’application, en allant dans la section Environnement : Général des options.

Fin de la mise à jour.

Depuis la version 1.3.0, Qt Creator a été localisé dans plusieurs langues, en particulier le français. Dès lors, Qt Creator utilise automatiquement la langue du système d’exploitation.

Malheureusement, il n’y a aucun réglages au sein de l’application permettant de choisir une autre langue. Il peut en effet être très pratique dans certaines situations de démarrer Qt Creator 1.3.1 en anglais.

La solution diffère selon le système d’exploitation.

Mac OS X

La seule solution que j’ai trouvé avec Mac OS X pour forcer Qt Creator d’utiliser l’anglais est de l’empêcher de trouver le fichier de traductions du français. Pour ce faire, il faut sélectionner l’application Qt Creator, afficher le menu contextuel et choisir Afficher le contenu du paquet.

Lorsque le contenu est affiché, aller dans le répertoire Contents/Resources/translations/. Localiser le fichier qtcreator_fr.qm et le renommer (par exemple en _qtcreator_fr.qm).

Lors du prochain démarrage de Qt Creator, celui-ci ne trouvera pas le fichier de traductions pour le français (la langue du système d’exploitation) et se rabattra sur l’anglais.

Windows

Sous Windows, le plus simple est de définir la variable d’environnement LANG, que Qt Creator utilise en priorité (avant la langue du système d’exploitation) pour déterminer la langue de démarrage.

Pour ajouter une variable d’environnement, afficher les propriétés du Poste de travail.

Dans l’onglet Avancé, cliquer sur Variables d'environnement.

La liste des variables d’environnement apparaît. Ajouter une nouvelle variable pour l’utilisateur en cours en cliquant sur Nouveau.

Le nom de la variable d’environnement doit être LANG. Comme valeur pour cette variable, mettre en, ce qui signifie que que dorénavant, Qt Creator démarrera en anglais.

Trucs et astuces C++

February 2nd, 2010

Initialiser un tableau

Lorsqu’on déclare un tableau d’entiers, il arrive souvent que l’on préférerait que ses éléments soient initialisés à zéro.

Plutôt que de le faire manuellement dans une boucle :

int Tableau[30];

for (int i = 0; i < sizeof(Tableau)/sizeof(int); ++i)
   Tableau[i] = 0;

il est possible de l’initialiser directement ainsi :

int Tableau[30] = {};

Il est possible de n’initialiser que quelques premiers éléments avec des valeurs spécifiques. Les autres éléments seront automatiquement initialisés à zéro.

int Tableau[30] = { 543, 245, 738 };

endl et \n

En mode console, lorsqu’on souhaite faire un retour de chariot, quelle différence entre endl et \n ?

Tout d’abord, il faut préciser que \n est portable. Même si le retour de chariot est codé différemment selon les systèmes d’exploitation, l’implémentation des classes de flux (iostream) prend en charge ces différences.

Pour revenir à la différence, \n provoque un retour de chariot alors que endl provoque un retour de chariot et vide le flux de sortie (flush) ce qui garanti par exemple pour la sortie standard que le flux est immédiatement affiché.

Dans la plupart des cas, cette différence n’aura aucun impact sur le résultat obtenu sur la sortie standard. Elle peut avoir un léger impact sur la performance étant donné que endl fait plus de choses que \n.

Par contre, cette différence peut être importante si l’on travaille sur d’autres genres de flux. Par exemple si l’on envoie des informations sur un fichier de log et que l’on veut être sûr que ce log reflète l’état le plus récent du programme, alors l’usage de endl plutôt que \n permet de garantir que ce qui est envoyé dans le fichier de log l’est immédiatement.

Opérateur ternaire

L’opérateur ternaire est généralement utilisé sous cette forme :

string Texte = (Saisie == NombreMysterieux) ? "trouvé" : "raté";

Mais l’opérateur ternaire peut également être utilisé comme lvalue (valeur assignable) :

(A > B ? A : B) = 0;

ce qui est équivalent au code ci-dessous :

if (A > B)
   A = 0;
else
   B = 0;

Cette fonctionnalité peut néanmoins aboutir à un code illisible et dangereux !

Un page sur plusieurs pages

January 22nd, 2010

Parfois, certains documents (par exemple un fichier PDF) n’ont pas des dimensions A4 et sont donc difficiles à imprimer sur une imprimante classique.

Tiler (http://www.mindcad.com/tiler.html), un petit utilitaire gratuit très pratique développé par Mindcad permet de résoudre ce problème.

Grâce à cet outil, il est possible de répartir les pages d’un document sur plusieurs pages A4. Il est possible de choisir le nombre de pages et leurs dispositions.

Tiler

Une fois la disposition voulue obtenue, il suffit de démarrer l’impression, et la page originale sera imprimée sur plusieurs pages.

À mon sens, son seul défaut (version 2.3.1) est que si le document original possède plusieurs pages, il faut démarrer manuellement une impression pour chaque page originale, ce qui peut se révéler fastidieux.

Réduire la taille d’un PDF dans Aperçu

January 22nd, 2010

Pour réduire la taille d’un document PDF ouvert avec Aperçu, il est possible d’utiliser le filtre Quartz Reduce File Size lors de la sauvegarde du document.

Preview : Quarz Reduce File Size

Malheureusement, ce filtre détériore, dans certains cas, fortement la résolution des images. De plus, il n’y a aucun contrôle possible sur la qualité finale obtenue.

En cherchant à résoudre ce problème, j’ai trouvé deux solutions très intéressantes.

Ajouter des filtres Quartz existants

Il est possible d’ajouter des filtres Quartz permettant de choisir la résolution des images. Ceux-ci seront alors utilisables dans Aperçu. C’est un dénommé jcolas qui a conçu plusieurs filtres proposant des réglages différents.

Ses filtre sont disponibles au téléchargement à cette adresse : http://idisk.mac.com/jcolas-Public

Mise à jour 14 août 2012 : Manifestement, ces filtres ne sont plus accessibles. N’ayant pas retrouvé leur trace officielle, je me permets de les mettre en téléchargement ici : jcolas_filters

Mise à jour 30 août 2012 : Depuis OS X Lion, l’emplacement des filtres a changé.

Méthode pour Snow Leopard et versions précédentes :

Il suffit de copier ces filtres dans le répertoire Filters de la bibliothèque (pour un utilisateur ou pour tous les utilisateurs). Si le répertoire Filters n’existe pas, il faut le créer. Lors du prochain démarrage d’Aperçu, ces filtres seront disponibles.

Filtres Quartz de jcolas

Méthode pour Lion et Mountain Lion :

Il suffit de copier ces filtres dans le répertoire PDF Services de la bibliothèque (pour un utilisateur ou pour tous les utilisateurs). Attention, depuis OS X Lion, le répertoire Bibliothèque d’un utilisateur n’est pas visible, il faut utiliser le menu Aller->Aller au dossier... du Finder pour y accéder. Lors du prochain démarrage d’Aperçu, ces filtres seront disponibles.

Mise à jour 7 novembre 2012 : Apparemment, il faut impérativement mettre ces filtres dans le répertoire PDF Services des bibliothèques du système (et non pas dans le répertoire Bibliothèque d’un utilisateur).

Pour accéder à ce répertoire, il faut utiliser le menu Aller->Aller au dossier... du Finder, y inscrire /Library puis cliquer sur le bouton Aller.

C’est à cet emplacement que doit se trouver le répertoire PDF Services dans lequel il faut placer les filtres.

Créer ses propres filtres

La solution précédente offre un large choix de compressions possibles. Mais peut-être n’y a -t-il pas le réglage voulu. Il est alors possible de créer ses propres filtres.

Pour cela, utiliser l’utilitaire ColorSync, livré avec Mac OS X. Il est situé dans le répertoire Applications/Utilitaires. Le nom complet du programme est Utilitaire ColorSync.

Une fois démarré, aller dans l’onglet Filtres et ajouter un nouveau filtre au moyen du bouton +. Donner un nom à ce nouveau filtre.

Créer son propre filtre Quartz

Pour définir ce que fait le filtre, cliquer sur la flèche tout à droite du nouveau filtre. Une quantité de réglages sont possibles.

Dans notre cas, nous voulons compresser les images.

Description du filtre

Une fois l’effet désiré ajouté, il est possible de l’ajuster. En l’occurrence, nous souhaitons compresser les images en JPEG. Le curseur permet de régler le niveau de compression.

Ajuster les paramètres du filtre

Mise à jour 17 décembre 2012 : Je ne sais pas si c’est un bug dans Aperçu introduit depuis Lion, mais en tous les cas, les filtres créés avec ColorSync placés dans le répertoire Filters de la bibliothèque de l’utilisateur ne sont pas reconnus par Aperçu. Pour qu’ils le soient, il faut les déplacer ou les copier dans le répertoire PDF Services des bibliothèques du système (voir la procédure ci-dessus).

Ensuite, quitter ColorSync et redémarrer Aperçu. Le filtre que l’on vient de créer est disponible parmi les autres filtres Quartz.

Notre filtre est disponible

Augmenter le niveau de warning avec Qt Creator

December 11th, 2009

Voici un petit programme C++ développé avec l’IDE Qt Creator :

#include <iostream>

int main() {
   short A = 60000;
   std::cout << "A vaut " << A << "\n";
   return 0;
}

À priori, très simple mais qui ne fonctionne pas comme désiré. Le problème ? L’affectation du nombre 60000 dans un short signé.

Malheureusement, lors de la compilation de ce programme, aucun warning n’est émis !

Pour augmenter le niveau de warning, il suffit de modifier le fichier projet (.pro) et d’y ajouter la ligne suivante :

QMAKE_CXXFLAGS_WARN_ON += -Wconversion

Pour être informé d’un maximum de warnings, il serait même judicieux d’y ajouter le flag -Wextra, ce qui aboutirait à la ligne suivante :

QMAKE_CXXFLAGS_WARN_ON += -Wconversion -Wextra

En plus des problèmes de conversion, il peut également y avoir des problèmes lors du passage d’un type signé vers non-signée et vice-versa. Pour détecter ces problèmes, il faut utiliser le flag –Wsign-conversion.

D’une façon générale, il peut même être pratique de considérer les warnings comme des erreurs, afin de ne rien laisser passer. Pour ce faire, il faut ajouter le flag -Werror, ce qui abouti à la ligne suivante :

QMAKE_CXXFLAGS_WARN_ON += -Wconversion -Wextra -Wsign-conversion -Werror

Synchronisation du calendrier et du carnet d’adresses

July 8th, 2009

Au sein de la famille, il est souvent utile de pouvoir partager les contacts du carnet d’adresses et certains rendez-vous du calendrier.

En l’occurence, je souhaitais arriver à la situation suivante :

  1. Rendre mon calendrier iCal accessible (au moins en lecture) à ma femme ;
  2. Pouvoir accéder (au moins en lecture) au calendrier de ma femme ;
  3. Pouvoir partager certains événements communs dans le calendrier ;
  4. Partager nos contacts du carnet d’adresses ;
  5. Pouvoir synchroniser ces informations sur nos ordinateurs et iPhones respectifs.

Calendriers partagés avec Google Calendar

La première solution envisagée devait permettre de répondre aux besoins 1, 2 et 3 de la liste ci-dessus. Voici en quoi elle consiste :

  • Créer deux comptes Google distincts, pour moi et pour ma femme ;
  • Créer un calendrier Google pour moi et autoriser ma femme à y accéder en lecture en le partageant :
    SafariÉcranSnapz000
    SafariÉcranSnapz001
  • Créer un calendrier Google pour ma femme et le partager avec moi :
    SafariÉcranSnapz002
  • Gérer ces calendriers depuis iCal :
    • Dans les préférences d’iCal, afficher l’onglet Comptes et ajouter un compte en cliquant sur +.
      iCalÉcranSnapz001
    • Donner un nom au calendrier (Description) et introduire le nom d’utilisateur (adresse du compte Google) et le mot de passe.
    • Afficher les options du serveur en cliquant sur le triangle et introduire l’URL du compte, qui aura la forme suivante : https://www.google.com/calendar/dav/compte_google@gmail.com/user et dans laquelle il faut remplacer compte_google par mon propre compte.
    • Réaliser la même chose pour le calendrier de ma femme, mais cette fois, en remplaçant compte_google par le compte de ma femme.
      iCalÉcranSnapz002

Cette solution permet donc d’avoir un calendrier distinct pour chaque membre de la famille et de donner un accès en lecture aux personnes nécessaires. Lorsqu’un événement concerne plusieurs personnes, il suffit de les inviter (au moment de la création de l’événement) et, si l’invitation est acceptée, l’événement apparaîtra également dans leurs calendriers.

Lorsque l’iPhone est synchronisé par iTunes, les calendriers seront synchronisés également.

Par contre, une limitation de l’iPhone (OS 3.0) rend cette solution peu pratique : il n’est pas possible avec l’iPhone d’ajouter des événements dans les calendriers Google.

La seule solution serait alors d’ajouter l’événement dans le calendrier normal, puis, lors de la synchronisation de l’iPhone et de iCal, déplacer cet événement dans le calendrier Google.

Cette manipulation n’est pas très pratique et j’ai donc opté pour une autre solution.

Synchronisation du calendrier entre plusieurs ordinateurs

La deuxième solution est un peu plus radicale, mais dans mon cas, plus appropriée : il s’agit de synchroniser complètement le calendrier de mon ordinateur avec celui de ma femme. Par la même occasion, le carnet d’adresses sera également synchronisé.

Avec cette solution, plus de calendrier Google propre à chaque individu : tout le monde écrira dans le calendrier iCal, mais dans deux sous-calendriers différents (mais c’est à chacun de respecter cela, car rien ne m’empêche d’ajouter des événements dans le sous-calendrier de ma femme).

La synchronisation sera prise en charge par un petit utilitaire gratuit et fort pratique : fruux.

Sa mise en place est assez simple est bien décrite dans le FAQ.

Préférences SystèmeÉcranSnapz001

Je ne l’utilise que pour synchroniser le carnet d’adresses et le calendrier, mais il fonctionne très bien. Il nécessite bien sûr une connexion à internet, car la synchronisation se fera au travers des serveurs de fruux.

C’est d’ailleurs le principal défaut de cette solution : la protection des données. Fruux semble être digne de confiance, mais il faut bien être conscient que toutes les données du calendrier et des contacts sont transférés par leurs serveurs.