Month: February 2008

“putain, 15 ans”, linux, I’m still there

Posted by – February 28, 2008

En lisant la genèse (ou directement voir le thread sur les ng), je me suis dit, “putain, il y a 15 ans” je commençais à m’intéresser à cet OS, par curiosité, obligation, intérêt philosophique et passion. Ce qui réconforte également, c’est que ce choix a été bien vu et pérenne, il suffit d’y croire, d’avoir des convictions et prendre des risques [calculés] parfois. Même si je me suis un peu écarté du chemin (environnement Microsoft et opensource ce jour), dans les entreprises dans lesquelles je suis passé, j’ai essayé à chaque fois de mettre en place 1 ou plusieurs serveurs Linux [pour le Web1 et la messagerie]. Ces actions sans prosélytisme, sectarisme ou idéologie, mais simplement guidé par l’envie et la passion, malgré le risque pris à l’époque, Linux était encore jeune avec une faible communauté.

Alors, comment je procédais en 19932 ? un p’tit coup de revival

La distribution était la slackware, qui tenait sur à peine 50 disquettes (sic), X-Window compris. Autant dire que l’installation était longue…sur mon [pauvre] PC 386 sx 253, avec mon disque de 80 Mo…oui, à l’époque, le giga n’existait pas.

L’avantage, lorsqu’on voulait compiler, c’était de bien faire attention à sa configuration, vu le peu de ressources disponibles en termes de mémoire ou de disque, et qu’une compilation du noyau prenait bien 2 heures.

Alors pourquoi avoir commencé ? tout simplement parce que encore étudiant, j’apprenais le C, et que les pointeurs mal gérés sous DOS cela faisait souvent planter le portable ou le PC…sous Linux, un autre étudiant m’ayant convaincu, toute mauvaise gestion provoquait un simple coredump…quel bonheur ;)

A partir de 95, ce fut l’occasion de se lancer dans le développement Web / Internet, en commençant par des CGI en C (mais tout de même à l’aide d’une libraire), puis en Perl, pour poursuivre par PHP/FI (l’ancêtre de PHP). Côté bases de données ou fichiers indexés, un commencement par C-ISAM, puis mSQL pour finir par PostgreSQL. Aux prémices du Web, on se débrouillait avec les outils de l’époque, et ceux-là étaient Opensource, c’est plus simple aujourd’hui.

Aujourd’hui, toujours une certaine passion, même si mon coeur balance également du côté de .NET, peut-être qu’avec Mono, je pourrai allier un jour les 2 mondes, à suivre.

Merci Linus, merci à tous les projets Opensources (Apache, lighty, Mysql, Ruby, Perl, …) et toute la synergie et l’émulation qui s’en dégage, nous pouvons que leur rendre hommage.

1 le tout 1er fut sous NCSA l’ancêtre d’Apache

2 quitte à jouer au vieux con…aucune nostalgie bien entendu dans la suite, c’est bien mieux aujourd’hui qu’hier.

3 mais heureusement que je l’avais overclocké en 40…;)

Liste livres IT Amazon

Posted by – February 16, 2008

Vous avez un peu d’argent car vous travaillez + ? vous avez gagné au loto ? ou bien tout simplement vous êtes très généreux, alors voici la liste des bouquins que j’aimerais bien sur Amazon :

Bouquins IT

…merci c’est gentil ;-)

Techdays 2008, jour 3

Posted by – February 14, 2008

J’ai assisté qu’à une session pour ce dernier jour : Windows 2008 et IIS 7.0 de Laurent BONNET.

Les idées reçues ont la vie longue, fruit d’un passé pas toujours glorieux chez Microsoft, mais les temps ont changé1.

1er constat : d’après Netcraft, l’usage des serveurs Web se répartit de la façon suivante :

  • 48 % Apache
  • 36 % IIS qui reste à un peu plus de 10 points du challenger

2ème constat : de plus en plus d’hébergeurs proposent une solution IIS dans leur offre, et au moindre prix, et notamment IIS 7.0.

