Humus numericus

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

R, Spip et autres

Mot-clé - ruby

Fil des billets

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… :-)

jeudi 28 décembre 2006

Hébergement pour Ruby on Rails : essai avec Site5

Dans un précédent billet, j'avais fait une rapide comparaison entre quelques hébergeurs supportant Ruby on Rails. J'avais dans un premier temps choisi Dreamhost, dont les offres sont pour le moins alléchantes. J'avais finalement abandonné, d'une part car cela ne correspondait plus à mes besoins, mais aussi car en termes de performance ça me semblait un peu poussif, au moins depuis l'Europe.

Je viens de retenter le coup mais cette fois avec un autre hébergeur, en l'occurrence Site5. Les avis semblent partagés, mais j'en suis pour l'instant satisfait. Ils proposent une promo spectaculaire en ce moment, mais qui oblige à payer pour deux ans d'un coup, ce qui ne me convient pas, j'ai donc opté pour un plan de base avec paiement mensuel qui me revient à environ 8,50 euros par mois. Pour ce prix là vous avez : 10Go de stockage, 200Go de trafic, PHP, Perl, Python, Ruby on Rails via Apache/FastCGI, Accès SSH, Cron jobs, mails, bases de données, Subversion, etc. Pour le peu que j'en ai vu les performances m'ont l'air tout à fait honorables, j'ai d'ailleurs migré dev.nozav.org dessus il y a quelques temps, et ça tourne très bien.

Inconvénients

Pour l'instant, la seule limitation qui me saute aux yeux concerne l'hébergement des domaines. Avec le plan de base, vous ne pouvez héberger qu'un seul domaine (vous devez en héberger un d'ailleurs, il n'y a pas de sous-domaine machin.site5.com). Ça n'est qu'avec les plans plus onéreux qu'on accède aux domain pointers qui permettent d'en utiliser plusieurs. En ce qui me concerne ce n'est pas trop gênant pour le moment, l'hébergeur principal de mon domaine nozav.org me permettant de faire pointer des sous-domaines vers une adresse IP.

Avantages

Un des gros plus de l'offre de Site5 est le fait que chaque site hébergé se voit assigner une adresse IP unique. Ceci est très pratique pour un tas de choses, et notamment pour gérer l'hébergement de sous-domaines. Autres avantages, l'installation de base est assez claire, avec un home qui contient deux répertoires, public_html pour les sites web et public_ftp pour utiliser un serveur FTP déjà installé à la base. Par ailleurs, leur système d'administration est bien foutu, clair et visiblement écrit en Rails.

Mise à jour (7 janvier 2007)

