Vi vi, notre ministre de la culture préférée a enfin trouvé le moyen de relancer l’économie !
Et pas seulement ! Car avec cela elle va diviser par deux le taux de chomage et résoudre la crise du logement !!

En effet le conseil constitutionnel vient de censurer la riposte graduée, élément majeur de l’Hadopi.

Du coup le haut comité Hadopi ne pourra plus que avertir les internautes et leur dire « Attention ! Tu es un méchant pirate» .
Par la suite, il faudra que l’internaute soit trainé en justice et qu’un juge s’occupe de son cas de méchant téléchargeur qui sature l’internet.

Mais du coup on va avoir 1 000 personnes à se retrouver devant un juge chaque mois.
Vu les temps de réaction de la justice, on peut également supposer que chaque procès durera au moins 6 mois.
Il faudra environ un juge pour 100 internautes tous les 6 mois. Et un gardien de prison pour tout autant de méchant qui ne peuvent pas être laissés en liberté. C’est trop dangereux.
Ca, c’est pour la relance de l’emploi. La moitié des Français vont devenir gardien de prison ou juge.
L’autre moitié sera derrière les barreaux.

Du coup avec 50% des Français en prison, cela résoud la crise du logement.
Plus personne n’aura besoin de logement. Donc les prix vont baisser.

Enfin il faudra construire tout plein de prisons pour héberger les quelques 30 millions de pirates.
Du coup la moitié des gardiens de prison seront à temps partiel : gardien le jour et maçon la nuit (parce qu’il faut travailler plus pour gagner plus).
Et cela va relancer l’économie :)

Voila le bout du tunnel ! Y’a plus qu’à suivre la lumière braves gens. Et remerciez Christine grâce à qui tout cela va se produire :)

Vu que je me veux de toucher un peu à tous et que je balance sur un peu tous les frameworks lorsque quelque chose ne me plait pas, autant également le faire sur Rails …
Tout en essayant, pour une fois, de faire quelque chose de vraiment structuré et pas juste trois paragraphes ou je raconte ce qui me passe par la tête sur le sujet.

Qu’est-ce qu’une fixture ?

Lorsque vous créer des tests unitaires et fonctionnels, il est primordial d’avoir des données en base, pour effectuer vos tests.
Il est assez lourd de créer manuellement ses entrées pour chaque test.
Du coup rails propose des fixtures. Dans un fichier yaml, vous placez toutes vos données.
Et elles sont entrées automatiquement en base (sans validation).

C’est sympa ça permet de gagner pas mal de lignes de code dans vos tests.

Mais pourquoi c’est pas bien ?

Chaque fichier de fixture correspond à une base de données.
Si vous créer un fichier users.yml, qui contient des utilisateurs, celui-ci ne pourra remplir des données que dans la base users du fait du nom du fichier.

Du coup lorsque votre application commence à grossir, cela devient assez rapidement le bordel. Vous avez beaucoup de données. Celles-ci deviennent illisibles.
Vous ne savez jamais si telle ou telle donnée est réellement utilisée ou non.
Si en prime vous avez rédigé certains tests de manière absolue et non pas relative, il suffit que vous ajoutiez un utilisateur pour que 15 tests échouent alors que votre code est toujours valide.

A moins de s’imposer une rigueur particulièrement extrême, on s’oppose donc à des grosses prises de tête et une hausse de la consommation d’aspirine lorsque l’application va grossir.

Alors quelle solution ?

La solution est simple : n’utilisez pas les fixtures :)
Cela ne signifie pas ne rien utiliser du tout bien évidemment ! Parce que … Haaaave you met Factory Girl ?
L’idée de ce plugin est assez simple. Vous définissez plusieurs factories, qui vont être l’équivalent d’une instance d’un objet.

Mais par la suite, c’est vous qui définissez quel factory vous souhaitez utiliser et quand. Vous pouvez donc créer de nouvelles factories sans avoir de problèmes de tests qui échouent pour des raisons idiotes.
Et puis ce qui est encore mieux, c’est que Factory Girl ne fonctionne pas que avec ActiveRecord. Les factories que vous créer sont des instances d’un objet, sans distinction.
Vous pouvez donc créer une factory pour un model qui ne dépends pas de ActiveRecord. Sympa pour les mocks :)

Et vous, vous utilisez quoi pour initialiser des données de test ?

De la même manière que en Ruby, Django propose une solution d’envoi d’email.
Mais toute application Python n’utilise pas forcément Django. Et il peut arriver d’avoir besoin d’envoyer un email sans Django.

C’est ce que j’ai fait en développant l’outil de rapport de positions par email de RefStats.

Pour cela, nous allons utiliser la librairie smtplib.
Commençons par importer cette librairie.
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

Puis envoyons notre email.
msg = MIMEMultipart('alternative')
msg['Subject'] = 'Sujet de l\'email'
msg.attach(MIMEText('contenu texte', 'text'))
msg.attach(MIMEText('contenu html', 'html'))
email = smtplib.SMTP()
email.connect('localhost')
# email d'envoi - email de réception - message
email.sendmail('noreply@dmathieu.com', 'you@example.org', msg.as_string())
email.close()

