Humus numericus

Aller au contenu | Aller au menu | Aller à la recherche

R, Spip et autres

Linux, Debian, etc.

Fil des billets

mercredi 14 septembre 2011

How to limit Crashplan memory usage

One of the downside of the CrashPlan backup software is that, as a java application, it can use quite a lot of memory.

There's a simple way to limit this amount of memory, though. You just have to go into your Crashplan installation folder, (/opt/crashplan/ for me) and then edit the bin/run.conf file from :

SRV_JAVA_OPTS="-Dfile.encoding=UTF-8 -Dapp=CrashPlanService -DappBaseName=CrashPlan -Xms20m -Xmx512m -Djava.net.preferIPv4Stack=true -Dsun.net.inetaddr.ttl=300 -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.negative.ttl=0 -Dnetworkaddress.cache.negative.ttl=0"
GUI_JAVA_OPTS="-Dfile.encoding=UTF-8 -Dapp=CrashPlanDesktop -DappBaseName=CrashPlan -Xms20m -Xmx512m -Djava.net.preferIPv4Stack=true -Dsun.net.inetaddr.ttl=300 -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.negative.ttl=0 -Dnetworkaddress.cache.negative.ttl=0"

Then change the -Xmx512m argument on the first line (which is the maximum amount of memory the Crashplan service can use) to a lower value, for example :

SRV_JAVA_OPTS="-Dfile.encoding=UTF-8 -Dapp=CrashPlanService -DappBaseName=CrashPlan -Xms20m -Xmx100m -Djava.net.preferIPv4Stack=true -Dsun.net.inetaddr.ttl=300 -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.negative.ttl=0 -Dnetworkaddress.cache.negative.ttl=0"
GUI_JAVA_OPTS="-Dfile.encoding=UTF-8 -Dapp=CrashPlanDesktop -DappBaseName=CrashPlan -Xms20m -Xmx512m -Djava.net.preferIPv4Stack=true -Dsun.net.inetaddr.ttl=300 -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.negative.ttl=0 -Dnetworkaddress.cache.negative.ttl=0"

And then restart the Crashplan engine.

vendredi 29 juillet 2011

Utiliser les styles KDE pour les applis KDE/Qt sous Gnome

Depuis une récente mise à jour de Debian, mes applications KDE/Qt sous Gnome se sont mises à utiliser un thème le plus proche possible de mon thème GTK en usage. C'est bien pour l'uniformisation, mais le résultat était très moche.

J'ai donc essayé de remettre en place le thème Oxygen utilisé jusque-là, mais celui-ci n'apparaissait pas dans la liste des styles possibles de qtconfig.

La solution se trouve sur la page dédiée à KDE du wiki d'ArchLinux : depuis la version 4.6.1 de KDE il faut désormais lui indiquer où se trouvent les styles. Pour cela, une petite ligne supplémentaire dans son ~/.bashrc suffit :

export QT_PLUGIN_PATH=$HOME/.kde4/lib/kde4/plugins/:/usr/lib/kde4/plugins/

Il n'y a plus qu'à sélectionner le thème de son choix dans qtconfig et normalement ça roule.

mercredi 29 juin 2011

Accélérer l'exécution de dpkg, apt-get ou aptitude

Petit conseil si votre dpkg rame, si votre apt-get se traîne comme une vieille chaussette ou si votre aptitude a le dynamisme d'une histoire de Petit ours brun, et si ces ralentissements se produisent lorsque ces programmes lisent leur base de données.

Après quelques recherches sur le Web, il semble que ce ralentissement provient des très nombreux fichiers présents dans /var/lib/dpkg/info et que dpkg et consorts doivent lire de temps en temps. Avec le temps ces fichiers se fragmentent (ils se situent à des endroits dispersés sur votre disque dur) et leur lecture prend de plus en plus de temps.

Une solution peut être d'utiliser le script suivant, donné par gmargo sur un forum ubuntu.

