Combine classical music library, open content and long-term availability

26 janvier 2011

I ran lately into serious questioning about my CD library of classical music. If I decide to expatriate myself for a few years, should I take away all my CDs? Isn’t there any clever means to access them from anywhere? The first option would be to take them all with me. No way, there are too many, and a long trip is the best way to break some of them.

I hence have to transfer their content onto my computer. As they contain classical music, most of which corresponding to legendary recordings, I don’t want to spend hours transferring their content to get lousy MP3 files at the end. First of all, MP3 is patented, meaning it is not free: in our era in which copying a computer file is over-simple, it’s a non-sense to patent a format. Second, MP3 is lossy, meaning it’s not possible to recover all of the data: quality is lower than on the initial CD. Hopefully, a free, lossless format exists, FLAC, which is supported by numerous audio and computer systems (laptops, media players, smart phones…): the long-term usability of my FLAC files should therefore be much better.

Ok, for each of my CDs, I thus have to transfer their content into a FLAC file, which is straightforward with Rhythmbox, an equivalent of iTunes or Windows Media Player but… free, available by default on Ubuntu. But here lies another difficulty. Transferring a CD onto a computer requires the user to enter all the music details: artist, title, tracks…, a painly process. But here again, a great tool can help us. Rhythmbox automatically searches an online database with the technical features from the input CD and, if there is a match, retrieves automatically the music details.

This online database, named MusicBrainz, aims at gathering reliable information about all CDs worldwide thanks to massive collaborative efforts (a kind of Wikipedia but exclusively for music, according to its founder). I therefore decided to join this project (although it is open-content and not free-content). If one of my CDs is not part of the database, I insert its music details, therefore allowing everyone to freely access them after me. And if the CD is already inserted in MusicBrainz, Rhythmbox automatically retrieves its details, such as with this one, the Mozart Requiem directed by Karl Böhm in 1971.

And by the way, I also have the possibility to keep online a list of my CD collection, which is quite nice. If I lost a CD I love or if I want to buy another copy of it to make a gift to someone, I’m sure to retrieve all its details in order to buy it again.

Finally, I know have to focus on the fact that my computer hard-drive is rapidly filling up, hell yes. FLAC being lossless, it generates big files, smaller than whole CDs of course, FLAC cleverly compresses the audio data, but still! Instead of buying an nth external hard-drive, which is a simple solution but prone to disaster if I loose the given hard-drive, I am thus thinking of renting hard-drive space to OVH. But it’s another story.


Utiliser LaTeX pour une thèse en SHS franco-vietnamienne

3 janvier 2011

De tout temps, des artisans ont produit de magnifiques objets, mais tous les métiers ne s’y prêtent pas. Certaines professions sont nettement plus « scribouillardes » que d’autres, notamment dans le monde académique où l’on produit (est censé produire) des articles à la chaine.

Ces idées, résultats, interprétations, discussions, conclusions, méritent d’être diffusés avec une mise en page respectant autant que faire se peut les règles typographiques en vigueur. De plus, à notre époque numérique, il est important de s’assurer de la pérennité de ces documents académiques, c’est-à-dire de leur préservation sous une forme permettant de les convertir facilement à l’avenir.

Dans un un tel contexte, nous pouvons donc tous nous réjouir du travail de Donald Knuth à qui nous devons, entre autre, l’existence de TeX, un système de composition de documents. Au passage, remercions également Leslie Lamport qui a grandement facilité l’utilisation de TeX en créant LaTeX. Mais passons plutôt aux aspects pratiques…

L’intérêt de LaTeX réside dans le fait qu’il exige du rédacteur de se concentrer sur la structure logique de son document, son contenu, tandis que la mise en page du document est laissée au logiciel lors d’une compilation ultérieure. LaTeX sépare ainsi en deux phases la forme du contenu. Ce système est libre, gratuit et multi-plateforme (en gros, il fonctionne sur GNU/Linux, Windows et Mac).

Ce système est utilisé relativement fréquemment par les chercheurs en sciences « naturelles », mais très peu par les chercheurs en sciences humaines et sociales. Dans la suite de ce billet, je présente un exemple de comment écrire une thèse mêlant français et vietnamien pour en convaincre quelques uns de sauter le pas.

Commencez par enregistrer dans les favoris de votre navigateur l’adresse du wikibook sur LaTeX, http://fr.wikibooks.org/wiki/LaTeX, et téléchargez-le au format pdf afin de ne pas être bloqué si vous n’avez pas de connexion internet. Puis, lisez la première partie intitulée « Premiers pas ». Une fois cela fait, vous êtes prêt à écrire votre thèse en LaTeX !

