Automatiser des taches récurentes avec Rails


Il existe plusieurs façons d'effectuer des taches récurentes au sein d'une application Rails, notamment avec Rake. La technique que j'utilise présente comme (seul ?) inconvénient d'être un peu lourde puisque elle relance le stack complet lors de son appel. Bon, d'un autre côté, je m'en sert principalement pour les backups et les envois de Mails nocturnes, alors les perfs, dans ce cas, je m'en fout un peu. En revanche, cette technique présente le gros avantage de pouvoir bénéficier de tout Rails (ActiveRecord, ActiveMailer...), et permet aussi d'être intégré au sein de l'appli d'une manière que je trouve plutôt cohérente. Bon, assez parlé, on s'y met :

Créons un répertoire qui contiendra tous les "controllers" de nos tâches nocturnes, nous allons le placer à côté des models et des controllers, appelons le "shedulers"


$ cd /home/mon_appli/app/
$ mkdir shedulers
$ ls
controllers
helpers
models
shedulers
views

Dans ce répertoire "schedulers", créons un fichier -par exemple- "newsletter.rb" (notez l'héritage d'ActiveRecord)

class Newsletter < ActiveRecord::Base

  this_time = Time.now
 
  accounts = Account.find(:all)
   
  accounts.each do |account|
   
    Notifier.deliver_email(account.email,"Newsletter du #{this_time.strftime('%d:%m:%Y')}")  
      
  end
  
end

Hop, vous bénéficiez d'ActiveRecord, vos relations et tout le toutim. Idem pour ActiveMailer, vous avez tout sous la main ! Maintenant, il ne reste plus qu'à appeler notre fichier grâce au script/runner de Rails. Placer vous à la racine de votre appli et taper dans la console :

script/runner app/shedulers/newsletter.rb >> log/production.log 2>&1

Ca marche ? Bon, ben maintenant c'est facile, y'a plus qu'à appeler cette même commande avec Cron

5 3 * * * cd /home/mon_appli && script/runner ./app/crawlers/debiter.rb >> /home/mon_appli/log/production.log 2>&1

Dans cet exemple, la newsletter partira donc chaque nuit à 3h05, et les erreurs éventuelles seront loguées dans le Log habituel de notre appli.



Commentaires Aucun commentaire pour le moment

A quoi ça sert "une maison de disque" ?!


Quand je lis ce genre d'article, je suis certes un peu triste, parce qu'il y a des gens passionnés et compétents qui vont perdre leur boulot, certes. Toutefois, je ne peux m'empêcher de réagir parce qu'un des ces jours, il va bien falloir que "l'industrie phonographique" nous la lache et comprenne une bonne fois pour toute qu'elle n'est plus d'aucune utilité. Voila, c'est posé.

Maintenant, je m'explique. Il était un temps lointain où pour trouver des gens qui vous écoutent, quand on était musicien, il fallait passer à la radio, ou tout du moins vendre des disques. Bien, le problème, c'est que bien avant de pouvoir les vendres, ces disques, il fallait :

Enregistrer la musique. Cela se passait dans de grands studios, que l'on louait à partir de 3000 Francs la journée (si ma mémoire est bonne) pour pouvoir disposer d'un matériel de qualité,et ça ressemblait à ça :



Une fois enregistré, votre "master" (la bande mère enregistrée en studio) était envoyé dans de grandes usines où l'on fabriquait le support qui allait servir à transporter votre chef-d'oeuvre jusqu'aux oreilles de vos fans



Ensuite, toute une chaine d'approvisionnement prenait en charge ces supports et les distribuait. Notez qu'à ce niveau, Barils de lessive ou "Sergent Peppers lonely hearts club band", c'était le même cirque à gérer.



Enfin, votre vinyl était vendu par de plus ou moins grands distributeurs, genre Fnac ou autre



C'est évident, tout cela coutait une fortune, et on comprend alors tout le sens d'une maison de disque, qui se chargeait de tout l'aspect logistique et investissement de la chose. De plus, pour que cette chaine puisse tourner, il fallait être à peu près sur que le produit final allait se vendre, et cela passait d'une part par la sélection draconnienne des futurs produits/artistes (haaaa "décrocher un contrat", tout un mythe), d'autre part -à l'autre bout de la chaine- par des techniques marketing plus ou moins invasives (pub télé, matraquage Radio...) afin de s'assurer de pouvoir écouler ses couteuses galettes de Vinyls. La musique coutait cher à produire et à faire connaitre, il était somme toute logique que la maison de disque récupère ses billes, l'artiste ne touchant finalement qu'une petite part (généralement autour de 5%) du gateau. Bon, c'était comme ça, ça marchait, et tout le monde était content.


Et puis d'un coup, Badaboum, le numérique arrive, pour le plus grand plaisir de TOUS les artistes (dont je fus, modestement), qui se ruèrent alors sur le Home Studio. Dans la foulée quasi immédiate, le Web débarque et soudainement (ça s'est passé en moins de 10 ans, c'est fou), tout ce que je viens de vous raconter au dessus, le studio hors de prix, l'usine de pressage, les camions, les cartons chez les distributeurs... tout, se résume à ça :



De Manu Tchao à Camille, en passant par la quasi totalité des artistes Electro et Rap actuels, et même désormais des musiciens classiques, tous utilisent un simple ordinateur pour s'enregistrer et mixer leurs compositions. Quand à la distribution, elle tient désormais dans un simple copier/coller/publier sur Myspace, Deezer ou LastFM. Pour les artistes, c'est que du bonheur. Fini le filtrage des maisons de disques qui freinait la diversité musicale par absence de prise de risque, fini les obstacles insurmontables avant de pouvoir accéder à des auditeurs, fini de s'endetter pour se payer des journées de studio à prix d'or... TOUS les artistes remercient "le numérique", qui permet d'enregistrer ses compositions de chez soi, avec une qualité professionelle, et de les distribuer instantanément dans le monde entier pour le prix d'une carte son et d'un PC Portable à 1000 Euros.