L’arrivée de Windows 2008, et notamment Windows Web Edition 2008 embarquera IIS 7.0, serveur Web complètement revu et corrigé, en vrac :

  • optimisé pour ASP.NET, PHP (FastCGI !)
  • configuration par fichiers XML (terminé la métabase)
  • une [belle] console d’administration (fini la MMC)
  • gère de 4Go RAM, et jusqu’à 4 CPU (soit 16 cores)
  • plus de 40 modules fournis en natif, à activer ou…pas (commande pkgmgr)
  • administrable en ligne de commandes (notamment appcmd)
  • à noter que la version Core ne disposera pas du framework .NET, et donc pas de PowerShell
  • utilisateur anonyme “built in” (local au système)
  • simplification de la réplication des configurations avec l’utilisation possible de chemins UNC, et prend la forme déjà connue des applications ASP.NET (machine.config, web.config, ApplicationHost.config)
  • administrable à distance grâce au WMSVC Management service (…donc plus besoin d’accès distant TSE)

Tout cela pour le bonheur et surtout la simplification de gestion multi-sites pour les hébergeurs.

Au niveau de l’architecture, celle-ci a été revue : d’un IIS 6.0 monolithique, on passe à une architecture en pipeline (on pensera ici aux modules ASP.NET), car ASP.NET est intégré au serveur.

Egalement, amélioration pour le diagnostic grâce à IIS 7 failed request events logs, pour résumer, en cas de crash d’une application, les logs (XML, XSLT) sont consultables a posteriori pour retrouver le problème survenu.

Pour les pros du dév., une API est disponible pour contrôler le serveur : Microsoft.Web.Administration.

Ce que j’ai surtout retenu, c’est un gros effort pour intégrer et héberger des applications PHP. Microsoft a travaillé avec Zend pour fournir FastCGI pour IIS, avec la possibilité de profiter des modules .NET (la pipeline) dans l’application PHP (par exemple le module de gestion d’accès FormsAuthentication). J’avais développé des applications sur IIS 5 en utilisan t un filtre ISAPI ou l’application php.exe, ce n’était pas encore vraiment très stable à l’époque mais cela fonctionnait.

A noter, le 1er avril, 1 journée sur IIS 7.0 sous forme de TP, et gratuit, je n’ai malheureusement pas plus d’informations sur le lieu.

Ressources :

D’autres comptes-rendus.

1 et je suis assez d’accord avec ce constat, depuis l’arrivée de Windows 2003, et surtout de la plateforme .NET, une nette amélioration s’est ressentie dans les produits Microsoft, avec une grande écoute des développeurs ou autres administrateurs (feedback cela s’appelle).

Techdays 2008, jour 1

Posted by – February 11, 2008

1er jour des Techdays 2008. Sont attendus 16 000 geeks personnes, avec plus de 300 sessions au programme, autant dire que cela va être dur de tout suivre. Lundi, j’ai pu suivre 3 sessions, boulot oblige.

La keynote fut agrémentée d’une démo (un flickr like) sur différents thèmes : plateformes, Linq, Astoria, SQL Server 2008, Silverlight, le tout monté par l’équipe Microsoft.

Un chiffre annoncé, selon une étude du cabinet Forrester, .NET dépasse J2EE en terme d’utilisation en entreprise avec respectivement 39 % et 35 % d’adoption.

Quelques notes prises, qui ne sont pas forcément bien structurées ou comprises, des idées, des astuces, à approfondir bien entendu.

ADO.NET Entities Framework

Session présentée par 2 consultants Winwise (Matthieu Mezil et Michel Perfetti). Chacun se répartit la session en Linq (requêtage objet) – eSQL (requêtage spécifique EDM) et ADO.NET Entities (ou EDM : Entity Data Model).

Le framework sera disponible courant juin 2008, pour l’instant on se contentera de la version Beta3 (CTP2).

EDM est ni plus ni moins un framework de mapping objet relationnel, tel qu’on peut le connaitre avec des ORM tels que NHibernate, ActiveRecord, … sauf que c’est la solution proposée par Microsoft.

