Catégorie : développement

Tout ce qui concerne le développement en général, que ce soit des choses générales, ou des choses bien précises. Cela va de la gestion de projet à la recherche du fonctionnement de pointeurs en C.

vim : exemple concret de conversion de fichier C en fichier Pascal

Voici un aperçu des petites choses possibles avec les macros vim.
J’avais un énorme fichier include (fichier fmod.h) à convertir en Pascal, afin de pouvoir accéder à l’extraordinaire librairie de fmod. Pour information, cette librairie est gratuite et redistribuable en tant que telle si votre produit est gratuit et ne vous rapporte rien. Donc profitez en c’est une librairie aussi simple d’utilisation que puissante et stable.

Je vous explique juste le principe de base, avec un exemple concret, et vous verrez qu’il vous suffit de faire pareil pour les quelques autres conversions, et vous gagnerez quelques minutes, voire comme dans mon cas, quelques heures de travail (que vous auriez inévitablement perdues avec un autre éditeur) :

Voici un exemple de déclaration C :

typedef FMOD_RESULT
  (F_CALLBACK *FMOD_FILE_OPENCALLBACK)
    (const char *name, int unicode,
      unsigned int *filesize, void **handle, void **userdata);

La fonction finale déclarée en Pascal doit être ainsi :

FMOD_FILE_OPENCALLBACK =
  function (
    const name:Pchar; unicode:Integer;
    var filesize: Cardinal; handle:Pointer;
    userdata:Pointer):FMOD_RESULT;

Je vais vous expliquer les premiers pas : il faut convertir ces paramètres :
void **handle, void **userdata)
en :
handle:Pointer; userdata:Pointer)

Le principe des macros avec les expressions régulières est très simple, je vais la construire pas à pas :

– Va chercher la première chaine qui est void ** :
void \*\*\
Notez bien que comme les étoiles * sont des caractères d’expression régulière, il faut mettre un antislash \ pour qu’elles ne soient pas interprétées.

– Va chercher la première chaine qui est void ** et qui est suivie d’une chaine composée de au moins un caractère minuscule comprise entre a et z :
void \*\*\([a-z]\+\)
Au même titre que les étoiles *, et les antislashes \, les parenthèses () sont des caractères d’expression régulière, il faut mettre un antislash \ pour qu’elles ne soient pas interprétées.
Oui je le concède ça rend la lecture un peu difficile. Mais le temps gagné en vaut la chandelle croyez moi.
– Va chercher la première chaine qui est void ** et qui est suivie d’une chaine composée de au moins un caractère minuscule comprise entre a et z, et qui se termine par une virgule :
void \*\*\([a-z]\+\)\(,\{1\}\)
Ici aussi notez le \{1\} : ici, les crochets \{\} sont des caractères d’expression régulière donc il ne faudrait pas mettre d’antislash, mais comme il sont dans une expression qu’on recherche, il les faut. Bref, essayez une fois avec, une fois sans, et l’un des deux fonctionnera !

Expression finale :

Remplace toutes les chaines de type void **[caractères de a à z], par [caractères de a à z]: Pointer;  :
:%s/void \*\*\([a-z]\+\)\(,\{1\}\)/\1: Pointer;/g

Ainsi :
void **handle,
donnera :
handle: Pointer;.

Mais (et c’est là où c’est génial) :
void **autrenomdevariable,
donnera :
autrenomdevariable: Pointer;.

Et cela s’appliquera sur tout le fichier, quel que soit le nom de la variable.

Ensuite, il vous suffit de vous concocter toute votre séance de petites macros, et de les mettre dans un fichier.
Puis vous appelez :

vim -s macro_vim.cmd [nom du fichier]

et vim jouera la macro dessus.

WordPress, Php et XML rpc – how-to. Explication

WordPress est un outil formidable. Il offre la possibilité d’envoyer des articles à distance.
Pour ce faire, entre autres, les développeurs ont crée une page qu’il faut appeler en lui passant les paramètres adéquats.
Cette page est située à la racine de l’installation de votre site WordPress. Par exemple si vous avez installé WordPress sur http://monsite.com/wordpress/, il faudra appeler la page http://monsite.com/wordpress/xmlrpc.php

Passons maintenant aux choses sérieuses : comment automatiser un envoi d’articles en php ?
C’est extrêmement simple. Je vous donne les indices, et à partir de là, à vous de finir de développer afin d’atteindre votre objectif.

