Quelques trucs.

Cette page regroupe quelques questions que je me suis posées un jour, et pour lesquelles je n'ai pas tout de suite trouvé une réponse satisfaisante. Pour l'instant, c'est complètement en vrac ! je rangerai peut-être un jour... Déjà, j'ai fait une liste !
[Dev] ajouter ses propres commandes C++ à l'interpréteur ocaml
Voir mon petit tutorial
[Dev] exploiter les résultats de mesure de performance:

J'avais initialement fait ça pour du C/C++, mais il semble que ça soit aussi utilisable pour ocaml maintenant, grâce à l'option -p de ocampopt. A tester...

Il faut tout d'abord compiler et faire l'édition de liens avec l'option -pg, puis :

  • générer le fichier de mesure gmon.out en lançant normalement l'application,
  • générer le fichier de résultat gprof nom_pg gmon.out > gprof.txt
OU
[LaTeX] avoir des énumérations hiérarchiques et pouvoir y faire référence
  \newcommand{\labelenumo}{\thesection.}

  \renewcommand\theenumi{\arabic{enumi}}
  \renewcommand\labelenumi{\labelenumo\theenumi.}
  \renewcommand\p@enumi{\labelenumo}
même chose avec enumii, enumiii, enumiv.

on peut aussi mettre ça dans la définition d'un nouvel environnement si on souhaite garder la possibilité de faire appel à la version par défaut de enumerate.

[Web] faire un calendrier en PHP
Si vous cherchez un petit calendrier paramétrable en PHP, vous pouvez vous inspirer du mien.
[LaTeX] pour définir une macro avec l'argument d'une autre macro