A l'heure d'Hadopi, où des dinosaures hésitent toujours entre la culpabilisation et la pénalisation, j'aimerais bien en entendre certains concernant l'aspect "coût" de la production d'un album. On n'entend toujours parler que de l'aspect "pertes" liées au numérique, mais qu'en est-il de ce qu'il permet d'économiser maintenant ?

L'histoire se répete, et nous voila revenus au même point que lorsque l'électricité arrivait massivement dans les campagnes. Alors oui, c'est sur, la plupart des fabricants de bougies et de lampes à pétrole vont mettre la clef sous la porte. C'est un peu triste, mais on a plus besoin d'eux. C'est aussi simple que ça : ajourd'hui, une "maison de disque", ça ne sert plus à rien

Edit:Tiens, hasard de calendrier, Radio Head va bientôt sortir son nouvel album. Hein ?! Ben oui, en se passant de maison de disque, évidemment.



Commentaires 2 commentaires

Initialiser un repo Git pour les nuls


Admettons que vous soyez dans la situtation suivante :

  • Vous disposez d'un serveur dédié sur lequel vous hébergez (ou voulez héberger) une working copy et votre repository SVN
  • Vous voulez quitter SVN pour GIT, mais n'êtes pas encore un expert en la matière
  • Vous n'avez que faire de l'historique de vos commit, de vos branches... vous voulez juste repartir de 0 avec Git (sinon, voyez plutôt Git-SVN)
  • Vous souhaitez simplement créer un dépot Git et démarrer du bon pied rapidement

Vous êtes aussi dans ce même cas de figure ?! Dans cette exemple, j'utilise deux machines : @server via SSH et @local qui est mon PC, au chaud chez moi.


# Côté serveur, on commence par se créer un répertoire qui hébergera le serveur "bare" (=le dépot SVN)

guillaume@server:$ mkdir /var/local/git/repos/my_app

# On initialise ce repo

guillaume@server:$ cd /var/local/git/repos/my_app && git --bare init
Initialized empty Git repository in /var/local/git/repos/my_app/

# Nous voila maintenant avec un repo GIT "bare", un peu comme un repo SVN. Si on regarde à l'intérieur, ça donne ça :

$ ls
branches config description HEAD hooks info objects refs

# On revient chez soi, en local, et on supprime récursivement tous les .svn du projet

guillaume@local:$ cd /home/guillaume/my_app/ 
guillaume@local:$ rm -rf `find . -type d -name .svn`

# Puis on initialise le projet, cela va créer un répertoire .git à la racine, contenant -entre autre- les fichiers de conf

guillaume@local:$ git init
Initialized empty Git repository in /home/guillaume/my_app/.git/

# On informe maintenant la copie locale de l'existence du repo sur notre serveur (évidemment, remplacez 81.81.81.81 par l'adresse de votre serveur). Par convention on appellera ce repo "origin"

guillaume@local:$ git remote add origin ssh://81.81.81.81/var/local/git/repos/my_app

# On informe Git des fichiers qu'il faut tracker. Dans notre cas, on ajoute tout le répertoire, soit simplement "."

guillaume@local:$ git add .

# Ok, on peut faire notre premier commit :

guillaume@local:$ git commit -a -m 'initialize repo'
[master (root-commit) 7871087] initialize repo
23 files changed, 500 insertions(+), 0 deletions(-)
create mode 100755 build.properties
create mode 100755 build.xml
.....

# On a presque terminé : il faut maintenant tout monter sur notre repo "origin", dans la branche "master" :

guillaume@local:$ git push origin master
Counting objects: 44, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (31/31), done.
Writing objects: 100% (44/44), 1.65 MiB, done.
Total 44 (delta 1), reused 0 (delta 0)
To ssh://81.81.81.81/var/local/git/repos/my_app
* [new branch] master -> master 

# Et voila ! Si on retourne sur notre serveur, on a plus qu'à "cloner" (= checkout sur SVN) notre appli :

guillaume@server:$ git clone file:///var/local/git/repos/my_app

# On peut vérifier que tout marche en faisant quelques modifs dans des fichiers en local, puis :

guillaume@local:$ git commit -a -m "Add some killer features"
[master 51401e0] add
 1 files changed, 2 insertions(+), 0 deletions(-)
 mode change 100644 => 100755 app/views/demo.html.haml

guillaume@local:$ git push
Counting objects: 13, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (7/7), 595 bytes, done.
Total 7 (delta 5), reused 0 (delta 0)
To ssh://81.81.81.81/var/local/git/repos/my_app
   ef4d530..51401e0  master -> master

# On revient sur le serveur, et on on "pull"

guillaume@server:$git pull 
remote: Counting objects: 13, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 7 (delta 5), reused 0 (delta 0)
Unpacking objects: 100% (7/7), done.
From file:///var/local/git/repos/my_app
   ef4d530..51401e0  master     -> origin/master
Updating ef4d530..51401e0
Fast forward
 controllers/application_controller.rb     |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)
 mode change 100644 => 100755 app/views/demo.html.haml

Ce tuto est librement inspiré de celui-ci en Anglais, qui m'a beaucoup aidé à faire mes premiers pas.



Commentaires Un commentaire