Créez un répertoire « thèse_latex » sur votre ordinateur à l’intérieur duquel vous créez un document texte « fichier_maitre.tex ». C’est ce fichier que vous compilerez afin d’obtenir votre thèse au format pdf. Comme un tel document est généralement très gros, surtout en SHS, il est pertinent de créer un fichier « chapitre1.tex », un fichier « chapitre2.tex » et ainsi de suite pour chaque chapitre. Le fichier maître se chargera d’inclure le contenu de ces fichiers lors de la création du pdf final.

Voici le fichier maître, les lignes commencées par « % » étant des commentaires:


% !TEX encoding = UTF-8 Unicode

% sous Mac, pour l'antislash, faire Alt + Maj + /
% sous Mac, pour l'accolade, faire Alt + ( ou )
% sous Mac, pour le crochet, faire Alt + Maj + ( ou )
% sous Mac, pour le le tilde, faire Alt + n

% définir le format des pages, la taille de la police et le type de document
\documentclass[a4paper,12pt]{book}

% package pour l'encodage des langues
\usepackage[vietnam,francais]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

% package pour les liens hypertexte et les propriétés du pdf
\usepackage{hyperref}
\hypersetup{
 unicode=true,
 pdfauthor={M G},
 pdftitle={Ma thèse},
 pdfkeywords={géographie, urbanisme},
 colorlinks=true,
 linkcolor=blue,
 linktoc=page,
}

% package pour inclure des images
\usepackage{graphicx}

% package pour inclure un document pdf à l'intérieur du pdf final
\usepackage[final]{pdfpages}

% package pour faire un index
\usepackage{makeidx}
\makeindex

% package pour faire un glossaire
% (on peut aussi rajouter l'option "acronym" pour avoir une liste d'acronymes)
\usepackage{glossaries}
\makeglossaries
\newglossaryentry{sample}{name={sample}, description={a sample entry}}
% à terme, on peut regrouper toutes les entrées dans un seul fichier et faire un "include"

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}

\title{Ma thèse}
\author{M G}
\date{14/12/2010}
\maketitle

\listoffigures

% inclusion du contenu du chapitre 1
\include{chapitre1}

% inclusion du contenu du chapitre 2
\include{chapitre2}

% créer l'index
\printindex
\addcontentsline{toc}{chapter}{Index}

% créer le glossaire
\printglossaries
\addcontentsline{toc}{chapter}{Glossaire}

% créer la bibliographie
\nocite{durand_villes_1995}   % ajout à la bibliographie sans besoin d'être cité dans le texte lui-même
\bibliographystyle{plain-fr}   % spécifie le style selon lequel la bibliographie va être représentée
\bibliography{Mabibliotheque.bib}   % spécifie le fichier au format "bibtex" dans lequel se trouvent les références bibliographiques

% insérer la table des matières
\tableofcontents

\end{document}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Voici le contenu du fichier « chapitre1.tex »:

% !TEX encoding = UTF-8 Unicode

\chapter{Voici mon titre de premier chapitre}

\section{Et voici ma première section}

\subsection{Ainsi que ma première sous-section}

Salut, voici un premier essai de lettres accentuées: é à ç. Et voici du remplissage en latin: Legi, Patres colendissimi, in Arabum monumentis, interrogatum Abdalam 1 Sarracenum, quid in hac quasi mundana scaena admirandum maxime spectaretur, nihil spectari homine admirabilius respondisse. Cui sententiae illud Mercurii adstipulatur: Magnum, o Asclepi, miraculum est homo.

\subsection{Deuxième sous-section}

Maintenant un peu de vietnamien: \foreignlanguage{vietnam}{đưỡng lô ghè}. Puis un terme à mettre dans l'index: toto\index{toto}. Mais cela peut également être un ensemble de mots en vietnamien:
<pre>\foreignlanguage{vietnam}{đưỡng lô ghè}</pre>
\index{\foreignlanguage{vietnam}{đưỡng lô ghè}}.

\section{Deuxième section}

Horum dictorum rationem cogitanti mihi non satis illa faciebant, quae multa de humanae naturae praestantia afferuntur a multis: esse hominem creaturarum internuntium, superis familiarem, regem inferiorum; sensuum perspicacia...

% insertion d'une figure
\begin{figure}[!t]
\centering
\includegraphics[width=\textwidth]{images/IMG_1426_small}
\caption{Le marché}
\label{Marché}
\end{figure}

Magna haec quidem, sed non principalia, idest quae summae admirationis privilegium sibi iure vendicent. Cur enim non ipsos angelos et beatissimos caeli choros magis admiremur?

% commande pour ajouter un espace vertical
\vspace{0.5cm}

Je vais maintenant testé l'ajout d'un terme dans le glossaire, commençons avec \gls{sample}. Cela a l'air de marcher. Rajoutons un peu de vietnamier pour rigoler encore: \foreignlanguage{vietnam}{đưỡng lô ghè}.

Et voici le contenu du fichier « chapitre2.tex »:

