Fantomas’side

Weblog open-source

Tag archives: développement

RSS feed of développement

Django unique et timed sessions

Comment rendre unique les comptes utilisateurs connectés sur un site en Django ?

Ce genre de problématique se retrouve souvent sur les sites internet proposant des abonnements à un service en ligne, voulant empêcher le partage d'abonnement.

Pour les besoins d'un projet spécifique en Django au sein de la société Emencia là où je travaille, j'ai du développer un moyen d'empêcher 2 utilisateurs de se connecter sur un compte utilisateur en même temps.

Mais le problème ne s'arrête pas là, comment empêcher la connection et la déconnection successive entre 2 utilisateurs ? L'idée est de donner un temps minimum de connection à chaque session ouverte pour empêcher la déconnection, par exemple 5 minutes.

Pour cela j'ai écrit un Middleware pour Django qui va se charger de rendre unique chaque sessions utilisateurs sur le site. Utiliser un middleware donne l'avantage d'être réutilisable et facile à installer.

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'utsessions.middleware.UTSessionMiddleware',
    )

Après plusieurs refactorings et tests, permettant de configurer le comportement du middleware, comme la déconnection automatique, j'ai publier le code source sur GoogleCode pour que tout le monde puisse en profiter.

Pour plus d'informations, ou pour télécharger le code, consulter le site web du projet : Django UT Sessions.

Pour installer le module depuis Pypi :

$ easy_install utsessions

Python 3.0 : compatibilités et évolutions

C'est le 3 décembre dernier que la version 3.0 de Python est sortie. Une version attendue par une grande partie de la communauté Python.

Au programme, un bon coup de nettoyage de la librairie standard, des nouveautés comme le passage en tout Unicode, et une nouvelle syntaxe. Même si cette dernière reste proche des moutures 2.x, elle est clairement incompatibles avec les versions précédentes. Un fait assumé par les créateurs.

Pour effectuer la transition en douceur, les versions 2.6 et 2.7 ont amorcées le travail en intégrant une partie des nouveaux concepts présent dans Python 3.0, comme la Curryfication, ou l'implémentation de pseudo opérateurs ternaires.

De plus le script 2to3 est là pour finaliser cette transition en convertissant le code écrit en 2.x vers la version 3. Il serait dommage que les anciens projets basé sur la version 2.x meurent du fait d'une trop grande difficulté de migration.

Craignant une fuite de la communauté Python, c'est sur ces sujets que nous avons été consultés par le site LeMagIT.fr, mon collègue et moi, pour expliquer notre point de vue sur cette nouvelle version dîtes mature.

L'article se situe à l'adresse suivante : Harmonisation au sein de Python 3.0.

Mise à jour : Toonux.com relaye l'info.

Ogame Statistics

Lors de mon dernier article, je vous ai parlé de Open Flash Chart, en vous spécifiant que cela avait un rapport avec un prochain article, cet article le voilà.

Ogame Statisitics est un nouveau site que je viens d'ouvrir permettant de consulter les statistiques de tous les joueurs et alliances présents sur un univers de jeu de Ogame.

Le site réalisé grâce au framework Django, permet de créer une interface visuel des statistiques collectées par un module de mon robot pour Ogame, Obot dont j'ai déjà parler précèdement sur le blog.

En effet j'ai développé un nouveau module pour mon robot permettant de récolter toute les statistiques à un moment donné sur un serveur de jeu.

Des initiatives ont déjà été prises pour effectuer des visualisations de statistiques, utiles pour les alliances, mais le gros inconvénient de ces systèmes est qu'il est nécessaire de rentrer les données manuellement et assez fréquemment pour obtenir un suivi, ce qui est une tache longue et répétitive donc idiote :)

Là où se démarque Ogame Statistics, est que la mise à jours des données est automatique et régulière, car elle est prise en charge par Obot :)

Au menu du site, on trouvera un moteur de recherche, pour permettre de retrouver son profil ou son alliance, ses dernières statistiques, ainsi que celle de son alliance, et des graphiques d'évolutions réalisés avec Open Flash Chart. Une petite touche d'Ajax avec jQuery pour le trie des données et le résultat n'en ...

Continue reading

Open Flash Chart avec le Python's style !

Récemment, pour les besoins d'un projet dont je parlerais bientôt lors d'un prochain article, je me suis mis à rechercher une librairie Python me permettant de réaliser rapidement de jolis graphiques statistiques.

Passé les PyChart et autre ChartDirector. Mon choix s'est porté sur Open Flash Chart, une librairie permettant de réaliser des graphiques statistiques grâce à Flash.

Comme son nom le laisse supposer, la librairie est open source, un point primordial ;) Un site bien documenté avec des exemples complets, permettant une prise en main rapide et un résultat graphique abouti, m'auront convaincu assez rapidement.

L'avantage de cette librairie est qu'il est techniquement possible de l'interfacer avec tous les langages, car le fichier flash générant le graphique, se charge de récupérer un fichier au format texte, contenant les données du document.

