Deblan blog

Futilités de Geek

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 service d'indentation a été mis à jour !

Il y a plusieurs années, j'ai mis en place un outil en ligne pour indenter les codes-sources qui reposent sur des langages de balisage.

Une partie de l'interface était développeé sur du CSS qui n'était plus disponible (très ancienne version du blog). J'ai donc effectué une refonte complète du code et j'ai amélioré l'algo.

Indentation

Cet outil est bien évidement totalement libre et je vous invite à le forker comme bon vous semble :

svn co https://svn.deblan.org/svn/indentation.deblan.org

Installer un serveur Sync (Firefox) à la maison

Dans ma conquête vers auto-suffisance et pour écarter encore plus mes données persos des USA, j'ai décidé d'installer mon propre serveur de synchronisation pour Firefox.

Pour rappel, Firefox permet de synchroniser vos terminaux par le biais d'une fonction "Sync". Ainsi vous concervez les mêmes marque-pages, historique, modules complémentaires, etc. entre les différents terminaux que vous manipulez.

Par défaut, ce sont sur des serveurs à Mozilla où les données sont enregistrées. Elles sont évidément chiffrées mais stockées on ne sait pas trop où....enfin si, aux USA. Certains diront que tant que c'est chiffré, on s'en fiche vers où elles partent et c'est à moitié vraie. Cependant, le jour où l'ago de chiffrement sera cassé, ces données aujourd'hui indéchiffrables le deviendront et je préfère les savoir chez moi.

Comment installer son propre serveur Sync ? C'est très simple et voici les étapes de configuration.

Voici mes contraintes :

  • Un domaine dédié (sync.deblan.org)
  • Transactions HTTP chiffrées (HTTPS)

Pour rappel, je travail sur Debian et j'ai déjà un serveur web Apache installé.

Étape 1 : installation des paquets nécessaires
$ su - 
# aptitude update
# aptitude install python-dev mercurial sqlite3 python-virtualenv libssl-dev libapache2-mod-wsgi
# aptitude clean
# a2enmod wsgi
# service apache2 restart
Étape 2 : installation de Sync server

Dans ma procédure de création de vhost pour Apache, je génère systématiquement un nouvel utiliseur unix. Dans le cas de Sync, il s'appel "websync". Son répertoire personnel est chez moi : "/services/web/www/sync.deblan.org".

# su - websync
$ mkdir public_html logs databases
$ chmod 700 logs databases
$ hg clone https://hg.mozilla.org/services/server-full
$ cd server-full
$ make build
Étape 3 : configuration de Sync server

Dans le répertoire server-full/" se trouve un fichier "development.ini". Éditez-le et ajoutez ces informations. Ici je vais conserver SQLite pour enregistrer les données.

# De base, Sync server permet à n'importe qui de s'inscrire pour synchroniser ses données.
# Vous pouvez activez un Captcha pour bloquer les bots
# Passez simplement use à true
[captcha]
use = false
public_key = 6Le8OLwSAAAAAK-wkjNPBtHD4Iv50moNFANIalJL
private_key = 6Le8OLwSAAAAAEKoqfc-DmoF4HNswD7RNdGwxRij
use_ssl = true

[storage]
backend = syncstorage.storage.sql.SQLStorage
# À modifier selon vos répertoires
sqluri = sqlite:////services/web/www/sync.deblan.org/databases/storage.db
standard_collections = false
use_quota = true
# Un quota de 25Mo : par défaut à 5Mo
quota_size = 25120
pool_size = 100
pool_recycle = 3600
reset_on_return = true
display_config = true
create_tables = true

[auth]
backend = services.user.sql.SQLUser
# À modifier selon vos répertoires
sqluri = sqlite:////services/web/www/sync.deblan.org/databases/auth.db
create_tables = true
pool_size = 100
pool_recycle = 3600
create_tables = true
# Décommentez la ligne suivante pour ne pas autoriser d'inscription.
# Note : il est nécessaire des les autoriser le temps d'ajouter votre compte
# allow_new_users = false

[nodes]
# Nécessaire pour que ça puisse fonctionner...
fallback_node = https://sync.deblan.org/

[smtp]
host = localhost
port = 25
sender = no-reply@deblan.fr

[cef]
use = true
file = syslog
vendor = mozilla
version = 0
device_version = 1.3
product = weave

[reset_codes]
backend = services.resetcodes.rc_sql.ResetCodeSQL
# À modifier selon vos répertoires
sqluri = sqlite:////services/web/www/sync.deblan.org/databases/reset.db
create_tables = True
Étape 4 : configuration d'Apache