Première chose : il faut que le PC qui doit envoyer les articles ait Php d’installé, avec le support XML rpc. Dit autrement, il faut qu’il soit compilé avec l’option --with-xmlrpc, ce qui n’est pas le cas par défaut. A vous de vous débrouiller tout seul pour arriver à activer l’option. Si vous êtes sous Linux, et que vous avez tout compilé à la main, comme un bon guerrier que vous êtes, il vous suffit d’afficher une page qui éxecute "phpinfo();" et Php vous affichera la ligne de compilation, il vous suffira de recompiler avec l’option --with-xmlrpc.

Une fois cette tâche terminée, il vous faudra activer sur le site WordPress concerné, l’option XML rpc. Il faut se connecter en tant qu’administrateur, aller dans le menu Réglagles » Ecriture » Publication à distance et cocher l’option XML-RPC.

Enfin on y arrive, le code qui se connecte et envoie quelque chose !

  1 <?php
  2 /* Exemple WordPress, Php et XML rpc  */
  3
  4 $request =
  5   xmlrpc_encode_request(
  6     "wp.getUsersBlogs",
  7     array("nom_d_utilisateur", "mot_de_passe")
  8   );
  9 $context =
 10   stream_context_create(array('http' => array(
 11     'method' => "POST",
 12     'header' => "Content-Type: text/xml",
 13     'content' => $request
 14   )));
 15 $file = file_get_contents(
 16   "http://monsite.com/wordpress/xmlrpc.php", false,
 17   $context);
 18
 19 $response = xmlrpc_decode($file);
 20
 21 if ($response && xmlrpc_is_fault($response)) {
 22     print(utf8_encode(
 23       "xmlrpc: $response[faultString] ($response[faultCode])"
 24     ));
 25 } else {
 26     print_r($response);
 27 }
 28 ?>

Donc là vous avez le code.
Pour terminer, toutes les fonctions disponibles sont ici : http://codex.wordpress.org/XML-RPC_wp.
Elles ne semblent pas trop à jour, alors si vous voulez la liste réelle, regardez votre dans le blog, le fichier ./wp-includes/class-wp-xmlrpc-server.php, la fonction wp_xmlrpc_server().
Vous y verrez toutes les fonctions que vous pourrez appeler en XML RPC.

C’est tout de même bien mieux de se faire son outil qui fait les envois d’articles à distance, plutôt que d’en acheter un, non 🙂 ?

ExtJS et Panel : le layout « absolute »

Après plusieurs heures de recherches, j’ai enfin compris comment fonctionnait le layout « absolute ».
L’utilité de la disposition "absolute", est qu’on peut positionner les éléments dans le conteneur à un endroit bien précis, au pixel près.
Voici l’astuce qui m’a fait perdre tellement de temps, et qui, je l’espère, vous en fera gagner :
D’habitude, sur tous les « layout » existants, lorsqu’on les définit, ils s’appliquent sur les éléments contenus. Et non pas sur le conteneur.
La seule exception se trouve avec le layout « absolute » : je le mets en gros et gras, parce que j’ai passé énormément de temps à trouver cette astuce :

Lorsqu’on utilise le layout « absolute », il faut toujours préciser aussi la largeur et la hauteur du conteneur, sinon ce dernier ne sera jamais affiché

Exemple concret :
Voici ce qui ne fonctionnait pas :
MonPanel = function(tab) {
    this.layout = 'absolute';
    this.border = false;
    MonPanel.superclass.constructor.call(this, {
        items: [{
            x: 0,
            y: 5,
            xtype: 'label',
            text: 'To:',
        }]
    });
};

Le panneau n’était pas affiché. Voici ce qui ne fonctionne :
MonPanel = function(tab) {
    this.layout = 'absolute';
    this.border = false;
    this.width = '100%';
    this.height = 150;
    MonPanel.superclass.constructor.call(this, {
        items: [{
            x: 0,
            y: 5,
            xtype: 'label',
            text: 'To:',
        }]
    });
};

Facebook en ligne de commande : le howto !

Traduction de l’article ici :
http://fbcmd.dtompkins.com/

C’est tout simplement un bon script en php, à lancer en ligne de commandes. Bon, comme le dit l’auteur, il ne faut surtout pas en abuser et faire un bot qui irait aspirer plein d’informations, hein !

Firelight / fmod en Pascal : comment faire et accord de la société

Lorsque la société Firelight a sorti leur outil pour jouer de la musique, je n’y croyais pas tellement il était puissant. Maintenant preuve est faite : plusieurs millions de développeurs s’en servent à travers le monde (et ça n’est pas exagéré), et plusieurs dizaines de millions de joueurs, et des milliers de professionnels, utilisent fmod sans le savoir.