Quelles différences entre eSQL et Linq ? le premier (sous forme de chaines de caractères) permet d’effectuer des requêtes dynamiques (ie : donc paramétrables), le 2è est plus un langage d’interrogation objet, compilé (ie : et donc statique). Toutefois, pour Linq, une solution pour avoir des requêtes paramétrables : les requêtes compilées (CompiledQuery.Compile).

Selon le provider, eSQL génère le SQL propriétaire qui sera envoyé au moteur de base de données.

Simple, à partir d’un modèle de données en entrée (80 % des applications partent de cette base), génération d’une couche EDM (Entity Data Model) pour le mapping (classes, le modèle) et les opérations de CRUD. Plusieurs providers seront livrés : SQL Server, MySQL, Oracle, …selon l’implémentation que feront les intéressés. Le modèle décrit est contenu dans un fichier .edmx

L’EDMX est réparti selon plusieurs sections :

  • CSDL : description des entités,
  • SSDL : description des données,
  • C-S mapping : le mapping entre les entités et les tables.

Le mapping peut être avancé : collections, types complexes, héritage (d’entités sur plusieurs tables [TPT : Table per Type] ou sur n entités sur une table [TPH : Table per Hierarchy, on aura un discriminant])…tout ce que l’on peut attendre d’un framework. Seule différence, pas de lazy loading, le chargement des collections (ie : associations n-m) doit être explicite (par un Load()).

La Cache tracking permet de garder l’état des objets modifiés grâce aux requêtes Linq (To SQL).

Ressources :

Javascript pas à pas, au trot, puis au grand galop

Javascript est devenu un langage important avec l’avènement du Web 2.0 et de la brique Ajax, il était important de se rappeler quelques bases.

Session présentée par Cyril DURAND , indépendant spécialiste en Javascript et ASP.NET.

Il est rappelé que JS est un langage orienté prototype et non objet. Un prototype : chaque objet a un lien caché vers son prototype, l’instance du prototype est partagé entre les objets (cela ressemble à l’héritage sans en être). Il est préférable d’utiliser les prototype que les closures, ces derniers étant plus gourmands en ressources mémoires (1 instance créée à chaque fois), un bench sur les 2 façons de faire1.

Un peu d’historique de ce langage, où la standardisation n’apparait qu’en 1998 pour donner naissance à l’EcmaScript (Javascript étant le nom [réservé] donné par Netscape). Depuis 1999, Javascript 1.5 supporté par la majorité des navigateurs. Depuis 2005-2006, Javascript 1.6, 1.7, et dans le futur, la 2.0 qui apporte le support objet (classe, …).

tour d’horizon

6 types de base : Number (flottant codé sur 64 bits), String, Null, Undefined, Object, Boolean. Pour ce dernier tout ce qui n’est pas faux est vrai, les valeurs qui retournent false :

false,
undefined, // valeur retourné lorsqu'on tente d'accéder à une variable/propriété inexistante
null,
0,
''

Opérateurs :

  • === d’égalité strict, vérifie la valeur ET le type.
  • || retourne la 1ère valeur non fausse, voir l’explication sur le blog de Cyril
  • astuce avec l’instruction !!, voir chez Cyril

Gestion des exceptions, le catch permet d’ajouter des conditions.