% !TEX encoding = UTF-8 Unicode

\chapter{Deuxième chapitre}

\section{Première section}

Voici une entrée pour le glossaire: \newglossaryentry{Toto_1}{description={un toto qui rit bien}}. Et maintenant une citation bibliographique: \cite{hue_litteratures_1999}.

\section{Deuxième section}

Mais n'oublions pas les listes:
\begin{itemize}
\item Toto1: bciovzgiuzbe
\item Toto2: cnfivgu
\end{itemize}

Enfin ajoutons une note de bas de page\footnote{toto}, et une deuxième\footnote{\cite{hue_litteratures_1999}}, avec une référence cette fois.

Sed non erat paternae potestatis in extrema fetura quasi effeta defecisse; non erat sapientiae, consilii inopia in re necessaria fluctuasse; non erat benefici amoris, ut qui in aliis esset divinam liberalitatem laudaturus in se illam damnare cogeretur.

Et enfin voici le fichier de bibliographie au format Bibtex:


% !TEX encoding = UTF-8 Unicode

@book{hue_litteratures_1999,
 address = {Paris},
 series = {Histoire littéraire de la francophonie, {ISSN} 1258-0368 ; {1999Universités} francophones, {ISSN} 0993-3948},
 title = {Littératures de la Péninsule indochinoise},
 isbn = {{2-86537-968-X}},
 abstract = {{AUF} = Agence universitaire de la francophonie. - Coll. principale : Universités francophones. - 9782865379682},
 publisher = {Ed. Karthala},
 author = {Bernard Hue and {Pierre-Richard} Féray},
 year = {1999},
 keywords = {24288, Francophonie -- Histoire, French language -- Indo China, Indo China -- Literature, Indochine -- Dans la littérature, Indochine -- Littératures, Literature -- Indo China -- 19th century, Literature -- Indo China -- 20th century, Littérature francophone -- Histoire et critique}
},