A l’époque, il y avait les entêtes (headers) destinés au C, mais aussi les entêtes (headers) destinés à Delphi. Ensuite, ils se sont aperçu que seul le C était vraiment rentable, voire certains outils, même si ça me fait mal de le dire, de Microsoft. Donc ils ont arrêté le suivi des entêtes (headers) en Pascal Objet, destinés à Delphi.

J’ai donc pris mon courage à deux mains, et vim, et j’ai converti, via quelques bonnes macros, tous les entêtes en C du tout dernier fmod en date, la librairie.
Pour les quelques appels de fonction que j’ai fait, ça fonctionne parfaitement.
Bien sûr, sur plusieurs milliers de lignes, il y a peut être des erreurs de conversion, donc si vous voulez appeler des fonctions et que ça ne réussit pas, faites comme moi : lisez attentivement la documentation, puis regardez les anciens entêtes (headers) destinés à Delphi, et comparez avec ma traduction : peut-être y a-t-il une correction, ou une évolution du code à faire. Si c’est le cas, ce serait très gentil de m’écrire et/ou de laisser un message ici décrivant la modification à apporter.
Si vous êtes intéréssé pour télécharger :

  • un programme d’exemple qui lit un mp3
  • les nouveaux en-têtes en Pascal
  • avec les anciens en-têtes (au cas ou les nouveaux ne fonctionneraient pas)

Alors cliquez ici.
NB : L’exécutable ne fonctionnera pas parce que le nom du fichier MP3, et de la librairie, sont codés en dur. Il vous suffit juste de changer ça pour voir que ça fonctionne.
Bien évidemment c’est sous licence LGPL.

Pour preuve, ci-suit la réponse de la société.

2011/5/17 Firelight Technologies Support
Hi Olivier,
We would be ok if you hosted them on your site – we probably wouldnt put it on ours any more because of the small interest of pascal these days.

Brett Paterson | CEO
FMOD by Firelight Technologies Pty Ltd
Interactive Audio Middleware | www.fmod.org
PH: +61 —— Fax: +61 3 ——

————— Original Message —————
From: Olivier Pons
Sent: 17/05/2011 5:15 AM
To: support@fmod.org
Subject: About Pascal headers.

Hi,

It seems you’ve stopped to write Pascal headers.
I’ve translated all your header files into Pascal object and it works pretty
well.
I’ve followed your whole design :
– fmod.pas
– fmod_codec.inc.pas
– fmod_dsp.inc.pas
– fmod_memoryinfo.inc.pas

May I ask you two possibilities :
– either you release them as « no guarantee behind » (sorry for my English,
but I’m pretty sure you understand the kind of license I’m talking about)
– or I release them as freeware on my website (type « olivier pons » i’m #2
after the facebook) http://olivierpons.fr/

Thank you again, the quality of your job is simply amazing.


Kind regards,
Olivier Pons

ref:00D9sZM.5009252Eg:ref

HTML : tags <pre> / <code> : comment forcer retour à la ligne

Voici une astuce : vous avec une page qui s’affiche parfaitement, avec plein de choses, à part un petit détail plutôt gênant : vous avez des lignes de code qui « débordent » et lorsque vous voulez imprimer, comme, justement, ça déborde, vous n’avez pas le code en entier.

Il vous suffit de mettre ce code en dernier dans le css (afin qu’il « écrase » toutes les configurations précedentes des retour-chariot) :


pre, code {
 white-space: pre-wrap;       /* css-3 */
 white-space: -moz-pre-wrap;  /* Mozilla, since 1999 */
 white-space: -pre-wrap;      /* Opera 4-6 */
 white-space: -o-pre-wrap;    /* Opera 7 */
 word-wrap: break-word;       /* Internet Explorer 5.5+ */
}

Et voilà, vous pourrez imprimer votre document tranquillement, tout le code sera affiché.
Cet article fait suite à une question que j’ai posée sur stackoverflow.com. Cette dernière avait déjà été posée, et la réponse était valide : le lien est ici. Et la solution, carrément à la source, est ici.

Php : T_PAAMAYIM_NEKUDOTAYIM !

Si jamais un jour vous vous trouvez en face de cette erreur surprenante :
Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in {fichier source} on line 35
l’explication (et la solution) sont sûrement ici :

  • il vous manque un point virgule à la ligne concernée ;
  • il y a une variable utilisée qui n’est pas définie ;
  • il y a une erreur incompréhensible, par exemple dans mon cas c’était un define mal écrit :
    if (!defined(SESSION_NAME)) {...}
    alors que le bon code était avec les côtes :
    if (!defined('SESSION_NAME')) {...}

En espérant, comme d’habitude, aider quelqu’un, un jour, quelque part…

mysql : mettre le client et le serveur en utf8 par défaut