Après plusieurs semaines, mon point de vue est toujours positif. J'ai migré dev.nozav.org, c'est à dire un site statique en HTML, mais aussi une petite application en Rails, et les performances sont tout à fait convenables, en tous cas bien meilleures que ce que j'avais expérimenté avec Dreamhost. Par ailleurs, le service de support est très performant (pourvu qu'on parle anglais, bien sûr) : en l'espace de deux heures, j'ai pu échanger trois ou quatre mails avec eux, et ils ont très rapidement modifier la config du serveur pour que je puisse déléguer la gestion des mails de mon domaine à un autre serveur tout en conservant la possibilité de comptes mails pour des sous-domaines (ce qui n'est pas trivial trivial comme demande).

Bref, pour l'instant je vous conseille cet hébergeur. Si vous souhaitez l'essayer, il y a toujours la garantie de 60 jours qui permet un remboursement intégral si vous n'êtes pas satisfaits.

Nouvelle mise à jour (20 janvier 2007)

Bon, comme je ne tiens pas en place niveau hébergement en ce moment, je viens à l'instant même de clôturer mon compte chez Site5. Non pas que je sois mécontent de leurs services, bien au contraire. Tout ce qui a été dit précédemment reste vrai à cette date : rapidité, fiabilité, support compétent, etc. Et ils m'ont bien reversé l'intégralité des sommes que je leur ai payé jusque là sans aucun problème puisque j'ai résilié mon compte avant 60 jours d'utilisation.

Si je change, c'est pour passer carrément sur un Virtual private server chez Tektonic. C'est un poil plus cher, y'a aucun support et faut tout faire soi-même. Par contre c'est totale liberté : on se retrouve avec l'équivalent d'un serveur dédié rien qu'à soi, et ce pour 15 dollars par mois, et on peut faire ce qu'on veut, y compris tout casser. J'essaierai de détailler davantage d'ici quelques temps.

jeudi 24 août 2006

Comparaison d'un script simple en Perl, Python et Ruby

Tiens, suite à une question d'un collègue de boulot aujourd'hui, je me suis amusé à comparer la manière de faire une tâche assez simple dans trois langages de script différents. L'objectif est d'afficher le chemin complet de tous les répertoires contenus (récursivement) dans un répertoire donné (en l'occurrence /var/log). Je trouve le résultat assez représentatif des particularités des différents langages :

En Python

import os
from os.path import join
for root, dirs, files in os.walk('/var/log'):
    for name in dirs:
        print join(root, name)

C'est pas forcément super intuitif (faut comprendre que la fonction os.walk renvoit un tuple avec le répertoire racine, les répertoires contenus et les fichiers contenus de chaque sous-répertoire parcouru. Mais c'est assez efficace.

En Perl

use File::Find;
find sub { print $File::Find::name, "
" if -d } , '/var/log';

Ah bah c'est sûr, difficile de faire plus bref. Mais c'est pas forcément évident du premier coup d'oeil, entre l'utilisation d'une référence à une fonction en argument de find, ou celui du test -d.

En Ruby

require 'find'
Find.find('/var/log') { |path| puts path if File.directory?(path) }

Et voilà. Simple, lisible, compact, compréhensible (du moins si on a compris le concept de bloc et d'itérateur). En un mot : é-lé-gant.

Bon, allez, je suis pas tout à fait objectif, je vous l'accorde...

mercredi 17 mai 2006

Traduction française du tutoriel sur Ajax et Rails

Ça y est, je viens de terminer la traduction en français du tutoriel initialement rédigé en anglais et désormais baptisé Comment paginer, trier et filtrer un tableau avec Ajax et Rails.

Ça fait bizarre de traduire un texte qu'on a écrit soi-même. En fait, y'a plus passionnant à faire, je dirais.

Le document est disponible en ligne et en version PDF (malheureusement pas super propre).

Voilà les liens pour voir tout ça :

jeudi 11 mai 2006

Tutoriel en anglais sur Ajax et Ruby on Rails

Ayé, je viens de mettre en ligne mon premier tutoriel en anglais sur dev.nozav.org. Son doux nom est How to paginate, sort and search a table with Ajax and Rails. En gros, ça explique comment afficher un tableau et implémenter des fonctions de pagination, tri par colonne et recherche "en temps réel" à l'aide d'Ajax, et d'avoir donc une interface web plus réactive qu'avec des pages "classiques".

Le tout est expliqué sous la forme d'une application Ruby on Rails dont l'installation et configuration est brièvement décrite.

Je compte faire une traduction en français dans les jours (semaines ?) qui viennent...

samedi 11 mars 2006

Hébergement pour Ruby on Rails

Comme je m'intéresse de plus en plus à Ruby et Ruby on Rails, d'autant que j'ai l'occasion de m'y mettre au boulot, je me suis demandé quels pouvaient être les hébergeurs intéressants pour un hébergement de sites web en général et d'applis RoR en particulier.

Il y'a pas mal d'infos là-dessus sur le wiki de RoR, avec toute une liste d'hébergeurs disponibles. Une liste un peu plus synthétique se trouve sur Rails Hosting, avec en plus un avis personnel : les hébergements les plus sérieux se trouveraient sur TextDrive (l'hébergeur officiellement soutenu par RoR, mais un peu cher), Site5 et Dreamhost. A noter que le seul hébergeur français à proposer RoR est Typhon, qui propose d'ailleurs une offre de découverte de Rails.

En m'y penchant d'un peu plus près, j'ai trouvé que l'offre de Dreamhost était assez stupéfiante : 20 Go d'espace (avec 160 Mo de plus chaque semaine), 1 To de trafic (avec 8 Go de plus chaque semaine), domaines, mails, listes de diffusions illimités, un nom de domaine gratuit pendant toute la durée de l'hébergement, bases MySql illimitées, PHP4, PHP5, Ruby, CGI, FastCGI, accès FTP, SFTP, WebDAV, accès direct sur le serveur par SSH, dépôts CVS et Subversion... le tout pour environ 9.95$ par mois (selon le mode de paiement).

Sachant qu'il y a 97 jours d'essais pendant lesquels on peut changer d'avis et se faire rembourser intégralement, j'ai donc pris un compte pour tester, et ça a l'air de marcher plutôt bien. C'est assez bluffant de pouvoir avoir un accès SSH direct avec un compte sur le serveur tout en sachant qu'on dispose de 20 Go de stockage...

Au niveau du tarif, si le montant annuel peut paraître un peu élevé de prime abord (120 dollars par an, soit environ 100 euros), il faut noter qu'il y a des codes promotions très intéressants disponibles pour une première inscription. Le principe est que pour tout code promotion utilisé, une partie va au nouvel abonné, une autre à celui qui a créé le code. J'en ai créé un qui vous permet de bénéficier de 75$ de promotion pour tous les plans annuels (ce qui fait que je touche 22$ que je pourrai soustraire du prix de mon hébergement) et le maximum possible pour tous les autres plans. Pour être tout à fait honnête, il est possible de bénéficier de réductions plus importantes assez facilement en Googlant un peu.

Si vous souhaitez bénéficier de cette réduc, il vous suffit d'utiliser le code *** (plus d'actualité, cf. ci-dessous).

Mise à jour : je viens de résilier mon abonnement à Dreamhost à l'instant. Non que je sois mécontent de leurs services, mais j'ai trouvé un hébergeur coopératif intéressant et correspondant davantage à mon état d'esprit (je n'étais qu'à moitié à l'aise avec cette histoire de codes promos). A priori le remboursement des sommes engagées si l'on résilie dans les 97 jours semble fonctionner... Du coup, le code promo en question n'est plus valable !

samedi 7 janvier 2006

erc2html

Je viens de pondre un tout petit script en Ruby qui me permet de transformer un log de discussion IRC enregistré sous ERC (Emacs Relay Chat) en fichier HTML pour publication. Le script supprime les sauts de ligne superflus, supprime les messages serveur et colorise deux trois bricoles. C'est loin d'être parfait, mais si ça peut être utile à quelqu'un...

require "cgi"

str = IO.read("/home/julien/lautre_20060107.log.txt")

titre = "Titre de la page"
charset = "UTF-8"

head = <<EOL
<html>
<head>
<title>#{titre}</title>
<meta http-equiv="Content-Type" content="text/html; charset=#{charset}" />
<style type="text/css">
 * {font-family: monospace;}
 .nick {font-weight: bold; color: #A00;}
 .ref {font-style: italic; color: #090;}
 .timestamp {color: #AAA;}
 .me {color: #00B;}
</style>
</head>
<body>
<h1>#{titre}</h1>
<p>
EOL

foot = <<EOL
</p>
</body>
</html>
EOL

str.gsub!(/^ERC>.*$/n, "")
str.gsub!(/
\s+/n, " ")
str.gsub!(/[\d\d:\d\d]/) { |s| "
"+s+"
"}
str.gsub!(/\s+$/n, "")
str.gsub!(/^\*\*\* .*$/n, "")
5.times {str.gsub!(/
\s*
/n, "
")}

str = CGI::escapeHTML(str)
str.gsub!(/^&lt;.*?&gt;/n) {|s| '<span class="nick">'+s+'</span>'}
str.gsub!(/(<\/span>) (\w+\s?:)/n) {|s| $1+' <span class="ref">'+$2+'</span>'}
str.gsub!(/[\d\d:\d\d]/) { |s| '<span class="timestamp">'+s+'</span>'}
str.gsub!(/^\* .*$/n) {|s| '<span class="me">'+s+'</span>'}
str.gsub!(/
/, "<br />
")

str = head + str
str = str + foot

puts str

lundi 14 novembre 2005

Oneliner en Ruby

Après avoir essayé (de manière plus ou moins approfondie) plusieurs langages de script comme Perl ou Python, et après avoir longuement hésité, je crois que mon choix va finalement se porter sur Ruby. Celui-ci me semble en effet combiner à la fois la puissance et la concision de Perl avec la clarté d'un langage purement objet.

Voici donc un exemple de oneliner en Ruby, en l'occurrence qui permet de renommer en minuscules tous les fichiers d'un répertoire :

 ruby -e 'ARGV.each {|file| File.rename(file, file.downcase)}' *

Plutôt simple, non ? En plus, il y a moyen de rendre cela beaucoup plus souple et puissant en utilisant des regexps, du type :

 ruby -e 'ARGV.each {|file| File.rename(file, file.gsub(/toto/, "titi")}' *