Deblan blog

Informatique

[Astuce] i3wm : liste des processus les plus actifs

Quand j'utilisais conky, l'un de mes objectifs était de connaître la liste des processus les plus actifs. En effet, il n'était pas rare (et ça continue aujourd'hui) qu'un programme s'affole un peu en mangeant un peu trop de ressources. Mon passage à i3-wm m'a légitiment fait abandonner conky puisque j'ai toujours une fenêtre affichée en plein écran. Du coup, j'ai décidé d'ajouter une barre qui s'affiche uniquement quand j’appuie sur une touche.

Voici un aperçu : i3-wm : barre de processus

Le code source du script est en shell :

#!/bin/sh                                          

echo "{\"version\":1}"

INFO='#E9F1FF'
NORMAL='#B3FF6C'
WARNING='#FF6836'
CRITICAL='#FF474A'

echo "[[]"

while true; do
	(
		echo -n ",["
		
		ps ux --sort -%cpu | head -n 30 | sed 's/\s\{2,\}/ /g' | cut -d" " -f3,11 | uniq | grep -v uniq | egrep -v '^0.0' | egrep '^[0-9.]* [a-z]' | while read cpu bin; do
			if [ $(echo "if (${cpu} < 3 ) 1 else 0" | bc) -eq 1 ]; then
				COLOR=$INFO
			elif [ $(echo "if (${cpu} < 40.0 ) 1 else 0" | bc) -eq 1 ]; then
				COLOR=$NORMAL
			elif [ $(echo "if (${cpu} < 70.0 ) 1 else 0" | bc) -eq 1 ]; then
				COLOR=$WARNING
			else
				COLOR=$CRITICAL
			fi
			echo -n "{\"full_text\": \" $bin ($cpu%) \", \"color\": \"$COLOR\"}," 
		done
		
		echo "]"
	) | sed 's/,\]/]/'
		
	sleep 5
done

Au niveau de la conf de i3, voila comment j'ai procédé :

bar {
    status_command /chemin/vers/le/script
    workspace_buttons yes
    position top
    tray_output none
    mode hide
    modifier mod1

    /* d'autres confs */    
}

That's all folks!


Chiffrement des données sur le Wall

Une mise à jour majeure a été déployée sur le colorisateur de code. En effet, il est maintenant possible de chiffrer les sources que vous envoyez.

J'ai choisi d'utiliser l’algorithme AES avec une clé de 256-bit et une passphrase de 256 caractères.

La clé est placée dans l'URL via une ancre. Coté serveur, je n'enregistre que le message chiffré. Le chiffrage (comme le déchiffrage) est fait par votre navigateur uniquement.

Voici un code chiffré sans clé : https://wall.deblan.org/x1a29/texte/0/, et le lien complet pour le lire correctement : https://wall.deblan.org/x1a29/texte/0/#aes=pmCMT59...

Je rappel que le Wall est un projet libre et que vous avez la possibilité de le forker :

$ git clone git://git.deblan.org/wall-deblan.git

Comment remplacer Google ?

Cette notion de vie privée ébranlée par cette surveillance à grande échelle amène à se poser tout un tas de questions. La première et sans doute l'une de plus compliquée sont les outils : comment remplacer des outils qui fonctionnent bien mais qui deviennent une contrainte pour sécuriser sa vie privée ?

Google a une place dominante sur Internet. Moteur de recherche, réseau social, email, vidéos, c'est bien l'ensemble de ces outils qu'il faut remplacer par d'autres libres, ouverts et respectueux de ses utilisateurs.

Je n'ai pas toutes les réponses et je suis conscient qu'il n'existe pas toujours de si bonne alternative. D'ailleurs, c'est sans doute l'une des forces de Google (et entreprise du genre) : leurs outils sont suffisamment bien pensés pour aguicher les plus extrémistes d'entre nous.

Concrètement, que pouvons-nous mette en place pour se passer de Google ? De mon coté, mes habitudes ont été updatées et encore beaucoup de travail m'attends.

