Mon ancien site est accessible à l'adresse suivante : http://old.harobed.org. En savoir plus…

« Billets plus récentsBillets plus anciens »

Idée d'une librairie basée sur Selenium pour tester des formulaires web

Introduction

Je viens de commencer à utiliser Selenium pour tester des formulaires, divers pages de listes de données… dans une application métier.

Mes objectifs :

  • tester l'ajout de nouvelles entités (1)
    • les données sont injectées dans un formulaire d'une page html
    • une page de résultat est utilisées pour vérifier que les données ont bien été enregistré (ça peut être une page d'édition)
  • tester la modification d'une entités (2)
    • les données sont injectées dans un formulaire d'une page html
    • une page de résultat est utilisées pour vérifier que les données ont bien été enregistré (ça peut être une page d'édition)
  • tester la validité d'une page de liste (3)
  • tester la validité des résultats d'un moteur de recherche (4)

Pour le moment je me suis concentré uniquement sur les points 1 et 2.

Première méthode (à l'arrache)

J'ai commencé par réaliser des fonctions du type :

  • login()
  • add_customer(data)
  • edit_customer(data)
  • check_customer(data)
  • add_customer(data)
  • edit_customer(data)
  • check_customer(data)

Les fonctions de type "add" et "edit" prennent en paramètre des données à injecter dans des pages. Les fonctions de type "add" correspondent aux pages d'ajout d'entités, les fonctions de type "edit" correspondent aux pages de modification d'entités.

Ensuite j'ai des fonctions "check", là aussi je passe en paramètre des données qui seront utilisées comme valeur de vérification face à des pages de résultats ou pages d'éditions (une page d'édition contient déjà des données, le but ici est de vérifier leurs validitées).

Ma variable "data" est du type :

data = [
    ("reference", u"C1345"),
    ("firstname", u"Stéphane),
    ("lastname", u"Klein"),
    ...
]

Dans mes fonctions ("add", "check"…) j'ai une boucle qui parcourt la structure de données et utilise les fonctions suivantes soit pour injecter des données, soit pour tester la validité des données.

def inject_value(driver, name, value):
    element = driver.find_element_by_id(name)
    if element.tag_name == 'input':
        if element.get_attribute("type") == "checkbox":
            if element.is_enabled() != value:
                element.click()
        else:
            element.clear()
            element.send_keys(value)

    elif element.tag_name == 'select':
        option_element = element.find_element_by_xpath(".//option[@value='%s']" % value)
        option_element.click()

    elif element.tag_name == 'textarea':
        element.clear()
        element.send_keys(value)

def check_value(driver, name, value):
    element = driver.find_element_by_id(name)
    if element.tag_name == 'input':
        if element.get_attribute("type") == "checkbox":
            return element.is_enabled() == value
        else:
            return element.get_attribute("value") == value

    elif element.tag_name == 'select':
        return element.get_attribute("value") == value

    elif element.tag_name == 'textarea':
        return element.text == value

Pour le moment, cela fonctionne correctement mais je trouve mon code fastidieux pour plusieurs raisons :

  • j'aimerais pouvoir définir des valeurs par défaut pour les formulaires
  • j'aimerais pouvoir choisir d'autres types de "selecteur", pour le moment je fais des recherches uniquement par ID
  • j'aimerais pouvoir facilement indiquer le type de champ, car pour le moment je fais de l'auto détection… mais cela ne sera pas toujours faisable

Ce que j'aimerais avoir

À noter que ce code n'est pas complet… c'est un brouillon.

from sealchemy import Form, TextField, SelectField, BooleanField

...

class AddCustomer(Form):
    __submit__ = Submit(name="_same")

    reference = TextField(default=u"C1345")
    type_user = SelectField(default=u"external")
    firstname = TextField(required=True)
    lastname = TextField(required=True)
    activated = BooleanField(default=True)
    comment = TextAreaField(default=u"")

    def go_to_page(self):
        self.driver.get("/customers/add/")

class EditCustomer(Form):
    __submit__ = Submit(name="_same")

    reference = TextField(default=u"C1345")
    type_user = SelectField(default=u"external")
    firstname = TextField(required=True)
    lastname = TextField(required=True)
    activated = BooleanField(default=True)
    comment = TextAreaField(default=u"")

    def go_to_page(self, id):
        self.driver.get("/customers/%s/" % id)

    def go_to_last_inserted(self):
        """Va sur la page du dernier client qui a été ajouté"""
        ...

Cela ressemble beaucoup à l'API de wtforms que j'utilise dans mon projet. Cela ressemble aussi à FormAlchemy que j'aime aussi.

__submit__ permet d'indiquer le champ à utiliser par la commande submit.

Note : je n'utilise pas une seule classe pour faire mes traitements "add" et "edit" car les formulaires d'ajouts et d'édition sont en pratique souvent différents.

L'interface de la classe de type Form :

class IForm(zope.interface.Interface):
    def inject():
        """Cette méthode injecte les données vers le formulaire HTML"""

    def submit():
        """Cette méthode lance le submit du formulaire"""

    def inject_and_submit():
        """Exécute inject et ensuite submit"""

    def check():
        """Cette méthode retourne True si les données correspondent aux
           données présentes dans le formulaire HTML"""

    def clear():
        """Réinitialise la valeur de tous les champs de l'instance avec
           les valeurs par défauts"""

    def populate(values):
        """Affecte des valeurs aux champs de l'objet."""

La classe Session de mon projet :

class MyProject(Session):
    def __init__(self, login, password):
        ...

    def login(self):
        ...

    add_customer = AddCustomer()
    edit_customer = EditCustomer()

Dans MyProject, j'ai ajouté les propriétés add_customer et edit_customer afin que ces objets aient accès à l'objet driver de Selenium.

Exemple d'utilisation :

session = MyProject(login="username", password="password", url="http://localhost:5000/")
session.login()

values = {
    "reference": u"C1871",
    "firstname": u"Stéphane",
    "lastname": u"Klein",
}
session.add_customer.populate(values)
session.add_customer.go_to_page()
session.add_customer.inject_and_submit()
session.edit_customer.go_to_last_inserted()
session.edit_customer.populate(values)
assert session.edit_customer.check()

Plus d'informations à propos des classes Field

Les classes de type Field comme TextField, BooleanField … ont un constructeur avec plusieurs paramètres :

  • name (optionnel) : définit la méthode de recherche du champ par l'attribut "name"
  • id (optionnel) : définit la méthode de recherche du champ par l'attirbut "id"
  • xpath (optionnel) : définit la méthode de recherche via xpath
  • required (optionnel) : définit si le champ est requis ou non
  • default (optionnel) : définit la valeur par défaut du champ

Par défaut, si j'ai ceci :

class ...(Form):
    firstname = TextField()

C'est équivalent à cela :

class ...(Form):
    firstname = TextField(name="firstname")

Conclusion, questions

Je vous ai donc présenté l'API que j'imagine créer sous le nom de "sealchemy".

J'ai plusieurs questions :

  • est-ce que vous pensez que cette librairie serait utile ?
  • est-ce que l'API, le mode de fonctionnement est judicieux ?
  • est-ce que cela vous intéresse ?
  • est-ce que vous avez déjà créé quelque chose du même genre ?
  • quelle est votre méthode pour faire ce genre de test ?

Merci d'avance pour vos commentaires.

Read and Post Comments

Quelques notes en vrac

Liste des applications / outils que j'utilise

Il y a quelques semaines, sur mon site, j'ai créé une nouvelle page qui s'intitule « Liste des applications / outils que j'utilise ».

Quelles sont les motivations qui m'ont poussé à réaliser cette page ?

  • je trouve intéressant de savoir quels sont les outils que X ou Y utilise au quotidien… on y découvre souvent des choses intéressantes (donc n'hésitez pas à réaliser ce type de page). Un site qui a le même esprit est « Ils utilisent ça ».
  • il arrive que l'on me demande quelle librairie j'ai choisi pour réaliser telle ou telle tâche
  • parfois, je ne sais plus quelle librairie javascript j'ai choisi pour réaliser une tâche, dans ce cas cette page me sert de "pense-bête"

Dans le même esprit, j'ai commencé la page « Liste des applications Android que j'utilise » mais pour le moment elle n'est pas très étendue.

virtualenvwrapper

Depuis 3 semaines, j'utilise de plus en plus régulièrement virtualenvwrapper.

Cet outil est vraiment très pratique. Un petit résumé rapide d'utilisation (mais je vous conseille fortement de lire la documentation pour en savoir plus sur les divers fonctionnalités de l'outil, comment l'installer…) :

Je crée le dossier qui contiendra mon projet :

$ mkdir ~/projets/mon_projet/

Je crée un nouvel environement qui porte le même nom que mon projet :

$ mkvirtualenv mon_projet
New python executable in mon_projet/bin/python
Installing setuptools............done.
virtualenvwrapper.user_scripts creating /home/harobed/.virtualenvs/mon_projet/bin/predeactivate
virtualenvwrapper.user_scripts creating /home/harobed/.virtualenvs/mon_projet/bin/postdeactivate
virtualenvwrapper.user_scripts creating /home/harobed/.virtualenvs/mon_projet/bin/preactivate
virtualenvwrapper.user_scripts creating /home/harobed/.virtualenvs/mon_projet/bin/postactivate
virtualenvwrapper.user_scripts creating /home/harobed/.virtualenvs/mon_projet/bin/get_env_details

Quand j'active l'environement mon_projet je souhaite être déplacé directement dans le dossier ~/projets/mon_projet :

$ echo "cd ~/projets/mon_projet" >> /home/harobed/.virtualenvs/mon_projet/bin/postactivate

J'active l'environement mon_projet :

$ workon mon_projet
(mon_projet)$ pwd
/home/harobed/projets/mon_projet

À noter que les commandes fournies par virtualenvwrapper supportent pour la plupart l'auto complétion, par exemple workon <tab> affiche les environements disponibles sur votre système.

Consultez la documentation de virtualenvwrapper pour en savoir plus.

Mozilla Sync

Depuis que je suis passé à Firefox 4, j'utilise Firefox Sync pour centraliser mes bookmarks.

Avant cela, j'utilisais avec plaisir delicious mais l'extension delicious pour Firefox 4 n'est pas disponible.

En tout les cas, Firefox Sync fonctionne vraiment très bien, c'est très facile à configurer, c'est totalement transparent à l'usage… un très beau travail, réalisé entre autre par Tarek Ziade pour la partie serveur (codé en Python).

Read and Post Comments

jquery.expandBox plugin

Je viens de publier une nouvelle version (0.2.0) du plugin jquery.expandBox.

« Et ça sert à quoi ? » et bien à étendre des elements HTML dans une page.

Exemples :

$('#bloc2').expandBoxVertically();
+-----------+                              +-----------+
|   bloc 1  |                              |   bloc 1  |
+-----------+                              +-----------+
|   bloc 2  |                              |           |
+-----------+                              |           |
|           |                              |   bloc 2  |
|     du    |  => étendre le "bloc 2" =>   |           |
|    vide   |                              |           |
|           |                              |           |
+-----------+                              +-----------+
|   bloc 3  |                              |   bloc 3  |
+-----------+                              +-----------+
$('#bloc2, #bloc3').expandBoxHorizontally();
+--------+--------+--------+----------------+
|        |        |        |                |
| bloc 1 | bloc 2 | bloc 3 |     du vide    |
|        |        |        |                |
+--------+--------+--------+----------------+

                      |
                      v

             étendre les blocs 2 et 3

                      |
                      v

+--------+-----------------+----------------+
|        |                 |                |
| bloc 1 |      bloc 2     |     bloc 3     |
|        |                 |                |
+--------+-----------------+----------------+

Pour en savoir plus sur les fonctionnalités de jquery.expandBox plugin, comment l'utiliser, où le télécharger… je vous conseille de vous rendre sur la page du projet….

Il y a 8 mois, au moment où j'ai réalisé ce plugin, j'ai cherché si ce type de plugin existait déjà.
Je n'ai rien trouvé (j'ai peut être mal cherché).

La fonctionnalité « The flexible box model » de la norme CSS 3 permet d'étendre des blocs d'une manière plus élégante que le plugin jquery.expandBox mais cette fonctionnalité n'est pas encore disponible pour tous les navigateurs.

J'espère que la documentation est compréhensible et que ce plugin vous sera utile.

Si vous avez des remarques, suggestions… n'hésitez pas à m'envoyer un mail à stephane@harobed.org

Read and Post Comments

Choix d'un Laptop, Lenovo ThinkPad T410 ou Dell Latitude

Mon poste de travail, un ancien PC, fait beaucoup de bruit. Cette année j'ai décidé de changer de machine.

Critères de choix

Mes critères de sélection sont les suivants :

  • Un laptop : cela fait des années que ma machine personnelle est un laptop et je trouve cela extrêmement plus pratique qu'une tour. Possiblité de se déplacer, silencieux…
  • CPU : Intel Core i3 ou i5 ou i7
  • Taille écran : entre 13" et 15"
  • Définition écran : entre 1280x800px et 1680x1050px
  • Traitement de surface : si possible mat
  • Mémoire : minimum 4Go
  • Disque dur : minimum 250 Go, si possible 7200 tours minutes
  • Carte graphique : Intel (Intel HD Graphics…)
  • Ethernet, Wifi… : si possible que du Intel
  • Autres critères :
    • quelque chose d'assez solide (mon MacBook perso me fait toujours peur niveau solidité)
    • une sortie moniteur externe qui accepte un connecteur VGA
    • un bon support sous GNU/Linux (Ubuntu en particulier)
    • si il est possible d'ajouter un disque SSD, ça serait bien… mais bon ce n'est pas obligatoire
    • je veux quelque chose de silencieux
    • je veux quelque chose qui ne chauffe pas trop
    • au minimum trois sorties USB

Ma recherche

Mes critères de taille, définition et de traitement de surface écran limitent fortement la liste de choix de portables.

Dans un premier temps, j'étais désespéré, je ne trouvais aucun laptop < 17" qui avait une résolution verticale suppérieur à 768px. J'ai cherché sur RueDuCommerce, LDLC, Fnac … (les filtres de ces sites sont très limités).

Suite à une discussion sur LinuxFR, j'ai découvert Laptop Spirit.

Dans un premier temps, mon choix s'est porté sur le modèle suivant « Dell Latitude E5510 - Advanced » :

  • Marque : Dell
  • Taille : 15,6"
  • Définition : 1600x900px
  • Traitement surface : Mat
  • Processeur : Core i5-560 2,66 GHz
  • Carte graphique : Intel GMA HD
  • Mémoire : 4 Go
  • Disque dur : 250 Go 7200rpm
  • Poids : 2,6 Kg

En fait, c'était le seul et l'unique portable qui correspondait à mes critères de recherche.

Ensuite via Wikipedia, j'ai découvert qu'il existait d'autres modèles avec une bonne définition écran : la série Dell Latitude .

En fait, la plupart du temps les hautes définitions sont en options, c'est donc pour cela qu'ils ne sont pas visibles sur les sites de ventes "généralistes".

De fil en aiguille, je suis tombé sur le wiki consacré aux ThinkPad de Lenovo : ThinkWiki, liste de tous les modèles ThinkPad .

En consultant les divers modèles présents sur ce wiki, j'ai découvert que les Lenovo ThinkPad Series T ont des résolutions écrans intéressantes.

Mon choix numéro 1

Mon choix s'est porté sur le modèle Lenovo ThinkPad T410 avec les caractéristiques suivantes :

  • Intel Core i5-560M Processor (2.66GHz, 3MB L3)
  • 14.1 WXGA+ TFT (1440x900px), w/ LED Backlight (WWAN antenna)
  • Intel Graphics Media Accelerator 5700MHD
  • 4 GB PC3-8500 DDR3 SDRAM 1067MHz SODIMM Memory (2 DIMM)
  • UltraNav (TrackPoint and TouchPad) with Fingerprint Reader
  • 320GB 7200rpm 2.5" SATA HDD
  • DVD Recordable 8x Max Dual Layer, Ultrabay Slim (Serial ATA)5
  • 9 cell 2.8Ah Li-Ion Battery - Dual Mode60
  • Intel Centrino Advanced-N 6200 (2x2 AGN)10
/images/lenovo_thinkpad_t410.jpg

Pourquoi un ThinkPad ?

Bien que j'ai l'impression que la tendance soit aux Apple MacBook Pro même chez les geeks sous GNU/Linux, les ThinkPad anciennement de marque IBM et maintenant Lenovo jouissent d'une très grande réputation chez les libristes.

Cette réputation est dû à la qualité matériel de ces portables, ils sont parmi les plus solides et fiables du marché. Illustration :

Je ne sais pas si ces vidéos sont des trucages marketing ou non, mais cela va dans le sens des sentiments des possesseurs de ThinkPad.

Comme je suis assez design "allemand de l'est", je trouve ces portables très beaux.

Les ThinkPad sont très populaire parmit les développeurs de logiciels libres, par conséquent les systèmes d'exploitation GNU/Linux sont généralement très biens supportés sur ces machines.

Paul Rouget a un ThinkPad T410, je lui ai demandé par mail si un OS GNU/Linux fonctionne bien sur cette machine, il m'a répondu qu'il n'avait aucun problème.

Où acheter un Lenevo ThinkPad T410 en France ?

Sur le site USA de Lenovo, il est possible de définir précisément la configuration de sa machine.

Avec la configuration suivante :

  • System components
  • Intel Core i5-560M Processor (2.66GHz, 3MB L3)
  • Genuine Windows 7 Home Premium 32
  • 14.1 WXGA+ TFT, w/ LED Backlight (WWAN antenna)
  • Intel Graphics Media Accelerator 5700MHD - AMT
  • 4 GB PC3-10600 DDR3 SDRAM 1333MHz SODIMM Memory (1 DIMM)
  • UltraNav (TrackPoint and TouchPad) with Fingerprint Reader
  • Camera, 2.0 MP
  • 320 GB Hard Disk Drive, 7200rpm
  • DVD Recordable 8x Max Dual Layer, Ultrabay Slim (Serial ATA)
  • Smart Card
  • 6 cell 2.6Ah Li-Ion Battery - Dual Mode
  • Country Pack North America with Line cord & 65W AC adapter
  • Bluetooth w/ antenna
  • Intel Centrino Ultimate-N 6300 (3x3 AGN)
  • Integrated Mobile Broadband - Upgradable

le numéro de produit est 2516CTO et le prix est à $1,169.00.

Seulement, ce système de configuration n'est pas disponible en Europe :(
En France, il faut passer par des revendeurs, comme par exemple :

Actuellement, le seul modèle en stock chez l'un de ces revendeurs qui correspond un peu au modèle que je souhaite est le suivant : Lenovo ThinkPad T410I CI5/480M-2.4G. Il a les caractéristique suivantes :

  • Contrôleur graphique : NVIDIA Quadro NVS 3100M / Intel HD Graphics
  • Mémoire vidéo : 512 Mo
  • Sortie audio : Carte son
  • RAM : 4 Go (installé) / 8 Go (maximum) - DDR3 SDRAM - 1066 MHz - PC3-8500 ( 1 x 4 Go )
  • Réseaux : Adaptateur réseau - Ethernet, Fast Ethernet, Gigabit Ethernet, IEEE 802.11b, IEEE 802.11g, IEEE 802.11n, Bluetooth 2.1
  • Alimentation : CA 120/230 V ( 50/60 Hz )
  • Disque dur : 320 Go - Serial ATA-300 - 5400 tours/min
  • Poids : 2.3 kg
  • Stockage optique : DVD±RW (+R double couche) - module enfichable amovible
  • Affichage 14.1" rétroéclairage par LED TFT 1440 x 900 ( WXGA+ )
  • Processeur : Intel Core i5 480M / 2.66 GHz ( à deux noyaux )
  • Télécommunications : Fax / modem / modem cellulaire
  • Transmission à large bande sans fil : Haut débit 3G Mobile
  • Périphérique(s) d'entrée : Clavier, TrackPoint, UltraNav
  • Batterie : 6 éléments Lithium Ion
  • Système d'exploitation : Microsoft Windows 7 Professionnel Édition 64 bits --
  • Dimensions (LxPxH) 33.6 cm x 23.9 cm x 3.2 cm
  • Normes environnementales : ENERGY STAR , EPEAT Gold
  • Garantie du fabricant : 3 ans de garantie --
  • Mémoire cache : 3 Mo - L3
  • Sécurité intégrée : Trusted Platform Module (TPM 1.2) Security Chip , lecteur d'empreintes digitales
  • Localisation : Français / France
  • Périphériques intégrés : Haut-parleurs stéréo, antenne LAN sans fil, ThinkLight, antenne Bluetooth, antenne cellulaire, Lecteur de carte SIM
  • Lecteur de carte : 5 en 1
  • Carte NIC sans fil : Intel Centrino Wireless-N 1000
  • Autonomie (jusqu'à) : 6.5 heure(s)
  • Caméra de portable : Intégré(e) - 2 mégapixels

Voici les points qui ne correspondent pas à mon besoin :

  • Disque dur : "5400 tours/min" alors que je veux 7200 tours/min
  • Contrôleur graphique : "NVIDIA Quadro NVS 3100M / Intel HD Graphics" alors que je veux uniquement une carte "Intel HD Graphics"
  • Transmission à large bande sans fil : "Haut débit 3G Mobile" j'ai pas besoin de cela

Le prix de ce modèle : 1,294.00 € HT, 1,547.62 € TTC

Le modèle qui correspondait plus à mes souhait était le suivant Lenovo ThinkPad T410 Réf 2537-25G i5-540M(2.53GHz) à 1,043.07€ HT, 1,247.51€ TTC mais il est en rupture de stock. J'ai essayé de le commander, mais le vendeur m'a informé que ce n'est pas possible ils n'en auront plus.

Je trouve tout même triste que Lenovo ne vendent pas directement leurs produits en Europe comme le fait Dell. Je pense que Lenovo perd beaucoup de ventes potentiels en Europe.

Autres choix

Si je ne prends pas le Lenovo ThinkPad T410, j'ai identifié quatre modèles intéressants chez Dell.

Dell Latitude E5510

Tout d'abord celui dont j'ai parlé en début d'article :« Dell Latitude E5510 - Advanced » :

  • Precesseur : One Intel Core™ i5-560M (2.66Ghz, 3M cache, Dual Core)
  • OS : Windows® 7 Professionnel authentique 32 Bit - Français
  • Microsoft® Office 2010 Microsoft® Office Starter 2010
  • Logiciel de protection Antivirus : Trend Micro Worry-Free Business Security Services, 15 mois
  • Écran : LCD 15.6” HD+ Écran large antireflet LED Affichage (1600 x 900)
  • Mémoire : Mémoire bicanale DDR3 de 4Go (2x2Go) 1333 MHz
  • Disque dur : 320 Go Serial ATA (7200RPM)
  • Batterie principale : 6 cellules
  • Caméra : Webcam et microphone inclus
  • Clavier : Clavier intégré avec double dispositif de pointage (AZERTY) - Français
  • Lecteur optique : Graveur DVD+/-RW 8x avec logiciel décodeur
  • Bluetooth : Carte réseau sans fil Dell sans fil 375 Bluetooth
  • Alimentation : Cordon d‘alimentation avec adaptateur secteur 90W, 3 broches - Europe

Prix : 899 € HT

Dell Latitude E5410

Le modèle « Dell Latitude E5410 Advanced »

  • Processeur : One Intel Core™ i5-560M (2.66Ghz, 3M cache, Dual Core)
  • OS : Windows® 7 Professionnel authentique 32 Bit - Français
  • Microsoft® Office 2010, Microsoft® Office Starter 2010
  • Logiciel de protection Antivirus : Trend Micro Worry-Free Business Security Services, 15 mois
  • Écran : LCD 14.1 inch Écran large WXGA+ (1 440 x 900px) antireflet LCD Panel avec WWAN antenna
  • Mémoire : Mémoire bicanale DDR3 de 4Go (2x2Go) 1333 MHz
  • Disque dur : 320 Go Serial ATA (7,200 Rpm)
  • Batterie principale : 6 cellules
  • Caméra : Webcam intégrée avec microphone
  • Clavier : Clavier intégré avec double dispositif de pointage (AZERTY) - Français
  • Lecteur optique : Graveur DVD+/-RW 8x avec logiciel décodeur
  • Bluetooth : Carte réseau sans fil Dell sans fil 375 Bluetooth
  • Alimentation : Adaptateur CA de 65W à 3 câbles avec cordon d'alimentation de 1 m (3 câbles) - Europe

Prix : 969,00 € HT

Dell Latitude E6510

Le modèle « Dell Latitude E6510 »

  • Processeur : One Intel Core i5-560M(2.66GHz,3MB,Dual Core)
  • OS : Windows® 7 Professionnel authentique (32Bit)
  • Logiciel de protection Antivirus : Trend Worry-Free Business Services MUI, 15 mois
  • Back converture : Silver LCD Back Cover
  • Écran : 15,6 pouces Plein Haute définition (1920X1080) AntiGlare WLED LCD
  • Processeur : Intel HD Graphics
  • Mémoire : 4096MB 1333MHz bicanale DDR3 SDRAM [1x4096]
  • Disque dur : 320 Go Serial ATA (7200RPM)
  • Lecteur optique : 8X DVD+/-RW Disque dur avec logiciel uniquement
  • Connectivité sans fil : Minicarte Intel Pro Wireless 6200 (802.11a/g/Draft-n 2x2) - EMEA
  • Bluetooth : Dell sans fil 375 Bluetooth
  • Batterie principale : lithium-ion à 6 cellules (60W/HR)
  • Caméra : intégrée HD webcam avec Microphone
  • Clavier : Interne Rétroéclairé Clavier
  • Alimentation : Adaptateur CA de 65W à 3 câbles avec cordon d'alimentation de 1 m
  • Biométrique identification : Repose-poignets standard

Prix : 1 299,00 € HT

Dell Latitude E6410

Le modèle « Dell Latitude E6410 »

  • Processeur : One Intel® Core™ i5-560M (2.66Ghz, 3M cache, Dual Core)
  • Système d'exploitation : Windows® 7 Professionnel authentique 32 Bit, Français - avec support
  • Microsoft® OFFICE 2010Microsoft® Office Starter 2010
  • Logiciel de protection Antivirus : Trend Micro Worry-Free Business Security Services, 15 mois
  • Back couverture : Blue LCD Back couverture
  • Écran LCD : Écran WXGA 14.1” Écran antireflet (1440X900)
  • Carte graphique : NVIDIA® NVS 3100M 512MB gDDR3 With Express Card
  • Mémoire : Mémoire bicanale DDR3 de 4Go (2x2Go) 1333 MHz
  • Disque dur : 500 Go Serial ATA (7200RPM)
  • Batterie principale : 6-cellules (60Wh) Lithium Ion high capacity Batterie avec ExpressCharge™
  • Caméra : intégrée HD webcam avec Microphone
  • Clavier : Français Azerty Retroéclairé
  • Lecteur optique : 8X DVD+/-RW Disque dur avec software
  • Bluetooth : Dell sans fil 375 Bluetooth
  • Alimentation : Europe - Adaptateur CA de 90W à 3 câbles avec cordon d'alimentation de 1 m (3 câbles)
  • Biométrique identification : Pavé tactile Standard

Prix : 1324,00 € HT

Demande de devis à Dell

Sur le site internet de Dell, il est indiqué qu'il est possible d'avoir le système d'exploitation Ubuntu. Cependant, le système de configuration du site web de Dell, ne permet pas de sélectionner l'OS Ubuntu.

J'ai donc effectué ma demande par téléphone, la réponse est positive, ils m'ont fait un devis avec Ubuntu comme OS.

  • Base Options : Intel HD Graphics
  • Processor : One Intel Core i5-560M (2.66Ghz,3M,Dual Core)
  • Display : 15.6in Full High Definition (1920X1080) WLED LCD Panel
  • Repose-mains : Lecteur de carte à puce sans lecteur d'empreintes digitales
  • Webcam : Intégrée 2,0 mégapixels Webcam avec microphone
  • Capot LCD : Argent avec LAN sans fil et WAN sans fil
  • Mémoire : 4Go (2x2Go) 1333MHz DDR3 Bicanale
  • Disque dur : 320Go Serial ATA (7200tr/min)
  • Lecteur optique : 8X DVD+/-RW Lecteur
  • Power Cord : Euro 90W AC Adaptor 3 pin
  • Batterie : Principale 9 cellules 90Wh LI-ION
  • Labels : Intel Core Label I5 for VPro
  • Sans fil : EMEA Intel Pro Wireless 6200 (802.11 a/g/ Draft-n 2X2) Mini-carte
  • Clavier : Français Azerty rétroéclairé

Logiciel

  • Instant ON : Latitude ON Lecteur désactivé
  • OS Linux : Ubuntu Edition version 9.10
  • FOR ISRAEL AND FR Intel vPro Technology's advanced management features

Service

  • Base Warranty
  • 3Yr Basic Warranty - Next Business Day - Minimum Warranty

Prix : 1176 €

Bilan

Modèle Prix HT Les + Les -
Lenovo ThinkPad T410I CI5/480M-2.4G 1294 € HT Matériel, clavier Disque dur 5400 tours/min
Dell Latitude E5510 899 € HT Le prix  
Dell Latitude E5410 969 € HT    
Dell Latitude E6510 1299 € HT Définition 1920 X 1080px  
Dell Latitude E6510 avec OS Ubuntu 1176 € HT Définition 1920 X 1080px, Ubuntu  
Dell Latitude E6410 1324 € HT 500 Go (7200RPM)  

Conclusion

Face à tant de difficulté pour trouver le modèle de ThinkPad que je veux, je pense prendre le modèle « Dell Latitude E6510 avec OS Ubuntu ». D'autant plus que chez Lenovo, ça me fait chier de devoir payer la "taxe" Microsoft pour un système d'exploitation que je n'utilise pas.

/images/dell-latitude-e6510.jpg

Mes questions

  • Où achetez vous vos Laptop Lenovo en France ?
  • Est-ce que la définition 1920 X 1080px est trop importante pour un 15" ?
Read and Post Comments

Pyramid est framework extensible mais pas directement Pluggable car il est sans opinion

Voici un billet important concernant Pyramid et la différence entre « extensibility » et « pluggability » : Chris McDonough on pluggable apps.

Ce billet fait référence à un mail de Chris McDonough.

Voici quelques extraits de ce mail :

Pyramid doesn't provide enough "rails" to make it possible to integrate truly honest-to-god, download-an-app-from-a-random-place and-plug-it-in-to-create-a-system "pluggable" applications.
Because Pyramid itself isn't opinionated (it doesn't mandate a particular kind of database, it offers multiple ways to map URLs to code, etc), it's unlikely that someone who creates something "application-like" will be able to casually redistribute it to J. Random Pyramid User and have it "just work" by asking him to config.include a function from the package.
This is particularly true of very high level components such as blogs, wikis, twitter clones, commenting systems, etc.
The "integrator" (the Pyramid developer who has downloaded a package advertised as a "pluggable app") will almost certainly have made different choices about e.g. what type of persistence system he's using, and for the integrator to appease the requirements of the "pluggable application", he may be required to set up a different database, make changes to his own code to prevent his application from "shadowing" the pluggable app (or vice versa), and any other number of arbitrary changes.
  • D'un point de vue technique, Pyramid est un framework sans opinion :
  • Au niveau "fonctionnel" aussi Pyramid est sans opinion :
    • choisissez les urls que vous voulez
    • choisissez les modèles de template que vous voulez
    • choisissez les principes de fonctionnement de votre application comme vous voulez…

Pour toutes ces raisons, le framework Pyramid n'est pas directement "Pluggable".

For this reason, we claim that Pyramid has "extensible" applications, not pluggable applications.

Pyramid permet de réaliser des applications extensibles mais le framework n'est pas en lui même "Pluggable".

Dans cet extrait, on a l'impression que Pyramid ne permet pas de créer des applications "Pluggable", mais cela ne correpond pas à ce qu'explique le mail (il faut lire la suite du mail).

Autre extrait :

Any Pyramid application can be extended without forking it as long as its configuration statements have been composed into things that can be pulled in via "config.include".

Dit autrement : les outils fournis par Pyramid permettent de réaliser des applications extensibles, elles peuvent être fortement modifié sans avoir besoin de les forker.

Bien souvent, même dans des applications biens développées en programmation orienté objet, il est nécessaire de modifier une classe A utilisée par une autres classes B. Pour que la classe B utilise votre nouvelle classe A, vous êtes obligé d'effectuer des changements dans le code source de l'application… par conséquent vous êtes obligé de forker.

Grâce à la Zope Component Architecture (ZCA) vous pouvez effectuer cette modification sans modifier le code source de l'application, il suffit de lui dire d'utiliser une autre classe via le système de configuration de la ZCA.

Autre extrait :

Truly pluggable applications need to be created at a much higher level than a web framework, I fear, as no web framework can offer enough constraints to really make them "work out of the box".

En effet, il est possible (sera possible) de trouver des plugins pour des applications (basées sur le framework Pyramid ) et non pas directement des plugins basés sur le framework Pyramid .

Les applications devront faire des choix / avoir des opinions (template, couches modèles…), cela permettra la mise à disposition de plugins facilement installables.

D'un point de vu personnel, c'est ce type de choix que j'ai fait au sein de la société IS-Webdesign où je travaille. Pour pouvoir réaliser une application facilement extensible et mettre en place un système de plugins, j'ai choisi le framework Pyramid (avant cela Repoze BFG ).

Autre extrait :

It would be a noble goal to build an application with Pyramid that provides these constraints and which truly does offer a way to plug in applications (Joomla, Plone, Drupal come to mind).

Intéressant, je suis curieux de voir quand va apparaitre la première application de ce type. À noter que j'ai déjà vu des mails à propos de ce type de projet sur la mailing list de Repoze (mais je ne sais plus où).

C'est à ce niveau qu'intervient l'équipe du TurboGears qui a décidé aussi de rejoindre le mouvement Pylons… et plus particulièrement Pyramid. Le but de TurboGears est justement d'avoir des "opinions" et par conséquent de permettre la mise à disposition de plugins.

Read and Post Comments
« Billets plus récentsBillets plus anciens »