mercredi 11 juin 2008

Décalage temporel des fichiers .srt

Les fichiers à extension .srt sont des fichiers textes utilisés pour sous-titrer des vidéos, typiquement des divx. Il arrive que les sous-titres contenus dans ces fichiers soient décalés globalement(1 seconde d'avance ou 2 secondes de retard).
Voici l'exemple d'un fichier .srt:
1
00:01:14,601 --> 00:01:16,410
Il fait beau aujourd'hui

Le but de l'application d'aujourd'hui est d'écrire une commande Ruby, utilisant les expressions régulières:
-prenant en paramètre le nom d'un fichier.srt,un décalage temporel exprimé en millième de seconde et un nom de fichier de sortie.
-vérifiant que le fichier passé en paramètre existe et est exploitable.
-appliquant le décalage temporel au fichier initial pour pouvoir générer le fichier de sortie.
exemples de fichiers.srt:

Le code correspondant à l'application est le suivant:
fichier=ARGV[0]
decalage=ARGV[1]
nvofichier=ARGV[2]
Comme cité ci-dessus, ces trois lignes nous montrent les arguments que l'utilisateur devra passer en paramètre qui sont le fichier, le décalage et le nouveau fichier.

On commence tout d'abord par ouvrir le nouveau fichier en mode écriture.
nomfichier = File.open(nvofichier,'w')
Puis on vérifie que le fichier existe et est bien exploitable.

if File.file?(fichier)&&File.writable?(fichier)

Ensuite on fait appel à la méthode open de la classe File qui ouvre et ferme un fichier à la fois et peut être aussi associée à un bloc.
File.open(fichier,'r') do |file|

Après, on a recours à un itérateur qui parcourt les lignes du fichier et teste la concordance(=~) de ces dernières avec le format d'un fichier .srt, comme vous pouvez le remarquer l'expression suivante : (\d{2}:\d{2}:)(\d{2}),(\d{3})(-->\\d{2}:\d{2}:)(\d{2}),(\d{3})/correspond au format de l'heure dans un fichier .srt, en effet on utilise à nouveau des expressions régulières qui utilisent à leur tour des patterns(dont l'intérêt est de filtrer une chaîne de caractères selon cette même expression régulière), le \d{2} fait deux fois référence à un chiffre et les parenthèses sont utilisées pour regrouper les termes d'expressions régulières à l'intérieur.

file.each_line do |line|

if line =~ /(\d{2}:\d{2}:)(\d{2}),(\d{3})( --> \d{2}:\d{2}:)(\d{2}),(\d{3})/

Si la concordance est vérifiée ,les variables $1,$2,..contiendront respectivement la première, la seconde,....sous-expression régulière.
nvsec1="#{$2}#{$3}".to_i+decalage.to_i
nvsec2="#{$5}#{$6}".to_i+decalage.to_i
Enfin,on crée deux variables nvsec1 et nvsec2 qui contiendront respectivement les variables ($2,$3)et ($5,$6) décalés du décalage que la fonction prend en paramètre.

nvsec2=nvsec2.to_s.insert(-4, ',')
nvsec1=nvsec1.to_s.insert(-4, ',')
line = "#{$1}"+nvsec1.to_s+"#{$4}"+nvsec2.to_s
nomfichier.puts line
else
nomfichier.puts line
end
end
end
else

Si le fichier passé n'existe pas ou est inexploitable on retourne le message d'erreur suivant :
puts "Fichier qui n'existe pas ou qui n'est pas exploitable"
end

Après s'être attardées sur l'explication du code, finissons alors avec une petite application.
Comme convenu on rentre en paramètre un nom de fichier, un décalage qui est de 1 pour cet exemple et un autre fichier de sortie.
Le résultat obtenu est le suivant.
1
00:01:14,601 --> 00:01:16,410
Il fait beau aujourd'hui
après l'application du programme ruby:
1
00:01:14,600 --> 00:01:16,409
Précédemment dans 24


Rechercher un fichier dans un répertoire

A présent, nous allons vous montrer comment faire un programme qui permet de rechercher un fichier avec une certaine extension dans un répertoire donné. Ce programme s'apparente par exemple à l'outil Rechercher de Windows.