@article{durand_villes_1995,
 title = {Villes et urbanisation au Vietnam, une esquisse d'état des lieux bibliographique},
 volume = {2},
 number = {31},
 journal = {Péninsule},
 author = {Frédéric Durand},
 year = {1995},
 pages = {141--162}
},

Avec cet exemple, nous aurons vu à peu près toutes les bases nécessaires pour écrire sa thèse avec LaTeX: inclusion de documents, bibliographie, index, glossaire, images, notes de bas de page, etc. Le pdf final ressemble à ça: pas mal, non ?

Pour aller plus loin, personnaliser la mise en page, ajouter des annexes, le mieux est de farfouiller dans le wikibooks ou sur le site des tuteurs de l’ENS. Et puis on apprend en essayant… A noter le package « classic thesis » qui permet d’obtenir une belle mise en page sans beaucoup d’efforts (disponible ici).


Utiliser R pour placer des lycées sur la carte d’Ile-de-France

12 septembre 2010

Prenons un exemple au hasard, tiens, une liste de lycées d’Ile-de-France. Je veux apprendre à utiliser R pour tracer une carte de l’Ile-de-France et y placer dessus les lycées de ma liste.

Pourquoi R ? parce que c’est un environnement informatique de calcul statistique disposant de fonctionnalités graphiques, et puis c’est libre et gratuit, et ça fonctionne sur Windows, Linux et Mac OS. Donc tout lecteur de ce billet peut tester sur son propre ordinateur si je ne raconte pas n’importe quoi.

Tout d’abord, il me faut récupérer les données géographiques de ma carte. Pour cela, je vais sur le site GADM (global administrative areas) qui met gracieusement à disposition une base de données contenant les coordonnées spatiales des régions administratives du monde entier. Puis je télécharge les données correspondant à la France, niveau 2, au format « R data ».

Avant d’aller plus loin, je dois installer plusieurs librairies R spécialisées dans les coordonnées spatiales: « sp », « maptools », gpclib » et l’excellent « ggplot2 ». La procédure d’installation est simple: ouvrez R et utilisez la commande install.packages( « sp » ). Pour ceux qui utilisent Ubuntu, l’installation de « maptools » directement dans R utilise trop de mémoire (voir ce thread). Il faut donc l’installer via la commande suivante:

$ R CMD INSTALL --no-latex package.tar.gz

Maintenant, je dois apprendre à manipuler les coordonnées spatiales dans R afin de tracer la carte en question. Pour cela, j’ouvre R, je charge les librairies dont j’ai besoin, je charge les données spatiales, je les convertis et je les trace:

library(ggplot2)
library(sp)
library(maptools)
library(gpclib)
gpclibPermit()
load("FRA_adm2.RData")
gadm_idf <- gadm[ gadm$NAME_1 == "\xcele-de-France", ]
idf <- fortify( gadm_idf, region="ID_2" )
qplot( long, lat, group=group, data=idf, geom="polygon", colour=I("white") )

Et voilà, on obtient le graphique ci-dessous:

Voilà une bonne chose de faite. A présent, je dois récupérer les coordonnées géographiques exactes des lycées qui m’intéressent (longitude et latitude). Heureusement Google Maps permet de faire ça mais il faut au préalable activer cette fonctionnalité (en savoir plus ici). Je reconnais que c’est un peu long et fastidieux, mais à la fin vous obtenez quelque chose comme ça:

lycée Jean Rostand,Mantes-la-Jolie,48.998052,1.696765

lycée Romain Rolland,Ivry-sur-Seine,48.800683,2.392895

etc…

Enfin, il ne me reste plus qu’à ajouter un point sur la carte à l’emplacement de chaque lycée. Pour cela rien de plus facile, commençons par ajouter le lycée Jean Rostand dont les coordonnées sont ci-dessus:


qplot( long, lat, group=group, data=idf, geom="polygon", colour=I("white") )
last_plot() + geom_point( aes(x, y, group=1), colour="red", data=data.frame(x=1.696765, y=48.998052) )

Pour ajouter tous les lycées d’un coup et placer des points de taille proportionnelle au nombre d’élèves dans ces lycées, voici la marche à suivre. Les données sont maintenant prises au hasard, à titre d’exemple. La fonction « theme_whiteMap() » n’est utilisée qu’à titre esthétique.


n <- 80
lycees 0, 1, 0))
lycees$bac[lycees$bac < 0.3] <- NA
lycees <- lycees[ lycees$lat1.5, ]
theme_whiteMap <- function(base_size = 12)
{
structure(list(axis.line = theme_blank(),
axis.text.x = theme_blank(), axis.text.y = theme_blank(), axis.ticks = theme_blank(),
axis.title.x = theme_blank(), axis.title.y = theme_blank(),
axis.ticks.length = unit(0.3, "lines"), axis.ticks.margin = unit(0.5, "lines"),
legend.background = theme_rect(colour = NA),
legend.key = theme_rect(colour = "grey80"), legend.key.size = unit(1.2, "lines"),
legend.text = theme_text(size = base_size * 0.8),
legend.title = theme_text(size = base_size * 0.8, face = "bold", hjust = 0),
legend.position = "right",
panel.background = theme_rect(fill = "white", colour = NA),
panel.border = theme_blank(),
panel.grid.major = theme_blank(),
panel.grid.minor = theme_blank(),
panel.margin = unit(0.25, "lines"),
strip.background = theme_blank(), strip.text.x = theme_blank(), strip.text.y = theme_blank(),
plot.background = theme_blank(),
plot.title = theme_text(size = base_size * 1.2, face = "bold"), plot.margin = unit(c(1,
1, 0.5, 0.5), "lines")), class = "options")
}
png( "ex_lycees_idf.png", width=600, height=500 )
pl <- qplot(long, lat, data = lycees, geom = "point")
pl <- pl + geom_polygon(aes(group=group), data=idf, colour=I("lightcyan4"), fill=I("transparent"))
pl <- pl + geom_point(aes(colour = bac, shape = factor(internat), size = eleves))
pl <- pl + theme_whiteMap()
pl <- pl + opts(title = "Exemples de lycées en Ile-de-France")
pl <- pl + labs(colour = "Réussite au bac", shape = "Internat", size = "Nombre d'élèves")
print(pl)
dev.off()

Au final, on obtient une carte avec plein d’infos dessus:

Merci à TJ sans qui j’étais bien incapable de faire tout ça…

Les observateurs auront remarqué que j’ai publié ce billet dans les catégories « Politique » et « Science ». La première parce que les données sont fortement inspirées des activités d’une association « œuvrant pour la cité ». La deuxième parce que l’acquisition de données, leur analyse et leur visualisation sont au cœur du travail quotidien des scientifiques.


Le chercheur qui rédige

2 août 2010

Un scientifique doit rédiger des rapports sur ses recherches, et ceci bien plus souvent qu’on ne le pense. Le fait même de rédiger, de mettre par écrit les idées qu’on a dans la tête, les résultats qu’on a trouvés, et les conclusions qu’on en a tirées, procure généralement un plaisir intellectuel très appréciable. Mais cet exercice a un prix: les inévitables questions de format, de mise en page et toutes les autres considérations techniques qui ne manquent pas d’apparaître. Alors comment faire pour éviter au maximum les désagréments, ne pas perdre de temps et être satisfait du résultat obtenu ?

Lorsque j’ai été confronté à ces questions, j’ai dû farfouiller à droite et à gauche pour trouver les bons outils, l’ordre optimal dans lequel effectuer chaque étape de la rédaction, les formats à utiliser, etc. Ce billet a pour but de remplir ce besoin, en premier lieu pour moi-même, afin que je n’oublie pas ce que j’ai utilisé pour rédiger mes différents manuscrits. Et ensuite, comme toujours, si ça peut servir à quelqu’un d’autre, tant mieux.