Nous instancions l’email, y définissions son sujet.
Ainsi que du contenu html et du contenu texte.
Puis nous nous connectons au serveur smtp (ici localhost) et envoyons l’email.

Une faille de sécurité a été détectée récemment dans l’identification par http digest de Rails.
Dans la méthode authenticate_with_http_digest plus précisément.

Cette méthode permet d’identifier un utilisateur. J’en ai déjà parlé ici.
Si vous regardez cet article, vous constaterez le code suivant :
authenticate_or_request_with_http_digest("Identification requise") do |name|
  users[name]
end

(enfin pas exactement car j’ai appliqué la correction « dans l’application» ).

Si l’utilisateur correspond, on retourne le mot de passe. Sinon on retourne nil.
Et c’est bien la le problème. La méthode attends le mot de passe ou false. Sinon elle tente de comparer le mot de passe avec nil.
Il suffirait donc que ce mot de passe soit vide et l’utilisateur est identifié.

Cette faille a déjà été corrigée. Mais ne sera disponible que dans la prochaine release.
En attendant, la correction officielle est de faire la chose suivante :
authenticate_or_request_with_http_digest("Identification requise") do |name|
  users[name] || false
end

Ainsi, soit on retourne le mot de passe; soit l’utilisateur n’est pas trouvé et on retourne false : L’identification est refusée.

Par ailleurs j’en profite pour vous conseiller mon extension simple auth, qui permet d’implémenter un système d’identification, volontairement mono utilisateur par HTTP.
Il est notamment utilisé sur mon portfolio.

Pour finir le problème de cette faille est la manière dont elle a été gerée d’un point de vue communication par l’équipe rails.
Nate, qui a découvert la faille se serait apparemment fait rembarrer plusieurs fois avant de, finalement, choisir de publier la faille pour qu’elle soit enfin corrigée.
Du coup ça troll dans les commentaires de l’annonce officielle.

Supposons le cas suivant :
J’ai des pages et des catégories. Une page peut avoir une catégorie.
Nous avons donc les modèles suivants :
class Category(models.Model):
  name = models.CharField(max_length=200)
  slug = models.SlugField(max_length=200,unique=True)
class Page(models.Model):
  title = models.CharField(_('title'), max_length=200)
  content = models.TextField(_('content'))
  category = models.ForeignKey(Category, related_name = 'cat')

Maintenant supposons que à cela, nous désirions ajouter, pour une catégorie, une page principale.
Dans mon cas, cela me permet, si j’ai une page principale, d’afficher le contenu de celle-ci lorsque l’on charge la page de la catégorie.
Mais après, à vous de voir ce que vous désirez faire :)

Dans notre modèle de catégorie, nous allons donc ajouter une relation vers le modèle Page. Logique !
Cependant, page = models.ForeignKey(Page,blank=True,null=True)
Ne fonctionnera pas. En effet la classe Page n’est pas encore définie lorsque vous définissez la classe Category.

La solution est cependant très simple. Il suffit de ne pas faire un appel direct à la classe Page. Mais de mentionner son nom dans une chaine de caractères :
page = models.ForeignKey('Page', blank=True,null=True)

Ainsi vous ne faites pas d’appel à la classe Page lors de l’instanciation de Category. Et lorsque Django initialize vos modèles et qu’il cherche la classe Page, celle-ci a déjà été déclarée.
Vous avez défini votre relation entre modèles à deux sens.

Suite à mon billet « aidez moi à faire ma playlist« , nous avons décidé, avec Romain (il en parle ici), de développer la chose.

C’est pour l’instant un simple wordpress qui aura deux billets par semaine :
- Un le lundi matin, invitant tout visiteur à partager ses musiques préférées
- Un le jeudi soir donnant le lien spotify vers la playlist de la semaine.
Et le vendredi, il n’y a plus qu’à écouter cette liste de musiques :)

Ca se passe sur Friday Playlist. Et vous êtes plus qu’invités à participer.

