Catégorie : traductions

Librairie Apr : tutoriel : finfo-sample.c

Note

Regardez le tutoriel au complet, en Anglais, ici.
Vous trouverez tout ce tutoriel séparé en plusieurs pages ici.
Ce fichier est l’exemple le plus simple pour mettre en oeuvre les fonctions apr_xx
Il vient d’ici.

/**
 * Tutoriel apr, exemple de code
 * http://dev.ariel-networks.com/apr/
 */
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include <apr_general.h>
#include <apr_file_io.h>

/**
 * exemple de récupération d'informations sur un fichier
 * @remark Vérif. des erreurs omise
 */
int main(int argc, const char *argv[])
{
    apr_status_t rv;
    apr_pool_t *mp;
    apr_file_t *fp;
    const char *fname;
    apr_finfo_t finfo;

    if (argc < 2) {
        printf("Utilisation : %s fichier-de-sortie\n", argv[0]);
        return 0;
    }
    fname = argv[1];

    apr_initialize();
    apr_pool_create(&mp, NULL);

    /* @remark depuis apr-1.1.0, utiliser APR_FOPEN_READ au lieu de APR_READ */
    if ((rv = apr_file_open(&fp, fname, APR_READ, APR_OS_DEFAULT, mp)) != APR_SUCCESS) {
        return -1;
    }

    /* Ci-suivent deux façons différentes pour récupérer
     * l'information : elles donnent le même résultat.
     *
     * Si vous avez déjà ouvert le fichier,
     * le premier est le meilleur. Sinon, le
     * second est le meilleur.
     */

    /* Récupération des informations. Via apr_file_t */
    rv = apr_file_info_get(&finfo, APR_FINFO_NORM, fp);
    /* Récupération des informations. Via le nom de fichier */
    rv = apr_stat(&finfo, fname, APR_FINFO_NORM, mp);

    apr_file_close(fp);

    apr_terminate();
    return 0;
}

Librairie Apr : tutoriel 5

5. Gestion des fichiers

Quand on veut des opérations dans un fichier, il faut en premier lieu appeler apr_file_open(). Voilà la déclaration :

/* extrait de apr_file_io.h */
APR_DECLARE(apr_status_t) apr_file_open(apr_file_t **newf,
    const char *fname, apr_int32_t flag,
    apr_fileperms_t perm, apr_pool_t *pool);

Le type du premier argument est apr_file_t**, qui est un argument résultat. Plus précisément, il stocke l’objet apr_file_nouvellement crée lors de l’appel à apr_file_open(). Le second argument est le répertoire + nom du fichier. Le troisième est une composition de flags, définis dans apr_file_io.h. Le quatrième argument est le type de permission qu’on accorde sur ce fichier, mais cela ne fonctionne que lors de la création de fichier. Les flags sont définis dans apr_file_info.h. Par exemple, si vous voulez créer un fichier dont les permissions d’accès sont 0600, c-à-d. lecture-écriture uniquement autorisée par le possesseur du fichier, il vous faudra spécifier APR_UREAD|APR_UWRITE. Vous utiliserez le plus couramment APR_OS_DEFAULT comme permission. Le cinquième et dernier argument est le pool mémoire à utiliser. Précisons pour le lecteur occasionnel que le pool mémoire aura été crée auparavant via apr_pool_create().
Après qu’on ait ouvert le fichier, on peut l’utiliser pour d’autres fonctions de la librairie apr. On peut trouver ces fonctions dans apr_file_io.h. Les fonctions les plus basiques sont apr_file_read() et apr_file_write(). Comme vous l’imaginez, apr_file_read() donne la possibilité de lire quelque chose du fichier et apr_file_write() d’écrire quelque chose dedans.Voilà les déclarations :

/* extrait de apr_file_io.h */
APR_DECLARE(apr_status_t) apr_file_read(apr_file_t *thefile,
    void *buf, apr_size_t *nbytes);
APR_DECLARE(apr_status_t) apr_file_write(apr_file_t *thefile,
    const void *buf, apr_size_t *nbytes);

Le troisième argument des deux fonctions est un argument en entrée mais aussi en sortie (= résultat). En entrée, il sert à spécifier la longueur de la valeur, et on a en sortie le retour du nombre d’octets résultant de l’opération. Pour simplifier, apr_file_read() renvoie le nombre d’octets lus, et apr_file_write() renvoie le nombre d’octets écrits. Voici un code d’exemple.

/* pseudo-code expliquant apr_file_write() */
strcpy(outbuf, "123456789");
apr_size_t outlen = strlen(outbuf);
rv = apr_file_write(fp, outbuf, &outlen);
printf("apr_file_write() rv = %d, nb octets = %d\n", rv, outlen);

Dans ce cas, avant d’appeler apr_file_write(), la variable ‘outlen’ vaut 9. En passant &outlen à apr_file_write(), on dit à la librairie qu’il faut écrire 9 octets. Au retour de apr_file_write(), la valeur de ‘outlen’ est remplie de ce qui a été effectivement écrit. Habituellement c’est 9, surtout si c’est un fichier local. En théorie, la valeur pourrait être plus petite (si le disque est plein par exemple).
Il faut toujours appeler apr_file_close() pour fermer le fichier. Il est possible aussi de le fermer automatiquement en détruisant le pool mémoire par lequel il a été crée, mais je préfère fermer mes fichiers de manière explicite. Cela n’engage que moi.

REMARQUE : Il y a quelques incompatibilités entre les différentes versions de la librairie libapr. Le troisième argument de apr_file_open() a comme préfixe APR_FOPEN_ depuis libapr-1.1.0, alors que ce n’était pas le cas avant. Il faut donc utiliser APR_FOPEN_CREATE au lieu de APR_CREATE. Consultez apr_file_io.h pour voir ce qu’il vous faut réellement utiliser. De la même façon, le quatrième argument de apr_file_open() a le préfixe APR_FPROT_ depuis la libapr-1.1.0.

REMARQUE : Il y a un problème de portabilité sur le séparateur des répertoires/noms de fichiers. Unix(POSIX) utilise le slash (‘/’), et les systèmes Microsoft utilisent le backslash (‘\’) en tant que séparateur. Si vous voulez écrire une application qui tourne sur les deux système, je vous conseille de transformer toujours les séparateur en slash (‘/’) car les systèmes Microsoft l’acceptent quand même.

