-
Godefroy de Compreignac
[SVN] Être averti en temps réel des commits envoyés
Quand on travaille sur un projet avec plusieurs personnes et qu'on utilise SVN, il peut être utile d'être averti en temps réel des commits qu'envoient les autres collaborateurs.
Je me suis inspiré de l'idée de Metrokid et du script de Christophe-Marie pour faire un petit script de notification par Cron.
Nous aurons besoin de la commande notify-send disponible dans le paquet libnotify-bin. Si vous ne l'avez pas, installez le :
$ sudo aptitude install libnotify-binEt voilà notre petit script, que nous nommerons .svn-monitor.sh et que nous placerons dans le dossier home de l'utilisateur courant ($HOME) :
#!/bin/bash
# Pour que cron sache sur quel moniteur afficher la notification
DISPLAY=:0.0
# Fichier dans lequel on stocke la date de dernière révision testée
LOGFILE=$HOME/.svn-monitor
# URL du dépôt SVN
SVNPATH=http://url-du-depot
# Nom d'utilisateur dont les révisions ne seront pas affichées
USERNAME=Skreo
# Icône utilisée dans la fenêtre de notification
ICON='/usr/share/icons/gnome/32x32/status/dialog-information.png'
# Durée d'affichage de la fenêtre de notification
DURATION=5000
# Révision à vérifier
if test -f $LOGFILE ; then
REV=$(( `cat $LOGFILE` +1 ))
else
REV=HEAD
fi
# Récupération du log de la dernière révision
TEXT=`svn log $SVNPATH -r $REV:HEAD | sed -r "s/^-+$/---/" | sed -r "s/^r([0-9]+) \| ([^ ]+) \| [^(]*\(([^)]+)\).*$/rév \1 par \2 le \3/"`
# Si on obtient un résultat, on l'affiche
if test "$TEXT" != "" ; then
# Détermination de la dernière révision
LASTREV=`echo -e "$TEXT" | sed -r "s/^(.*rév ([0-9]+) .*|.*)$/\2/" | awk NF | sort -nr | head -1`
# Suppression de l'affichage des révisions faîtes par $USERNAME
TEXT=`echo "$TEXT" | sed -r "s/$USERNAME/-/g"`
TEXT=`echo "$TEXT" | sed -r ':a;N;$!ba;s/---\nrév [0-9]+ par - .*\n---/---/g'`
# Suppression de la première et de la dernière ligne, et suppression des lignes vides
TEXT=`echo "$TEXT" | sed '1d' | sed '$d' | awk NF`
# Affichage de la notification
notify-send -t $DURATION -i "$ICON" "SVN" "$TEXT"
# Et on l'enregistre dans le fichier
echo $LASTREV > $LOGFILE
fiIl ne reste ensuite plus qu'à l'exécuter par cron toutes les 5 minutes par exemple.
Pour modifier les tâches cron :$ crontab -eLignes à ajouter dans le cron :
DISPLAY=:0.0
LANG=fr_FR.UTF-8
*/5 * * * * sh $HOME/.svn-monitor.sh
6 commentaires
[MySQL] Optimisation d'une recherche avec multiples jointures
J'ai été confronté à un problème de ralentissements sur EklaBlog dûs à une requête SELECT utilisant de multiples jointures. Nous allons voir dans cet article comment optimiser cela.
La requête en elle-même n'est pas très complexe et utilise uniquement des clés (primary et indexes), mais elle est très lente pour plusieurs raisons :
- Jointure sur 5 tables
- Recherche sur 4 champs chacun dans une table différente
- Tri par ORDER BY
Elle ressemble en gros à ceci :
SELECT a.id, a.blog, a.category_id, a.title, a.content, a.author, a.creadt, c.url
FROM mod_article a
INNER JOIN categories b ON b.id=a.category_id
INNER JOIN blogs c ON c.id=b.blog_id
INNER JOIN articles_tags at ON at.article_id=a.id
INNER JOIN tags t ON t.id=at.tag_id
WHERE t.name="skreo" AND a.online="1" AND b.protect="" AND c.protect=""
ORDER BY a.creadt DESC
LIMIT 10Les tables concernées sont relativement grosses :
- 130 000 entrées dans tags
- 1 400 000 entrées dans articles_tags
- 400 000 entrées dans articles
- 70 000 entrées dans categories
- 130 000 entrées dans tags
- 19 000 entrées dans blogs
D'où un temps d'exécution de la requête pouvant atteindre 30 secondes...
Lors d'un test en local, que je répèterai dans la suite de l'article, j'obtiens une exécution en 0.24s en moyenne quand le pc ne fait rien d'autre.
Solution possible
Une solution possible que m'a indiqué mon ami Guilhem est de stocker un résultat intermédiaire de la requête dans une table de type MEMORY (en RAM) :
CREATE TABLE tags_lookup (
article_id int(10) unsigned NOT NULL,
tag_id int(10) unsigned NOT NULL,
creadt int(10) unsigned NOT NULL,
blog_id int(10) unsigned NOT NULL,
KEY tag_id (tag_id),
KEY creadt (creadt),
KEY blog_id (blog_id)
) ENGINE=MEMORYIl faut ensuite remplir la remplir :
# On vide la table
TRUNCATE TABLE tags_lookup;
# Puis on la remplit entièrement
INSERT INTO tags_lookup
SELECT a.id AS article_id, at.tag_id, a.creadt, c.id AS blog_id
FROM articles a, categories b, blogs c, articles_tags at
WHERE a.online="1" AND b.protect="" AND c.protect=""
AND b.id=a.category_id AND c.id=a.blog_id AND at.article_id=a.id;Il faudra exécuter les requêtes ci-dessus régulièrement pour mettre à jour le contenu de la table, à l'aide d'un bash par exemple.
Pour obtenir les informations qu'on voulait au début, on peut alors exécuter cette requête :
SELECT a.id, a.blog, a.category_id, a.title, a.content, a.author, a.creadt, c.url
FROM tags t
INNER JOIN tags_lookup s ON s.tag_id=t.id
INNER JOIN articles a ON a.id=s.article_id
INNER JOIN categories b ON b.id=a.category_id
INNER JOIN blogs c ON c.id=a.blog _id
WHERE t.name="skreo"
ORDER BY s.creadt DESC
LIMIT 10Lors de mon test, j'obtiens cette fois-ci 0.15s d'exécution en moyenne, ce qui est déjà mieux.
Mais le gros avantage d'une telle structure, c'est qu'on va pouvoir faire une recherche beaucoup plus facile à comprendre pour le serveur MySQL, grâce à des requêtes imbriquées :
SELECT a.id, a.blog, a.category_id, a.title, a.content, a.author, a.creadt, c.url
FROM (
SELECT article_id
FROM tags_lookup
WHERE tag_id=(
SELECT id
FROM tags
WHERE name="skreo"
LIMIT 1
)
ORDER BY creadt DESC
LIMIT 10
) s
INNER JOIN articles a ON a.id=s.article_id
INNER JOIN categories b ON b.id=a.category_id
INNER JOIN blogs c ON c.id=a.blog_id
ORDER BY a.creadt DESC
LIMIT 10;Toujours avec la même base de données, j'obtiens cette fois-ci une exécution presque instantanée : entre 0 et 0.02 secondes !
Conclusion
En mettant en place une table en mémoire vive rassemblant des données correspondant à une partie du traitement d'une grosse requête, on peut donc éviter des jointures très lourdes.
Cette méthode a bien évidemment comme inconvénient d'avoir des données pas toujours ultra fraiches en mémoire, mais ça peut être un bon compromis quand on voit la rapidité des requêtes qui en résultent.
Vous avez d'autres solutions intéressantes ? une meilleure idée ?
5 commentaires
[Ubuntu] Mes nouveaux choix de logiciels
Ayant fait l'acquisition d'un magnifique joujou, un Dell XPS Studio, j'ai décidé de ne pas migrer mon ancienne partition /home, mais plutôt de refaire une installation propre de Ubuntu Jaunty Jackalope, et de changer certaine habitudes dans les logiciels que j'utilise.
Ainsi j'ai commencé par abandonner Kopete (Instant Messenger) et Amarok (Music player) qui sont devenus lourds et peu ergonomiques avec l'arrivée de la nouvelle version de KDE, du moins c'est mon avis. Comme quoi, il n'y a que les cons qui ne changent pas d'avis ! (Cf. un de mes commentaires sur un article précédent)J'ai donc remplacé Kopete par Pidgin qui est parfaitement intégré à Gnome, complet, et qui supporte un très grand nombre de protocoles. Je l'utilise donc avec mes comptes MSN, Jabber, et Facebook. Car Pidgin supporte même Facebook, avec un plugin disponible ici !
A la place d'Amarok, j'ai installé Exaile, son équivalent pour Gnome, certes un peu moins ergonomique que la version 1.4 d'Amarok, mais aussi efficace et avec sûrement autant de fonctionnalités.
Ensuite, je n'ai cette fois pas installé Azureus (Client Torrent), très efficace mais aussi très lourd (sûrement car c'est une application Java). À la place, j'ai préféré Deluge, un client léger, parfaitement intégré à Gnome, et offrant une rapidité impressionnante.Les logiciels que j'utilise maintenant principalement et qui me conviennent parfaitement sont donc :
29 commentaires
[LaTeX] Comment faire rapidement une facture super classe
J'ai fait mes premières factures récemment, et j'ai été complètement incapable de trouver la moindre application gratuite/libre permettant d'éditer facilement et rapidement une belle facture.
Donc comme je suis un peu kamikaze, j'ai passé des heures à m'améliorer en LaTeX en mettant au point un petit système pour éditer des jolies factures.
Pour ceux qui ne connaissent pas ou peu LaTeX, il existe de très bonnes FAQ, notamment :
Voici le code LaTeX de ma facture :\documentclass[french,11pt]{article}
\usepackage{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[a4paper]{geometry}
\usepackage{units}
\usepackage{bera}
\usepackage{graphicx}
\usepackage{fancyhdr}
\usepackage{fp}
\def\TVA{19.6} % Taux de la TVA
\def\TotalHT{0}
\def\TotalTVA{0}
\newcommand{\AjouterProduit}[3]{% Arguments : Désignation, quantité, prix unitaire HT
\FPround{\prix}{#3}{2}
\FPeval{\montant}{#2 * #3}
\FPround{\montant}{\montant}{2}
\FPadd{\TotalHT}{\TotalHT}{\montant}
\eaddto\ListeProduits{#1 & \prix & #2 & \montant \cr}
}
\newcommand{\AfficheResultat}{%
\ListeProduits
\FPeval{\TotalTVA}{\TotalHT * \TVA / 100}
\FPadd{\TotalTTC}{\TotalHT}{\TotalTVA}
\FPround{\TotalHT}{\TotalHT}{2}
\FPround{\TotalTVA}{\TotalTVA}{2}
\FPround{\TotalTTC}{\TotalTTC}{2}
\global\let\TotalHT\TotalHT
\global\let\TotalTVA\TotalTVA
\global\let\TotalTTC\TotalTTC
\cr \hline
Total HT & & & \TotalHT \cr
TVA \TVA~\% & & & \TotalTVA \cr
\hline \hline
\textbf{Total TTC} & & & \TotalTTC
}
\newcommand*\eaddto[2]{% version développée de \addto
\edef\tmp{#2}%
\expandafter\addto
\expandafter#1%
\expandafter{\tmp}%
}
\newcommand{\ListeProduits}{}
%%%%%%%%%%%%%%%%%%%%% A MODIFIER DANS LA FACTURE %%%%%%%%%%%%%%%%%%%%%
\def\FactureNum {1} % Numéro de facture
\def\FactureAcquittee {non} % Facture acquittée : oui/non
\def\FactureLieu {Paris} % Lieu de l'édition de la facture
\def\FactureObjet {facture pour te faire payer} % Objet du document
% Description de la facture
\def\FactureDescr {%
Cette facture concerne la réalisation du site web machin-truc.com, son hébergement, et la location du nom de domaine
}
% Infos Client
\def\ClientNom{M. Dupont} % Nom du client
\def\ClientAdresse{% % Adresse du client
12, rue de la Geekerie \\
75000 Paris
}
% Liste des produits facturés : Désignation, quantité, prix unitaire HT
\AjouterProduit {Réalisation du site} {1} {1600}
\AjouterProduit {Hébergement -- 1 mois} {3} {10}
\AjouterProduit {Nom de domaine -- 1 an} {1} {8}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\geometry{verbose,tmargin=4em,bmargin=8em,lmargin=6em,rmargin=6em}
\setlength{\parindent}{0pt}
\setlength{\parskip}{1ex plus 0.5ex minus 0.2ex}
\thispagestyle{fancy}
\pagestyle{fancy}
\setlength{\parindent}{0pt}
\renewcommand{\headrulewidth}{0pt}
\cfoot{
Ma Société SARL au capital de 3000 € ~--~ 34, rue du Brainfuck - 75000 Paris\newline
\small{
Telephone : +33(0)6 12 34 56 78 ~--~ Site web : www.ma-societe.com ~--~ E-mail : contact@ma-societe.com\newline
RCS Paris 512 569 485 ~--~ Code APE 6201Z ~--~ Numéro TVA : FR 56-512-569-485
}
}
\begin{document}
% Logo de la société
\includegraphics{logo.jpg}
% Nom et adresse de la société
Ma Société SARL \\
34, rue du Brainfuck \\
75000 Paris
Facture n°\FactureNum
{\addtolength{\leftskip}{10.5cm} %in ERT
\textbf{\ClientNom} \\
\ClientAdresse \\
} %in ERT
\hspace*{10.5cm}
\FactureLieu, le \today
~\\~\\
\textbf{Objet : \FactureObjet \\}
\textnormal{\FactureDescr}
~\\
\begin{center}
\begin{tabular}{lrrr}
\textbf{Désignation ~~~~~~} & \textbf{Prix unitaire} & \textbf{Quantité} & \textbf{Montant (EUR)} \\
\hline
\AfficheResultat{}
\end{tabular}
\end{center}
~\\
\ifthenelse{\equal{\FactureAcquittee}{oui}}{
Facture acquittée.
}{
À régler par chèque ou par virement bancaire :
\begin{center}
\begin{tabular}{|c c c c|}
\hline \textbf{Code banque} & \textbf{Code guichet} & \textbf{N° de Compte} & \textbf{Clé RIB} \\
59763 & 00726 & 41652387462 & 98 \\
\hline \textbf{IBAN N°} & \multicolumn{3}{|l|}{ FR59 4859 4628 7921 0289 8106 846 } \\
\hline \textbf{Code BIC} & \multicolumn{3}{|l|}{ AGRIFPRP792 } \\
\hline
\end{tabular}
\end{center}
}
\end{document}
Tout d'abord, la première fois, il faut modifier le nom de votre société, son adresse, le logo (situé dans un fichier logo.jpg qui doit être dans le même dossier), les informations de votre société en bas de page, et les informations bancaires pour les virements.Ensuite, à chaque fois qu'il faudra faire une facture, il suffira de modifier les lignes dans l'encart "A MODIFIER DANS LA FACTURE" où on définit les infos du clients, la description de la facture, et les produits vendus. Tout est expliqué dans les commentaires du code

Les sous-totaux, la TVA, et le total TTC sont calculés automatiquement. C'était bien sûr la partie la plus dure à faire... J'ai utilisé en particulier le package fp pour les calculs.
Vous trouverez dans ce targézède la source .tex de cet exemple, ainsi que le pdf compilé :
Télécharger l'exemple
7 commentaires
Zim : Gérez vos notes et todo-lists super facilement
Jusqu'à présent j'avais des notes et todo-lists dans tous les sens : fichiers txt éparpillés, mails en draft, Tasks de Gmail, bouts de papier, Basecamp...
Et puis j'ai découvert Zim par le Linux Pratique n°15, un petit logiciel qui vous permet de gérer toutes vos notes en WYSIWYG. Il est open source et compatible avec Linux, Mac OS X, et Windows.
L'avantage par rapport à un bête notepad ou à un traitement de texte évolué, c'est qu'il est très léger, qu'on peut créer différentes pages liées et avec une arborescence, et qu'on peut y ajouter des éléments du type todo-list, images, équations LaTeX...etc. Sa particularité est aussi d'enregistrer les notes au format Wiki dans des fichiers txt. Les notes sont donc très facilement exportables et modifiables sans Zim au besoin.
Les principales fonctionnalités sont :
- Arborescence des pages + historique en onglets
- Mise en page basique : gras, italique, surligné, barré, titres, liens
- Todo-list : tapez simplement "[]" pour faire apparaitre une case à cocher
- Correcteur orthographique : avec le paquet aspell
- Diagramme avec le paquet dot
- LaTeX : avec le paquet latex
- Insertion d'images (très peu pratique cependant)
- Tri d'une liste en un clic
- Export HTML
Un truc très pratique aussi, c'est la possibilité de mettre Zim dans le system tray, pour avoir toujours le logiciel ouvert avec l'icône sous la main sans encombrer la barre des tâches.
À télécharger ici : http://zim-wiki.org/downloads.html
7 commentaires
[1] 2 3 4 5 6 ...
Suivre le flux RSS des articles
Suivre le flux RSS des commentaires

Haut de page