Programmation

Memstats

Tuesday, 29 July 2014
|
Écrit par
Grégory Soutadé

BSD systems are known to have the highest uptime, but our favorite GNU/Linux system can do the same if we want. At work my computer runs since 260 days without any reboot thanks to Ubuntu (LTS 10.04).

This is cool, nevertheless having software launched for a long time consume a lot of memory (I like to keep terminals and emacs open to save history), especially Firefox uses one to three giga bytes of memory (even in version 30.0). Software not used everyday goes to swap and come back when needed. This process can slow my computer for minutes (when I unlock my session).

The only solution is to kill these applications and restart them properly. I used to track memory eaters with "top" command, but it's hard to see in one time which software is using most of memory.

I wanted to do it for long time, and now it's out ! I wrote a PERL script called memstats that list processes by memory usage (and not by CPU usage like top).

It reads information from /proc/PID/stat and /proc/PID/status, so it's very Linux dependant (sorry BSDs...).

memstats output looks like "top" (because it's a good one).

soutade@cybelle> memstats
  PID    OWNER  VIRT   RES S       TIME         COMMAND
20098  soutade 3.10g 1.80g S   09:00:59         firefox
 1285     root  526m  259m S 6214:00:04            Xorg
 2555  soutade  862m  200m S 6214:00:10  gnome-terminal
 2113  soutade  827m  181m S 6214:00:20     gnome-panel
20081  soutade  866m  153m S   10:00:12     thunderbird
 2122  soutade 1.97g   98m S 6214:00:20        nautilus
 2192  soutade  591m   86m S 6214:00:13 indicator-apple
20104  soutade 1.07g   42m S   09:00:58          pidgin
26536  soutade  627m   40m S   06:00:22           gedit
 6517  soutade  529m   30m S 2816:00:40           emacs
 2845  soutade  442m   27m S   00:00:50           emacs
22935  soutade  449m   23m S  103:00:06           emacs
 2094  soutade  899m   23m S 6214:00:21        metacity
 2207  soutade  393m   11m S 6214:00:13 indicator-messa
 2762  soutade  114m   10m S   00:00:48          python
 9752  soutade  401m    8m S   96:00:18 gnome-screensav
 2070  soutade  766m    7m S 6214:00:22 gnome-settings-
 2914  soutade   94m    6m R   00:00:00        memstats
 2121  soutade  477m    6m S 6214:00:20 notification-da
 2489  soutade  414m    6m S 6214:00:20 update-notifier
23305  soutade  391m    5m S 5641:00:44 ubuntuone-syncd
 2280  soutade  418m    4m S 6214:00:10 gdu-notificatio
 2061  soutade   22m    4m S 6214:00:22     dbus-daemon
 1973     root  192m    4m S 6214:00:32         lightdm
 6886  soutade  581m    4m S 3797:00:46 gnome-keyring-d
 2134  soutade  539m    4m S 6214:00:19 gnome-fallback-
28423  soutade   85m    4m S   05:00:43            bash
 2389  soutade  335m    4m S 6214:00:00 zeitgeist-daemo
 6080  soutade  332m    4m S 3624:00:44      pulseaudio
 2382  soutade  400m    3m S 6214:00:00 zeitgeist-datah

memstats is licenced under GNU GPL v3 and available in my inDefero forge. Have fun !

gPass v0.5

Wednesday, 25 June 2014
|
Écrit par
Grégory Soutadé

Logo gPass

Petit rappel : gPass est un gestionnaire de mot de passes en ligne. C'est une alternative libre à lastpass. Il permet d'héberger un serveur de mot de passe, qui stockera un mot de passe fort et unique pour chaque site web. Les mots de passes sont chiffrés par une "clé maître" que seul l'utilisateur connaît et sont remplacés à la volée dans le formulaire d'authentification.

La modification de code est minime mais importante, car elle rajoute le préfix "@_" en sus de "@@".

Pour s'authentifier, il faudra toujours rentrer son nom d'utilisateur, puis comme mot de passe :

  • @@masterkey pour remplacer sa clé maître par le vrai mot de passe et soumettre automatiquement le formulaire au site web
  • @_masterkey pour remplacer sa clé maître par le vrai mot de passe sans soumettre le formulaire au site web, puis soumission manuelle dans un second temps

Cela permet de contourner le surplus de JavaScript de certains sites qui ne prennent pas en compte la transformation "clé maître" -> "mot de passe".

Le serveur et le module pour Firefox sont téléchargeables sur la page du projet ou directement sur le site de Firefox (addon uniquement).

PS : D'après les statistiques le nombre d'utilisateurs a doublé \o/

Facebook 2 email

Sunday, 04 May 2014
|
Écrit par
Grégory Soutadé

Un nouveau service accessible depuis Cybelle : f2email. Il s'agit d'une application PHP exploitant la Graph API de Facebook afin d'être notifié par email des nouveaux événements provenant de nos amis et pages que l'on suit.

Au départ le besoin est simple : un restaurateur de Sophia Antipolis publie chaque jour le menu sur un compte Facebook et donc, quasiment chaque jour, on me demande de partager ce menu sur l'intranet. F2email permet désormais d'automatiser ce traitement, mais pas que ! En effet, je vais de moins en moins sur Facebook, pourtant j'aimerais suivre mes "likes" qui sont souvent des groupes de musique que j'aime bien (l'ère de la mailing list est terminée :(). De plus, f2email a été conçu pour être modulaire : actuellement, il n'y a qu'un seul module (email) d'implémenté, mais on pourrait en créer d'autres, comme par exemple l'insertion automatique sur Pastebin ou l'inscription dans des agendas.

Qui dit Facebook, dit convoitises. J'ai toujours peur que le serveur soit corrompu, l'application a donc été développée avec cette idée en tête. C'est pour cela qu'une fois déconnecté (logout), un maximum de permissions sont retirées du jeton d'accès (access token). Il ne restera que les permissions de base, les adresses email (nécessaires pour l'administration et l'envoie d'email), ainsi que les numéros d'identifiants des cibles. Cela fait hélas encore beaucoup, mais comparés aux autres sociétés, ici, tout est fait pour garder un maximum d'anonymat. Il n'y a ni utilisation, ni revente des données personnelles !! Il y a aussi un lien permettant de supprimer toute trace de son passage dans la base de données.

L'application serveur est comme d'habitude disponible sous licence GPL sur ma forge. On pourra aussi remarquer le design épuré dont moi seul a le secret :)