Dans ce Vhost, j'utilise le module WSGI (pour jouer avec Python) mais également Suexec pour ma politique de sécurité. J'ai également des certificats SSL qui ne sont pas ceux par défaut. Il ne faut donc pas faire un "bête" copié/collé car ça ne va pas fonctionner.

# cat /etc/apache2/sites-available/sync.deblan.org.443 
<IfModule mod_ssl.c>
<VirtualHost *:443>
	# À modifier
	ServerName sync.deblan.org
	# À modifier (public_html est un répertoire vide)
	# /var/www/service-web/www/ == /services/web/www/ (contraintes php-fastcgi)
	# @see https://www.deblan.io/post/407/Serveur-web-Debian-Apache2-et-FastCGI
	DocumentRoot /var/www/service-web/www/sync.deblan.org/public_html
	SuexecUserGroup websync webgroup
	ErrorLog /services/web/logs/sync.deblan.org.log
	CustomLog /services/web/logs/sync.deblan.org.log combined
	CustomLog /services/web/logs/sync.deblan.org.log trafic

	WSGIProcessGroup sync
	# Modifier "websync" selon le user créé pour l'occasion
	WSGIDaemonProcess sync user=websync group=websync processes=2 threads=25
	WSGIPassAuthorization On
	# À modifier selon vos répertoires
	WSGIScriptAlias / /services/web/www/sync.deblan.org/server-full/sync.wsgi

	# À modifier selon vos répertoires
	<Directory /var/www/service-web/www/sync.deblan.org>
		Options -Indexes SymLinksIfOwnerMatch MultiViews
		AllowOverride All
		Order allow,deny
		allow from all
		Options +ExecCGI
	</Directory>

	# Ne fonctionnera pas tel quel chez vous
	SSLEngine on
	SSLCertificateFile    /etc/apache2/ssl/deblan/org/deblanorg.crt
	SSLCertificateKeyFile /etc/apache2/ssl/deblan/org/deblanorg.key
	SSLCACertificateFile  /etc/apache2/ssl/deblan/org/GandiStandardSSLCA.pem

	BrowserMatch MSIE [2-6] \
		nokeepalive ssl-unclean-shutdown \
		downgrade-1.0 force-response-1.0
	BrowserMatch MSIE [17-9] ssl-unclean-shutdown
</VirtualHost>
</IfModule>
# a2ensite sync.deblan.org.443
# service apache2 reload

Il ne reste plus qu'à supprimer et recréer un compte Sync en spécifiant que vous utilisez un serveur personnel. Si tout se passe bien, les bases de données SQLite vont être générées. En cas de problème, il "suffira" de regarder ce que les logs racontent coté serveur et de regarder ceux présents chez vous via : about:sync-log.


Afficher les joies du code dans conky

Vous êtes fan des joies du code et vous aimeriez afficher le dernier article sur votre bureau ? Voici une solution écrite en PHP.

Note : je bosse sous Debian, il faudra adapter le gestionnaire de paquet si vous utilisez une autre distribution.

Etape 1 : préparation du répertoire de travail
mkdir -p ~/.conky/les_joies_du_code
Etape 2 : installation des logiciels nécessaires
  • Conky : sans lui, on ne ferait pas grand chose !
  • Php : pour pouvoir exécuter le script qui va arriver
  • Gifsicle : pour récupérer les frames d'un GIF
$ su - 
# aptitude update && aptitude install conky php5 gifsicle
Etape 3 : préparation du cron
$ cd ~/.conky/les_joies_du_code
$ vim cron
#!/bin/sh

cd "$(dirname $0)"

CONF="$(./update 2>/dev/null)"

if [ -n "$CONF" ]; then
	echo "$CONF" > config
fi
Etape 4 : installation du script de mise à jour

Note : il a été fait un peu à l'arrache mais il a le mérite de fonctionner :) Désolé pour les puristes qui liront ces quelques lignes.

$ cd ~/.conkytheme/les_joies_du_code
$ vim update
#!/usr/bin/php
<?php

// Config

$screen_width = 1920;
$position_y   = 50;
$rss_url = 'http://lesjoiesducode.tumblr.com/rss';

// Config end

chdir(dirname($argv[0]));
$pwd = getcwd().'/';

// Création des répertoires de travail
if (!is_dir('tmp')) {
    mkdir('tmp');
}

if(!is_dir('tmp/images')) {
    mkdir('tmp/images');
}