Attention, j'ai utilisé ce script, je n'ai pas eu de problème et j'ai pu constater une amélioration significative des performances de dpkg et apt, mais je ne peux en rien vous garantir qu'il ne va pas corrompre votre base de données de paquets ou autres choses désagréables. Donc utilisez-le à vos risques et périls et faites toutes les sauvegardes nécessaires avant ;-)

Bref, voilà le script :

#!/bin/sh

# Script to reorder the /var/lib/dpkg/info directory to speed up "dpkg -S".
#
# Original by Peter Cordes, from Ubuntu Forums thread
# http://ubuntuforums.org/showthread.php?p=8982470
#
# "Safer" modified version by gmargo 2009-03-17

# Original Code:
# cd
# strace -efile -o dpkg.tr dpkg -S /bin/ls
# cd /var/lib/dpkg
# mkdir info.new
# grep '^open' ~/dpkg.tr | sed -r '/dpkg\/info/sX.*"(.*)".*X\1Xp' -n | xargs sudo cp -a -t info.new 
# # cmd line length limits prevent info/*.  I could have used rsync -au info/ info.new
# sudo cp -iau info/[a-k]* info.new/
# sudo cp -iau info/[l]* info.new/
# sudo cp -iau info/[m-z]* info.new/
# diff -ur info info.new/
# sudo rm -rf info
# sudo mv info.new info
# 
# sync
# echo 3 | sudo tee /proc/sys/vm/drop_caches
# time dpkg -S /bin/ls


# Modified code:

ORIGINAL=/var/lib/dpkg/info
NEW=/var/lib/dpkg/info.new
BACKUP=/var/lib/dpkg/info.saved.$(date "+%Y%m%d_%H%M%S")

#------------------------------
# You must be root or use sudo.
#------------------------------
if [ `id -u` -ne 0 ] ; then
    echo "ERROR: You must be root for this to work!"
    exit 1
fi

if [ -e "$NEW" ]; then
    echo "Remove $NEW directory first."
    exit 1
fi

echo "Time to perform search for package that provides ls, before optimization:"
sync
echo 3 > /proc/sys/vm/drop_caches
time dpkg -S /bin/ls

mkdir "$NEW"
rc=$? ; if [ $rc -ne 0 ] ; then echo "ERROR: mkdir $NEW failed rc=$rc" ; exit 2 ; fi
chmod 755 "$NEW"

echo "Optimize:"
strace -efile -o /tmp/dpkg.tr.$$ dpkg -S /bin/ls >/dev/null
grep '^open' /tmp/dpkg.tr.$$ | sed -r '/dpkg\/info/sX.*"(.*)".*X\1Xp' -n | xargs cp -p -t "$NEW"
find /var/lib/dpkg/info -type f -print | xargs cp -pu -t "$NEW"
rm -f /tmp/dpkg.tr.$$

#--------------------------------------------------
# Rename old info directory.
# DO NOT DELETE UNTIL YOU ARE CONVINCED dpkg WORKS.
#--------------------------------------------------
echo "Create backup:"
if [ -e "$BACKUP" ]; then
    echo "Backup directory $BACKUP already exists."
    exit 1
fi
mv "$ORIGINAL" "$BACKUP"
rc=$? ; if [ $rc -ne 0 ] ; then echo "ERROR: mv $ORIGINAL $BACKUP failed rc=$rc" ; exit 2 ; fi

mv "$NEW" "$ORIGINAL"
rc=$? ; if [ $rc -ne 0 ] ; then echo "ERROR: mv $NEW $ORIGINAL failed rc=$rc" ; exit 2 ; fi

echo "Dpkg search time after optimization:"
sync
echo 3 > /proc/sys/vm/drop_caches
time dpkg -S /bin/ls

vendredi 15 avril 2011

Envoi de mail automatisé en cas d'erreur suite à un git pull

J'utilise git pour différentes choses au quotidien, mais en particulier pour synchroniser divers fichiers entre différentes machines (fichiers de conf, fichiers org, etc.).

Pour cela j'ai un scipt shell très simple qui se lance à chaque démarrage ou extinction de la machine et qui effectue une série de git pull / git push. Un truc du genre :