Fonctions : il est conseillé de les déclarer sous forme de variable et non comme on peut le voir avec function(){} :

 var myfnc = function() { // };
var myfnc2 = function fct() {};

Objet :

  var p = { firstname: 'Olivier',
speak: function() { return this.firstname; }
}
var fnc = p.speak;

this se rapport au contexte appelant. Grâce au mot clé apply, on permet de changer de contexte.

On retrouvera sur son site, des billets sur les notions décrites :

MS Ajax Library

Opensource, sous licence Microsoft Permissive License, il est surtout utilisé en conjonction avec ASP.NET AJAX Control Toolkit, ensemble de modules Ajax (autocompletion, modal, …)

MS Ajax Library apporte des extensions à Javascript afin de se simplifier la vie pour développer avec ce dernier, avec notamment :

  • string.Format
  • registerClass
  • callBaseMethod
  • registerEnum
  • $get(‘id’) : au lieu du document.getElementById()
  • createDelegate
  • $addHandner() : ajouter un évènement sur un click, …

Astuce : il suffit d’ajouter le mot clé debugger; dans le code JS afin que celui-ci soit débuggable sous Visual Studio.

ADO.Net Data Services (aka Astoria)

Session présentée par Pierre Lagarde et Mistu Futura2.

ADO.Net Data Services est prévu pour juin 2008, pour l’instant, la Beta (CTP) est fournie (ASP.Net Futures/Extensions). En gros, faire du REST (donc requêtes par dessus HTTP pour interroger des données). Cette couche vient au-dessus de LinqToSQL / Entities Framework, voir la session décrite au début du billet.

L’URL est du type : http://server/monservice.svc, on peut également l’enrichir de paramètres (filtres d’interrogation) : http://server/monservice.svc/Customers, http://server/monservice.svc?$filter=, … Cela permet très simplement et sans code particulier côté serveur d’interroger son modèle de données, rien que d’y penser, ça donne envie.

Le retour peut être de 2 formes : XML ou JSON selon la sérialisation souhaitée3.

L’utilisation des interceptors (attribut QueryInterceptor(“requete”) à ajouter à la méthode du service) permet de sécuriser l’accès aux données, en restreignant les données à explorer.

Une utilisation avec un client non Web est aussi prévu. Dans ce cas, webdatagen.exe permettra de générer un proxy Astoria pour une utilisation dans un client Winform par exemple.

D’autres comptes-rendus

Sur le site de DotNetGuru

1 j’admets que je vais devoir me poser pour étudier ça de près, ça reste pour l’instant un peu abstrait…

2 Mitsu qui a travaillé chez nous en tant que consultant avant d’entrer chez Microsoft. Il nous avait développé avec talent à l’époque une 1ère version d’un ORM : dsMap, autant dire que les données ça le connait ;)

3 la version 3.5 insére automatiquement un “d” avant la sérialisation des données en JSON, ceci afin de préserver une sécurité, liée à la possibilité d’Eval de l’expression JSON ramenée

DP : design patterns et bonnes pratiques

Posted by – February 4, 2008

Préambule

Développer objet, composants, services c’est bien, développer avec des design patterns c’est mieux.

Sans entrer dans un tutoriel de design patterns1, je voulais énumérer quelques patterns que j’ai pour habitude d’utiliser car cela permet de résoudre simplement des problématiques courantes.

Pour une définition, se référer à Wikipédia

En génie logiciel, un patron de conception (design pattern en anglais) est un concept destiné à résoudre les problèmes récurrents suivant le paradigme objet.

Après quelques années, on commence à avoir du recul sur son expérience de développement. A force d’écrire du code (ou à le refactorer), on cherche constamment à écrire du mieux possible telle partie ou tel module, pour une unique raison à mon sens : comment rendre le plus maintenable possible un système sur le long terme ?

Maintenable = modulable, souple, facilement évolutif, et ce, par tout ingénieur susceptible de toucher au code… vaste mission qui s’offre à nous.

Un mot que j’aime bien : entropie, que l’on peut transposer à une plateforme d’applications si on n’y fait pas attention : le degré d’instabilité d’un système augmente au fil du temps, et ce constat est corrélé au nombre de lignes de code qui augmente.

Aussi, autant prévenir que guérir2 avant que le système s’écroule (c’est une image…) : bonnes pratiques, refactoring, design patterns, etc…sont autant de moyens afin de rendre le système le plus stable et évolutif possible.

Lesquels