L'utilisateur doit rentrer le nom du répertoire puis s'il le souhaite une partie ou l'ensemble du nom de fichier recherché ainsi que l'extension

nomrep=""
while (!File.directory?(nomrep))
puts "Rentrez le nom du répertoire"
nomrep=gets.chomp
$rep=nomrep
end

#L'utilisateur rentre ou non une partie ou l'ensemble du nom de fichier recherché
fichierrech=""
puts "Entrez ou non une partie ou l'ensemble du nom de fichier recherché"
fichierrech=gets.chomp
$fichierrech=fichierrech


exttapee=""
puts "Indiquer ou non l'extension du fichier que vous voulez rechercher"
exttapee=gets.chomp
$ext=exttapee

La méthode récursive suivante explore chaque répertoire et pour chaque fichier teste s'il correspond à la requête
On utilise pour cela encore une fois les expressions régulières
/\w*#{$fichierrech}\w*\.#{$ext}/
\w : une séquence qui contient tous les caractères constituant les mots. On aurait pu écrire à la place [A-Za-z0-9_]
p* : il doit y avoir 0 ou n occurrence(s) de p
\. : le point est un métacaractère, il indique une occurrence de n'importe quel caractère. Comme on souhaite le rechercher dans la chaîne traitée, on l'a donc précédé d'un \
On recherche donc une chaîne qui contient 0 ou n caractères puis le nom du fichier puis O ou n caractères puis le . puis l'extension

def explore(repertoire,tablo)
Dir.open(repertoire) do |rep|
rep.each do |nom|
if nom!='.'&&nom!='..'
if File.directory?(repertoire+'/'+nom)
explore(repertoire+'/'+nom,tablo)
else
if nom=~ /\w*#{$fichierrech}\w*\.#{$ext}/
tablo.push(repertoire+nom)
end
end
end
end
end
end

On appelle la méthode, on écrit dans le fichier le résultats
tablo=[]
explore($rep,tablo)

nvofichier="recherche#{$ext}"
nomfichier = File.new(nvofichier,'w')
tablo.each { |element|
nomfichier.write element+"\n"
}
nomfichier.close
puts "Les résultats des requêtes ont été enregistrés sur ce fichier #{nvofichier}"

Nous avons comparé l'outil Rechercher de Windows et ce programme
Pour une recherche dans C:\Documents and Settings avec un mot clé et l'extension .jpg
Programme ruby : 6,65 secondes
Outil rechercher (avec la recherche sur les images et photos) : 16,97 s

Pour une recherche dans le même répertoire sans extension particulière
Programme ruby : 6,97 secondes
Outil rechercher : 17,87 s

Pour ces recherches, le programme est plus que deux fois plus rapide que l'outil de Windows. Cependant, ce dernier possède des fonctionnalités que le programme ruby ne contient pas comme de pouvoir accéder directement aux fichiers trouvés par l'interface graphique.
Pour le premier essai, il faut aussi penser que l'outil windows recherche dans toutes les extensions d'image : jpg, bmp, tif ... notre programme ne fait une recherche que sur les fichiers jpg.
Cependant pour une recherche correspondant aux critères : recherche d'un fichier sur une extension particulière, le programme ruby est bien plus performant

lundi 9 juin 2008

Enlever les accents d'un fichier

Après la pause pour vous parler de Ruby on rails, revenons sur notre thème principal.
Dans les interpréteurs de commande par exemple, les accents sont mal interprétés. Pour une meilleure lisibilité, il est alors intéressant d'avoir un fichier sans accent.
Le langage ruby intègre les expressions régulières. Celles-ci ont pour objectif de filtrer des données (chaînes de caractères). Elles s'apparentent à un Rechercher/Remplacer. Ce sont des fonctionnalités très puissantes mais à la syntaxe parfois ésotérique.
Dans notre programme qui enlève les accents, nous allons simplement utiliser la méthode gsub qui effectue les remplacements.
Voici le programme :