Tout d’abord, j’utilise Ubuntu, une distribution Linux, et j’essaie de n’utiliser que des outils libres et gratuits, si possible utilisables (portables) sous Windows, Mac et Linux. On entend souvent dire que ces programmes sont biens mais que ils ne valent pas Microsoft Word, Adobe Illustrator, etc. C’est faux: pour 95% des utilisateurs, les programmes libres et gratuits sont largement suffisants et simples d’utilisation. Par contre, il est vain de rechercher un seul outil pouvant tout faire, vite et bien. J’essaie donc de trouver un outil pour chaque utilisation, puis d’utiliser des formats d’échange entre tous.

* * *

Pour écrire le texte, j’utilise OpenOffice Writer qui est l’équivalent de Microsoft Office Word. Afin de partager mon travail avec des collaborateurs travaillant avec Word, je sauvegarde mon document au format « DOC ». Si ceux-ci m’envoient leurs corrections, je peux les lire dans Writer. Cela fonctionne la plupart du temps mais il vaut mieux à cette étape ne pas se préoccuper de mise en page. Je fais donc le minimum, c’est-à-dire utiliser les styles par défaut pour les titres et les paragraphes, et je n’inclus généralement pas les images dans le document.

Pour dessiner les schémas, j’utilise Inkscape qui permet de faire du dessin vectoriel, ce type de dessin étant redimensionnable sans perte de qualité. Cela signifie qu’une fois un schéma réalisé, je peux l’exporter en grande dimension si je veux le mettre sur un poster de taille A0, en moyenne dimension si je veux le mettre dans un article, ou en petite dimension si je veux le mettre dans une présentation: la source du schéma n’est donc qu’à un seul endroit.

Pour réaliser les graphiques, et bien, bizarrement, je n’ai pas beaucoup eu besoin d’en faire, mais comme dans la plupart des cas, réaliser un graphique revient à manipuler des données, j’utilise R qui, bien que présenté comme étant un environnement pour faire des calculs statistiques, permet de faire des figures de grande qualité. Cependant, utilisant souvent Python pour programmer, je me mets petit à petit à utiliser la package « matplotlib« .

Pour manipuler une image, j’utilise GIMP, que ce soit une photo, un schéma issu de Inkscape, un graphique issu de R… Avec cet outil, je peux redimensionner des images, ajouter un fond blanc, exporter en plusieurs formats, etc.

Pour faire la mise en page, j’utilise LaTeX, un système logiciel de composition de documents. Je pourrais l’utiliser aussi pour écrire le texte mais ce n’est vraiment pas pratique du tout de relire, corriger, améliorer un texte de manière collaborative avec LaTeX. Sinon, pour faire simple, avoir LaTeX sur votre ordinateur vous permet de réaliser des documents d’une qualité similaire à un imprimeur professionnel, que ce soit un roman, une suite d’équations ou une partition de musique. Bien évidemment, la mise en page se fait à la fin !

Pour gérer la bibliographie et les citations, j’utilise le format « bibtex » utilisé par LaTeX. En pratique, je rassemble au fur et à mesure de mes recherches les références qui m’intéressent sur le site web CiteULike. Une fois que j’ai défini un sous-ensemble d’articles à citer, je leur donne le même tag et les exporte au format « bibtex ». Si je veux les incorporer dans le texte en cours d’écriture avec Writer, j’utilise JabRef pour exporter mes références du format « bibtex » au format « ods » d’OpenOffice, puis dans Writer je choisis « Edit » -> « Exchange Database… » -> Browse, puis « Tools » -> « Options… » -> « OpenOffice.org Base, Databases », et je fais attention de renommer par « Bibliography ». Mais je recommande plutôt, dans le texte en cours d’écriture, de mettre les référence sous la forme « ref XX 2008 », puis de faire la mise en page des citations à la fin avec LaTeX directement.

* * *

Et maintenant, quelques astuces qui me servent souvent pour manipuler des images…

Pour dessiner un diagramme en pratique, j’ouvre Inkscape et crée un document de dimension A0 en orientation « paysage » avec une résolution de 300 ppi (pixels per inch), la qualité demandée par les éditeurs. Le fait que l’image de base soit si grande m’assure de ne pas me retrouver à vouloir exporter mon image dans des dimensions supérieurs à celles auxquelles je peux prétendre: pas de risque avec A0… Si j’ai besoin d’écrire du texte, une légende par exemple, j’utilise la police Arial. Pour entrer un symbole mathématique, Inkscape utilise les codes Unicode via la combinaison de touches Ctrl+U. Une fois le dessin réalisé, je sauvegarde le document au format « svg ».