Je commence une nouvelle série de billets (et oui encore une). En début de chaque mois, je publierai les films que je suis allé voir au cinéma le mois précédent ainsi qu’une petite critique.

  • X-Men Origins: Wolverine
    Note : 5 / 10
    De nombreux éléments ne concordent pas avec les précédents films n’empêchent pas le film de respecter ses attentes : on y découvre comment le passé de Logan a fait de lui Wolverine et on ressors en attendant la suite.
  • Star Trek
    Note : 5 / 10
    Ce qu’il y a de bien avec la science fiction, c’est que avec une petite faille spatio-temporelle, on arrive à modifier litéralement tout ce qui a déjà été raconté auparavant. Et cela tout en gardant la chose crédible ! A conseiller à tous ceux qui ont aimé les précédents du même nom.
  • Je l’aimais
    Note : 2 / 10
    Si j’ai envie d’être spoilé, j’irai voir sur iSpoil. Quand je vais voir un film, en savoir la fin et ne plus avoir aucun suspens et ce dès le début, ça démonte tout et du coup on s’ennuie pendant deux heures.
  • Un mariage de rêve
    Note : 7 / 10
    A ne pas conseiller à tous ceux qui aiment l’action ou les drames romantiques. Il s’agit cependant d’une formidable critique de la bourgeoisie Anglaise des années 30 et de son manque d’ouverture.
  • Good Morning England
    Note : 8 / 10
    Une critique de mesures gouvernementales anglaises il y a 30 ans de cela qui pourrait fortement s’appliquer à la France aujourd’hui avec l’hadopi. On s’attache; on pleure à la fin et on en redemande.
  • Anges & Démons
    Note : 4 / 10
    Sans prendre en compte le scénario à chier, qui ne vient pas du film mais du livre, ce film est tout compte fait pas trop mal. Aucune surprise lorsque l’on a déjà lu le livre. Mais également probablement quelques incompréhensions pour ceux qui ne l’ont pas lu. Une jolie superproduction à regarder pour arrêter de réflechir.
  • Incognito
    Note : 6 / 10
    Un film français sympa et plutôt rigolo et décontractant. Bénébar réussit à merveille son entrée au cinéma; Dubosc, pour une fois, n’est pas trop lourd et il est surprenant, au début, de voir Anne Marivin ne pas parler Ch’ti. Mais on rigole et on apprécie.
  • Millenium
    Note : 4 / 10
    Une histoire particulièrement bien ficelée même si prévisible.
    Mais un film beaucoup trop long et trop lent. On apprécierai un petit peu plus de rapidité par moments.

Je copie Hélène.
Vous avez jusqu’à 14h pour me donner en commentaires les liens spotify (pas de deezer ou autre svp) des chansons que vous voulez.
Je les mettrai dans ma playlist du jour et ça sera la musique que j’écouterai cet après midi.

[Edit : Il est 14h. C'est fini pour les suggestions. Si vous désirez également écouter la playlist, c'est ici]

Symfony
Vous en avez peut-être entendu parler, il y a quelques semaines de cela est sorti le premier livre Symfony en Français, aux éditions Eyrolles.

A vrai dire il s’agit de la version Française du Jobeet, qui a été publié en anglais comme calendrier de l’avent en décembre dernier.
Vu la qualité du Jobeet, je ne peux que vous conseiller ce livre.
Rédigé par Fabien Potencier, le créateur de Symfony et Hugo Hamon de Apprendre PHP, c’est le livre à acheter de la saison (non non j’ai aucune action).

Pour ma part je ne l’acheterai pas (ça, c’est dit).
Y’a Romain qui a fait la relecture de cet ouvrage et qui en a, par conséquent, reçu trois exemplaires gratuitement.
Il voulait au départ les encadrer au mur de sa chambre. Mais c’est pas assez grand. Donc comme il est trop cool, il m’en offre un.

Ca tombe bien. Après avoir développé l’API de Refstats avec rails; le site avec Zend Framework et l’interface de documentation (pas déployée encore) avec Django, je voulais justement faire l’interface de passage en mode professionnel avec Symfony :)

Envoyer un email en ruby

In: Ruby

26 mai 2009

Si vous avez déjà essayé d’envoyer un email avec rails, vous avez constaté que c’est articulièrement aisé.
Mais ruby ce n’est pas que du rails !
Dans le cas du redéveloppement de Refstats par exemple, j’ai recodé le crawler de celui-ci, qui va récupérer de manière journalière les positions de chacun de vos sites.
Et je désire être rapidement être mis au courant si j’ai une erreur qui est apparue afin de pouvoir la corriger tout aussi vite.

Du coup si je soulève une exception, je veux m’envoyer un email.
Bien évidemment, je n’ai qu’une application console.
Pas de rails derrière, bien que j’utilise Active Record.

Du coup pas d’action mailer. Et pas de fonction « mail»  comme en PHP.

Il est cependant assez aisé d’envoyer un email :
require 'net/smtp'
def send_email(from, to, subject, message)
  msg = "Subject: " + subject + "\r\n\r\n" + message
  Net::SMTP.start('localhost') do |smtp|
    smtp.send_message msg, from, to
  end
end

Nous déclarons une méthode send_email, qui prends les paramètres :
email de l’envoyeur; email du destinataire; sujet de l’email et son message.

Nous créons l’entête du message avec son sujet.
Puis nou instancions un Net::SMTP avec l’adresse du serveur SMTP (et en second paramètre son port si autre que 25).
Et on envoie notre message !
Pour plus de détails, notamment l’identification, je vous invite à vous référer à la documentation de Net::SMTP.

Photostream

    FlorentPhilou vs 5DMadagascarHélèneLucienPhilou vs langueMug DesignRails TeaPHP vs. Django

Rss Feeds

En Français :


In English :