Commençons par les emails. Cela fait maintenant plusieurs années que j'ai de quoi envoyer et recevoir des emails chez moi. J'utilise la solution postfix pour envoyer et recevoir mes courriers en *@deblan.*. Bien que l'installation complète et sécurisée d'un serveur de mail ne soit pas toujours évidente, aujourd'hui ça fonctionne bien et j'arrive à passer les filtres anti-spam même si je suis derrière une IP de ligne ADSL. Des solutions complémentaire comme postgrey et spamassassin permette de garantir un filtre suffisamment robuste pour ne pas s'en prendre trop dans la tronche.
Pour les moins courageux, je vous invite à vous dirigez vers des associations comme Rhien.

Les parties "réseau social" et "vidéos" sont assez sensibles. En effet, c'est en effet de masse seulement que les choses pourraient changer. La visibilité des données devient plus ou moins importante selon le profil des utilisateurs et il m'est impossible de recommander un outil plus qu'un autre. Il est existe du logiciel libre "social" comme StatusNet et Twister, ou encore Diaspora, caractérisés avant tout par leur utilisation décentralisée, mais seule une minorité d'internautes les ont installés.
Du coté des plateformes vidéos, pas mal de solutions web-based sont disponibles et des outils comme Wordpress peuvent facilement accueillir ce type de contenus. il y a deux problèmes plus ou moins importants : si on héberge son contenu à la maison, en dehors des lignes VDSL ou en fibre optique, les débits ne sont pas suffisants pour assurer un service digne de ce nom. J'aurais tendance à privilégier les réseaux P2P mais ça reste compliqué et ça sort des sentiers battus du streaming. Pour une médiathèque plus ou moins avancée, il pourra être intéressant d'utiliser Owncloud. Owncloud est d'ailleurs une excellente alternative à l'espace de stockage Google Drive ou à l'agenda de Google Calendar. Par ailleurs, il permet maintenant l'édition de document collaborative.

Sans faire le tour complet de Google, il reste à présent le moteur de recherche à remplacer. Personnellement, j'ai mis quelques temps avant de pouvoir m'en défaire. Il faut avouer qu'il est performant mais la politique de Google me déplait et mes données personnelles passent avant tout. J'ai épluché quelques solutions et j'ai utilisé, pendant un court temps, Seeks. Il fait office de proxy et agrège différents moteurs de recherches pour récupérer des résultats. Bien que le projet soit extrêmement intéressant, il ne m'a pas convaincu (mais je garde sous le coude !). Duck Duck Go est un moteur qui s'appuie sur Google mais rend nos requêtes anonymes. Il fonctionne bien mais j'aimerais autre chose que des résultats textuels. Typiquement, quand je recherche le titre d'un artiste, j'ai envie qu'on me propose aussi des vidéos et des images. Du coup, je me suis retranché sur Qwant, un moteur de recherche Français avec la législation française avec lui (et moi). Il fonctionne pas mal même si certaines requêtes m'ont amené trop peu de résultats pertinents. Cependant, il accueil les fonctionnalités que je cherchais avec une interface plutôt sympatique.


Le wall a lui aussi été mis à jour !

Après le service d'indentation, c'est au tour du Wall (service de colorisation syntaxique) de subir quelques mises à jour.

Il s'affiche à présent mieux sur des écrans peu larges (sans pour autant être responsive design) et une nouvelle fonctionnalité est apparue et concerne les langages de balisage (HTML et XML), le Javascript et le PHP. On peut à présent cocher une case pour indenter le code.

L'indentation du HTML et du XML repose sur mon algo d'indentation utilisé sur Markup language indenter. Les sources sont libres donc je vous laisse fouiller pour trouver le code.

Concernant le Javascript, j'ai utilisé JS-Beautify qui provient du service en ligne Jsbeautifier.

Le PHP est quant à lui traité par PHP-CS-Fixer, écrit par Fabien Potencier (le papa de Symfony).

L'indenteur XML et PHP-CS-Fixer font partie des sources du wall. Si vous forkez mon projet, vous devrez installer js-beautify de manière à le rendre accessible via /usr/local/bin/js-beautify.