REMARQUE : Faites attention lors du l’utilisation de apr_file_gets(). Faire un appel à cette fonction sans le paramètre APR_BUFFERED dégrade sérieusement les performances de l’opération. Cela s’explique par le fait que apr_file_gets() appelle apr_file_read(), et, sans ce paramètre, il y aura un appel pour chaque octet à lire. Souvenez vous bien qu’il vous faut ouvrir le fichier avec le flag APR_BUFFERED si vous voulez utiliser apr_file_gets().

Je vous recommande d’utiliser toujours APR_BUFFERED sauf dans ces cas :

  • Quand vous « mmap »-ez le fichier (cela génère une erreur du fichier à « mmapp-er ») ;
  • Aucune lecture/écriture (p.ex. un fichier destiné à être uniquement un verrou) ;
  • Vous êtes sûr que vous lisez ou écrivez avec un buffer suffisamment gros.

REMARQUE : Si vous ouvrez un fichier avec le flag APR_BUFFERED et que vous appelez par la suite apr_file_trunc(), n’oubliez pas d’appeler apr_file_flush() avant apr_file_trunc(). Sinon vous allez perdre des informations.

REMARQUE: Si vous ouvrez un fichier avec le flag APR_BUFFERED, et que le fichier est partagé par plusieurs threads, il vous faut obligatoirement préciser APR_XTHREAD. Malheureusement, ce flag a quelques revers de médailles sur les systèmes d’exploitation Windows. Par expérience, je vous conseillerai d’éviter d’utiliser APR_XTHREAD sur les systèmes d’exploitation Windows.

Il est possible d’avoir des informations sur le fichier telles que la date de création, de modification, le possesseur du fichier, les permissions, etc. Ces informations sont dans la structure apr_finfo_t, que vous trouverez décrite dans apr_file_info.h. Il y a deux fonctions que fournit la librairie libapr :

/* extrait de apr_file_io.h */
APR_DECLARE(apr_status_t) apr_file_info_get(apr_finfo_t *finfo,
    apr_int32_t wanted, apr_file_t *thefile);
/* extrait de apr_file_info.h */
APR_DECLARE(apr_status_t) apr_stat(apr_finfo_t *finfo,
    const char *fname, apr_int32_t wanted, apr_pool_t *pool);

Il faut un objet apr_file_t pour la fonction apr_file_info_get(), et un nom de fichier pour apr_stat(). Si on a déjà ouvert ce fichier et qu’on a donc un objet apr_file_t crée, c’est plus pratique de se servir de apr_file_info_get(). Sinon, il faut appeler apr_stat(). A l’inverse de beaucoup d’autres types, apr_finfo_t est un type complet. Plutôt que d’appeler une fonction de la librairie pour créer l’objet, il faut allouer une structure apr_finfo_t explicitement. Typiquement, c’est alloué sur la pile locale, parce qu’on n’a souvent besoin besoin que d’un seul attribut, comme la taille du fichier, ou sa date de création, et rien de plus. Notez que quelquefois des informations telles que apr_finfo_t::fname, sont allouées dans le pool mémoire que vous passez en paramètre. Faites attention, c’est parfois la cause de problèmes de fuites mémoire. Regardez l’exemple à finfo-sample.c pour bien comprendre le fonctionnement.

Il y a quelques fonctions de gestion des fichiers qui fonctionnent en se basant sur un nom de fichiers. Par exemple, apr_file_remove() et apr_file_copy(). Vous lez trouverez dans apr_file_io.h et apr_file_info.h.

REMARQUE : Quelques fonctions de la librairie aprlib prennent en paramètre des argument initialisés par des flags que l’on peut combiner (« bit-wised flags ») pour récupérer les attributs des fichiers. Ces fonctions sont apr_dir_read(), apr_stat(), apr_lstat(), et apr_file_info_get(). Notez que selon la valeur que vous donnez à l’argument, ce dernier peut ne pas exister sur le système d’exploitation, et dans ce cas, renvoyer la valeur d’erreur APR_INCOMPLETE.

Librairie Apr : tutoriels 3 et 4

Pour information : regardez le tutoriel au complet, en Anglais, ici.
Vous trouverez tout ce tutoriel séparé en plusieurs pages ici.

3. memory pool (apr_pool_t)

La plupart des fonctions de libapr sont dépendants de pools mémoire. Grâce aux pools mémoire, vous pouvez facilement gérer des groupes de portions de mémoire.

Imaginez un cas sans le système de pool mémoire, où vous devez allouer chaque portion de mémoire. Vous devez libérer chacun d’eux. Si vous avez fait dix allocations, vous devez faire dix libérations, sinon vous allez avoir des fuites mémoire. Le principe de pool mémoire résout ce genre de problème. Après avoir crée un pool mémoire, vous pouvez allouer autant de morceaux de mémoire que vous voulez sur ce pool. Pour tout libérer, la seule chose que vous ayez à faire est de détruire le pool mémoire. Le pool s’occupe de libérer le reste.

Il y a deux gros avantages :

  1. Comme expliqué juste avant, cela évite les fuites mémoire ;
  2. Ensuite, le coût machine d’allocation est réduit.

D’une certaine façon, vous devez tout de même programmer comme si vous étiez dans une session. Un pool mémoire est un peu comme un contexte de session, c’est à dire que tous les objets qui y sont liés ont la même durée de vie. Vous pouvez contrôler un groupe d’objets dans un contexte de session. Au début d’une session, vous créez un pool mémoire. Ensuite, vous créez des objets sur ce pool mémoire pendant cette session. Notez que vous n’avez pas à vous préoccuper de leur durée de vie. A la fin de la session, la seule chose que vous ayez à faire est de libérer le pool mémoire.

REMARQUE : En général, le contrôle de la durée de vie des objets est la chose la plus difficile en programmation. C’est pour cela qu’il y a plein d’autres techniques pour cela, telles que les « pointeurs intelligents, le ramasse-miettes (GC – garbage collector) etc. Il est difficile d’utiliser de telles techniques en même temps. Comme le pool mémoire est l’une de ces techniques, il vous faire attention aux mélanges !

Il y a trois fonctions principales de l’API, concernant les pools mémoire :

/* extrait de apr_pools.h */
APR_DECLARE(apr_status_t) apr_pool_create(apr_pool_t **newpool, apr_pool_t *parent);
APR_DECLARE(void *) apr_palloc(apr_pool_t *p, apr_size_t size);
APR_DECLARE(void) apr_pool_destroy(apr_pool_t *p);