A chaque fois que vous vous connectez, vous avez vos bases en utf8 mais lors de votre requête vous avez des caractères hyéroglyphes.
Et vous devez taper l’ordre « set names utf8 » à chaque fois.
Vous en avez assez ? Voici la solution :

Éditez votre fichier de configuration de mysql et ajoutez ces lignes :

[client]
default-character-set=utf8

[mysqld]
character-set-server=utf8
collation-server=utf8_unicode_ci

Attention ! C’est très important de mettre les directives après le type de connexion. Par exemple, sur ma configuration ça donne au final :

19 [client]
20 port = 3306
21 socket = /var/run/mysqld/mysqld.sock
22 # (!) Olivier Pons / 20-03-2011
23 default-character-set = utf8
24
25 # Here is entries for some specific programs
26 # The following values assume you have at least 32M ram
27
28 # This was formally known as [safe_mysqld]. Both versions are currently parsed.
29 [mysqld_safe]
30 socket = /var/run/mysqld/mysqld.sock
31 nice = 0
32 # (!) Olivier Pons / 20-03-2011
33 character-set-server = utf8
34 collation-server = utf8_unicode_ci
35
36 [mysqld]
37 #
38 # * Basic Settings
39 #
40 user = mysql
41 pid-file = /var/run/mysqld/mysqld.pid
42 socket = /var/run/mysqld/mysqld.sock
43 port = 3306
44 basedir = /usr
45 datadir = /var/lib/mysql
46 tmpdir = /tmp
47 language = /usr/share/mysql/english
48 skip-external-locking
49 # (!) Olivier Pons / 20-03-2011
50 character-set-server = utf8
51 collation-server = utf8_unicode_ci
52 #

J’ai trouvé cet article ici, et je l’ai remis en Français, en espérant aider la communauté !

Php et Smarty : comment simuler print_r(), var_dump() ou var_export()

Si jamais vous utilisez le moteur de templates Smarty, il pourra vous arriver, à un moment ou à un autre, de vouloir afficher le contenu d’une variable Smarty. Rien de plus simple : prenons un exemple concret :

{foreach name=tab_g key=id_g item=item_g from=$tab_garanties}
{/foreach}

Imaginons que vous vouliez afficher ce qu’il y a dans $tab_garanties. Il suffit de faire :

{$tab_garanties|@print_r}

Et c’est tout !

Si vous avez une autre solution, je suis preneur !

Cette idée vient d’ici, mais, comme souvent, comme c’est en anglais, j’aide un peu par mes traductions, la communauté Française.

vim : imap, ab, abbr ne fonctionnent pas ? Solution ici !

Exemple concret : un mapping sous vim c’est ça :
imap ooo Olivier

map signifie : lorsque je taperais ooo tu le transformeras en Olivier.
Le petit i de imap juste avant, signifie « uniquement en mode insertion« .

Pourtant, il peut arriver qu’en mode insertion ça ne fonctionne pas ! Si c’est votre cas, il y a une solution très simple : essayez de vous mettre en mode « nopaste » : essayez de taper l’ordre :

:set nopaste

Puis mettez vous en mode insertion soit « i » et ré-essayez. Ca devrait fonctionner.

Moi, je le fais par défaut (= j’ai ajouté :set nopaste dans mon fichier de configuration ~/.vimrc) au moins je ne suis pas ennuyé.

J’ai posé la question et j’ai eu la réponse sur stackoverflow ici.

L’explication est à peine plus longue. En fait, sous vim, tout ce qu’on tape est analysé. Si on a fait un imap ooo test, alors, lorsqu’on fait un copier-coller, et que dedans il y a ooo, alors vim va automatiquement faire la transformation. Dans presque tous les cas, lorsqu’on fait un copier coller, on ne veut pas que ça soit modifié ! Donc il faut préciser à vim : attention, je vais faire un « coller », alors s’il te plait, désactive tes « mappings ». L’ordre est très simple, il suffit de se mettre en mode paste et donc de donner l’ordre : :set paste. Là où on peut être dérouté, c’est que, justement, par défaut, vim est en mode paste, autrement dit tous les mappings clavier sont désactivés !

C’est une configuration pour les débutants, mais avec ce que je vous ai appris et tous les liens sur vim, vous n’êtes plus un débutant, pas vrai ?
Il vous suffit donc d’ajouter :set nopaste dans votre fichier de configuration ~/.vimrc. Les (rares) fois où vous aurez un copier coller particulier (par exemple avec la souris), il vous suffira de faire un

:set paste

puis juste après le coller, de dire qu’on a fini, et de ré activer les mappings :

:set nopaste

Aussi simple que ça !