Ensuite, avant d’inclure l’image dans mon document final, je l’ouvre avec GIMP en précisant la résolution (au moins 300 ppi) et la taille (souvent 7 pouces pour la largeur). J’ajoute un calque blanc (« Calque » -> « Nouveau calque… » -> je garde les dimensions et je coche « blanc ») et je le mets en bas de l’image (« Calque » -> « Pile » -> « Calque tout en bas »). J’aplatis l’image, si besoin je coupe des parties superflues (crop), puis je la redimensionne en gardant 300 ppi mais en modifiant la largeur (clic droit -> « Image » -> « Échelle et taille de l’image »), et enfin je la sauvegarde au format « tif » en compressant avec LZW.

Dans certains cas, j’ai besoin d’utiliser une capture d’écran tout en gardant une bonne résolution (300 ppi). Pour cela, je capture mon écran et obtiens donc une image, généralement au format « png ». Puis j’insère la capture d’écran dans une présentation d’OpenOffice Impress (équivalent du Power Point de Microsoft Office) et j’exporte le document au format « pdf ». J’ouvre ce fichier avec GIMP en précisant bien que je veux une résolution de 300 ppi. Je coupe l’image (crop) en enlevant les bordures inutiles, je redimensionne l’image en gardant bien 300 ppi mais en modifiant les dimensions si nécessaire, et enfin je sauvegarde l’image au format « tif » avec la compression LZW.

Si j’ai besoin de découper une image au format pdf, par exemple un schéma réalisé avec Beamer et TikZ, j’utilise GIMP. A l’ouverture, je choisis une résolution suffisamment élevée (par exemple 500 ppi) afin d’avoir une image suffisamment grande (au moins 6 pouces). Puis je découpe l’image comme je le souhaite. Enfin, je redimensionne en fixant une résolution de 350 ppi, et je sauve au format TIF.

* * *

Une fois que le texte a été finalisé, après maints aller-retours entre les différentes auteurs, je peux enfin me mettre à la mise en page. Pour cela, j’ajoute un plugin à OpenOffice Writer, writer2latex, qui me permet, comme son nom l’indique, d’exporter un document de Writer vers LaTeX. C’est très simple, une fois le plugin installé, j’ouvre le document en question avec Writer (sans les images), puis je clique sur « Fichier » -> « Exporter » et je choisis « LaTeX 2e » comme format. J’obtiens ainsi un fichier texte contenant mon fichier formaté en code latex, à partir duquel j’obtiens une version « pdf » via la commande « pdflatex ». C’est surtout très pratique pour les tableaux, parce qu’ils sont longs et fastidieux à créer en LaTeX, et bien plus rapide à faire avec Writer.

Par défaut, writer2latex exporte le document dans l’encodage « latin1 » qui consiste à mettre « \’a » à la place de « à », ce qui, vous en conviendrez, n’est pas très lisible. Pour régler cela, il faut changer le fichier de configuration de writer2latex. Ce fichier XML se trouve a priori dans le répertoire de configuration d’OpenOffice, ici sous Ubuntu: $HOME/.openoffice.org/3/user/. A la place de « latin1 », il faut mettre « utf8 », et tout rentre dans l’ordre. Si votre texte est en français, vous pouvez aussi automatiquement remplacer les guillemets par les commandes latex \og et \fg. D’ailleurs, beaucoup d’autres choses sont paramétrables, en voici quelques exemples bien utiles:

<option name="inputencoding" value="utf8"/>
<string-replace input="& #xAB;& #xA0;" latex-code="\og "/>
<string-replace input="& #xA0;& #xBB;" latex-code=" \fg"/>
<string-replace input="'" latex-code="'"/>

* * *

A la fin, vous avez tout votre texte formaté en latex, il reste maintenant à faire la mise en page. Pour cela, et bien, il faut apprendre LaTeX. Par exemple, il existe une syntaxe spéciale pour inclure les images au bon endroit, à la bonne taille, etc. Ah bah oui, on n’a rien sans rien… Mais heureusement beaucoup d’information est disponible sur Internet. Ce n’est pas une mine d’or mais plutôt une meule de foin, alors voici deux épingles bien utiles (et en français): un WikiBook sur LaTeX, et les tutoriels des élèves de l’ENS.

Avec tout ça, il n’y a plus de raison pour continuer à partager des documents de mauvaise qualité !


Utiliser latex pour expliquer la programmation dynamique

24 avril 2010

Vous voulez faire découvrir la programmation dynamique à des lycéens ? Rien de mieux qu’une petite présentation… En bon geek, vous allez la faire en latex. Mais pour ça, il va falloir connaître quelques ficelles, surtout quand on veut pouvoir représenter la façon dont on remplit la matrice, pas à pas:

