Build your own website thumbnail generator with Django

On many website you can see a awesome link preview effect using a thumbnail of the page. There is some web services such as Websnapr or Thumbalizr providing an API to make your own webpages screenshots but it can be annoying to rely on third party projects: free accounts can only display a small among of screenshots and, cannot customize the size of the image, you cannot render Flash animations or Javascript…

Webkit Logo

We will build a website thumbnail generator using CutyCapt, a Webkit based free software designed to make screenshots of web pages, and Django, the powerful Python web framework.

The first step is to download and install CutyCapt. On a Debian-based system (such as Ubuntu) just type the following commands:

sudo apt-get install subversion libqt4-webkit libqt4-dev g++
svn co https://cutycapt.svn.sourceforge.net/svnroot/cutycapt
cd cutycapt/CutyCapt
qmake
make
./CutyCapt --url=http://lapin-blanc.net --out=example.png

Try to open the example.png (i.e: eog example.png), if the install is OK you must see a screenshot of this blog.

I assume your Django installation is working fine. Start a new project if needed (django-admin.py startproject mysite) and create an application called webthumb

with python manage.py startapp in your project.

Django Reinhardt

Edit your urls.py file to add a new pattern to the tuple urlpatterns. It will match screenshots requests and call the thumb view:

(r'^thumb/(?P.*)', 'mysite.webthumb.views.thumb'),

Now create a view called thumb in webthumb/view.py with this code:

import os
import subprocess
import md5
from django.http import HttpResponse

CUTYCAPT = '/home/keyes/cutycapt/CutyCapt/CutyCapt'
THUMBS_DIR  = '/home/keyes/Documents/Projets/kakofony/thumbs/'

def thumb(request, url):
    hash = md5.new(url).hexdigest()
    path = THUMBS_DIR + hash + '.png'
    print path

    if not os.path.isfile(path):
        try:
            subprocess.check_call([CUTYCAPT,\
                '--url=' + url,\
                '--min-width=200',\
                '--out=' + path])
        except subprocess.CalledProcessError:
            return django.http.HttpResponseServerError

    img = open(path, 'rb').read()
    return django.http.HttpResponse(img, mimetype='image/png')

Adapt the variables CUTYCAPT and THUMBS_DIR with your settings. Of course the directory pointed by THUMBS_DIR must be writeable (chmod 777).

You can now embed website thumbnails in your websites just with this HTML markup <img src="http://localhost/thumb/http://lapin-blanc.net" alt="Lapin Blanc" />.

Enjoy !

Partager :
  • RSS
  • Facebook
  • Google
  • del.icio.us
  • TwitThis
  • LinkedIn
  • Blogasty
  • Tutmarks
  • Wikio FR
  • Scoopeo
  • StumbleUpon
  • Digg
  • Zataz
  • Slashdot
  • Technorati
  • YahooMyWeb
  • Reddit France

The last update of Aptana block Django development server

The last update of Aptana Studio come with a new built-in Jetty-based HTTP server running on port 8000… the same as Django development server. There is no good way to disable the preview server feature of the popular editor, but our favorite web framework can be launched on another port. Just type python manage.py runserver 8080 instead of python manage.py and access to your work on http://localhost:8080.

Django logo

Partager :
  • RSS
  • Facebook
  • Google
  • del.icio.us
  • TwitThis
  • LinkedIn
  • Blogasty
  • Tutmarks
  • Wikio FR
  • Scoopeo
  • StumbleUpon
  • Digg
  • Zataz
  • Slashdot
  • Technorati
  • YahooMyWeb
  • Reddit France

Ravalement de façade

Comme vous pouvez le voir, j’ai légerement remanié l’apparence de mon blog. Il utilise désormais un thème très sobre à trois colonnes permettant de mieux structurer l’information et fait la part belle à Twitter que j’utilise de plus en plus assidument.

Partager :
  • RSS
  • Facebook
  • Google
  • del.icio.us
  • TwitThis
  • LinkedIn
  • Blogasty
  • Tutmarks
  • Wikio FR
  • Scoopeo
  • StumbleUpon
  • Digg
  • Zataz
  • Slashdot
  • Technorati
  • YahooMyWeb
  • Reddit France

Monter une partition Linux sous Mac OS X

Ou plus précisément une partition de type ext2/3, le système de fichier le plus populaire sous GNU/Linux, utilisé par défaut sur Ubuntu.

Mac OS X n’inclut pas de pilote pour monter les partitions ext2, heureusement un projet libre comble ce manque : ext2fsx. Récupérer la version ext2fsx_dev sur le site du projet, la seule supportant l’architecture x86 (tous les Mac depuis le passage aux processeurs Intel). Un simple double clic sur le fichier .dmg et un redémarrage de l’ordinateur suffira à l’activation du pilote.

Gestionnaire ExtFS

Vous pouvez désormais monter vos partitions formatés en ext2, 3 ou 4 via la commande mount ou depuis un sympathique petit utilitaire nommé Gestionnaire ExtFS que l’on trouve dans le menu Autre des Préférences Système.