On crée un pool mémoire via apr_pool_create(). Ce pool existe tant qu’on ne l’a pas libéré via apr_pool_destroy(). Le premier argument de apr_pool_create() est un argument-resultat. Un nouvel objet « pool mémoire », apr_pool_t, est renvoyé par cet appel à l’API. On appelle apr_palloc() pour allouer une portion de mémoire en précisant la taille. Jetez un coup d’oeil à mp-sample.c pour voir un exemple simple.

/* extrait de mp-sample.c */
apr_pool_t *mp;
/* créer un pool mémoire. */
apr_pool_create(&mp, NULL);
/* allouer une portion mémoire sur le pool */
char *buf1;
buf1 = apr_palloc(mp, MEM_ALLOC_SIZE);

En résumé, on peut utiliser apr_palloc() comme malloc(3). On peut aussi appeler apr_pcalloc(). Comme vous l’imaginez, apr_pcalloc() ressemble fortement à calloc(3). apr_pcalloc() renvoie une portion mémoire intégralement initialisée avec des zéro. Si vous vous servez de malloc(3)/calloc(3), vous aurez besoin d’appeler free(3) pour chaque portion allouée. A l’inverse, vous n’avez pas besoin de faire ça pour chaque portion allouée sur un pool mémoire. Vous appelez simplement apr_pool_destroy() avec le pool concerné et tout ce qui a été alloué est libéré.

REMARQUE : Il n’y a pas de limitation sur la taille que vous pouvez allouer avec apr_palloc(). Néanmoins, ce n’est pas une bonne idée d’allouer de gros morceaux de mémoire avec une gestion de mémoire orienté « pool ». C’est simplement parce que la gestion via un pool mémoire a été conçue pour gérer efficacement des petites allocations. En réalité, la taille initiale d’un pool mémoire est de de 8 kb. Si vous avez besoin d’allouer quelque chose de plus large, p.ex. plusieurs méga bytes, vous devriez éviter la gestion via un pool mémoire.

REMARQUE : Par défaut, un manager de pool mémoire ne libère jamais la mémoire allouée au système tant qu’il n’est pas détruit. Si un programme tourne pendant longtemps, il aura des problèmes. Je vous conseille de préciser dès le début une taille limite maximale comme suit :

/* exemple qui applique une limite haute pour forcer le
 * manager du pool à libérer de la mémoire au système
 * à partir d'un certain seuil
 */
#define YOUR_POOL_MAX_FREE_SIZE 32 /* taille max. du pool */
apr_pool_t *mp;
apr_pool_create(&mp, NULL);
apr_allocator_t* pa = apr_pool_allocator_get(mp);
if (pa) {
    apr_allocator_max_free_set(pa, YOUR_POOL_MAX_FREE_SIZE);
}

Il y a deux autres fonctions de l’API que vous devez connaitre. L’une d’elles est apr_pool_clear(), et l’autre est apr_pool_cleanup_register(). apr_pool_clear() ressemble à apr_pool_destroy(), mais le pool mémoire est toujours réutilisable. Le code typique est le suivant :

/* exemple montrant comment fonctionne apr_pool_clear() */
apr_pool_t *mp;
apr_pool_create(&mp, NULL);
for (i = 0; i < n; ++i) {
    do_operation(..., mp);
    apr_pool_clear(mp);
}
apr_pool_destroy(mp);

Le pool mémoire est utilisé dans do_operation(), qui, imaginons, alloue plein de morceaux mémoire. Si vous n’avez pas besoin de tous les morceaux alloués hors de do_operation(), vous pouvez appeler apr_pool_clear(). Ainsi vous limiterez l’utilisation mémoire. Si vous connaissez bien le principe du fonctionnement du système de la pile locale, vous pouvez imaginer que la gestion de pool mémoire est une « pile mémoire locale ». L’appel de apr_palloc() est similaire au fait de déplacer SP(stack pointer), et appeler apr_pool_clear() est similaire à faire reculer SP. Les deux opérations sont très légères en termes de calcul CPU.
La fonction apr_pool_cleanup_register() offre la possibilité d’appeler automatiquement des fonctions de libération lorsque le pool est nettoyé via apr_pool_clear() ou détruit vie apr_pool_destroy(). Dans les fonctions de callback, vous pouvez implémenter un code de libération de vos objets, ou de finalisation, liés au nettoyage/destruction du pool mémoire.
La dernière chose concernant les pools mémoire est le sous-pool. Chaque pool a la possibilité d’avoir un parent. Pour être plus précise, les pools mémoire sont organisés dans un arbre. Le deuxième argument de  apr_pool_create() est le parent du pool mémoire à créer. Si vous passez NULL en tant que parent, le nouveau pool est positionné à la racine de l’arbre. Vous pouvez créer des « sous-pools » mémoire en les liant à ce dernier. Quand vous appelez apr_pool_destroy() pour un pool mémoire dans l’arbre, tous ses descendants sont aussi détruits. Quand vous appelez apr_pool_clear(), le pool mémoire reste en vie, il est simplement nettoyé, mais les enfants sont détruits. Quand un enfant est détruit, les fonctions callback liées au nettoyage/destruction dont on a parlé précédemment sont appelées.

REMARQUE : Le bogue suivant est très courant : vous passez NULL comme paramètre pool à la fonction callback de nettoyage. Il faut plutôt utiliser apr_pool_cleanup_null, comme le montre l’exemple :

/* pseudo code sur le bogue habituel de pool mémoire */
/* apr_pool_cleanup_register(mp, CONTEXTE_DE_VOTRE_CODE, CALLBACK_DE_VOTRE_CODE, NULL); C'EST UN BOGUE */
/* Version corrigée : */
apr_pool_cleanup_register(mp, CONTEXTE_DE_VOTRE_CODE, CALLBACK_DE_VOTRE_CODE, apr_pool_cleanup_null);

4. Error status (apr_status_t)

La plupart des fonctions de la librairie libapr renvoient une valeur de type apr_status_t. La valeur apr_status_t est très souvent, soit APR_SUCCESS soit autre chose. APR_SUCCESS indique que tout s’est correctement déroulé. Le code typique ressemble à cela :

/* pseudo code sur la vérification du retour apr_status_t */
apr_status_t rv;
rv = apr_pool_create(&mp, NULL);
if (rv != APR_SUCCESS) {
    /* Gestion de l'erreur */;
}