Pour que ce soit lisible, j’ai mis le code ici, sur gist.github. Une fois que vous l’avez récupérer, lancez la commande « pdflatex », vous obtiendrez un document comme ça: dynamic_programming.
\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{verbatim}
\usepackage{url}</code>

\setbeamertemplate{navigation symbols}{}

\setbeamertemplate{footline}[page number]

\title{About optimal sequence alignment}
\subtitle{A short glimpse into bioinformatics}

\begin{document}

\begin{frame}
\titlepage
\end{frame}

\begin{frame}
\frametitle{Pairwise sequence alignment}
Assumptions:
\begin{itemize}
\item sequences $S_1$ and $S_2$ are homologous, they share a common ancestor;
\item differences between them are due to only two kinds of events, substitutions and insertion-deletions.
\end{itemize}

Strategy:
\begin{itemize}
\item choose a scoring matrix (reward for match, penalty for mismatch and gap);
\item compute the editing distance (number of matches, mismatches and gaps) to go from one sequence to the other;
\item keep the alignment with the highest score.
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Needleman-Wunsch algorithm}
\begin{itemize}
\item Aim: find the optimal global alignment of sequences $S_1$ and $S_2$
\item Recursion rule:
\begin{align}
D(i,j) = max
\begin{cases}
D(i-1,j-1) + score( S_1[i], S_2[j] )\\
D(i-1,j) + gap\\
D(i,j-1) + gap
\end{cases}
\end{align}
\item Scoring scheme: identity=0 transition=-2 transversion=-5 gap=-10
\item Sequences: $S_1$=TTGT $S_2$=CTAGG
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Fill the matrix}
\begin{tabular}{l|cccccccccccc}
&amp; &amp; &amp; C &amp; &amp; T &amp; &amp; A &amp; &amp; G &amp; &amp; G \\ \hline
&amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; \\
&amp; \visible{0} &amp; \visible{$\rightarrow$} &amp; \visible{-10} &amp; \visible{$\rightarrow$} &amp; \visible{-20} &amp; \visible{$\rightarrow$} &amp; \visible{-30} &amp; \visible{$\rightarrow$} &amp; \visible{-40} &amp; \visible{$\rightarrow$} &amp; \visible{-50} \\
&amp; \visible{$\downarrow$} &amp; \visible{$\searrow$} &amp; \visible{$\downarrow$} &amp; \visible{$\searrow$} &amp; \visible{$\downarrow$} &amp; \visible{$\searrow$} &amp; \visible{$\downarrow$} &amp; \visible{$\searrow$} &amp; \visible{$\downarrow$} &amp; \visible{$\searrow$} &amp; \visible{$\downarrow$} &amp; \\
T &amp; \visible{-10} &amp; \visible{$\rightarrow$} &amp; \visible{-2} &amp; \visible{$\rightarrow$} &amp; \visible{-10} &amp; \visible{$\rightarrow$} &amp; \visible{-20} &amp; \visible{$\rightarrow$} &amp; \visible{-30} &amp; \visible{$\rightarrow$} &amp; \visible{-40} \\
&amp; \visible{$\downarrow$} &amp; \visible{$\searrow$} &amp; \visible{$\downarrow$} &amp; \visible{$\searrow$} &amp; \visible{$\downarrow$} &amp; \visible{$\searrow$} &amp; \visible{$\downarrow$} &amp; \visible{$\searrow$} &amp; \visible{$\downarrow$} &amp; \visible{$\searrow$} &amp; \visible{$\downarrow$} &amp; \\
T &amp; \visible{-20} &amp; \visible{$\rightarrow$} &amp; \visible{-12} &amp; \visible{$\rightarrow$} &amp; \visible{-2} &amp; \visible{$\rightarrow$} &amp; \visible{-12} &amp; \visible{$\rightarrow$} &amp; \visible{-22} &amp; \visible{$\rightarrow$} &amp; \visible{-32} &amp; \\
&amp; \visible{$\downarrow$} &amp; \visible{$\searrow$} &amp; \visible{$\downarrow$} &amp; \visible{$\searrow$} &amp; \visible{$\downarrow$} &amp; \visible{$\searrow$} &amp; \visible{$\downarrow$} &amp; \visible{$\searrow$} &amp; \visible{$\downarrow$} &amp; \visible{$\searrow$} &amp; \visible{$\downarrow$} &amp; \\
G &amp; \visible{-30} &amp; \visible{$\rightarrow$} &amp; \visible{-22} &amp; \visible{$\rightarrow$} &amp; \visible{-12} &amp; \visible{$\rightarrow$} &amp; \visible{-4} &amp; \visible{$\rightarrow$} &amp; \visible{-12} &amp; \visible{$\rightarrow$} &amp; \visible{-22} &amp; \\
&amp; \visible{$\downarrow$} &amp; \visible{$\searrow$} &amp; \visible{$\downarrow$} &amp; \visible{$\searrow$} &amp; \visible{$\downarrow$} &amp; \visible{$\searrow$} &amp; \visible{$\downarrow$} &amp; \visible{$\searrow$} &amp; \visible{$\downarrow$} &amp; \visible{$\searrow$} &amp; \visible{$\downarrow$} &amp; \\
T &amp; \visible{-40} &amp; \visible{$\rightarrow$} &amp; \visible{-32} &amp; \visible{$\rightarrow$} &amp; \visible{-22} &amp; \visible{$\rightarrow$} &amp; \visible{-14} &amp; \visible{$\rightarrow$} &amp; \visible{-9} &amp; \visible{$\rightarrow$} &amp; \visible{-17} &amp;
\end{tabular}
\end{frame}

