lundi 17 avril 2017

Emacs backups

The other day I really scared myself by almost losing 1 hour of uncommited work. I've mixed up some commands, redirected to the wrong file, even reloaded my buffer and emacs and my content was gone. I eventually found a version of the file displayed in another terminal, but it was closed.
 
In 2017, GNU/Linux doesn't have a filesystem with snapshots (not talking about btrfs).
 
So it turns out that emacs can do that. It normally automatically saves unsaved changes into a buffer, but as soon as you save it, you loses that history.

So now I have emacs keep some versions of the file, just it case.
Here's what it looks like. (If you don't have it set, use ls -B to hide all kind of backup files.)

-rw------- 1  8,9K mars  25 16:44 in30.md.~1~
-rw------- 1  8,9K mars  25 16:55 in30.md.~2~
-rw------- 1   12K avril 17 10:13 in30.md.~67~
-rw------- 1   12K avril 17 19:16 in30.md.~68~
-rw------- 1   12K avril 17 19:29 in30.md.~69~
-rw------- 1   12K avril 17 19:40 in30.md.~70~
-rw------- 1   12K avril 17 19:40 in30.md.~71~
-rw------- 1   12K avril 17 19:47 in30.md.~72~
-rw------- 1   12K avril 17 19:47 in30.md


And there's what I've added to my ~/.emacs.d/init.el