#Utilisateur doit taper un nom de fichier
#Tant que ce n'est pas un fichier, on réitère la demande
nomtape=""
while (!File.file?(nomtape))
puts "Entrer le chemin vers un nom du fichier"
nomtape=gets.chomp
$nomfichier=nomtape
end


#Si l'utilisateur le souhaite, le fichier est d'abord copié avant d'être modifié
#Si vous utilisez Unix, changer la ligne de commande `copy #{$nomfichier} #{$nomfichier}.save` en `cp #{$nomfichier} #{$nomfichier}.save`
rep=""
while(rep!="O" && rep!="N")
puts "Voulez-vous sauvegarder le fichier avant de le modifier (O/N)?"
rep=gets.chomp
end
if(rep=="O")
`copy #{$nomfichier} #{$nomfichier}.save`
puts "Creation de #{$nomfichier}.save"
end


#On affiche le contenu du fichier ligne par ligne avec le numéro de la ligne :
mon_fichier = File.open($nomfichier, "r")
i = 0
fichier=[]
mon_fichier.each_line { |ligne|
fichier[i]=ligne
i += 1
}
mon_fichier.close

#Utilisation d'un table associative (hash). C'est une collection d'éléments accessibles au moyen d'une clé. 'á', 'à' et 'â' sont ici des clés qui permettent d'accéder à 'a'
#gsub : effectue les remplacements
accents = { ['á','à','â','ä','ã'] => 'a',
['Ã','Ä','Â','À','Á'] => 'A',
['é','è','ê','ë'] => 'e',
['Ë','É','È','Ê'] => 'E',
['í','ì','î','ï'] => 'i',
['Í','Î','Ì','Ï']=> 'I',
['ó','ò','ô','ö','õ'] => 'o',
['Ó','Õ','Ö','Ô','Ò'] => 'O',
['œ'] => 'oe',
['Œ'] => 'OE',
['ß'] => 'ss',
['æ']=> 'ae',
['Æ']=> 'Æ',
['ú','ù','u','ü'] => 'u',
['Ü','Û','Ù','Ú'] => 'U',
['ç'] => 'c',
['Ç']=> 'C'
}
accents.each do |ac,rep|
ac.each { |s|
j=0
fichier.each { |elem|
fichier[j]=fichier[j].gsub(s, rep) #remplace s par rep, le cas échéant
j += 1
}
}
end

fichiermodif = File.open($nomfichier, "w")
fichier.each { |element|
fichiermodif.puts element
}

fichiermodif.close

puts "Modification de #{$nomfichier}"


source : http://www.ruby-forum.com/topic/144612#640711

vendredi 6 juin 2008

Ruby On Rails


On ne pouvait évoquer le langage Ruby sans parler du framework Ruby On Rails.
Ce dernier est écrit principalement en langage Ruby selon le modèle de conception MVC(Model view controller).
Les développeurs de Rails disent pouvoir permettre de faire des applications web différentes avec peu de lignes de code,ainsi des applications complexes sont réalisées rapidement et simplement.Le risque d'erreur est alors réduit.
Depuis 2 ans,Rails s'est imposé comme la star du web 2.0,à côté d'Ajax et des nouvelles applications riches.Le secret de cette réussite réside en les principes sur lequels s'appuient le framework:
-il n'y a pas de duplication de code
-adoption de convention plutôt que de longs fichiers de configuration
-adhésion stricte au modèle de programmation MVC
-utilisation d' un seul langage ( Ruby ) pour tout faire
Avec plus de 700000 téléchargements au cours de ces six derniers mois,Rails s'est imposé comme le framework web 2.0 par excellence.
L'engouement pour cette technologie poussa Sun et Microsoft à embaucher des développeurs afin de jeter les ponts entre Ruby/Rails et les mondes Java et .Net
Installation de Ruby On Rails:

En premier lieu,il faut télécharger RubyGems qui est un package standard de Ruby.
Ensuite, extraire ruby setup.rb.
Une fois tout cela fait ,tapez la commande suivante:
gem install rails --include-dependencies

Source:Programmez numéro 107





jeudi 5 juin 2008

Ruby et la gestion de fichiers (suite)