L'objectif est de pourvoir faire \motcle{toto}, qui écrit toto, met toto dans l'indexe et définit la commande \toto

  • une première solution :
    \makeatletter
    \newcommand{\motcle}[1]
          {\index{#1}{\textbf #1}\@namedef{#1}{\textit #1}}
    \makeatother
    
    mais c'est du TeX, et donc pas très robuste. On pourra par exemple définir plusieurs fois le même mot clé, et \motcle{def} fait planter la compilation... En fait, la définition de \@namedef est :
    \expandafter \def \csname #1\endcsname
    
  • une autre solution :
    \newcommand{\motcle}[1]{%
        \index{#1} \textbf{#1}%
        \expandafter \newcommand \expandafter *\csname #1\endcsname
          {\textit{#1}}%
      }
    
    mais attention, elle définit la commande localement.
  • une amélioration est donc :
    \newcommand*{\motcle}[1]{%
        \index{#1} \textbf{#1}%
        \expandafter \@ifdefinable \csname #1\endcsname {%
          \global \@namedef{#1}{\textit{#1}}%
        }%
      }
    
[LaTeX] pour que le texte fasse le tour des images
penser à utiliser la package picins
[LaTeX] pour commencer une énumération à un certain numéro
\begin{enumerate}[C1. ]
\setcounter{enumi}{10}
\item onzième élément ie. C11.
\end{enumerate}
Pour rendre le fond d'une image transparente :
  • convert -transparent white toto.jpg toto.png
  • puis, si le résultat n'est pas assez propre, utiliser gimp en faisant une sélection par couleur + couper la sélection (^X)
  • pour ne pas avoir une image trop grosse, choisir image/mode/indexée
[Web] un script qui met à jour un site FTP :
  • mettre les informations de connection dans le fichier $HOME/.netrc, c'est-à-dire y ajouter une ligne :
    machine home.tele2.fr login fr-00000 password mon-joli-pwd
  • on peut ensuite écrire un script :
    #! /bin/sh
    ftp <<**
    open home.tele2.fr
    cd html
    put index.html
    prompt 
    mput *.png
    bye
    **
    
  • l'utilisation de prompt permet d'utiliser mput sans avoir à confirmer le transfert pour chaque fichier.
  • Du coup, on peut écrire un makefile pour transférer automatiquement tout ce qui a changé depuis le dernier transfert (la date est mémorisée dans la date de dernière modification du fichier transfert.ok) :
  • TOUS_FICHIERS=$(shell ls *.html *.css *.js *.png *.jpg *.gif)
    
    all : $(HOME)/.netrc transfert.ok
            echo "Et voilà..."
    
    toujours:
    
    $(HOME)/.netrc :
            (echo "machine $(ADRESSE) login $(LOGIN) password $(PSWD)") > $@
            chmod 600 $@
    
    cmd_ftp : $(TOUS_FICHIERS)
            echo "Mise à jour de $@ : $?"
            (echo "#! /bin/sh"; \
             echo "ftp <<**"; \
             echo "open $(ADRESSE)"; \
             echo "cd html"; \
             echo "prompt"; \
             echo "mput $?"; \
             echo "bye"; \
             echo "**") \
             > $@
            chmod u+x $@
    
    transfert.ok : cmd_ftp
            echo "Transfert..."
            ./cmd_ftp > /dev/null
            touch $@
    
    clean :
            rm -f transfert.ok cmd_ftp
    
[Mozilla] quand thunderbird devient fou...
Il arrive parfois qu'il se mettre à dupliquer sans raison certains messages (dans l'interface seulement, car cela disparait quand on le relance), ou encore qu'il indique de nouveaux messages inexistants... Pour régler définitivement le problème (jusqu'à la prochaine fois...), il faut :
  • quitter thunderbird,
  • effacer les fichiers ~/.thunderbird/*.default/Mail/*/*.msf
  • relancer l'outil,
et tout devrait rentrer dans l'ordre !
[Mozilla] script qui lance mozilla...
même s'il y en a déjà un de lancé
#!/bin/sh
if `mozilla -remote "ping()" 2> /dev/null` ; then
  mozilla -remote "xfeDoCommand (openBrowser)" &
else
  mozilla &
fi
on peut utiliser d'autres commandes

Note : ceci semble être maintenant le comportement par défaut. Plus besoin de script, donc.

[Mozilla] accéder à des fichiers locaux depuis une page http
  • Problème : avec la police de sécurité par défaut, on ne peut pas lire un fichier local (ie. avec une URL commençant par file://) depuis une page chargée avec le protocole http ou https.
  • Solution : mettre dans le fichier user.js de son profil les lignes :
    user_pref("capability.policy.policynames", "TrustInCheckloadURI");
    user_pref("capability.policy.TrustInCheckloadURI.sites", "http://site.ami.truc");
    user_pref("capability.policy.TrustInCheckloadURI.checkloaduri.enabled", "allAccess");
    
    en précisant le site de confiance depuis lequel on veut que ça marche (typiquement, pour moi, depuis mes propres pages...).
  • pour de plus ample explications, voir ici
[LaTeX] recherche récursive avec TEXINPUTS
Pour que LaTeX recherche les fichiers de style récursivement dans un répertoire, il faut juste terminer son nom par // dans la variable TEXINPUTS ! Exemple :
export TEXINPUTS=.:$(HOME)/latex/inputs//:/usr/local/lib/hevea:
permet de chercher dans $(HOME)/latex/inputs et ses sous-répertoire.
[Linux] génération de mot de passe
J'ai bien cru que je ne (re)trouverais jamais une petite commande toute simple, non intégrée dans une usine à gaz... Finalement, je ne sais plus si c'est celle-là que je connaissais, mais c'est exactement ce que je cherchais : pwgen. Il y a même une option (-y ou --symbols) pour intégrer des caractères spéciaux.
[Linux] rehash sous bash
La commande rehash n'existe pas sous bash. Mais il ne faut pas croire les gens qui disent que c'est parce qu'elle ne sert à rien ! car voilà ce qui m'est arrivé l'autre jour :
$ which make
/usr/local/bin/make
$ make --version
GNU Make 3.80
$ /usr/local/bin/make --version
GNU Make 3.81 
En fait, en cas de besoin, on peut utiliser hash -r, et on peut aussi utiliser cette commande pour faire plus de choses :
 hash [-r] [-p fichier] [nom]
     Pour chaque nom fourni, le  chemin  d'accès  complet  de  la commande  est 
     déterminé,  en  examinant   les   répertoires   de   $PATH   et   mémorisé.
     Si l'option -p est fournie, aucune  recherche  de  chemin d'accès n'a lieu,
     et  le  fichier  est  utilisé  comme  chemin   complet  pour  la  commande.
     L'option -r force le shell  à  oublier  tous  les  emplacements  mémorisés.
     Sans arguments, hash affiche des informations sur les commandes mémorisées.
[Linux/sed] mettre en majuscule
  • la première lettre : echo salut | sed 's/^./\u&/'
    donne : Salut
  • certaines lettres : echo "salut les lulus" | sed 's/[sl]/\u&/g'
    donne : SaLut LeS LuLuS
  • toute une expression : echo "salut les lulus" | sed 's/a[^ ]*/\U&/'
    donne : sALUT les lulus
Pour plus d'information sur sed, voir la FAQ, la doc, ou encore sur CommentÇaMarche où on trouve pas mal d'astuces.
[vim+ocaml] passer du .ml au .mli et inversement
Il est très pratique d'avoir une touche (ici ",s") qui permette de passer du .ml au .mli quand on édite du ocaml. J'ai adapté ce truc en partant de la version de Stefano Zacchiroli paru dans Caml Weekly News, for the week of 11 to 18 November, 2003, mais j'ai ôté la partie Python qui ne semble pas indispensable :
if !exists("g:did_ocaml_switch")
  let g:did_ocaml_switch = 1

  fun OCaml_switch()
    if (match(bufname(""), "\\.mli$") >= 0)
      let fname = substitute(bufname(""), "\\.mli$", ".ml", "")
      exec "arge " . fname
    elseif (match(bufname(""), "\\.ml$") >= 0)
      let fname = bufname("") . "i"
      exec "arge " . fname
    endif
  endfun

  map ,s :call OCaml_switch()

endif

[vim+ocaml] afficher le type des objets
Alors là, c'est clair, je ne pourrais plus me passer de ocamlannot qui permet de voir le type des données ocaml.
...
Contact : INRIA / Sophia Antipolis / Marelle - Tel : (+33) 4 97 15 53 45 - Fax : (+33) 4 92 38 50 29 - E-mail: Anne dot Pacalet at inria dot fr

Valid XHTML 1.0 Strict Valid CSS! logo Vim