echo "-> Syncing ~"
cd /home/julien
git pull
git add .
git commit -a -m  "Maj auto home" 
git push 

Le problème avec cette méthode est que je ne regarde pas sytématiquement la sortie de ce script, et que je peux donc passer à côté de messages d'erreur me signalant des conflits non résolus suite à un merge automatique. Je cherchais donc un moyen d'être averti par mail si ce type d'erreur se produit.

Suite à une question sur StackOverflow, j'ai pu voir qu'il ne semble pas y avoir de hook dans git pour ce type de cas de figure. Je me suis donc rabattu sur le code de retour de git pull.

Ce qui donne en gros le code suivant :

echo "-> Syncing ~"
cd /home/julien
git pull 2> /tmp/git_pull_output.txt
if [ $? != 0 ]
then mail -s "[git] Git pull failed for home" julien < /tmp/git_pull_output.txt 
fi

Maintenant j'attends d'avoir un vrai conflit pour voir si ça marche… :-)

lundi 17 janvier 2011

Modifier la hauteur de la «addon bar» sous Firefox 4

Depuis la beta 8 de Firefox 4, la barre de statut a été remplacé par une «barre de modules» (addon bar). L’argument était de fournir un espace plus configurable avec possibilité d’y placer n’importe quel bouton ou widget.

Un comportement qui m’a dérangé avec cette nouveauté est l’affichage de l’url des liens survolés dans la barre d’adresse à la place de la barre de statut : je ne suis pas arrivé à m’y faire, même au bout de plusieurs semaines. La solution s’appelle Status-4-evar, une extension permettant de retrouver le fonctionnement «classique» de la barre de statut :

https://addons.mozilla.org/en-US/firefox/addon/235283/

Un autre petit problème était la hauteur de cette nouvelle barre, plus importante que précédemment, gâchant inutilement un espace vertical parfois précieux. Ceci peut se régler facilement en éditant son fichier userChrome.css (celui-ci se trouve dans le répertoire ~/.mozilla/firefox/<blahblah>.default/chrome/) et en y ajoutant :

#addon-bar {
padding: 1px !important;
height: 25px !important;
}

jeudi 30 décembre 2010

Ce blog est désormais accessible en nozav.42 !

Pour tester et soutenir l’expérience 42, ce blog est désormais accessible via l’adresse :

…si bien sûr votre système a été configuré pour résoudre ce nouveau TLD alternatif.

Pour savoir comment faire (c’est pas forcément trivial, le plus simple est sans doute d’utiliser les DNS fournis par Geeknode), comprendre le projet, voire enregistrer votre propre nom de domaine en .42, c’est là :

vendredi 12 novembre 2010

Console graphique avec grub2 sous Debian

Le passage à grub2 sous Debian a entraîné quelques changements dans la configuration du bootloader, et notamment si on souhaite obtenir une console graphique au moment du boot et pas seulement 25 lignes et 80 colonnes de texte.

À noter que l’ancienne méthode fonctionne toujours, à savoir passer un argument supplémentaire du type vga=788 dans les paramètres du noyau, mais ça n’est plus la méthode recommandée.

Si on regarde dans le fichier /etc/default/grub, on constate la présence d’un paramètre GRUB_GFXMODE qui permet de spécifier une résolution pour les consoles graphiques. Celui-ci fonctionne pour l’invite de grub (celle où vous pouvez choisir quel noyau booter), mais n’est pas prise en compte pour la console qui s’affiche ensuite. Pour cela il manque en effet un paramètre, que nous pouvons ajouter à l’aide de la ligne suivante dans /etc/default/grub :

GRUB_GFXPAYLOAD_LINUX=keep

Mettez ensuite à jour votre grub :

$ sudo update-grub

Et voilà ! Vous devriez normalement avoir une jolie console graphique au prochain démarrage.

