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."