Partager :
  • RSS
  • Facebook
  • Google
  • del.icio.us
  • TwitThis
  • LinkedIn
  • Blogasty
  • Tutmarks
  • Wikio FR
  • Scoopeo
  • StumbleUpon
  • Digg
  • Zataz
  • Slashdot
  • Technorati
  • YahooMyWeb
  • Reddit France

Quel développeur suis-je ?

Alors, quel développeur je suis ?

Programmer hierarchy

Programmer hierarchy

Partager :
  • RSS
  • Facebook
  • Google
  • del.icio.us
  • TwitThis
  • LinkedIn
  • Blogasty
  • Tutmarks
  • Wikio FR
  • Scoopeo
  • StumbleUpon
  • Digg
  • Zataz
  • Slashdot
  • Technorati
  • YahooMyWeb
  • Reddit France

Un formulaire de création de compte avec Symfony et sfGuard

sfGuard fait parti des plugins Symfony les plus utiles. Il ajoute à notre framework un système de gestion avancé des utilisateurs, groupes et permissions. Il inclut en standard un back office complet ainsi qu’un formulaire de connexion mais pas pour de la création de compte en front.

Symfony

Alors qu’il fût assez fastidieux de le réaliser avec la version 1.0 de Symfony, le nouveau système de création de formulaires introduit dans la version 1.1 nous facilite bien la tache.

Je ne reviendrais pas sur l’installation du plugin qui est très bien détaillée dans sa documentation.

Commençons par générer les formulaires associés à nos tables grâce à Propel : php symfony propel:build-forms. Attaquons-nous maintenant à la classe de notre formulaire d’enregistrement. Créez un fichier nommé sfGuardRegisterForm.php dans le répertoire lib/form/ qui contient ce code :

<?php
class sfGuardRegisterForm extends sfGuardUserForm
{
  public function configure()
  {
    parent::configure();

    /* Ici on ajoute une validation
        pour le mot de passe afin qu'il soit long
        d'au moins 6 caractères et d'au plus 128. */
    $this->validatorSchema['password'] = new sfValidatorString(
      array('min_length' => 6, 'max_length' => 128)
    );
  }
}
?>

Comme vous pouvez le lire, on se contente de créer une classe qui hérite de sfGuardUserForm fournie avec le plugin et d’y ajouter une validation supplémentaire pour le mot de passe (par défaut il peut être vide). C’est également dans cette méthode configure que se déroulera la validation de vos champs personnalisés sur lesquels nous reviendrons plus bas.

Effacez la cache avec la commande php symfony cc. C’est déjà presque fini !

Créons un répertoire sfGuardAuth dans le répertoire modules de votre application puis deux sous répertoires dans sfGuardAuth nommés actions et templates. Ce pseudo-module nous permettre de surcharger le module sfGuardAuth du plugin afin de lui ajouter une action et une vue qui permettront à vos visiteurs de s’enregistrer sur votre site.

Créez un fichier actions.class.php dans le répertoire actions qui contient :

<?php
/* On doit inclure manuellement
l'action du plugin car l'autoloading ne fonctionne pas dans ce cas. */
require_once(sfConfig::get('sf_plugins_dir').
'/sfGuardPlugin/modules/sfGuardAuth/lib/BasesfGuardAuthActions.class.php');

/* Notre action dérive de celle fournie par le module
    afin d'hériter de ses actions propres. */