Actuellement, le serveur est programmé pour faire un "run" (aller voir s'il y a des nouvelles) à 11h du soir et 11h du matin. De plus, seules les cinq dernières notifications (par likes/amis) sont transmises. Par contre, ça ne sert à rien de vouloir espionner quelqu'un, la graph API est très restrictive quand on n'est pas ami avec une personne (un peu plus cool pour les pages).

Dynastie 0.2

Monday, 28 April 2014
|
Écrit par
Grégory Soutadé

Logo Dynastie

Voilà un peu plus d'un an que la première version de Dynastie est sortie (et plus d'un an et demi qu'elle est fonctionnelle). La version 0.2 a été crée dans la foulée suite aux remarques (notamment de Denis Bernard), mais elle manquait de substance (juste bon à faire une 0.1.1). Il n'y a pas eu de révolution depuis, mais une suite d'améliorations :

  • Le support de la syntaxe Markdown
  • Les templates "base" supportent l'inclusion de multiples blocs
  • Simplification de l'installation
  • Les marqueurs "dyn:post _ url" et "dyn:post _ full_url" dans la directive "replace", ainsi que "#comment _ number" dans les commentaires
  • Générateurs "Tous les articles" et "Les joies du code" (à partir de la sortie d'un script perl).
  • La recherche d'un article dans l'interface d'administration
  • Quelques bugs corrigés (trim des commentaires, double quotes dans les tag metas, retours à la ligne dans les commentaires).

Contrairement à ma première idée, Markdown fait son entrée dans la place (avec quelques extensions persos). En effet, je me suis rendu compte que la syntaxe épurée était suffisante pour 90% des articles qui n'ont pas besoin de mise en page "complexe". Néanmoins, on y perd au passage le support de la coloration syntaxique.

L'ensemble des fonctionnalités supportées est relativement stable, donc, à priori, peu d'évolutions sont à prévoir dans le futur.

binstats : Basic statistics on binary code

Monday, 21 April 2014
|
Écrit par
Grégory Soutadé

As you may know, my work consists in developing software for embedded devices. We usually says that an embedded device is a peace of hardware with low resources (memory, CPU, flash...) taking in example phones. Nowaday, smartphones have only core software that is really embedded, the rest is sometimes more powerful than the computer I wrote this post. But, don't care, I don't work in telephony. Here (at Neotion), we do really embedded software, with chipsets clocked from 100Mhz to 200Mhz, with available RAM from 1MB to 32MB, and flash up to 8MB.

After years of developments, we can have one or more software that became too big to fit in its allocated flash partition. So, to find the guilty functions, I wrote a simple PERL script (~130 lines) that will count number of instructions for each function from objdump's output (with -ld switch) and displays statistics per function and per file (it doesn't focus on .data or .bss section). To correctly use the script, you have to compile your program with -ggdb option (to have line numbers and file paths), but you can also set optimisations (-OX).

Example with main.c

#include <stdio.h> int function1(int a, int b) { return a*b+4; } int function2(int a, int b, char* c) { printf("Result %d*%d+4 = %s\n", a, b, c); return 0; } int main(int argc, char** argv) { char buf[32]; sprintf(buf, "%d", function1(5, 4)); function2(5, 4, buf); }
> gcc main.c -ggdb -o test > objdump -ld test > test.txt > ./binstats.pl --in test.txt Total instructions 63 63 (100.00%) /home/soutade/main.c 38 main 16 function2 9 function1

There are also options to filter small files, small functions and paths that helps to focus on big ones. Have fun !