Retenir plus facilement - ma version du systeme PAO

Rédigé par Fred - - Aucun commentaire

Au hasard de mes parcours sur la toile — bon, en fait, je sais plus comment c’est venu, du coup, on va dire que c’est par hasard1 —2 je suis tombé sur cette page. Et j’ai découvert que le commun des mortels pouvait faire des choses incroyables (et pas forcément utiles, donc indispensables) comme mémoriser l’ordre des cartes d’un paquet de 54 cartes mélangées, retenir une liste de nombres pendant plusieurs semaines, résoudre le rubik’s cube en aveugle (je ne parle pas du temps de mémorisation ni de résolution ça c’est pour les mortels moins communs3), se rappeler de moults numéros de téléphone etc.

Il y a plusieurs techniques, qui ont l’air de se valoir, pour arriver à ce but (certaines étant plus adaptées à des tâches en particulier). Je ne vais pas les présenter, elles sont bien mieux détaillées que ce que je pourrais faire dans les différents liens qui viendront. Je vais décrire celle que j’utilise, qui est une adaptation de ce qui se fait.

Memory palace

Le « palais de la mémoire » (ou la méthode des lieux) est une façon de se rappeler les choses. Pour cela, on se crée un parcours, dans sa maison, dans sa ville, avec des endroits bien spécifiques, et on utilisera toujours le même parcours. Par exemple, on commence par la chambre, on va aux toilettes, dans la cuisine, puis dans la salle de bains. Ensuite, pour se souvenir des légumes à prendre aux marchés, on place un légume par endroit quand on fait sa liste, en inventant une petite histoire : les poireaux sont en train de dormir au chaud sous la couette, la carotte lutte pour ne pas tomber au fond du trou, le brocoli se fait attaquer par les céréales qui veulent le noyer dans le bol, et le pâtisson prend sa douche. Et arrivé au marché, on refait le parcours en cherchant qui faisait la grasse mat’ puis celui qui était aux toilettes, etc.

Il est donc important, à mon avis, d’avoir plusieurs palais, et d’en changer fréquemment pour ne pas se mélanger avec la liste de la semaine dernière…

On peut également placer plusieurs objets dans une même pièce, voire dans un même endroit (si l’ordre n’a pas d’importance par exemple). Dans ce billet (mnemotechnics.org), l’auteur décrit (et illustre) comment il place 10 objets dans une même pièce.

Bon, tout ça c’est bien beau, mais on ne va pas mettre nos cartes et nos faces de rubik’s cube dans toute la maison. Ça ne nous aiderait pas mieux à retenir.

Des nombres aux mots

Pour retenir la liste des courses, la méthode du dessus est suffisante. Il suffit de créer des histoires les plus extraordinaires possibles, pour mieux les retenir. Mais pour retenir un numéro de téléphone ? les décimales de pi ? les cartes du paquet ?

Ben pour ça, il va falloir transformer ce que l’on veut retenir en une suite de chiffres, associer chaque chiffre à une lettre, chaque lettre à un mot, et placer ces mots aux quatre coins de la maison.

Des chiffres aux lettres

Non, pas des chiffres et des lettres. C’est autre chose ça.

Pour transformer les chiffres en lettre, il y a plusieurs méthodes, les plus connues étant le code chiffres-sons (!wfr) (ou Major System4, qui utilise toutes les consonnes (donc plusieurs pour un même chiffre) et rien que des consonnes) et le système Dominic (!wen) (ou Dominic System5, qui utilise voyelle et consonne).

Table 1: Chiffre -> lettre
  0 1 2 3 4 5 6 7 8 9
Major S,Z,Ce T,D N M R L CH,J,Ge K,G,Q F,V P,B
Dominic A B C D E S G H N O

L’avantage du premier est qu’il permet de transformer n’importe quel mot en suite de chiffre, et inversement.

Avec ces systèmes, on associe généralement un mot ou un nom (souvent les initiales Prénom Nom) à un nombre sur deux chiffres (de 00 à 99). Par exemple pour le code chiffres-sons, on peut associer PoPeye pour 99, le Père Noël pour 92, NeiGe pour 26, etc (on associe les sons, pas les lettres, donc NeiGe, c’est 26 et pas 27). Pour le système Dominic, on utilise quasiment que des initiales : Albert Einstein pour 04, George Bush pour 61 ou encore Barack Obama pour 19.