\begin{frame}
\frametitle{Traceback}
\begin{tabular}{l|cccccccccccc}
&amp; &amp; &amp; C &amp; &amp; T &amp; &amp; A &amp; &amp; G &amp; &amp; G \\ \hline
&amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; &amp; \\
&amp; \color{red}{0} &amp; $\rightarrow$ &amp; -10 &amp; $\rightarrow$ &amp; -20 &amp; $\rightarrow$ &amp; -30 &amp; $\rightarrow$ &amp; -40 &amp; $\rightarrow$ &amp; -50 \\
&amp; $\downarrow$ &amp; \color{red}{$\searrow$} &amp; $\downarrow$ &amp; $\searrow$ &amp; $\downarrow$ &amp; $\searrow$ &amp; $\downarrow$ &amp; $\searrow$ &amp; $\downarrow$ &amp; $\searrow$ &amp; $\downarrow$ &amp; \\
T &amp; -10 &amp; $\rightarrow$ &amp; \color{red}{-2} &amp; $\rightarrow$ &amp; -10 &amp; $\rightarrow$ &amp; -20 &amp; $\rightarrow$ &amp; -30 &amp; $\rightarrow$ &amp; -40 \\
&amp; $\downarrow$ &amp; $\searrow$ &amp; $\downarrow$ &amp; \color{red}{$\searrow$} &amp; $\downarrow$ &amp; $\searrow$ &amp; $\downarrow$ &amp; $\searrow$ &amp; $\downarrow$ &amp; $\searrow$ &amp; $\downarrow$ &amp; \\
T &amp; -20 &amp; $\rightarrow$ &amp; -12 &amp; $\rightarrow$ &amp; \color{red}{-2} &amp; \color{red}{$\rightarrow$} &amp; \color{red}{-12} &amp; $\rightarrow$ &amp; -22 &amp; $\rightarrow$ &amp; -32 &amp; \\
&amp; $\downarrow$ &amp; $\searrow$ &amp; $\downarrow$ &amp; $\searrow$ &amp; $\downarrow$ &amp; $\searrow$ &amp; $\downarrow$ &amp; \color{red}{$\searrow$} &amp; $\downarrow$ &amp; $\searrow$ &amp; $\downarrow$ &amp; \\
G &amp; -30 &amp; $\rightarrow$ &amp; -22 &amp; $\rightarrow$ &amp; -12 &amp; $\rightarrow$ &amp; -4 &amp; $\rightarrow$ &amp; \color{red}{-12} &amp; $\rightarrow$ &amp; -22 &amp; \\
&amp; $\downarrow$ &amp; $\searrow$ &amp; $\downarrow$ &amp; $\searrow$ &amp; $\downarrow$ &amp; $\searrow$ &amp; $\downarrow$ &amp; $\searrow$ &amp; $\downarrow$ &amp; \color{red}{$\searrow$} &amp; $\downarrow$ &amp; \\
T &amp; -40 &amp; $\rightarrow$ &amp; -32 &amp; $\rightarrow$ &amp; -22 &amp; $\rightarrow$ &amp; -14 &amp; $\rightarrow$ &amp; -9 &amp; $\rightarrow$ &amp; \color{red}{-17} &amp;
\end{tabular}
\end{frame}

\begin{frame}[fragile]
\frametitle{Output}
Plot the optimal alignment:
\begin{verbatim}
CTAGG
*| |*
TT-GT
\end{verbatim}

Score: -17

Complexity in time: $O(nm)$

Complexity in memory: $O(nm)$
\end{frame}

\begin{frame}
\frametitle{Acknowledgments}
Bellman; Levenstein; Needleman and Wunsch; Sankoff and Sellers; Hirschberg; Smith and Waterman; Gotoh; Ukkonen, Myers and Fickett; and many others...

\vspace{1cm}
Want to know more? start reading!
\url{http://lectures.molgen.mpg.de/online_lectures.html}
\end{frame}

\end{document}


%d blogueurs aiment cette page :