// Récupération du flux RSS
$rss_file = @file_get_contents($rss_url);

if (!$rss_file) {
    die(1);
}

// Parsing du flux et surtout du dernier article posté
$schema    = simplexml_load_string($rss_file);
$channel   = $schema->channel;
$last_item = $channel->item[0];

preg_match('`src="([^"]+)"`', $last_item->description, $img);

if (!$img) {
	die(1);
}

// Récupération du titre
$title = ucfirst($last_item->title);

// Récupération du GIF
file_put_contents('tmp/gif', file_get_contents($img[1]));

list($width, $height) = getimagesize('tmp/gif');

$position_x = $screen_width - $width - 20;

// Récupération des frames du gif
shell_exec('rm -rf tmp/images/*; gifsicle --unoptimize --explode tmp/gif --output tmp/images/frame');

$frames = glob('tmp/images/*');

if (!$frames) {
	die(1);
}

// Génération du fichier de configuration pour conky
echo <<< EOF
total_run_times 0
out_to_console no
double_buffer yes
no_buffers no
text_buffer_size 4096
update_interval .24

alignment top_left
minimum_size $width 5
maximum_width $width 50
gap_x $position_x
gap_y $position_y

draw_shades yes
draw_outline no
draw_borders no
border_width 1
border_margin 1

background no

own_window yes
own_window_hints undecorated,below,skip_taskbar,skip_pager,sticky
own_window_type override
own_window_transparent yes

use_xft yes
xftalpha .1
override_utf8_locale yes
xftfont Fixed:size=7
uppercase no

uppercase no
use_spacer right

default_color FFFFFF
default_shade_color 333333
default_outline_color black

color1 FFFFFF
color2 999999

imlib_cache_size 0
template1 $pwd/tmp/images/frame.
template2 -p 0,60 -s ${width}x${height}

TEXT

\${color1}\${font Astron Boy Video:style=Bold:pixelsize=15}Les joies du code\${font}

\${color2}$title

EOF;

foreach ($frames as $k => $frame) {
	list($temp, $num) = explode('.', $frame);
	echo '${if_updatenr '.($k+1).'}${image ${template1}'.$num.' ${template2}}${endif}'."\n";
}

Vous remarquerez 3 variables de configuration au début du fichier :

  • $screen_width : la résolution de la largeur de votre écran pour que le script calcule et place correctement le conky à droite de l'écran
  • $position_y : la position verticale du conky
  • $rss_url : l'url du flux RSS. Vous pouvez ainsi configurer le script pour les joies du sysadmin
Etape 5 : création de la tâche cron
$ cd ~/.conky/les_joies_du_code
$ chmod u+x cron update
$ crontab -e
*/20 *   * * * $HOME/.conky/les_joies_du_code/cron
Etape 6 : on test si ça fonctionne
$ ~/.conky/les_joies_du_code/cron
$ conky -q -c ~/.conky/les_joies_du_code/config

Conky - Les joies du code


[Tips] Zoomer et dé-zoomer dans urxvt

Un billet court pour expliquer rapidement comment zoomer et dézoomer dans un terminal urxvt (rxvt-unicode).

L'objectif est le même que ctrl+/- dans un navigateur : modifier la taille des caractères dynamiquement.

Le code de base est le suivant :

printf '\33]50;%s\007' "xft:Terminus:pixelsize=XX"

Note : XX correspondant à la taille en pixels de la font (Terminus dans mon cas).

On va donc faire une première fonction qui va lancer cette commande à la volée. De mon coté j'utilise ZSH mais si vous préférez Bash ça sera sensiblement la même chose.

zoom() {
	printf '\33]50;%s\007' "xft:Terminus:pixelsize=$1"
}

Après avec recharger la conf de votre interpréteur de commande, vous pourrez la tester comme ça :

$ zoom 15
$ zoom 20

On va maintenant ajouter deux autres fonctions qui vont augmenter et diminuer progressivement la taille (à la manière d'un navigateur).

URXVT_SIZE=20
URXVT_PROGRESS_SIZE=5

zp() {
	URXVT_SIZE=$(echo "$URXVT_SIZE+$URXVT_PROGRESS_SIZE" | bc )
	zoom $URXVT_SIZE
}

zm() {
	URXVT_SIZE=$(echo "$URXVT_SIZE-$URXVT_PROGRESS_SIZE" | bc )
	zoom $URXVT_SIZE
}

Après rechargement de la conf, vous zoomerez avec la commande "zp" (zoom plus) et dé-zoomerez avec "zm" (zoom moins).

Pratique non ?