Dans notre architecture, nous nous basons sur la plateforme .NET pour développer les projets. Sur celle-ci, les projets sont développés sous forme d’une architecture n-tiers, non pas MVC (bien qu’il existe des implémentations3 MVC dans le monde ASP.NET), mais une variante du paradigme4 PAC (et une petite dose de SOA avec les services Web), où l’on trouve la couche présentation (ASP.NET), une couche d’abstraction (contrôleur, entités) qui fait la liaison entre la présentation et la couche métier ci-après, et une couche d’implémentation pour les traitements (métier, DAL). Cela a l’avantage d’être souple tout en bénéficiant du modèle ASP.NET5 (ce que ne permet pas MVC pour l’instant)

Factory / Singleton

Dans ce type d’architecture, les implémentations sont instanciées dynamiquement (ie : lors de l’utilisation du contrôleur), pour se faire, nous avons besoin d’une Factory (typiquement contenu dans une classe Helper avec une méthode statique) voire d’une Abstract Factory.

Si l’on souhaite que notre instance ne soit pas créée à chaque fois par la Factory (pour économiser la mémoire, l’initialisation qui pourrait être longue, …), on utilisera le pattern Singleton. En gros, l’objet est gardé en mémoire (par une variable statique). Dans ce cas, on fera bien attention à ce que l’instanciation de cet objet soit thread safe (ou sur IBM), dans un environnement multi-threading comme ASP.NET, cela peut générer des conflits.

Strategy

J’aime bien ce modèle car cela permet d’encapsuler et de déléguer à d’autres classes des actions à déclencher dans un contexte précis.

Strategy, cela utilise notamment le principe de l’injection de dépendance (très lié à l’IoC lorsque l’on parle de conteneurs tels que Spring ou Windsor).

Par exemple, comment à partir de mêmes données, générer un document PDF, Word, HTML, le pattern Strategy pourrait résoudre cette problématique proprement (sans faire un excès d’utilisation de l’héritage6) en délégant à des classes (PDF, Word, HTML) le soin de le faire.

Template Method

Ce pattern applique le principe d’Hollywood : “ne nous appelez pas, nous vous appellerons”. Autrement dit, on délègue la responsabilité de tout ou partie d’un traitement ou d’actions aux sous-classes qui dérivent de la classe mère qui définit le squelette des traitements à effectuer.

Cela peut s’avérer très utile dans un développement avec une approche plugins (ou de tâches), où la classe mère doit exécuter des sous services, elle ne fera qu’appeler une méthode qui devra être implémentée par les classes sous-jacentes qui dérivent de cette dernière.

Un exemple concret

Adapter

L’Adapter peut permettre lorsqu’on a un existant de faire évoluer le système sans tout casser, en se basant sur les interfaces existantes tout en les faisant évoluer.

Les candidats

J’aimerais pouvoir utiliser les DP suivants, même si le ou les contextes d’utilisation se sont déjà présentés :

  • State pour gérer des états de façon évolutive et sûre, ou bien
  • Memento, ou comment garder en mémoire (archivage) les différentes actions précédemment menées
  • …tout autre DP qui permettrait de résoudre un problème proprement

Conclusion

Le développement logiciel, et plus précisément le Web s’avère être un métier passionnant qui fait intervenir énormément de compétences et différentes facettes pour remplir à bien les missions.

J’aime particulièrement les bonnes pratiques, ancrées dans des principes souvent simples mais qu’il faut tenter d’appliquer à chaque nouveau projet ou module développé.

Ressources

On pourra citer pêle-mêle :

…toutes les bonnes pratiques et astuces d’optimisation du code axé sur le développement Web :

Livres:

1 voir les ressources ci-après

2 si l’entropie est trop forte alors le système s’écroule : il devient inmaintenable, et il n’est plus possible de le faire évoluer

3 ProMesh, MonoRail et bien sûr ASP.NET MVC

4 je ferai prochainement un billet sur ce modèle d’architecture

5 Evénements (cycle page/contrôles), ViewState, Postback, gestion fine des contrôles, …

6 on privilégiera la composition à la place de l’héritage à multi-niveaux (ie : en ajoutant sans cesse des couches de classes), catastrophique pour une bonne évolution du système.