Nous allons maintenant créer un programme qui permet d'ajouter un copyright à tous les fichiers dans un répertoire donné. Bien entendu, ce rajout du copyright n'est valable que pour les fichiers texte, cela ne va rien donner pour les autres fichiers dont sont inclus les fichiers de traitement de texte (.doc, .xls, .odt ...). Pour ces derniers, le texte va être rajouté mais ne va pas apparaître lorsqu'on va ouvrir le fichier avec l'application

On crée d'abord un nouveau programme qui permet de créer un tableau contenant la liste des fichiers d'un répertoire donné. L'utilisateur doit spécifié en argument le répertoire ainsi que son nom, qui va servir pour le copyright (Copyright Dupond)

Le dièse (#) permet d'écrire un commentaire dans le code

Test du premier argument donné (ou non) qui correspond au nom de la personne
if(ARGV[0])
$nompers = ARGV[0] #variable globale
else
puts "Quel est votre nom ?"
$nomperso=gets.strip
end


Test du deuxième argument donné (ou non) -> dossier que l'on veut examiner
if (ARGV[1])
if (File.directory?(ARGV[1])) #est-ce un répertoire ?
$nomrep = ARGV[1]+"/"
else
puts "Le deuxieme argument specifie doit etre un repertoire !"
exit #sortie du programme
end
else
rep=""
while (rep!="O" && rep!="N")
puts "Vous n'avez pas specifie de repertoire, voulez-vous (O/N) que le repertoire soit le repertoire courant ?"
rep=STDIN.gets.strip #on a lancé le programme avec un argument, il est donc nécessaire d'utiliser STDIN.gets à la place de gets
end
if(rep=="O")
$nomrep='./'
else
exit
end
end


Met dans un tableau les fichiers du répertoire
class String
def liste_rep(tablo)
liste_exclus = [".", ".."]
d=Dir.open(self)
liste_dir = d.sort - liste_exclus
liste_dir.each { |fichier|
case File.ftype(self+fichier)
when "file"
tablo.push(fichier)
end
}
end
end
tablo=[]
$nomrep.liste_rep(tablo)

A la fin du programme, on appelle un programme ruby qui permet de crée un copyright à la fin de chaque fichier spécifié en argument
On renvoie ce que donne l'exécution du programme
Le caractère ` se fait en appuyant sur les touches Altgr et 7 du clavier puis en tapant sur la barre d'espace
i = 0
tablo.each { |elem|
print `ruby "lienversfichierruby.rb" #{$nomrep}#{tablo[i]} #{$nompers}`
i += 1
}
Il s'agit à présent de créer le programme ruby que l'on vient d'appeler
Celui-ci ressemble beaucoup au programme crée précédemment (voir le message)
On a enlevé l'affichage du contenu du fichier et rajouter la création du copyright à la fin du fichier.
Voici ce que cela donne :
if ARGV[0]
nomfichier = ARGV[0]
else
puts "Vous n'avez pas specifie de nom de fichier ! Le programme va donc s'arreter"
exit
end

if ARGV[1]
nom = ARGV[1]
else
puts "Vous n'avez pas specifie votre nom ! Le programme va donc s'arreter"
exit
end
if !File.file?(nomfichier)
File::new(nomfichier, "w+")
puts "Le fichier #{nomfichier} n'existe pas, il a donc ete cree"
end

#Ecriture du copyright :
#Le mode 'a' permet l'ouverture du fichier en lecture et écriture et place le pointeur de fichier à la fin du fichier.
mon_tabl = ["Copyright #{nom}"]
if(!File.writable?(nomfichier))
puts "Veuillez mettre #{nomfichier} en ecriture !"
else
mon_fichier = File.open(nomfichier, "a")
mon_tabl.each { |element|
mon_fichier.write element+"\n"
puts "#{nomfichier} modifie"
}
mon_fichier.close
end


source : http://pbnaigeon.developpez.com/tutoriel/ruby/premiers-pas-avec-ruby/#LVIII

lundi 2 juin 2008

Ruby et la gestion de fichiers

Après avoir eu un aperçu sur quelques fonctionnalités du langage Ruby nous allons maintenant aborder l'utilité de ce dernier dans la gestion de fichiers.
Pour cela nous allons vous montrer quelques petits programmes qui illustrent bien le côté pratique et simpliste de ruby.
Nous expliquerons le code petit à petit.