J’étais donc parti sur ce système, et étais passé à l’étape suivante, quand quelqu’un qui se reconnaîtra m’a dit que c’était pourri (uu) ; il valait mieux une seule lettre par chiffre.

Un coup de ddg.gg plus tard, me voilà avec les 10 consonnes les plus fréquentes en français, que j’organise comme je peux :

Table 2: Mon système chiffre -> lettre
Chiffres Mon système Mnémotechnique
0 C un 0 pas fermé
1 l 1 barre
2 n 2 barres
3 m 3 barres
4 R quasiment le miroir
5 S même forme
6 d miroir
7 t même forme
8 V 8 japonais à l’envers ?
9 p miroir

Et si je veux, je peux ajouter les consonnes restantes dans les cases pour retomber sur un semblant de code chiffres-sons6 (j’ai pas encore eu l’utilité, mais sait-on jamais).

Système PAO

J’étais parti pour me faire ma liste de 100 mots7, lorsque je suis tombé sur le système PAO, pour « Personne-Action-Objet8 ». Au lieu d’avoir un seul mot pour un nombre à deux chiffres, on en a trois ! Un nombre peut correspondre à une personne, une action, et un objet. Donc dans notre Memory Palace, on peut stocker trois fois plus d’informations, et éviter trop de répétitions !

Par exemple, avec le code chiffres-sons, on peut avoir Michaël Jackson, ManGer et MaGie qui sont codés avec 36, PoPeye, PaPouiller et PouPée qui sont codés avec 99, etc.

Lorsque l’on veut retenir une suite de nombre comme 99, 36, 99… on n’associe plus PoPeye, Michaël Jackson, PoPeye dans trois pièces de la maison, mais PoPeye qui ManGe une PouPée dans une seule pièce.

Là aussi, les approches Major/Dominic diffèrent : pour le premier cas, on va plutôt essayer de trouver des actions/objets de deux syllabes avec les consonnes correspondants aux chiffres (comme dans mon exemple : ManGer, PouPée). Dans le second, on va associer un verbe (et un objet, mais souvent le système, c’est juste PA, pas PAO) sans rapport avec le codage. Enfin pas tout à fait sans rapport. Le rapport, c’est que c’est relatif à la personne qui est codée : Albert Einstein (04) va écrire au tableau E=mc², Bill Gates (16) programme sur son PC… Pour retrouver 1604, on pensera alors à Bill Gates qui écrit sur un tableau noir.

J’ai commencé les deux méthodes, mais suis finalement resté sur la Major. Et puis, en lisant des commentaires sur le système Dominic, celui de RussellP (du 2012-11-26 09:37 UTC) a retenu mon attention. L’idée : utiliser des thèmes. Je me suis dit que ce serait sympa de faire ça, choisir un thème avec comme initiale la lettre correspondant aux dizaines. Pour les personnes, les actions, et les objets. Ça n’a pas été facile… Je ne suis pas encore totalement satisfait de tous mes thèmes et de leur contenu, mais rien que pour l’exercice, c’était sympa de le faire. Vous pouvez voir le résultat ici9 (version fontifyed).

Table 3: Les trois premiers thèmes pour les personnes
Thème Combat Lyrique aNimateur
  c (0.) l (1.) n (2.)
c (.0) Ken Cabrel Capello
l (.1) Li Long Lio Lagaf
n (.2) Nina NTM Nagui
m (.3) Mitrurugi Mc hammer Maïté
r (.4) Raphael Renaud Ruquier
s (.5) Cervantes Souchon Sébastien
d (.6) Dahlsim Dalida Damidot
t (.7) Taki Tupac Toesca/tex
v (.8) Voldo Voulzy Vandel
p (.9) Paul Piaf Ppda

Voilà, si vous lisez l’anglais, je vous conseille vivement les sites dans les notes de fin page, les wikis, fora, commentaires, etc. pour en apprendre un peu plus, et pourquoi pas pour vous y mettre et faire votre tableau :]