;; if you wish to keep all backup files into a central directory
;; (setq backup-directory-alist `(("." . "~/.saves")))

(setq vc-make-backup-files t)
(setq delete-old-versions t
      kept-new-versions 6
      kept-old-versions 2
      version-control t
      backup-by-copying-when-linked t)

(defun force-backup-of-buffer ()
  (setq buffer-backed-up nil))

(add-hook 'before-save-hook  'force-backup-of-buffer)

dimanche 19 février 2017

Multiplication optimization

GCC tries its best not use the costly mutiplication mul instruction when possible, in favor of cheaper addition and shift. Multiplication by power of 2 are easy because it's a simple shift.

Some 'complex' example:

- (x * 3) can be expressed as (x + x * 2) which outputs leal (%rdi,%rdi,2), %eax

- (x * 40) is (x * 5 * 8) ie. ((x + x * 4) * 8) which gives leal (%rdi,%rdi,4), %eax + sall $3, %eax


And it seems that gcc does this trick for all factors until 42. I know.

dimanche 21 juin 2015

python binding for libgtop2

Where is it ?! It's my code and I can't find it anymore. I'm not even sure about where is the precious 'gtop.c' file within gnome. I've just found it in the archives: gtop.c and I have immediately clone this and gdesklets.

I have also written a silly email to the debian maintainers to understand what is going on because the gtop.c is still shipped within source package gnome-python-desktop but it is not built. And the old gdesklets package ships its own file.

The gdesklets version will do for now. Here's how to grab it and use

# Get it
$ aptitude download gdesklets
Get :  1 http://ftp.fr.debian.org/debian/ sid/main gdesklets amd64 0.36.1-7 [2 699 kB]
 2 699 kB downloaded en 1s (1 868 kB/s)


# Extract it
$ ar x gdesklets_0.36.1-7_amd64.deb
$ tar xJf data.tar.xz ./usr/lib/gdesklets/libdesklets/system/gtop.so
$ mv ./usr/lib/gdesklets/libdesklets/system/gtop.so .


# Check it
$ ldd -r gtop.so | grep libgtop
        libgtop-2.0.so.7 => /usr/lib/libgtop-2.0.so.7 (0x00007feda0cb4000)


# If you don't have this
# apt-get install libgtop2-7

# Here's a simple example
Python 2.7.10 (default, Jun  1 2015, 16:21:46)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import gtop
>>> gtop.loadavg()
Struct { .last_pid = 9065, .loadavg1 = 0.14, .loadavg15 = 0.14, .loadavg5 = 0.1, .nr_running = 2, .nr_tasks = 398 }

There's also the new binding based on the Gnome-Instrospection framework but I'm afraid it's currently broken. It's autogenerated, and I have started to fix it. It's shipped with package gir1.2-gtop-2.0. Here's a sample code, it's very closed to the C usage.

#!/usr/bin/env python3

from gi.repository import GTop

GTop.glibtop_init()

buf = GTop.glibtop_loadavg()
GTop.glibtop_get_loadavg(buf)
print(dict((k, getattr(buf, k)) for k in dir(buf) if not k.startswith('__')))

And it runs (probably because of my local unsent patches):
$ python3 loadavg.py
server=0x7fe25d788c00 features=0 flags=0 server_flags=0
server=0x7fe25d788c00 features=20 flags=0 server_flags=b0000
{'flags': 15, 'last_pid': 9590, 'nr_tasks': 401, 'nr_running': 2, 'loadavg': [0.02, 0.04, 0.07]}


mardi 16 juin 2015

Seagate Hybrid Drive

Lately, I have replaced two laptop drives : a Toshiba MK6475GSX 640GB Jan-2012 and an older and failing Seagate Momentus 5400.6 320GB. I've swapped them with two Seagate ST500LM000 2.5" 500 GB that I bought on LDLC for ~70€. I've copied the data with a mix of sfdisk, dd and ntfsclone, obviously I've had to change the partitions sizes for the 640GB -> 500GB and I've had to realign an ext4 partition. Editing sfdisk input file and playing with parted was alright.
The performance is very good, somewhere between 100-120MB for reads. There's no burst when the data is on the 8GB SSD, but it feels like everything is smoother and faster. I don't have hard stats but it seems to me that the real issue with classic laptop drives is there lack of buffer, usually 8-16MB. Well, with a 8GB SSD, that's no longer an issue. The laptops are running Windows 7 and Debian. Everything is transparent, nothing to configure, it runs fine out of the box. So I'm happy with these cheap upgrades.

(I am writing in English because I wasn't able to find any user comments (!= review) on the ST500ML000 before I purchased them, so I'm just sharing).

jeudi 27 mars 2014

Cdiscount Cfini

Plus jamais je ne commanderai sur Cdiscount.
Jusqu'à présent je n'avais pas eu de problème mais aujourd'hui j'ai passé commande d'un casque audio. Problème: je reçois finalement un mail m'indiquant que la livraison aura lieu dans 2 mois ... je décide donc d'annuler ma commande. Et là le spectacle commence:
  • Impossible d'annuler par Internet, ça n'est pas prévu. Il faut appeler un numéro surtaxé.
  • Forcément le télé-conseiller m'informe que leur informatique est en panne et que je n'aurai qu'à rappeler.
  • Contrairement à Amazon, Cdiscount prélève à la commande et non pas à la livraison.
J'en suis donc réduit à envoyer par courrier papier ma demande d'annulation et de remboursement. C'est pitoyable et la blague du téléphone m'a déjà couté 3€ de communication. Honte à Cdiscount. Je croise les doigts pour être remboursé facilement et après je supprime mon compte de ce site arnaqueur.

vendredi 1 novembre 2013

Armurerie Open Source

Pourquoi est-ce que les premières choses que les américains impriment en 3D sont des armes ? Je viens de découvrir pourquoi: il y a peut-être une vrai culture de l'open source dans les armes là-bas. J'ai vu une vidéo avec un vendeur d'arme qui faisait l'article d'un nouveau fusil et à un moment il décrit le nouveau chargeur et il dit à peu près en anglais "pour le moment il nous est propriétaire mais il sera open source dans environ un an" à 7min 08s



C'est peut-être limité aux petites pièces (chargeurs, munitions, accessoires) mais on dirait qu'il y a réellement une pratique open source (à défaut de libre) pour assurer la compatibilité et la diffusion de ces pièces.

mercredi 25 janvier 2012

Brèves

Le client a décidé que:
- les postes du site A redémarreraient le dernier lundi de chaque trimestre;
- les postes du site B redémarreraient le premier lundi de chaque mois impair.

Nul besoin de préciser que les lusers des sites A et B travaillent de manière identique.

Suite à quoi, un professionnel hérite de la lourde mission de pisser un script shell pour mettre en oeuvre cette "stratégie". A cause d'un bug, ce 26 décembre, les stations du site A n'ont pas redémarré. En effet, les tableaux KSH sont indexés à partir de 0 (zéro) -- comme partout en fait (sauf en Pascal) -- et utiliser le numéro du mois comme indice est funeste le dernier mois de l'année.

J'appelle le collègue.

"Encore heureux que tu ne programmes pas des missiles !
- Détrompe-toi, j'ai travaillé à l'apéro-spatiale sur des missiles pendant la guerre du Golfe."

mercredi 22 juin 2011

Et les Shadoks pompaient...

Cher Luc,

dans ta recherche d'une femme, si Xi désigne une rencontre, 1 signifiant le succès et 0 l'échec, contrairement à la logique Shadok, la probabilité que ta rencontre Xi+1 soit un succès ne s'accroît pas forcément.

Par exemple, pour 4 filles rencontrées, si succès est synonyme de relation sexuelle, la probabilité que tu couches avec ta 5ème rencontre est de 0,5.

Par contre, si un succès signifie que tu as trouvé la femme de ta vie, la probabilité que ta 5ème rencontre soit la bonne est de 0,16. Si c'est à nouveau un échec, cette probabilité n'est plus que de 0,14 pour ta 6ème, etc.

Bref, après 99 échecs, la probabilité de ton succès sera en fait inférieure à 0,01 et non pas égale à 1 comme le prevoient les Shadoks.

C'est implacable.

jeudi 5 mai 2011

Comment j'ai craqué mon compte CE

Mon compte sur le site de mon CE a changé et son mot de passe aussi. Pour commander mes chèques vacances au dernier moment, je me suis donc retrouvé coincé jusqu'à qu'un collègue me fasse remarquer que les mots de passe initiaux ont l'air d'être séquentiels (#fail).

Le site de mon CE étant vraiment sécurisé (merci SPIP), un petit bout de tshark, un petit coup de curl pour faire des POST, et hop, mot de passe récupéré !

for i in {0..100}; do
    id=$(printf 'za%03d' $i);
    echo $id;
    curl -q -D - -U 'proxy_user:password' -x proxy:8080 -d "matricule=1983&password=${id}&SubmitAuth=Connexion" 'http://www.mon-ce.com/spip.php?page=authentif' | grep Location;
done

vendredi 29 avril 2011

VCS + deduplication

La déduplication c'est très intéressant pour économiser l'espace disque.

En tout particulier pour des dossiers SVN. En effet, quand on fait un svn checkout dans /monprojet, SVN crée pour chaque fichier du projet /monprojet/fichier mais aussi une copie en /monprojet/.svn/.../fichier. Cette copie permet d'accélérer plusieurs opérations dont svn diff et svn revert.

Mais cela veut dire garder 2 copies identiques (ou quasiment) du même fichier. Mais grâce à la déduplication, cette copie ne coûte plus rien !

Par exemple pour un disque NFS (sur du NetApp) sur lequel une centaine de développeurs travaillent sur le même projet, on dépasse les 35% de gain d'espace disque par rapport à un stockage traditionnel.

En revanche pour GIT, qui stocke tout dans des blobs compressés, cette optimisation de l'espace disque devient impossible.

lundi 31 janvier 2011

Test de PRA duplicity: succès partiel

J'utilise depuis 6 mois duplicity avec Amazon S3 pour sauvegarder des choses vraiment importantes de mon portable: mes documents importants et des bouts de configuration locale, genre /etc.

Ce soir j'ai essayé de récupérer un /etc/shadow datant de 3 mois en faisant un:
${DUPLICITY} -t 3M --file-to-restore=etc/shadow ${DEST} /tmp/shadow
et j'ai bien du télécharger 300Mio pour pouvoir récupérer mon fichier de 2Kio...

Échec! Volume was signed by key None, not 987BF8A4

Je commence a en avoir marre de duplicity ou rdiff-backup: déjà avec rdiff-backup, je m'étais rendu compte que le format des métadonnées avait changé d'une version à l'autre et cela avait rendu caduques mes anciennes sauvegardes... Ici j'ai toujours bien fait mes sauvegardes et paf, ça me dit que ça n'est pas bien signé, et ça reste là à rien faire. ^C. Et là miracle, mon fichier a bien été restauré... Je suis en totale confiance.

Autant duplicity c'est très rapide pour faire les sauvegardes incrémentales, autant il y a un truc de complètement foiré au niveau de la restauration: en gros j'ai l'impression qu'il a téléchargé le morceau d'archive tar de la sauvegarde complète précedente, puis qu'il a téléchargé chaque incrémentale jusqu'à la date demandée...

J'abandonne S3 en direct, faute d'outil adéquate.
Et j'abandonne aussi duplicity, je retourne vers du tar ou rsync.

lundi 11 octobre 2010

Windowseries réseaux

Sous Windows, des fois, le simple fait de lancer une application comme TS3 vous permet de brider votre connexion ethernet à 100Mbps alors même que vous venez d'acheter un joli switch 1000Mbps. Passe encore.

Maintenant, vous souhaitez copier des fichiers linux -> windows par CIFS et là ça ne marche pas parce que Windows l'a décidé. En fait il pourrait très bien le faire à condition de modifier un paramètre système qui pose des problèmes de performances avec les jeux et les cartes 3D.

Bref je suis "like the fruit of the oak" comme dirait Francis. J'ai plus qu'à essayer le FTP.

lundi 4 octobre 2010

La meilleure SF de toute la zone lente

Attention, il paraît que Vernor Vinge publie un nouvel opus de la série "Zones of Thought" ce 21 octobre !

vendredi 1 octobre 2010

U SOX

Si toi aussi tu es soumis à Sarbanes-Oxley, peut-être utilises-tu déjà un générateur de mot passe de qualité. Sinon, je te prête celui-ci. Je n'en dis pas plus mais c'est du vrai. Du coup les mots de passe ont tous un petit air de famille.



#define FALSE 0
#define TRUE  1

int rand ();
unsigned long getseed ();

main (int argc, char *argv[])
{
  char AMin[] = "abcdefghijklmnopqrstuvwxyz";
  char AMaj[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  char Nume[] = "0123456789";
  char Spec[] = "!:~{}.^*=+-,?_%";
  long trustedhostid[2];
  int istrustedhost = 0;
  char PassWord[20];
  int NSpec = 15;
  int a = 0;

  int seed, numgen, longpass, typelettre;
  int FMin, FMaj, FNum, FSpe;
  int ic, i, j, k, l, n;
  FMin = FMaj = FNum = FSpe = FALSE;
  l = 1;

#if 0
  if (getuid () > 0)
    {
      fprintf (stderr, "Sorry, only root can run this command\n");
      exit (1);
    }
#endif

  seed = getseed ();
  while (seed <= 100000)
    {
      seed = getseed ();
    }

  longpass = 8;
  numgen = fonct_rand (seed);

  ic = 0;
  n = numgen % 26;
  if (numgen % 2 == 0)
    {
      PassWord[ic] = AMin[n];
      FMin = TRUE;
    }
  else
    {
      PassWord[ic] = AMaj[n];
      FMaj = TRUE;
    }

  for (ic = 1; ic < longpass; ic++)
    {
      seed = numgen;
      numgen = fonct_rand (seed);
      typelettre = numgen % 4;
      if (ic > longpass / 5 && !FMin)
    typelettre = 0;
      if (ic > longpass * 2 / 5 && !FMaj)
    typelettre = 1;
      if (ic > longpass * 3 / 5 && !FNum)
    typelettre = 2;
      if (ic > longpass * 4 / 5 && !FSpe)
    typelettre = 3;

      switch (typelettre)
    {
    case 0:
      n = numgen % 26;
      PassWord[ic] = AMin[n];
      FMin = TRUE;
      break;
    case 1:
      n = numgen % 26;
      PassWord[ic] = AMaj[n];
      FMaj = TRUE;
      break;
    case 2:
      n = numgen % 10;
      PassWord[ic] = Nume[n];
      FNum = TRUE;
      break;
    case 3:
      n = numgen % NSpec;
      PassWord[ic] = Spec[n];
      FSpe = TRUE;
      break;
    }
    }
  PassWord[ic] = '\0';

  printf ("%s\n", PassWord);

}

int
fonct_rand (int j)
{

  int i, k, l;

  l = 1;

  k = j / 100000;
  k *= 100000;

  l = j - k;
  for (i = 0; i < l; i++)
    rand ();

  return rand ();
}

unsigned long
getseed ()
{
  unsigned int myseed;
  FILE *devrandom;

  if ((devrandom = fopen ("/dev/random", "r")) == NULL)
    {
      fprintf (stderr, "Sorry , I can't open /dev/random \n");
      exit (1);
    }

  else
    {
      fread (&myseed, sizeof (myseed), 1, devrandom);
      fclose (devrandom);
    }
  return (myseed);

}

mercredi 8 septembre 2010

Sauvegarder son compte IMAP en mbox/maildir

J'ai suivi deux autres billets sur comment sauvegarder un compte IMAP avec cet autre bon logiciel libre : getmail4 .

En détails, ce que j'ai fait en détails pour sauver mon compte GMail en mbox et maildir dans ~/gmail.getmail4:

1) Créer le fichier le fichier ~/.getmail/gmail.conf comme ce qui suit:
[retriever]
type = SimpleIMAPSSLRetriever
server = imap.gmail.com
username =moi@gmail.com
password = pouetpouet
mailboxes = ("[Gmail]/Tous les messages",)

[destination]
type = MultiDestination
destinations = ("[mboxrd-destination]", "[maildir-destination]")

[mboxrd-destination]
type = Mboxrd
path = ~/gmail.getmail4/mboxrd/gmail-backup.mbox

[maildir-destination]
type = Maildir
path = ~/gmail.getmail4/maildir/

[options]
# print messages about each action (verbose = 2)
# Other options:
# 0 prints only warnings and errors
# 1 prints messages about retrieving and deleting messages only
verbose = 2
message_log = ~/gmail.getmail4/gmail.log

# preserves your mail after backup
delete = false
# just get new mails
read_all = false
2) Créer la strcture:
mkdir ~/gmail.getmail4/maildir/{new,cur,tmp} 
touch ~/gmail.getmail4/mboxrd/gmail-backup.mbox
3) feu !
getmail -r /home/benoit/.getmail/gmail.conf

mardi 7 septembre 2010

Importer des mails au format mbox sur un compte IMAP

Je n'utilise plus Evolution depuis que j'ai changé de portable. A présent j'utilise une combinaison de Thunderbird/Icedove + GMail mais je me suis toujours demandé comment proprement récupérer mais mails d'Evolution provenant de compte POP3.

Je sais déjà faire une restauration d'Evolution: en restaurant mon ~/.evolution + mon ~/.gconf* dans un compte de test, c'est possible de relancer Evolution comme s'il ne s'était jamais rien passé.

Mais là c'est encore plus simple et générique avec imap-uploader. J'ai déjà importé 2000 mails envoyés naguère en utilisant mon ~/.evolution/mail/local/Sent pour tester, le tout sous un libellé distinct sous GMail. Il ne me reste plus qu'à envoyer également mon ancien Inbox et ça sera joué !

python imap_upload.py --gmail --box evolution_Sent /home/benoit/.evolution-restaure/mail/local/Sent
python imap_upload.py --gmail --box evolution_Inbox /home/benoit/.evolution-restaure/mail/local/Inbox

vendredi 30 juillet 2010

Le livre préféré de RMS

Il l'a dit sur Reddit:

19. OsamaK: What's the best book you have ever read?

RMS: I can't remember now all the books I have read and loved. And even if
I could, I would not be able to pick one to call it best.

If you like fairly hard Science Fiction with a big vision, I recommend
A Fire Upon the Deep, by Vernor Vinge, and Diaspora, by Greg Egan. If
you like something a little less hard, I recommend The Jehovah
Contract by Victor Koman. If you like detective fiction, I recommend
Laura King's books about Mary Russell, starting with The Beekeeper's
Apprentice, and Steve Saylor's Roman mysteries about Gordianus the
Finder.
Je n'ai pas encore lu A Fire Upon the Deep mais je viens de terminer A Deepness in the Sky de Vernor Vinge. Et à ce jour, c'est vraiment le meilleur livre de SF que j'ai lu. C'est beaucoup plus complexe que les Ringworld de Larry Niven ou les Foundation d'Isaac Asimov. Ce que j'aime chez Vinge, c'est que c'est vraiment de la SF dure et son approche de l'Humanité. Là où chez Asimov, l'humanité va vers le mieux grâce à la "psychohistory", et même si chez Niven le Ringworld est en décrépitude, dans le monde des Qeng Ho de Vinge, les civilisations apparaissent, disparaissent, régressent et progressent sans cesse. Et le temps s'allonge à l'infini, avec les voyages qui se font en stase à des vitesses sub-luminiques, ce qui fait que la vie d'un homme peut s'étaler un millénaire.

Je ne connais pas Diaspora de Greg Egan, je vais commander ça dès que j'aurais lu A Fire Upon the Deep qui déjà sur mon bureau.

mercredi 29 juillet 2009

Hello World!

Bonjour le monde !