libapr définit quelques statuts d’erreur tels que APR_EINVAL, et des macros pour vérifier des types d’erreurs telles que APR_STATUS_IS_ENOMEM((). Quelques unes d’entre elles sont vraiment très utiles, surtout pour la gestion des problèmes de portabilité. Un exemple typique est la macro APR_STATUS_IS_EAGAIN(). Historiquement, il y a deux erreurs qui ont le même chiffre mais pas la même signification, EAGAIN et EWOULDBLOCK. La macro APR_STATUS_IS_EAGAIN() gère ce problème.
Néanmoins, c’est presque impossible de gérer toutes les erreurs sans prendre en compte le système sous-jacent. La librairie libapr ne réinvente pas la roue. Ce qu’elle fait est très simple :

  • En cas de succès, retour = APR_SUCCESS
  • En cas d’erreur concernant uniquement la librarie elle-même, retour = APR_XXX
  • En cas d’erreur système commune à tous les systèmes d’exploitation, retour = APR_XXX
  • En cas d’erreur spécifique à un système d’exploitation, retour = numéro d’erreur du système plus un offset

Je vous conseille de suivre ces règles simple :

  1. Comparer la valeur de retour avec APR_SUCCESS
  2. Si vous avez besoin de plus de détails sur l’erreur, comparer avec d’autres valeurs d’erreur définies dans la librairie

Un fonction extrêmement utile est apr_strerror(). Vous pouvez afficher la chaine décrivant l’erreur de cette façon :

/* pseudo code expliquant apr_strerror() */
apr_status_t rv;
rv = apr_xxx_xxx();
if (rv != APR_SUCCESS) {
    char errbuf[256];
    apr_strerror(rv, buf, sizeof(buf));
    /* afficher la description de l'erreur */
    puts(errbuf);
}

Librairie Apr : tutoriel : aval officiel de l'auteur

J’ai eu l’aval officiel de l’auteur pour tout traduire et mettre en ligne sur mon site :
Voilà ce que j’ai demandé :

You’ve done a really really really good work with your apr tutorials.
I’d like to help the community by translating it in French and making it available in my site.
Example : (Exemple de document traduit)
May I go on or should I stop ?

Voilà sa réponse reçue au moment même où je fais cet article :

Hi, Olivier Pons,
Surely, you can go on.
It is my pleasure.
When you let me know the exact (I mean, a kind of permanent) URL, I will put the link on my site.
Thank you very much.
– INOUE Seiichiro

Pour information : regardez le tutoriel au complet, en Anglais, ici.
Vous trouverez tout ce tutoriel séparé en plusieurs pages ici.

La procrastination organisée

Cet article vient d’ici

J’ai essayé d’écrire cet article pendant des mois. Pourquoi est-ce que, finalement, aujourd’hui, je le fait ?

Parce que j’ai du temps libre ? Faux.

Je dois relire des documents, commander des livres, envoyer une demande de remboursement, finir de rédiger des brouillons.

En réalité je me suis mis à écrire cet article pour éviter de faire toutes ces choses. C’est l’essence même de ce que j’appelle la procrastination organisée, une stratégie impressionnante que j’ai découverte, et qui convertit les procrastinateurs en personnes efficaces, respectées et admirées pour tout ce qu’elles arrivent à faire en même temps et pour la bonne utilisation qu’elles font de leur temps. Tous les procrastinateurs, par définition, repoussent tout ce qu’ils ont à faire jusqu’au dernier moment. La procrastination organisée est l’art d’utiliser ce mauvais trait de caractère à bon escient. L’idée clé est que le fait de procrastiner ne veut pas dire « ne rien faire du tout ». Les procrastinateurs ne font rien que très rarement ; il font toujours des choses qui ne sont que peu utiles, telles que tailler des crayons, faire le jardin ou faire un diagramme de la réorganisation de leurs fichiers sur leur ordinateur. Pourquoi est-ce qu’un procrastinateur fait ces choses ? Parce qu’elles sont une façon d’éviter de faire des choses plus importantes. S’il ne restait au procrastinateur qu’à tailler ses crayons, aucune force sur la terre ne réussirait à le convaincre de tailler le moindre petit crayon. Néanmoins, le procrastinateur peut être motivé pour faire des choses difficiles, chronométrées et importantes tant que ces tâches sont des choses qui donnent la possibilité d’éviter de ne pas en faire d’autres qui sont plus importantes.

La procrastination organisée signifie « un moyen de gérer la structure même des tâches d’une manière qui exploite ce trait de caractère ». La liste des tâches qu’on a en tête doit être triée par ordre d’importance. Les tâches qui semblent plus urgentes et importantes sont au sommet. Mais il faut imaginer qu’il y a aussi des tâches importantes à réaliser en bas de la liste. Réaliser ces dernières tâches est un moyen de ne pas faire les autres, situées plus en haut sur la liste. Avec ce type de structuration des tâches, un procrastinateur devient un citoyen utile. Un procrastinateur peut même acquérir, comme moi, une bonne renommée, être efficace et paraître organisé.

La situation la plus parfaite que j’aie jamais eue, pour une procrastination structurée, était lorsque ma femme et moi travaillions en tant que professeurs à Resident Fellows dans Soto House, à Stanford. Le matin, nous avions des papiers à remplir, des interrogations à préparer, du travail qui consistait à résumer des réunions faites, et moi, je quittais à ce moment précis la résidence pour aller juste à côté jouer au ping-pong avec les résidents, ou parler de tout et n’importe quoi avec eux, dans leurs appartements, ou pire, juste rester assis à lire le journal. Je me suis fait rapidement une réputation surprenante, et on pensait que j’étais une des rares professeurs du campus qui était d’accord pour accorder du temps avec les jeunes et qui voulait mieux les connaitre. Quel truc bizarre et marrant à la fois : s’éclater au ping-pong pour éviter de faire des choses plus importantes, et acquérir la réputation du prof le plus sympa du campus !

Les procrastineurs suivent souvent une mauvaise tactique. Ils essaient de minimiser leurs engagements, assumant le fait que s’ils ont peu de choses à faire, ils vont arrêter de procrastiner et faire ces choses. C’est exactement contre la nature du procrastineur et détruit sa source la plus importante de motivation. S’il y a peu de tâches sur une liste, ça veut dire que par définition, ces tâches seront importantes, et que la seule chose à faire pour les éviter est de ne rien faire. C’est la manière la plus efficace de devenir un gros tas de gelée flasque, au lieu d’être quelqu’un d’efficace.
Arrivé ici, vous vous demandez : « Et alors, on fait quoi des tâches tout en haut de la liste, qu’au final, personne ne fait ? ». Je l’admets, il y a un problème potentiel ici.

L’astuce est de choisir vraiment bien les projets qu’on met en haut de la liste. La gestion idéale comporte deux caractéristiques : en premier, il faut qu’il y ait des deadlines (mais en réalité si ce n’est pas fait ce n’est pas la mort), et en second, il faut que les tâches semblent horriblement importantes (mais personne ne va mourir si on ne les fait pas). Heureusement, la vie abonde de tâches qui correspondent à ces deux critères. Dans les universités la grande majorité des tâches relèvent de ces deux catégories, et je suis sûr que c’est la même chose pour toutes les entreprises un peu grosses. Tenez, prenons par exemple la tâche que j’ai écrite juste en haut de ma liste maintenant. C’est de finir un essai sur le thème de la philosophe des langages. Il est supposé être terminé depuis onze mois. J’ai fait plein de choses super importantes entretemps juste pour éviter de travailler dessus. Il y a quelques mois, je me suis senti tellement coupable que j’ai écrit une lettre à mon éditeur en lui disant combien j’étais désolé d’être en retard et où j’ai exprimé mes bonnes intentions pour finir ce que j’ai commencé. Le fait d’écrire cette lettre était encore une façon d’éviter de travailler sur le sujet. Eh bien au final on a vu avec lui que mon planning était à peine derrière tout ce qu’il avait planifié. Mais en réalité est-ce que ce sujet est si important ? Pas tellement important, enfin pas important au point d’imaginer ne rien pouvoir faire d’autre. Lorsque je n’aurai plus rien à faire je m’y mettrai.

Un autre exemple est le remplissage de la fiche de commande de livres. J’ai écrit ça en juin. En octobre, je vais donner un cours sur l’épistemologie. La la fiche de commande de livres est à rendre depuis longtemps. C’est facile d’imaginer que c’est une tâche importante, avec un délai pressant derrière (pour les non-procrastineurs, je préfère signaler que les délais deviennent vraiment urgents une semaine voire deux, après que le délai soit écoulé). J’ai pratiquement tous les jours un beep de la secrétaire du département, des étudiants qui me demandent parfois ce qu’ils auront à lire, et la fiche de commande de livres est là en plein milieu de mon bureau, pile poil sous le sachet dans lequel était mon repas de midi de mercredi dernier. Cette tâche est presque tout en haut de ma liste. Cela me gêne et me motive tout à la fois, de faire d’autres choses utiles mais plus superficielles ou, disons, moins importantes. Mais en réalité, la secrétaire a une pile énorme fiches déjà remplies par des non-procrastinateurs, et elle n’a pas le temps de toutes les faire ! Je remplirai la mienne au milieu de l’été et tout ira bien. J’ai juste besoin de commander des livres connus d’imprimeurs connus et efficaces. Je vais sûrement accepter d’autres tâches apparemment plus importantes entre maintenant et, disons, le premier août. Je me sentirai mieux sur le plan comportemental si je me mets à remplir cette fiche le jour où ce sera vraiment un moyen d’éviter de faire ces autres nouvelles tâches plus importantes.

Le lecteur attentif pourra constater que la procrastination structurée demande une petite dose de déception, parce qu’il faut systématiquement mettre à jour sa propre pyramide des besoins et que celle-ci peut sembler fausse vue de l’extérieur. Parfaitement.

On doit pouvoir se reconnaitre et s’épanouir en exécutant des tâches avec une importance faussement gonflée et des délais irréalistes, tout en ressentant vraiment qu’elles sont importantes et urgentes. Ce n’est pas une difficulté en soi, parce que tous les procrastineurs ont une faculté rare : savoir se mentir à soi-même et y croire.

En conclusion : quoi de plus noble qu’utiliser les défauts d’un caractère pour les transformer en qualités ?

Librairie Apr : tutoriel : mp-sample.c

Note

Regardez le tutoriel au complet, en Anglais, ici.
Vous trouverez tout ce tutoriel séparé en plusieurs pages ici.
Ce fichier est l’exemple le plus simple pour mettre en oeuvre les fonctions apr_xx
Il vient d’ici.

/**
 * apr tutorial sample code
 * http://dev.ariel-networks.com/apr/
 */
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include <apr_general.h>
#include <apr_pools.h>

#define MEM_ALLOC_SIZE		1024

/**
 * exemple de pool mémoire
 * @remark Vérif. des erreurs omise
 */
int main(int argc, const char *argv[])
{
    apr_status_t rv;
    apr_pool_t *mp;
    char *buf1;
    char *buf2;

    /* initialisation par processus (per-process) */
    rv = apr_initialize();
    if (rv != APR_SUCCESS) {
        assert(0);
        return -1;
    }

    /* créer un pool mémoire. */
    apr_pool_create(&mp, NULL);

    /* allouer de la mémoire via le pool */
    buf1 = apr_palloc(mp, MEM_ALLOC_SIZE);
    buf2 = apr_palloc(mp, MEM_ALLOC_SIZE);

    /* détruire le pool mémoire
      (ce qui était alloué au dessus sera
      automatiquement libéré) */
    apr_pool_destroy(mp);

    apr_terminate();
    return 0;
}

Firefox : 20 raccourcis indispensables

Ces astuces viennent d’ici

Je me suis permis de rajouter pas mal de notes afin que tout le monde arrive à s’en servir. Tellement indispensables !

  1. Chercher dans des sites grâce à un mot clé
    Allez dans n’importe quel site qui a champ de recherche, cliquez avec le bouton droit de la souris, choisissez “Ajouter un mot-clé pour cette recherche”. La boîte d’ajout de mot-clé va s’ouvrir. Donnez-lui un nom et un mot clé court (par exemple “bay” pour eBay pour le nom et le mot-clé). Maintenant, si vous voulez chercher des CDs sur eBay vous pouvez le faire en allant dans la barre d’adresse et en tapant directement bay CDs”.
  2. Assignez de mots-clé à des marque-page
    Pour accélérer la recherche d’un marque-page, allez dans marque-pages/organiser les marque-pages, cliquez avec le bouton droit de la souris sur le lien qui vous intéresse et sélectionnez le menu « propriétés ». Entrez une chaine courte dans le champ mot-clé (étiquette sur Firefox 3), par exemple, entrez ‘olive’ pour votre marque-page sur ce blog et validez. Par la suite, poiur accéder immédiatement à ce raccourci, il vous suffit de taper ‘olive’ dans la barre d’adresse et de taper sur entrée.
  3. Navigate Tabs
    Appuyez sur « CTRL+TAB » pour aller d’onglet en onglet, de la gauche vers la droite ou « CTRL+SHIFT+TAB » pour aller en sens inverse. Quand vous arriverez au dernier onglet il retournera au premier et vice-versa. Vous pouvez aussi appuyez sur « CTRL » et un chiffre qui correspond à l’onglet auquel vous voulez accéder. Par exemple, « CTRL+3 » vous amènera directement au troisième onglet.
  4. Tapez plus rapidement des URLs
    Tapez le nom (pas l’addresse) d’un site sur lequel vous voulez vous rendre et appuyez sur « CTRL+ENTER ». Cela va automatiquement ajouter « http://www. » avant le texte et « .com » après et ouvrir automatiquement le site. « SHIFT+ENTER » ajoute « http://www. » et « .net« , et « CTRL+SHIFT+ENTER » « http://www. » et « .org« . Si vous appuyez sur ALT au même moment le site s’ouvrira dans un nouvel onglet.
  5. Recherche rapide d’un mot sur google
    Pour chercher n’importe quel mot ou phrase dans un site web, selectionnez et glissez-déposer le texte dans la barre de recherche de Firefox (la plupart du temps elle est en haut à droite). Alternativement, vous pouvez sélectionner la phrase, cliquer avec le bouton droit sur la sélection, et choisir « Recherche google pour… ». Vous pouvez changer le moteur de recherche en sléectionnant un autre moteur via la petite flèche de sélection à droite du logo ‘G’ de google. Par exemple, si vous choisissez Amazon ou eBay vous pouvez utiliser cette méthode pour chercher rapidement un produit.
  6. Marques pages qui s’ouvrent en cascade
    Vous pouvez marquer tous les onglets ouverts en une seule fois en allant dans « Marque-pages », puis « Marquer tous les onglets ». Si vous décidez de sauver ce répertoire dans la « Barre personnelle », alors lorsque vous cliquerez sur le bouton qui sera dans votre barre, vous aurez un menu qui va s’ouvrir avec tous les onglets que vous avez sauvé.
  7. Supprimer des adresses historisées
    Lorsque vous commencez à taper quelque chose sur Firefox 3, ou que vous cliquez sur la petite flèche de la barre d’adresse pour qu’elle vous donne des suggestions, vous verrez une liste des sites sur lesquels vous êtes allé récemment. Pour enlever une adresse particulière, déplacez vous avec les touches haut et bas et tapez “SHIFT+DELETE”. Firefox le supprimera de son historique.
  8. Téléchargements instantanés
    Cliquez avec le bouton droit sur la barre de navigation (mais pas directement là où on tape une URL, plutôt juste à côté) et sélectionnez « Personnaliser ». Une fiche va s’ouvrir, et vous présenter tous les boutons que vous pouvez ajouter. Glissez-déposez l’icône des téléchargements à côté des boutons suivant-précédent. Maintenant, lorsque vous voulez télécharger quelque chose rapidement, il vous suffit de l’attraper avec la souris (= cliquer en laissant appuyez dessus) et le glisser-déplacer sur ce bouton et le téléchargement va commencer. Personnellement j’utilise DownThemAll et j’ai mis le bouton. C’est un gain de temps énorme.
  9. Lancer plusieurs onglets de la page d’accueil
    Firefox peut-être configuré pour ouvrir plusieurs onglets au démarrage, ou bien si vous cliquez sur l’icône de la maison. Allez sur toutes les pages que vous voulez voir ouvertes au démarrage et allez dans Outils/Options/Général et cliquez sur « Pages courantes ».
  10. Affichage du curseur
    Voir là où est le curseur pour sélectionner du texte en appuyant sur SHIFT et en utilisant les flèches du clavier est parfois plus précis qu’en utilisant la souris. Appuyez sur “F7″ pour afficher (ou cacher) l’affichage du curseur. Votre souris pourra se reposer un peu.
  11. Sauvez des clips audio ou vidéo
    Si vous voulez sauver une image, une vidéo, ou un morceau de musique, mais qu’il est protégé, cliquez avec le bouton droit et choisissez “Informations sur la page”. Cliquer sur l’onglet « Média », et cherchez le fichier que vous désirez, puis choisissez « Sauver sous ».
  12. Recherche rapide sur Google
    Si Google est votre moteur de rcherche par défaut, et que vous tapez votre recherche directement dans la barre d’adresse et que vous appuyez sur entrée, Firefox va essayer le bouton habituel de Google “J’ai de la chance” et vous amener directement à la première page de résultats de Google.
  13. Visualiser des images
    Vous pouvez voir n’importe quelle image en cliquant dessus avec le bouton droit et sélectionnant « Voir l’image ». Appuyez sur “SHIFT” au moment où vous faites cela et l’image s’ouvrira dans une nouvelle fenêtre. Appuyez sur “CTRL” (ou cliquez avec le bouton de la molette) et l’image s’ouvrira dans un nouvel onglet.
  14. Accélérez Firefox
    Il y a plein de manière de bidouiller un programme pour le rendre plus rapide, mais la plus facile et d’en utiliser un autre qui fait tout pour vous. Servez vous donc des extensions FireTune et Fasterfox. Votre vie va changer !
  15. Faire des marque-pages « vivants »
    Firefox utilises les feeds RSS pour créer des marque-pages « vivants » qui changent tout seuls dynamiquement et pointent sur les derniers articles et les dernières histoires en date. Vous pouvez créer des marque-pages « vivants » (« live bookmark ») à partir de n’importe quel site pourvu que ce dernier les supporte. Dans ce cas vous verrez une icône orange qui apparaîtra dans la barre d’adresse. Cliquez dessus et le tour est joué.
  16. Arrêter une animation
    Certaines sites Web utilisent des images GIF animées. Pour arrêter l’animation appuyez simplement sur la touche « ESC ».
  17. Ouvrir un nouvel onglet
    Il y a plein de façon d’ouvrir un nouvel onglet. Vous pouvez aller dans le menu principal, et choisir Fichier/Nouvel onglet, ou encore faire CTRL+T, ou cliquer sur un lien en laissant appuyé sur la touche CTRL, en cliquant avec le bouton droit de la souris sur un lien et en choisissant “Ouvrir dans un nouvel onglet”. Vous pouvez aussi simplement prendre un lien et l’amener entre deux onglets. Je précise « entre », parce que si vous amenez le lien sur un onglet, Firefox va ouvrir le lien dans l’onglet que vous avez choisi, pas dans un nouvel onglet.
  18. Fermer des onglets
    Vous pouvez fermer n’importe quel onglet en cliquant dessus avec le bouton du milieu de votre souris (le bouton de la roulette). Ou encore en appuyant sur CTRL+F4. Ou finalement en appuyant sur CTRL+W. Faites votre choix.
  19. Customisez Firefox
    Allez dans la barre d’adresse et tapez “about:config” puis appuyez sur “ENTREE” pour afficher la configuration des options de Firefox. Attention, il faut faire ces changements avec prudence ! Tout le comportement de Firefox est basé sur ces préférences. Vous en saurez plus en allant sur mozillaZine.
  20. Trouver des mots et des liens
    Si vous appuyez sur « / » (la touche « division » du pavé numérique) vous aurez une boite de recherche rapide qui va s’ouvrir dans Firefox (en bas à gauche de la page). Au fur et à mesure que vous tapez quelque chose, la recherche se fera en direct ! Si vous appuyez sur ” ‘ ” (l’apostrophe, la touche « 4 » du clavier, au dessus du « e ») au lieu du « / », la boite de recherche rapide uniquement dans les liens présents dans la page va s’ouvrir. Appuyez sur “CTRL-F” pour ouvrir la boite de recherche complète (elle s’ouvre au même endroit que les deux précédentes). Lorsque l’une des boite de recherche est ouverte, appuyez sur « F3 » pour rechercher l’occurrence suivante.

Librairie Apr : tutoriels 1 et 2

1. Disponibilité du tutoriel au complet

Regardez le tutoriel au complet, en Anglais, ici.
Vous trouverez tout ce tutoriel séparé en plusieurs pages ici.

2. Un squelette de code pour libapr

Je pense que c’est une bonne idée d’écrire un « squelette de code » au début, lorsque vous commencez à apprendre une nouvelle librairie ou un nouveau framework. Un ‘squelette de code’ est le plus petit morceau de code possible que vous pouvez compiler et exécuter (malgré le fait qu’il ne fasse rien de vraiment utile).
Heureusement, le squelette de code que l’on va faire pour la libapr est beaucoup plus simple que la plupart des frameworks modernes. Voyons apr-skeleton.c. On appelle apr_initialize() pour ouvrir la librairie, et apr_terminate() pour la fermer. C’est tout. Comme vous pouvez l’imaginer, le code ne fait rien du tout.
libapr n’est pas une librairie de type framework. Pour être plus précis, libapr ne vous aide pas du tout à concevoir la structure de votre code programme. Il y a des avantages et des inconvénients. L’avantage le plus important est que l’utilisation de libapr est très facile à utiliser et à intégrer dans du code existant. L’inconvénient principal est que vous devez concevoir la structure complète du code lorsque vous utilisez libapr.
Ici, nous avons tout de même quelques règles et style concernant libapr :

  • la règle de nommage est très simple et claire ;
  • les types de données opaques sont souvent utilisés (p.ex. les types incomplets) ;
  • la plupart des retours de fonctions sont apr_status_t et si besoin est, certaines variables en paramètre sont aussi des arguments résultats ;
  • règles de pool mémoire.

On peut voir les styles et les règles directement par cet exemple :

/* extrait de mp-sample.c */
apr_status_t rv;
apr_pool_t *mp;
rv = apr_pool_create(&mp, NULL);

Voici l’explication du code : ici ne regardez que la notation. Vous voyez le préfixe apr_. Ce dernier indique que le symbole fait partie de l’espace de nommage de la librairie libapr. Le suffixe _t précise que le nom concerné est un type.
apr_pool_t est un type opaque. Cela signifie que la structure de ce type n’est pas publique. En utilisant une terminologie de style OO (Object Oriented), toutes les variables membres sont privées. Vous ne pouvez pas y accéder directement. Vous ne pouvez pas les voir dans les fichiers « .h » non plus. La seule chose que vous puissiez faire pour ce type est d’appeler une API qui l’utilise, telle que apr_foo_bar() par exemple. Plus important encore, vous ne pouvez créer une instance de ce type dynamiquement. Vous êtes obligé de passer par une fonction d’allocation de la librairie. Seule libapr sait comment construire et détruire ce genre d’objets.
Comme vous pouvez le voir, le type de retour de la fonction apr_pool_create() est apr_status_t. apr_status_t est soit un code indiquant un status soir un code d’erreur. apr_status_t is est utilisé couramment en tant que type de valeur de retour par la plupart des fonctions de l’APIs. De la même façon, on peut recevoir des résultats de fonction via des arguments. De tels arguments sont appelés arguments-résultat. Il y a beaucoup d’arguments-résultat dans le monde de la libapr.
En général, si vous voyez le type apr_foo_t, vous verrez des fonctions apr_foo_bar(), qui ont un lien avec le type apr_foo_t. Le code qui suit est un pseudo code courant :

/* pseudo code of libapr. Vérif. des erreur omise */

apr_status_t rv;
apr_foo_t *foo;

/* créer un objet @foo selon @args : */
rv = apr_foo_create(&foo, args...);

/* faire quelque chose avec @foo : */
rv = apr_foo_do_something(foo, args...); /*  */

/* détruire l'objet @foo. */
apr_foo_destroy(foo);

/* NB : Parfois la destruction d'un objet est
   faite implicitement lorsque le pool mémoire
   associé est détruit. */

Les dix types d'entreprises les plus rentables

Article trouvé ici :

(NB : la traduction n’est pas parfaite car il y a des expressions très technique qui m’ont un peu dépassé. N’hésitez pas à me faire part de vos commentaire et j’y appliquerai les corrections si nécessaire)

  1. Services touchant à la comptabilité
    Marge moyenne : 25 %
    Il est question des entreprises qui gèrent le grand livre des comptes, de celles qui conçoivent les systèmes de facturation, de fiches de paie, de remboursement, et qui préparent les bilans financiers et tout ce qui concerne les taxes. Bref tout ça fait bien bailler… jusqu’au moment où on voit le profit de ces entreprises. Trois raisons : la mainmise sur le prix de la prestation (toute entreprise a besoin d’un comptable, quel que soit l’état de l’économie en général), peu de débordements et d’embauches nécessaires, et on s’adapte facilement à la taille des entreprises, grâce à tous les clients qui ne peuvent que revenir.
  2. Services juridiques
    Marge moyenne : 21. 6%
    Les avocats ont une économie plutôt prospère pour – pratiquement – les mêmes raisons que les comptables. Peu d’embauches supplémentaires induites (une secrétaire ou deux, une location de bureaux, et quelques ordinateurs, bref, une dépense acceptable). Le principal revenu se fait au travers de la représentation par l’avocat, ce qui fait qu’il n’y a aucune embauche ou coût caché. Cela maintient un coût réel faible, sachant que le fait de passer les affaires d’un état à un autre aux Etats-Unis est une source abondante de revenus (cela coûte cher – « switching costs »).
  3. Services dentaires
    Marge moyenne : 20.9%
    De bien belles dents pour un sourire radieux. Et une courbe de coût très basse. C’est normal : les seuls coûts sont liés à une salle pour patient, une aide-soignante et une secrétaire. De plus, les dentistes peuvent recevoir beaucoup de patients, jusqu’à plusieurs par heure. Quelques équipement sont chers, mais globalement tout est intéressant. Mieux, la plupart des patients paient de leur propre poche. Les dentistes ont un pouvoir sur le prix que peu d’autres praticiens ont : pour les autres, les prix sont liés à la sécurité sociale (ou les assurances santé, qui serrent les boulons au maximum et imposent leurs tarifs – valable qu’aux Etats-Unis).
  4. Services spécialisés dans le design
    Marge moyenne : 17.6%
    Ce melting-pot inclut les designers d’intérieur, les designers industriels (pas les architectes) et les designers graphiques. L’efficacité dérivant de la technologie, tel que le design de logiciels informatiques, ont vraiment aidé à élargir la marge du profit, dans ce business. Et maintenant, les sociétés de design vendent cher leurs talents.
  5. Autres practiciens de la santé
    Marge moyenne : 17.5%
    Chiropracteurs, optometristes, pédiatres, psychothérapeutes, orthophonistes et professionnels de la santé mentale savent que ça paye, de se spécialiser. Ces practiciens de la santé ont souvent une mainmise sur leurs tarifs, bien plus que les médecins généralistes, parce que la plupart peuvent contourner les grandes organisations de l’assurance santé et consorts. C’est spécifique aux Etats Unis, mais on y viendra bientôt en France, je pense.
  6. Centres de cures et autres
    Marge moyenne : 16.9%
    Les spas, les centres de soins familiaux (avortement, stérilisation volontaires etc.), les centres des soins mentaux, les centres de désintoxication, etc, tous tombent dans cette catégorie assez vaste. Les patients « séjour court » (qui restent moins d’une journée à l’hôpital) rattrapent cette catégorie : avec les nouvelles technologies, il est possible de traiter de plus en plus de personnes. Les hôpitaux spécialisés « séjour court » sont complètement débordés, et ils commencent à rattraper les « long-séjour ».
  7. Courtiers en assurance
    Marge moyenne : 15.9%
    Ici, on parle des agents d’assurance, et ceux qui fournissent d’autres services tels que ceux qui gèrent les quittances de paiement. Les agents qui gagnent bien leur vie sont ceux qui font des polices avec un pourcentage de commission annuel : ils prennent une commission sur la vente d’une police d’assurance, mais aussi un certain pourcentage tous les ans, tant que la police d’assurance est valide. Des revenus additionnels sans aucun coût derrière – la formule la plus intelligente.
  8. Médecins
    Marge moyenne : 15.8%
    Heureusement que les docteurs se font de l’argent : sinon pourquoi se faire suer pendant huit années d’école médicale ? Et quelque soit l’état de l’économie, nous aurons toujours besoin de soins médicaux, et il y aura toujours des gens malades. Néanmoins, aux Etat-Unis, les docteurs voient leurs tarifs pratiquement imposés par les gros assureurs de la santé.
  9. Laboratoires de diagnostiques médical
    Marge moyenne : 15.3%
    Tous les équipements coûtent extrêmement cher et ce genre d’investissement peut en refroidir plus d’un. Pourtant, une fois mis en place, on rentre rapidement dans ses frais, et on fait par là-même rapidement des bénéfices. Selon le type de laboratoire, le coût caché de « refaire un autre test » reste marginal – si on choisit bien l’équipe qui gère tout ça.
  10. Les intermédiaires liés aux dépôts de garantie et prêts
    Marge moyenne : 13.6%
    Ce groupe englobe les petites banques, les unions spécialisées dans les crédits (par exemple General Motors Credit Union) et les autres institutions spécialisée pour les dépôts de garantie. En moyenne, pour chaque dollar qui rentre, il y a 48 cents qui ressortent pour régler les coûts cachés et autres remboursement. Alors que la location de bails commerciaux s’est récemment asséchée ces derniers mois, ce groupe d’industrie a échappé à l’orage, mais pour combien de temps ?

La perfection ne mène à rien

Ce conseil vient d’ici

Arrêtez d’être perfectionniste — essayez votre truc juste « comme ça » et voyez le résultat. C’est un conseil simple, mais je l’ai ignoré trop longtemps. Chaque article ne va jamais être excellent, ou recevoir la palme du meilleur article, au même titre que chaque nouveau design ne sera jamais un chef d’oeuvre idéal. Se prendre la tête sur chaque petit détail et repousser le projet jusqu’à ce qu’il soit réellement parfait ne fait qu’une seule chose : mettre des barrières à votre créativité.

De plus, si vous êtes perfectionniste, votre processus créatif est si épuisant que vous allez rapidement perdre votre motivation. Si chaque article prend trois heures à être écrit, mis en forme, et réfléchi correctement, vous allez écrire moins de chose, moins souvent, et vous allez oublier de plus en plus d’idées qui auraient pu être sympatiques. C’est le paradoxe du perfectionnisme : votre meilleur travail n’est produit que lorsque vous ne recherchez pas la perfection. Être perfectionniste est si démotivant que vous vous retrouverez à produire moins, et peut-être même que vous ne créerez jamais le chef-d’oeuvre qui montre réellement votre vrai potentiel.

Vous produisez le meilleur de vous-même lorsque vous ne recherchez pas la perfection absolue.

Cela ne veut pas dire que vous devriez baisser la qualité de ce que vous produisez. Diminuez juste un peu votre réticence à ne pas présenter votre travail s’il n’est pas complètement achevé. En d’autres termes, essayez d’enlever les barrières qui sont juste après votre créativité. Essayez aussi de deviner quelles sont les parties de votre travail qui vous ont pris trop de temps et cherchez un moyen de réduire ce temps ou supprimez carrément ces parties. Vous aurez alors plus de temps à passer sur les éléments essentiels de votre projet, et vous n’aurez pas perdu un brin de motivation lorsque vous aurez un nouveau projet à entamer.