Et si vous connaissez déjà, si vous avez des suggestions, des commentaires, n'hésitez pas à m'envoyer un mail (sur free, on change le pénultième point par un @ (celui avant « free.fr ») et on a l'adresse mail qui correspond au site).

Bonus

Jetez également un coup d’œil à http://www.ludism.org/mentat/BrainTrainingGames pour entraîner votre mémoire. Le dual n-back est franchement pas facile, mais les études ont l’air de montrer que c’est efficace.

org-drill

Tout est expliqué sur worg : org-drill fonctionne comme les « flashcards » question d’un côté, réponse de l’autre. Pour réviser mes associations chiffre-mot, je me suis donc préparé un fichier pao-drill.org qui ressemble à :

* Personnes
** Item :drill:
   :PROPERTIES: 
   P-00
*** the answer
    Ken
** Item :drill:
   :PROPERTIES: 
   P-10
*** the answer
    Cabrel

Pour ça, je pars du fichier pao.org, et pour chaque tableau, je supprime les lignes et colonnes servant de repères. Puis je supprime le dernier caractère de chaque ligne (avec un C-x r k).

Et c’est parti pour deux macros (qui pourraient être regroupées en une seule, mais bon…) :

Mettre un couple nombre-mot par ligne

  • On prépare pour mettre le compteur sur deux chiffres : C-x C-k C-f %02d
  • On initialise le compteur à 00 : C-x C-k C-c 0
  • Pour chaque caractère |, on va aller à la ligne, et insèrer le compteur : F3 Cs | Enter Space F3 F4
  • On le fait pour tous les autres mots : M-99 F4

Mettre les items org-drill

Tiré de C-h l (sans les espaces) :

<f3> C-s | <return> <backspace> <return> ** Item :drill: <return> P - <delete> M-f <return> *** the answer <return> <delete> <f4> J’ai ajouté P- pour les personnes, A- et O- pour actions et objets pour être interrogé sur les trois tableaux à la fois.

Et là on se rend compte qu’on a oublié de faire M-x org-table-transpose-table-at-point sur les tableaux. Du coup, un petit C-M-%, on remplace ^\(.\)-\([0-9]\)\([0-9]\) par \1-\3\2 et le tour est joué.

Voilà, notre fichier est tout beau tout prêt. Pour s’en servir, M-x org-drill et c’est parti.

Comme je veux m’entraîner fréquemment, je me suis rajouté dans mon .emacs

(defun pao () "reviser son pao" (interactive) (find-file
  "~/.emacs.d/pao-drill.org") (org-drill) ) (global-set-key (kbd
  "<f11>") ’pao)

Raccourcis et fonctions

J’ai découvert C-u C-c C-x f S pour réorganiser les footnotes. Et j’utilise de plus en plus C-c C-x C-f pour mettre en gras, italique… C-c C-l pour insérer/éditer un lien, et le magique C-c C-c pour aller d’une note à sa définition et inversement. Et en essayant de voir si on pouvait augmenter le nombre de caractères stockés par C-h l, j’ai découvert open-dribble-file.

Footnotes:

1

En fait, j’avais déjà commencé à m’y intéresser, mais que vaguement. J’avais dans l’idée d’apprendre les départements avec leur numéro, et j’étais tombé sur ce site : http://villemin.gerard.free.fr/Wwwgvmm/MnemoTe/Departem.htm (que je connaissais déjà pour ses « curiosités » mathématiques, comme http://villemin.gerard.free.fr/Wwwgvmm/Decompos/Amiable.htm par exemple). Je m’étais également déjà renseigné sur le « palais de la mémoire » (en anglais memory palace cité dans des films ou des séries comme Sherlock ou The Mentalist). J’avais regardé comment font les gens qui font le rubik’s cube en aveugle. Et puis il y a eu quelque chose qui a fait que je me suis un peu plus penché sur la question. Mais… pas moyen de m’en souvenir :Þ

3

Qui font des choses encore plus incroyables, comme mémoriser 1000 chiffres en une heure, 10 paquets de cartes en une heure (Grand Master Memory (!wen), http://www.recordholders.org/en/list/memory.html), ou 44 nombres binaires en 1 secondes ! (http://blog.mnemotechnics.org/ramon-campayo-memorizing-binary-1333.html)

6

#+CAPTION: Mon système chiffre -> lettre avec toutes les lettres/sons

chiffres 0 1 2 3 4 5 6 7 8 9
lettres c l n m r s d t v p
ajouts k, q, g, x   gn     j, z, ch     w, f, b  
7

Si c’est ce que vous souhaitez faire, je conseille de prendre le plus possible 1 seule voyelle pour tous les mots (et d’utiliser toujours la même voyelle exception), comme expliqué ici. J’étais plutôt parti sur le son é lorsque j’ai commencé à essayer de faire ce tableau.

9

Si des gens sont tentés par l’aventure, mais sans les thèmes, j’ai mis quelques anciennes tentatives pour les systèmes classiques, et « mon » système, avec des liens divers (version fontifyed) et également dans ce fichier (fontifyed, intégré au blog) qui me sert de référence. J’y ai par exemple noté comment je retiens pi et les départements (ou plutôt comment je suis sensé m’en souvenir).

Résoudre le problème du cavalier

Rédigé par Fred - - Aucun commentaire

Le problème du cavalier est le suivant : il faut déplacer un cavalier sur un échiquier de façon à ce qu’il passe par toutes les cases, une seule fois. On ajoute également souvent une contrainte : il doit pouvoir revenir à sa case de départ, un parcours dit « fermé » (et donc former un cycle hamiltonien).

De nombreux programmes permettent de résoudre ce problème, et c’est également un bon exercice pour ceux qui apprennent la programmation.

Évidemment, c’est un problème très intéressant mathématiquement, et algorithmiquement parlant. Mais ce qui m’intéresse ici, c’est plutôt de résoudre le problème de tête.

Lire la suite de Résoudre le problème du cavalier

Récupérer les images d’une galerie en python

Rédigé par Fred - - Aucun commentaire

Quand je veux récupérer plusieurs pages, je le fais souvent avec wget. L’utilisation des options --load-cookies, --save-cookies et --keep-session-cookies avec --post-data étant plus que pratique. Pour parser, ensuite, c’est souvent pénible, même si awk est là pour aider.

man wget donne :

# Log in to the server.  This can be done only once.
 wget --save-cookies cookies.txt \
      --post-data 'user=foo&password=bar' \
      http://server.com/auth.php

 # Now grab the page or pages we care about.
 wget --load-cookies cookies.txt \
      -p http://server.com/interesting/article.php

Pour parser, j’aime bien python ; je trouve ça plus lisible. Par contre, ce que j’utilisais jusqu’à présent pour me logguer sur une page était moins glop :

import urllib, urllib2, cookielib

username = 'foo'
password = 'bar'

cj = cookielib.CookieJar()
handle = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
login_data = urllib.urlencode({'username' : username, 'pwd' : password})
handle.open('http://www.example.com/login.php', login_data)
res = handle.open('http://www.example.com/my_account.php')
print res.read()

Mais ça, c’était avant. Depuis, j’ai découvert Requests. Pour faire un POST, c’est aussi simple que :

import requests

url= 'http://www.example.com/login.php'
login_data = {username = 'myuser', password = 'mypassword'}

req = requests.post(url, login_data)
page = req.content

Si on a besoin de gérer les cookies, on peut passer par une Session :

import requests

url= 'http://www.example.com'
login_data = {username = 'myuser', password = 'mypassword'}

s = requests.Session()
req = s.post(url + '/login.php', login_data)
req = s.get(url + '/my_account.php')

C’est quand même plus lisible, non ?

En fait, récemment, je voulais parcourir les images de la galerie d’un site. Mais cette galerie contenait 10 images seulement par page, pour 40 pages. J’ai donc fait un script pour mettre toutes les images sur une seule page.

Les images sont encapsulées par une balise a class="foo" et donc j’utilise BeautifulSoup pour toutes les lister (soup.findAll("a","foo")).

Comme j’ai « besoin » de consulter les images plusieurs fois, j’ai préféré enregistrer les images en local plutôt que de laisser un lien sur le site. Pour ça j’ai utilisé stream=True de la méthode .get (cf ce lien sur SO).

J’ai pas fait très propre puisque j’affiche la page sur stdout que je pipe avec tee pour mettre dans un fichier. Mais au moins, je vois si ça marche :þ

# -*- coding: utf-8 -*-
from BeautifulSoup import BeautifulSoup
from requests import session

login_data = { 'login': 'fredtantini', 
               'password': 'toto1234',
               'action': 1 }

urlToVisit = 'http://www.example.com'

#on ouvre une session
with session() as s:
    #on se connecte
    req = s.post(urlToVisit + '/login.php', data=login_data)
    print "<html><body>"
    #comme je sais qu’il y a 40 pages
    for nPage in xrange(1,41):
        #on récupère la page
        request = s.get(urlToVisit + '/some_page.php?p='+str(nPage))
        #que l’on passe à BS
        soup = BeautifulSoup(request.text)    
        print "<h1> Page - ",nPage,"</h1>"
        #Pour tous les liens
        for i in soup.findAll("a","foo"):
            #on récupère l’image
            r = s.get(urlToVisit + '/' + i.img['src'], stream=True)
            #on la télécharge par parties (cf lien SO plus haut)
            if r.status_code == 200:
                with open(i.img['alt'] + ".jpg", 'wb') as f:
                    for chunk in r.iter_content():
                        f.write(chunk)
            print str(i).replace('./images/', './')

print "</body></html>"

Différence entre <code>eval-after-load</code> et <code>add-hook</code>

Rédigé par Fred - - Aucun commentaire

J’expliquais dans le billet sur le démarrage d’Emacs que

le code de eval-after-load sera exécuté seulement une fois […]

Les nomdumode-mode-hooks, eux, sont exécutés pour chaque buffer dans lequel le mode sera activé.

Pour illustrer mes propos, voici un code à mettre dans un nouveau buffer (C-x b auie) :

(setq auie 0)
(setq nrst 0)
(eval-after-load "python" ;puisque dans python.el
  '(progn
     (setq auie (1+ auie))
     ))


(add-hook 'python-mode-hook
          (lambda ()
            (setq nrst (1+ nrst))
            ))
(progn
  (python-mode)
  (message (concat "auie vaut :" (number-to-string auie) ", nrst : " (number-to-string nrst))))

Passez en mode elisp (M-x emacs-lisp-mode), puis évaluez le buffer (M-x eval-buffer). Un petit message devrait s’afficher. Allez à la fin du buffer (M->) et évaluez la dernière sexp (C-x C-e). Évaluez plusieurs fois ; constatez que auie n’augmente pas, nrst si.

Autrement dit, si l’on veut exécuter du code lorsque l’on passe dans le mode foo, et que l’on ne veut pas charger le fichier foo.el ni faire un (require 'foo) dans son fichier init.el, on a deux possibilités :

  1. Utiliser eval-after-load pour exécuter du code une fois.
  2. Utiliser add-hook pour exécuter du code plusieurs fois.

En fait, eval-after-load va exécuter le code à chaque fois que la bibliothèque est chargée. Mais généralement, on fait un (autoload 'foo-mode "foo" "docstring") ; au premier appel de foo-mode (avec un M-x ou avec un add-to-list 'auto-mode-alist), foo.el est chargé et le code du eval-after-load est exécuté. Aux prochains appels de foo-mode, foo.el est déjà chargé, le code n’est plus exécuté.

eval-after-load est donc approprié si l’on veut changer des valeurs par défaut :

(eval-after-load "ace-jump-mode"
  '(ace-jump-mode-enable-mark-sync)) ;par défaut, c’est à disable

(eval-after-load "foo-mode"
  '(my-init-foo-mode)) ; on charge des choses en plus

(eval-after-load "org"
  '(require 'ox-md nil t)) ;l’export markdown n’est pas chargé automatiquement

(eval-after-load 'foo-mode
  '(define-key foo-mode-map (kbd "C-à") 'my-useful-fonction)) ; un raccourci utilisé seulement pour ce mode

Le add-hook lui est utilisé à chaque fois que foo-mode est lancé (et non pas à chaque fois que foo.el est chargé). C’est ce choix que l’on fera si l’on veut activer un minor mode pour un major mode ou si on veut changer des valeurs de variables changées par le major mode.

; à chaque fois que l’on passe en elisp mode, on met les parenthèses en couleur
(add-hook 'emacs-lisp-mode 'rainbow-delimiters-mode)

;avant de sauver, on lance un nettoyage
(add-hook 'before-save-hook 'whitespace-cleanup)

;le mode foo redéfinit à chaque fois C-> et je ne veux pas
(add-hook 'foo-mode-hook '(lambda ()
  (define-key foo-mode-map "\C->" 'foobar))) 

;on met c-basic-offset à 4
(add-hook 'c-mode-common-hook
  '(lambda () 
     (setq c-basic-offset 4)))

;si on veut différentes valeurs selon que l’on soit en foo ou en bar
(add-hook foo-mode-hook
  '(lambda () 
    (setq spam 42)) nil t)

(add-hook bar-mode-hook
  '(lambda () 
    (setq spam 3.14)) nil t)

En espérant avoir été clair.

Un peu de typographie et marquer les raccourcis clavier dans org-mode

Rédigé par Fred - - Aucun commentaire

Utilisant la disposition de clavier bépo, et soucieux d’écrire le plus correctement possible, j’ai pris l’habitude de mettre des espaces insécables lorsque c’est nécessaire (même si, je l’avoue, je n’utilise pas les espaces fines… désolé). Depuis plusieurs jours, j’utilise également les apostrophes courbes (!wfr) et plus celles qui se trouve sur la touche 4 des claviers azerty, des droites : l’apostrophe courbe vs l'apostrophe droite.

Lire la suite de Un peu de typographie et marquer les raccourcis clavier dans org-mode

Le problème opendir de MinigalNano chez Free.fr

Rédigé par Fred - - Aucun commentaire

Il n’y a pas si longtemps, j’ai ouvert une gallerie pour la naissance de M. Je voulais quelque chose de vraiment simple, sans base de données et j’étais parti sur single file php gallery. Mais « les gens » m’ont dit que c’était trop lent. Du coup, j’ai cherché autre chose. Puis je me suis souvenu de Minigal Nano. Et tout allait pour le mieux dans le meilleur des mondes jusqu’à ce que quelqu’un me signale que le lien que je lui donne ne fonctionne pas, alors que je venais de tester… Après quelques veines tentatives de renommages des fichiers images, je me rends à l'évidence, c’est la faute à free… (Manquerait plus que ce soit de ma faute !)

Quelques recherches sur [<a href='function.opendir'>function.opendir</a>]: failed to open dir me font tomber sur ± le même problème qu’ont les gens qui veulent installer un dokuwiki sur un site .free.fr (entre autres). Du coup, je regarde comment le script liberator corrige le problème, et je vois qu’il y a un souci avec la fonction opendir (étonnant non ?)…

Me voilà donc à insérer la fonction suivante dans le fichier index.php :

function myopendir($x, $y=null) {
         if(!is_dir($x)) return false;
         return is_null($y) ? @opendir($x) : @opendir($x,$y);
}

et remplacer tous les @opendir / opendir par myopendir.

Et voilà une Minigal Nano qui roule.

Modifier des fichiers en masse avec Emacs

Rédigé par Fred - - Aucun commentaire

La problèmatique du jour est la suivante : j'utilise actuellement selenium pour les besoins du boulot. Je vous passe les détails, mais j'ai moults fichiers html qui me permettent de tester le contenu d'un site. Sauf que ce site évolue parfois, et du coup, il me faut modifier relativement fréquemment ces fichiers. Heureusement qu'il y a findus emacs.

Lire la suite de Modifier des fichiers en masse avec Emacs

Le nettoyage de mon .emacs

Rédigé par Fred - - Aucun commentaire

Pourquoi

Parce que. Un peu plus de 900 lignes, ça commence à faire pas mal. Surtout quand plein de trucs sont plus utilisés (entre autre suite à divers changements de PC). J'ai essayé de faire ça pas trop mal : dans des dossiers tout bien rangé. De plus, tout ce qui peut être customised sera fait dans Customize.

Je vous conseille de regarder le manuel d'emacs sur le fichier d'initialisation et le petit résumé de ce qu'il se passe au démarrage, c'est toujours instructif.

Lire la suite de Le nettoyage de mon .emacs

Fil RSS des articles de cette catégorie