Le Wall est totalement libre et vous pouvez récupérer les sources via GIT :

$ git clone git://git.deblan.org/wall-deblan.git

Générer des PDF dans Symfony2

La génération de PDF fait souvent partie des cahiers des charges de projets de moyenne et grande envergure. Il existe quelques outils comme HTML2PDF qui repose sur FPDF ou TCPDF. Cependant, bien qu'ils soient puissants et fonctionnels, leur utilisation peut très vite devenir complexe quand il s'agit de mettre en forme précisément les contenus.

C'est pourquoi nous avons décidé d'utiliser Wkhtmltopdf. Ce petit bijou a la particularité de reposer sur un moteur de rendu Webkit. Le javascript est interprété et des plugins additionnels (comme Flash) peuvent être ajoutés. En plus de ça, il interprète extrêmement bien le CSS et toutes les balises HTML sont prises en compte.

Bon, trêve de bavardage, voici comment l'installer et l'utiliser.

Je travail avec Debian Wheezy, que ce soit sur mon poste de développement ou sur les serveurs en production. Vous devrez donc adapter la suite de l'article à votre système.

Installation de Wkhtmltopdf
Coté système
$ su - 
# aptitude update
# aptitude install wkhtmltopdf

Wkhtmltopdf a besoin d'un serveur X pour fonctionner. Comme les serveurs n'en disposent pas, nous allons installer xvfb qui permet d'en créer un virtuel.

# aptitude install xvfb

Il faut ensuite préparer un wrapper pour lancer wkhtmltopdf via xvfb :

# cat > /usr/bin/wkhtmltopdf.sh << EOF
#!/bin/sh

xvfb-run -a wkhtmltopdf "$@"
EOF
# chmod +x /usr/bin/wkhtmltopdf.sh
Coté Symfony2

KNP Labs a développé un bundle dédié à wkhtmltopdf. Ke vais passer par composer pour l'intégrer au framework :

$ cd /chemin/vers/le/projet
$ ./composer.phar require knplabs/knp-snappy-bundle

Activons à présent le bundle dans AppKernel.php :

$bundles = array(
    /* ... */
    new Knp\Bundle\SnappyBundle\KnpSnappyBundle(),
)

Il est nécessaire de le configurer en indiquant le chemin de wkhtmltopdf. Dans le fichier app/config/config.yml, ajoutez ces lignes :

knp_snappy:
    pdf:
        enabled:    true
        binary:     /usr/bin/wkhtmltopdf.sh
        options:    []

Videz le cache et lisez la doc pour savoir comme il fonctionne. Un truc intéressant à savoir : il utilise des feuilles de styles dédiées à l'impression.

Une astuce pour gérer la pagination

Bien qu'il soit ultra puissant, il n'y a pas d'outil pour gérer la pagination. Wkhtmltopdf va récupérer du code HTML et convertir le tout en PDF. En fonction de la taille de la page (qui est paramétrable) et de son format (portait ou paysage), il va enquiller le contenu et générer une page quand il sera nécessaire de le faire. Si vous souhaitez faire des sauts de page, vous devrez faire un peu de javascript. Voici la démarche que j'ai employée pour un projet.

J'ai découpé le contenu en différentes divisions portants la classe "print-page". Chaque division représente un contenu qui doit nécessairement être affiché en début de page. Dans mon projet, j'ai utilisé un rendu en A4 paysage et la zone représentant le contenu fait 1340px de largeur pour 934px de hauteur. Il suffit à présent de modifier la hauteur des divisions en calculant le nombre de pages nécessaires à leur affichage.

// Dépend de jQuery

var page_height   = 934;
var $print_pages  = $('.print-page');

$print_pages.each(function(i, v) {
	var $content    = $(this);	
	var height      = $content.height();
	var pages_count = 1;
	var newheight   = pages_count * page_height;

	while(height - 20 > newheight) {
		pages_count++;
		newheight = pages_count * page_height;
	}
	
	$content.css({height: newheight});
});

Il est également important d'indiquer des largeurs à vos contenus car j'ai eu quelques problèmes de génération avant de le faire.