Il suffit donc de générer un simple fichier texte, pour pouvoir afficher un graphique complexe, ce qui est un avantage notable pour la machine qui hébergera la représentation des graphiques. En effet on nous n'avons pas générer d'image, comme les autres librairies, et encore moins à les stocker.

La bonne nouvelle, est qu'il existe déjà des APIs pour différents langages, tel PHP, Perl, mais aussi Python. Génial ! :)

La moins bonne nouvelle vient du fait, que cette dite API Python ne fonctionne pas ou plus, et n'est clairement pas maintenue à jours. :(

L'autre bonne nouvelle, est que j'ai pris le soin de recoder l'API Python pour Open ...

Continue reading

Ogame Attack Watcher, la suite !

Cela fait maintenant quelques semaines que le silence se fait sur le blog, ceci est du au développement intensif de mon dernier projet, mon robot pour Ogame, j'ai nommé Obot. C'est l'occasion idéale de faire un focus sur la progression de ce projet.

Je résume le projet dont j'ai parlé dans un article précédent : j'ai ouvert le site web OAW pour mettre à disposition les avancées techniques du robot, et éventuellement recruter de nouveaux contributeurs pour ce projet.

Avec actuellement en frontal un site réalisé grâce au framework python Django, qui m'as permis d'interfacer des fonctionnalitées de la librairie Obot, comme la vérification du compte Ogame à l'inscription, j'ai réalisé le paramétrage du robot via des interfaces en Ajax, et une internationalisation facile à mettre en place et à mettre à jours.

J'ai déployé en arrière plan une version stabilisée par des tests unitaires et fonctionnels, une version serveur du robot, capable de gérer jusqu'à 1000 comptes en simultanés (vive la théorie :p)

Résultat, le premier bot online gratuit pour Ogame ! Open-source en plus :D

http://oaw.upasika.org

Dénommé à la base Ogame Attack Watcher, car à la base le robot et le site web étaient uniquement destinés à la surveillance des attaques sur les planètes de son compte, le développement de la librairie de fonctions contenues dans Obot a pris une tournure différente : automatiser et optimiser le développement ses planètes.

Au programme :

  • Alerte par e-mail en cas ...

Continue reading

Ogame Attack Watcher

Ogame Attack Watcher (OAW) est un programme écrit en Python qui permet la surveillance de comptes inter-univers pour OGame.

En effet OGame est un jeu de rôle massivement multijoueurs en ligne, qui se joue à travers un navigateur internet.

L’intérêt de ce programme est de pouvoir surveiller à distance son compte de toutes tentatives d'attaques sur ses planètes, qui pourraient ruiner des semaines d'efforts. Le programme se connectera toute les 30 minutes sur votre compte et vous préviendra par email de toute attaques, laissant le temps de préparer une manœuvre.

Le plaisir d'écrire ce programme pour moi a été de pouvoir recevoir ces attaques directement sur mon téléphone mobile pour pouvoir savoir de n'importe où si je me fais attaquer sur le jeu, le tout grâce au transfert d'email :) Ce que je vous recommande de faire fortement.

Une seconde version du programme est en cours d'écriture, avec beaucoup plus de fonctionnalités :

  • Migration des flottes et des ressources en cas d'attaques.
  • Construction de batiments, défense, recherches
  • Mode Raider :p

Les bonnes volontées sont les bienvenues d'ailleurs.

Il ne manque juste l'adresse du programme pour pouvoir s'enregistrer et utiliser OAW : http://ogame.willbreak.it ou directement http://oaw.upasika.org

Le svn du projet en version 2 :

http://obot.upasika.org

Génération de flux RSS en PHP

RSS pour Really Simple Syndication, est une des récentes technologies qui popularisent le web 2.0. Le format RSS est un flux de données XML regroupant diverses informations sur des ressources accessibles depuis le réseau.

Dans le cas d'un site d'actualités, les flux RSS du site regrouperont les nouveaux articles publiés et les commentaires récents qui permettront aux utilisateurs de voir l'évolution du site sans avoir besoin de s'y connecter en permanence.

Générer un flux RSS 2.0 à l'heure actuelle peut rester facile pour n'importe quel développeur. Cependant, générer de multiples flux devient vite une tâche fastidieuse. J'ai donc décidé d'écrire un jeu de classes PHP, pour me simplifier la production de flux de type RSS.

Un exemple concret de construction de flux à partir de ces classes vous montrera la marche à suivre. Notre exemple se base sur le listage d'un répertoire distant, à travers un flux RSS.

<?php
include('myrss.class.php');

$rss = new RSS('Contenu du répertoire', 'http://url.du.repertoire', 'Description du répertoire');