En guise de complément, on pourra aussi noter que :

  • on peut configurer la police de la console graphique et sa taille en modifiant les paramètres FONTFACE et FONTSIZE du fichier /etc/default/console-setup.
  • si vous ne savez pas quelle résolution indiquer dans GRUB_GFXMODE, vous pouvez ouvrir une console grub en tapant sur c à l’invite de grub et tapez ensuite la commande vbeinfo, qui liste les modes graphiques supportés par votre système.

lundi 30 août 2010

How to automatically generate timelines that can be split between several pages

I recently wanted to create a PDF timeline that could be automatically split between several A4 pages for later cutting and pasting. After a bit of LaTeX and Ruby I finally came out with a little timeline-generator script :

http://github.com/juba/timeline-generator

The principle is quite simple : you specify several parameters in a config file such as the start and end dates, the number of A4 sheets, the sheets orientation, etc., and the script generates two PDF files : one with your timeline on one big page, and another with the same timeline split between the given number of A4 pages. To make cut-and-pasting easier, the second file includes crop marks and a small overlapping between pages.

To take a look at what the generated files look like :

The title, months names and number formatting are in french, but english is also supported.

Optionally, a calendar scale (days and months of year) and a time of day scale (hours and minutes) can be added at the bottom of the timeline. The idea is to allow some comparisons such as «if the 0 to 2010 timeline was a day, the World War II would have taken place between 23h09 and 23h14. If it was a year, it would have happened between December 18th and December 20th».

If you have access to a functional installation of Ruby and PDFLaTeX, the script should be quite easy to use. Everything is explained in the README file on GitHub.

But if you are interested by this type of timeline, don’t hesitate to drop me a mail or a comment with the main parameters (start and end date, number of sheets…), and I’ll generate and send you back the PDF files.

Générer automatiquement des frises chronologiques sur plusieurs pages

Je me suis récemment amusé à essayer de fabriquer des frises chronologiques avec l’idée de les imprimer sur plusieurs pages A4 pouvant être découpées et réassemblées par la suite. Comme je ne voulais pas faire ça à la main et avoir quelque chose de réutilisable, j’ai mélangé un peu de Ruby et de LaTeX, ce qui a donné un script automatique de génération de chronologies :

http://github.com/juba/timeline-generator

Le principe est assez simple : vous indiquez dans un fichier de configuration différents paramètres, dont évidemment la date de départ, la date de fin, le nombre de feuilles A4, leur orientation, etc., etc. (quasiment tous les aspects de mise en page sont configurables), et le script vous génère deux fichiers PDF : l’un avec votre frise chronologique sur une seule grande page, et l’autre découpée en autant de feuilles A4 que désiré. Avec en plus, si c’est pas le bonheur, des marques pour la découpe et un petit recouvrement d’une page sur l’autre pour faciliter l’assemblage.

Pour avoir un aperçu du résultat :

Vous remarquerez au bas de la chronologie une petite originalité : la présence d’un axe représentant les jours et mois de l’année, et d’un autre représentant les heures de la journée. L’idée est de pouvoir effectuer des comparaisons du genre «si la période de 0 à 2010 était une journée, la seconde guerre mondiale aurait lieu entre 23h09 et 23h14. Si c’était une année, elle aurait eu lieu entre le 18 et le 20 décembre». Je ne sais pas encore si c’est une bonne idée ou si c’est plus perturbant qu’autre chose, mais en tous cas on peut supprimer ces “extras” dans le fichier de configuration.

Si vous avez une installation fonctionnelle de Ruby et PDFLaTeX sur votre machine, ça devrait être assez simple à faire tourner, les explications sont données dans le fichier README sur Github (en anglais).

Dans le cas contraire, si vous êtes intéressé par une chronologie de ce type, n’hésitez pas à m’envoyer un mail avec les principaux paramètres (date de départ, date de fin, nombre de pages…) et je vous renverrai le résultat.

Bon, reste plus qu’à trouver un mur pour afficher tout ça, maintenant… :-)

lundi 8 mars 2010

Comment protéger une adresse mail destinée à un enfant ?