Dans ce premier exemple, en ligne de commande, lors de l'exécution du programme qui suit, on a rajouté des arguments.
ex : monprogruby.rb argu1 argu2
Les arguments seront ainsi stockés dans un tableau qui se nomme ARGV, on peut les récupérer par la suite dans le programme ruby.
Pour récupérer le premier argument il suffit de taper ARGV[0].

Si l'on exécute ce programme sans argument, un fichier par défaut est créé.
if ARGV[0]
nomfichier = ARGV[0]
else
puts "Vous n'avez pas specifie
d'argument, un fichier par defaut nommé fichier.txt a donc ete cree"
nomfichier="fichier.txt"
end
Dans le cas contraire, si le fichier spécifie existe, il est créé, autrement on le crée.


if !File.file?(nomfichier)
File::new(nomfichier, "w+")
puts "Le fichier #{nomfichier} n'existe pas, il a donc ete cree"
else
puts "Le fichier
existe"
end

Si le fichier est en mode écriture, on écrit dedans.
mon_tabl = ["Bonjour,", "Ceci est un fichier qui contient cette ligne ... ",
"Puis celle-ci"]
if(!File.writable?(nomfichier))
puts "Veuillez mettre le fichier en ecriture !"
else
mon_fichier = File.open(nomfichier, "w")
mon_tabl.each { element
mon_fichier.write element+"\n"
}
mon_fichier.close
end

Pour afficher le contenu du fichier ligne par ligne avec le numéro de celle-ci il suffit de taper le code suivant :
mon_fichier = File.open(nomfichier, "r")
i = 1
mon_fichier.each_line { ligne
puts "#{i} - #{ligne}"
i += 1
}

Pour renommer un fichier texte par exemple tata en toto il faut avoir recours au code suivant:

File::rename("tata.txt", "toto.txt")

source : http://pbnaigeon.developpez.com/tutoriel/ruby/premiers-pas-avec-ruby/#LVIII

Découvrir Ruby

Nous allons créer notre premier programme ruby afin de vérifier que Ruby fonctionne :
Il s'agit d'un programme qui affiche "Hello World" :
puts "Hello World"
Il existe plusieurs possibilités de faire marcher ce programme Ruby :

1) Taper directement la ligne de code dans l'interpréteur de commande irb (Interactive Ruby). C'est un terminal qui interprète les expressions Ruby.

2) Créer un fichier avec l'extension .rb
Vous pouvez ensuite le modifier avec n'importe quel éditeur de texte (Scite installé automatiquement si vous avez utilisé l'installeur ou le bloc note ou Notepad ++ ...)

Il faut ensuite exécuter le fichier.
Pour cela, il y a plusieurs possibilités :
  • Sous Windows, on peut directement exécuter le programme grâce à l'invite de commande (aller dans démarrer/accessoires/invite de commandes ou démarrer/exécuter et taper cmd)
    Il s'agit ensuite de se déplacer dans le répertoire où se trouve le fichier
    cd : pour changer de répertoire
    dir : afficher la liste des fichiers du répertoire courant
    puis nomprgm.rb pour exécuter le fichier
  • Sous Unix, il faut mettre impérativement au début du fichier .rb
    #!/usr/bin/ruby (c'est le chemin vers l'exécutable ruby) et rendre le fichier exécutable
    cd : pour changer de répertoire
    ls : afficher la liste des fichiers du répertoire courant
    ./nomprog.rb pour exécuter le fichier
  • Si l'on utilise le logiciel Scite.
    Taper F5 pour que le programme s'exécute.
  • Double-clic du fichier dans l'explorateur
    Dans ce cas-là, pour pouvoir afficher le résultat du programme, il faut taper gets à la fin du code. Cela permet d'arrêter l'exécution du programme et d'attendre que l'utilisateur tape Entrer pour le continuer.
    Cependant, si votre programme contient des erreurs, son exécution s'arrêtera sans indiquer les lignes d'erreurs. Il n'est donc pas conseillé d'utiliser cette méthode pour lancer ses programmes.