class sfGuardAuthActions extends BasesfGuardAuthActions
{
  public function executeRegister($request) {
    /* Passe le formulaire à la vue. */
    $this->form = new sfGuardRegisterForm();

    /* Si l'action est appelé via la méthode POST... */
    if ($request->isMethod('post')) {
      $this->form->bind(
        $request->getParameter('sf_guard_user')
      );

      /* ...est que les données sont valides */
      if ($this->form->isValid()) {

        /* On crée l'utilisateur */
        $sf_guard_user = $this->form->save();

        $this->setFlash('message',
          array('Vous êtes enregistrez,
            <a href="/login">connectez-vous</a> !')));
        $this->redirect('@homepage');
      }
      /* Sinon le formulaire ainsi que l'erreur sera ré-affiché */
    }
  }
}

Quand l’utilisateur est créé on redirige le visiteur vers la page d’accueil et on l’avertit grâce à un attribut flash.

Passons à la vue qui se nommera registerSuccess.php et qui se trouvera dans le répertoire templates :

<form action="<?php echo url_for('sfGuardAuth/register') ?>" method="POST">
  <table>
    <?php echo $form ?>
    <tr>
      <td colspan="2">
        <input type="submit" />
      </td>
    </tr>
  </table>
</form>

Très bien, notre formulaire fonctionne. Mais le plus fort arrive !

Vous avez ajouter des champs personnalisés au profil de votre utilisateur dans la table sf_guard_user_profile (cf. la documentation de sfGuard) ? Régénérez les formulaires associés à vos tables avec la commande php symfony propel:build-forms, effacez la cache à grand coup de php symfony cc, rechargez la page /sfGuardAuth/register et admirez : nos champs sont automatiquement reconnus et affichés. Vous pourrez leur ajouter des étapes de validation dans notre première classe sfGuardRegisterForm ou dans sfGuardUserProfileForm si vous voulez qu’elles s’appliquent à tous les formulaires héritant de cette classe (page de modification du profil, ….).

Partager :
  • RSS
  • Facebook
  • Google
  • del.icio.us
  • TwitThis
  • LinkedIn
  • Blogasty
  • Tutmarks
  • Wikio FR
  • Scoopeo
  • StumbleUpon
  • Digg
  • Zataz
  • Slashdot
  • Technorati
  • YahooMyWeb
  • Reddit France

Vive la traduction automatique !

Translate Server Error

Source : fun.drno.de

Partager :
  • RSS
  • Facebook
  • Google
  • del.icio.us
  • TwitThis
  • LinkedIn
  • Blogasty
  • Tutmarks
  • Wikio FR
  • Scoopeo
  • StumbleUpon
  • Digg
  • Zataz
  • Slashdot
  • Technorati
  • YahooMyWeb
  • Reddit France

Découvrez Appnr, une interface web d’ajout de programmes pour Ubuntu

Appnr est un portage web du système d’installation de paquets simplifié d’Ubuntu (GNOME Application Installer). Il permet de parcourir les différents logiciels disponibles dans les dépôt de notre distribution favorite depuis un simple navigateur et via une jolie interface AJAX. Appnr reprend les grandes lignes de son grand frère desktop : classement par catégorie, alphabétique et par popularité.

Appnr

L’application utilise le pseudo-protocole apturl afin de permettre l’installation des paquets directement d’un simple click depuis Firefox. Appnr est très pratique pour suggérer l’installation d’un logiciel à un utilisateur d’Ubuntu via le réseau de manière intuitive et user-friendly. Elle pourra également agréablement remplacer le très austère packages.ubuntu.com pour fouiller dans les dépôts depuis un autre système.

Partager :
  • RSS
  • Facebook
  • Google
  • del.icio.us
  • TwitThis
  • LinkedIn
  • Blogasty
  • Tutmarks
  • Wikio FR
  • Scoopeo
  • StumbleUpon
  • Digg
  • Zataz
  • Slashdot
  • Technorati
  • YahooMyWeb
  • Reddit France

MessengerFX’s security problem corrected

Some times ago I found a Cross Site Scripting vulnerability in MessengerFX, a popular web-based Windows Live Messenger client. Friday I received from the team saying that the problem is now corrected:

Hi Kevin,
First of all i want to thank you for your warn. We fixed that problem and
now its working correctly.

[...]
If you find any other problem please let me know. Thanks again.

It was serious : Every software’s feature is available through Javascript. Any contact of a MessengerFX user can crash his browser, and futhermore get its contact list, add, remove, ban and unban contacts, read and send messages to any other contact of the victim ! Basically, an attacker just need to be listed in the contacts list of an MessengerFX user and this attacker can take control over the account.

In fact, all Javascript code is now removed server-side, so it’s impossible to send some snippets to a friend and the code is still executed locally (in the browser of the sender). The team explain that a new version of their app will be released soon and will better handle things like this.

Partager :
  • RSS
  • Facebook
  • Google
  • del.icio.us
  • TwitThis
  • LinkedIn
  • Blogasty
  • Tutmarks
  • Wikio FR
  • Scoopeo
  • StumbleUpon
  • Digg
  • Zataz
  • Slashdot
  • Technorati
  • YahooMyWeb
  • Reddit France

La faille de sécurité touchant MessengerFX semble corrigée

Il y’a quelques temps, j’avais découvert une vulnérabilité de type Cross Site Scripting dans MessengerFX, un client web populaire pour le réseau Windows Live Messenger, qui pouvait avoir de fâcheuses conséquences : en plus de pouvoir faire planter le navigateur de n’importe quel utilisateur du service, elle permet d’accéder à toutes les fonctionnalités implémentées par Messenger FX ce qui signifie entre autre : récupérer la liste de contact de l’utilisateur, envoyer des messages en son nom, supprimer, bloquer et débloquer des personnes de sa liste de contact et lui en ajouter, lire les messages, bref : de prendre le contrôle complet du compte MSN de la victime.

Vendredi, j’ai reçu un email de l’équipe MessengerFX m’indiquant que le problème est corrigé :

Hi Kevin,
First of all i want to thank you for your warn. We fixed that problem and
now its working correctly.
[...]

La correction actuelle ne permet plus d’envoyer de code Javascript via MessengerFX à un ami et éxecute toujours le dis code en local (sur l’ordinateur de celui qui l’envoi). L’équipe indique que la prochaine version, bientôt disponible, inclura une meilleure gestion de l’envoi de code via l’application internet.

Partager :
  • RSS
  • Facebook
  • Google
  • del.icio.us
  • TwitThis
  • LinkedIn
  • Blogasty
  • Tutmarks
  • Wikio FR
  • Scoopeo
  • StumbleUpon
  • Digg
  • Zataz
  • Slashdot
  • Technorati
  • YahooMyWeb
  • Reddit France

Next Page →