L’autre jour ma fille de six ans et demi a eu envie que je lui installe un client mail sur son interface sur notre ordi familial. J’ai trouvé que c’était une bonne idée, mais je ne voulais évidemment pas utiliser une adresse ouverte à tous les vents, avec risque notamment de recevoir des spams inappropriés. La cahier des charges était donc le suivant :

  • que les deux parents reçoivent systématiquement une copie des messages reçus sur la boîte ;
  • que les messages reçus sur la boîte mail ne soient diffusés qu’après validation manuelle de la part d’un des deux parents ;
  • ajouter la possibilité de “whitelister” certaines adresses d’expédition pour ne pas avoir à valider systématiquement les messages qui en proviennent

Oui, bon, je sais, ça fait un peu big brother, mais vu le type de spam qu’on reçoit parfois, y compris sur des adresses a priori totalement privées, je préfère bétonner un maximum pour l’instant.

Je me suis demandé comment faire ça avec Postfix, Procmail ou je ne sais quel assemblage d’applications que j’utilise pour le mail, et puis j’ai finalement trouvé une solution que je trouve pas trop compliquée, et qui passe par la création d’une liste de diffusion, ici avec Mailman.

Donc voici la marche à suivre :

  1. Créer une liste de diffusion nommée prenom@domaine.org (l’adresse mail publique attribuée à l’enfant)
  2. Mettre les mails des parents comme administrateurs de la liste
  3. La configurer pour que tous les envois soient modérés par défaut, avec validation manuelle des administrateurs de la liste
  4. Créer une adresse mail “de transit” du type mail.prenom@domaine.org
  5. Abonner à la liste prenom@domaine.org les deux parents, ainsi que mail.prenom@domaine.org
  6. Configurer le client mail sur l’ordi familial pour aller lire les mails sur la boîte mail.prenom@domaine.org, tout en envoyant les mails avec l’adresse prenom@domaine.org

Et voilou ! À partir de là, chaque message envoyé à prenom@domaine.org passe par une phase de modération, et les deux parents reçoivent un mail avec un lien leur permettant de rejeter ou valider le message, et en plus la possibilité de placer l’expéditeur sur liste blanche (ou liste noire) pour éviter les validations ultérieures. Une fois le message validé, il est ensuite transféré de manière transparente sur la boite mail.prenom@domaine.org (donc à l’enfant) et sur les boîtes des parents.

Voilà, je ne sais pas si c’est très clair, mais ça a le mérite de fonctionner en tous cas :-)

Comment révoquer une clé PGP

Je viens de révoquer une clé PGP avec GnuPG pour une ancienne adresse mail. Voici la marche à suivre.

D’abord il faut noter l’identifiant de la clé publique que l’on souhaite révoquer. Pour cela on fait un :

$ gpg --list-keys

Et on note l’identifiant (8 caractères hexadécimaux du type A1B2C3D4). Ensuite on génère un certificat de révocation qu’on stocke dans un fichier :

$ gpg --gen-revoke A1B2C3D4 > revoke.txt

Puis on importe ce certificat de révocation :

$ gpg --import revoke.txt

On exporte la clé publique désormais révoquée :

$ gpg --export -a A1B2C3D4

On peut alors uploader la sortie de cette dernière commande sur un serveur de clé type pgp.mit.edu et d’ici peu, le monde entier sera informé que votre clé ne doit plus être utilisée.

mercredi 10 février 2010

Don't put a dot in your cronjobs names !

So you just setup a wonderful new cron job on your server that will make your life easier and your family happy. You put it in your /etc/cron.d in a file called wonderfulcronjob.sh but… your job is never launched.

You checked the permissions, the crontab syntax, ran the script manually, evertything is fine. You checked your syslog, but nothing is reported on it, not even the fact that the job is started. What’s the problem ?

The answer is in the run-parts manual page :

If the —lsbsysinit option is not given then the names must consist entirely of upper and lower case letters, digits, underscores, and hyphens.

So if you put a dot in your cron job name, it will not be run at all. Rename it to wonderfulcronjob-sh or just wonderfulcronjob and everything should work fine.

Thanks to birdy for finding this one…

- page 1 de 5