Dans tous les cas, vous devriez voir apparaître à l'écran Hello World

mercredi 21 mai 2008

Un avant-goût de Ruby...

Ruby est un langage de programmation orienté objet, créé par Yukihiro Matsumoto.
La première version fut publiée en 1995 et celle utilisée aujourd'hui est la 1.8.6.

C'est un langage Script de haut niveau dont la syntaxe est inspirée de Smaltalk, Perl, Lisp. Cependant, la syntaxe est plus simple et plus claire que ces derniers, l'objectif étant de créer des programmes extrêmement simples et lisibles.

Par exemple:

-pour connaître la longueur d'une chaîne de caractères :

"Ruby est un langage créé par Yukihiro Matsumoto".length
-pour saluer 10 fois :

10.times do
puts"SALUT!"
end

Ruby est un langage orienté objet où tout est objet même les nombres, cependant il y a quelques conventions de nommage à respecter !
Prenons pour exemple var qui fera référence à une variable locale tandis que @@var fera référence à une variable de classe.
Il n'y a aucune fonction, il n'existe que des méthodes !


L'héritage simple tout comme l'héritage multiple est permis (avec l'utilisation de Mixin pour ce dernier).
Un Mixin est une classe abstraite qui représente un service qu'il est possible de greffer aux classes héritières.(Par exemple, considérons une classe Immeuble. À cette classe nous pouvons ajouter un ascenceur. Pour cela, on crée une classe abstraite Ascenceur qui est ici un mixin, et on crée une classe ImmeubleAvecAscenceur qui hérite à la fois d'Immeuble et d'Ascenceur.)

L'utilisation des blocs, des boucles et des itérateurs est incontournable en ruby.

Il existe aussi plusieurs classes intégrées et packages standards.




samedi 17 mai 2008

Installer ruby

Dernière version stable : 1.8.6

Il y a plusieurs possibilités d'installer Ruby :
  1. Sur Microsoft Windows, avec l'installeur
  2. Ruby 1.8.6 One-Click Installer
  3. Sur GNU/Linux :
  4. Utiliser le système de package mis à votre disposition le cas échéant ou compiler les sources.
    Sur Mac OS X
    Version 1.8.6 (la dernière) intégrée dans Mac OS X Leopard.
    Version 1.8.2 disponible dans Mac OS X Tiger
    Pour mettre à jour Ruby ou pour le télécharger, vous pouvez passer par Locomotive (adapté pour utiliser le framework Ruby on Rails) MacPorts ou Fink (possibilité d'installer Ruby à partir d'une interface graphique).
  5. A partir des sources C
  6. S'il n'y a pas d'autres possibilités d'installation ou si vous êtes à l'aise avec votre plateforme de développement !
    Dossier des sources

Nous avons essayé l'installation sous Windows avec l'installeur.
Lors de cette installation,

  • Scite : un éditeur de texte adapté au langage ruby
  • Activer RubyGems. Une application ou une bibliothèque est rassemblée dans une gemme, qui est un élément d’installation unique. RubyGems utilise exclusivement son propre système de fichier, plutôt que d’installer les fichiers à leurs emplacements « habituels ». Cela permet d’obtenir de nouvelles fonctionnalités et augmente la fiabilité du système.
  • European keyboard. Cela crée une variable d'environnement nommée INPUTRC dont la valeur est Programme d'installation ruby\bin\inputrc.euro. Grâce à cela, on est censé pouvoir taper des caractères comme @ ou [ dans la console irb. Mais sans cela, les caractères apparaissent tout aussi bien !

Sources : http://www.ruby-lang.org/fr/downloads/ et http://www.rubyfrance.org/documentations/divers/introduction-rubygems/

lundi 7 avril 2008

Pourquoi ce blog ?

Nous sommes deux étudiantes en première année à l'ENSISA. Dans le cadre du projet de première année il nous est demandé de créer un blog traitant d'un aspect de l'ingénierie logicielle. Nous avons choisi de parler du langage Ruby. Nous allons donc montrer quelques applications de ce langage qui s'avèrent être utiles dans les systèmes de gestion des fichiers. Bonne visite !