if ($handle = opendir('.')) {
  while (false !== ($file = readdir($handle)))
    if ($file != "." && $file != "..") {
      $file_info = stat($file);
      $desc = is_dir($file) ? 'Dossier créé ' : 'Fichier de '.round(
      $file_info['size'] / (1024 * 1024), 2).' Mo';
      $desc .= strftime('le %A %d/%m/%Y à %H:%M:%S', $file_info['atime']);
      $date = strftime('%D');
      // Remplissage du flux
      $item = new Item($file, 'http://url.du.repertoire/'.$file, $desc, $date);
      $rss->add($item);
    }
  closedir($handle);
}
print $rss->publish();
?>

Et voilà comment en moins de ...

Continue reading

Valeur binaire et décalage

L'informatique a un secret, un secret aussi fondamental que spectaculaire. Toutes les informations circulant à l'intérieur d'une calculatrice ou même d'un ordinateur sont composées de 0 et de 1. Ce système appelé binaire, permet de synthétiser toutes les informations possibles, chiffres, images, caractères, à travers des séquences de bits pour rendre ces informations compréhensibles par une machine.

Par exemple, si on prend le nombre 42, il aura besoin de 6 bits pour stocker son information, qui se représentera pour un l'ordinateur 101010. Je vous épargne la conversion du système décimal au système binaire :)

Lors de l'écriture d'une programme, un développeur ne se souciera pas de ces suites de 0 et de 1, c'est le travail du compilateur ou de l'interpréteur, et surtout de la machine. Le développeur se souciera juste du déroulement des différentes actions composant son programme.

Mais parfois il est astucieux d’accéder aux bits d'une valeur stockée en mémoire. Dans l'infographie par exemple, pour les composantes RGB des couleurs, généralement codées sur 32bits (4 octets).

Dans mon cas, j'ai eu besoin de représenter en ActionScript pour Flash les suites de bits contenus dans des nombres indiquant l'heure actuelle. L'avantage de cet algorithme est qu'il est portable et facile à paramétrer.

function arrayOctetBinaryValue(value:Number) : Array {
    var binary = new Array();
    for (var i = 0; i < 8; i++) {
        binary[i] = value & 0x1;
        value = value >> 1;
    }
    return(binary.reverse());
}

arrayOctetBinaryValue(12); // [0 ...

Continue reading

Persistance

Comment rendre les variables du code persistantes à travers le temps et les pannes de courants en passant par les crashs d'application ?

Cette problématique fut mise en avant lors du développement d'ECS, un framework e-commerce écrit en Python, au sein d'Emencia, société de services en logiciels libres.

Les modules Python pickle et cPickle servent à cela, mais leurs mise en place de manière générique peuvent être coûteuse et de plus comment centraliser des centaines d'objets à un moment T donné ?

ECS grâce au projet SQLAchemy, supporte tous types de bases données et fournis en plus un tas de fonctions pour manipuler des tables en base de donnée à partir d'un modèle de code. C'est donc à partir de la que fût développé le modèle de persistance.

Le modèle de persistance écrit pour ECS, fournit donc les outils pour effectuer la sauvegarde de tout objet instancié au sein de Python. Il contient en plus une implémentation rapide par méta-classe pour accélérer l'intégration au sein du code.

Voici un exemple d'implémentation de classe persistante, prenons l'exemple d'un chat :

from persistency import PersistentClass

class Cat(object):
  __metaclass__ = PersistentClass
  age = None
  name = None

def __init__(self, name='', age=-1):
  self.age = age
  self.name = name
  if self.age == -1:
    self.load()
  else:
    self.save()

def database(cls):
  return 'sqlite:///:memory:'

Cat._sqluri_callback = database

Nous allons donc créer un chat du nom de Felix âgé de 8 ans.

felix = Cat('Felix', 8)  # Roooh il est ...

Continue reading

Service class design

Avant de faire du Python par la force des choses et d'en découvrir la toute puissance, j'ai commencé la programmation sur le web avec PHP, et me suis particulièrement intéressé aux moyens de communication à travers les différentes technologies qui composent internet.

A la suite de plusieurs projets plus ou moins grands, une subtilité m’apparaît, peu importe la technologie, du moment que les programmes ont accès aux mêmes ressources, et qu'ils partagent le même langue pour communiquer, il n'y a pas de problèmes.

D'où l'idée de centraliser les tâches à partir d'un même noyau qui sera accessible par n'importe quels types de technologies.

Dans le cas d'un blog, les différents articles qui le composent doivent au minimum pouvoir être créés, édités et supprimés.

Donc si on veut pouvoir faire une interface pour administrer tout cela, disons dans une page, on va rédiger du code pour apporter ces fonctionnalités. Maintenant nous voulons pouvoir administrer les articles pour pouvoir les éditer à partir d'un client quelconque. Doit-on une fois de plus re-coder ces fonctionnalités ? Non ! Cela serait une énorme perte de temps.

A l'heure du web 2.0 et de la centralisation des données, il est temps de se simplifier la tâche.

La solution proposée est de fournir un service accessible de n'importe où et qui centralisera toutes les actions faites aux articles du blog. L'accès aux ressources se fera donc par HTTP, le minimum je pense.

Écrire ...

Continue reading