Archives pour la catégorie Ecrit en français

Mesurer la qualité du Web tout en surfant

La conformité aux standards ouverts définis dans le cadre du W3C est un élément important dans la qualité du Web tel qu’on le connaît. Pour ceux d’entre vous qui sont développeurs Web et souhaitent vérifier la conformité des pages qu’ils consultent, rien de plus simple : avec l’extension HTML Validator de Firefox, une petite icône en bas de Firefox vous indique si la page pose ou non problème. Mieux encore, l’extension vous indique comment corriger le problème si vous pouvez modifier cette page !

Web-SSO : A CAS client for Zope

The Central Authentication Service (aka CAS) is an open source lightweight framework that provides Web Single Sign On to big organizations (universities, agencies, corporations). It seems to be wildly used and seen as as much mature and reliable as the struts framework.

An existing server can benefit CAS WebSSO features if its technology is supported by a CAS client. So, please welcome Zope’s CAS User Folder, that SSOizes Zope within complex SSO infrastructures.

Le Gartner consacre blogs et wikis

Le Gartner Group reconnait dans les wikis, les blogs, les logiciels de réseautage social et RSS un fort potentiel pour l’entreprise. L’attention portée par le cabinet d’analyse au mouvement de la gestion des connaissances « grass-roots » contribuer à apporter à celui-ci la légitimité (la consécration ?) qui lui permettront de prendre pied dans le secteur privé.

Depuis quelques mois, je sentais le vent venir : mon chef me parle de plus en plus souvent blogs et RSS (« c’est quoi ? », « à quoi ça sert ? », « comment je pourrais essayer ? »). Au début, c’était peut-être un peu pour me faire plaisir ? Mais, non, il a même souhaité que je lui installe un agrégateur RSS sur son poste de travail. Ah ! Du concret ! Ajouté à cela tout le buzzwording du Gartner et autres MetaGroup sur le sujet (« blogs et wiki sont les outils de collaboration de troisième génération »), on peut dire que, ça y est, les grandes entreprises portent l’attention de leur informatique sur ce sujet (il était temps). Maintenant, il faudra encore attendre un peu avant de voir des usages prendre racines à l’échelle de l’entreprise entière. En attendant, carnettons et agrégeons tous en coeur !

Facteurs de succès des communautés de pratiques

Nombre d’entreprises essaient depuis quelques années de décloisonner leur communication internet en développant en leur sein des échanges entre professionnels partageant des pratiques ou centres d’intérêt. Ces communautés de pratiques sont invitées à utiliser des techniques de communication électroniques. Certaines communautés sont perçues comme des succès et d’autres comme des flops. Qu’est-ce qui fait qu’une communauté de pratique appuyée sur des outils électroniques connaîtra ou non le succès ? Le CEFRIO s’est penché sur le sujet dans le cadre d’un projet de recherche et a publié ses conclusions.

Quels sont les principaux facteurs organisationnels de succès ? Pour qu’une communauté connaisse le succès, il faut distinguer deux phases dans son cycle vie : son démarrage et son fonctionnement en régime de croisière. Pour la phase de démarrage, c’est la structure de l’organisation qui est déterminante. Le succès sera probablement au rendez-vous :

  • si l’environnement organisationnel n’est pas un frein aux échanges (voire, au contraire, s’il facilite et encourage ces échanges transverses),
  • si le sujet d’échanges choisi par la communauté est considéré comme pertinent (comme ayant de la valeur) par ses membres ou par l’organisation dans son ensemble
  • et si l’entreprise soutient formellement la communauté.

Ces facteurs structurels sont déterminants pour que la sauce puisse prendre. Ils perdent ensuite leur importance lorsque la communauté entre en régime de croisière. Ce sont alors trois pratiques de gestion de la communauté qui prennent le pas pour assurer le succès de la communauté :

  • le travail de l’animateur de la communauté est-il assuré avec dynamisme ?
  • la participation à la communauté est-elle reconnue dans l’évaluation individuelle de performance (l’entretien annuel…) ?
  • l’implication dans la communauté fait-elle l’objet d’une large communication au sein de l’organisation ?

Si c’est le cas, il est fort probable que l’activité de la communauté sera perçue comme un succès par ses membres pour eux-mêmes et pour l’entreprise. Dans le cas contraire, il est probable que ce ne soit pas le cas. Dans une moindre mesure, le soutien technologique offert aux membres et la formation aux outils informatiques influent positivement sur le succès. Il est également probable que le fait que les membres aient déjà l’habitude de travailler en équipe, voire en communauté distante favorise également le succès. D’autres facteurs de succès de moindre importance sont liés aux croyances des membres : ma participation à la communauté peut-elle améliorer mes perspectives d’évolution professionnelle ? ai-je le sentiment d’appartenir au groupe que constitue la communauté ? ai-je le sentiment de pouvoir l’influencer ?

Jusqu’ici, il était souvent rapporté qu’un facteur déterminant du succès était le fait que la communauté, avant de devenir « électronique », était constituée d’un groupe de personnes se connaissant déjà bien. L’étude du CEFRIO montre que ce n’est pas le cas : même constituée de personnes s’ignorant avant d’entrer dans le communauté, la communauté a autant de chances de connaître le succès ou l’échec.

Que pensent les participants de ces communautés ? En forçant le trait, on peut dire que les plus de 50 ans sont bien moins satisfaits de leur participation à des communautés de pratique que les plus jeunes et considèrent que les communautés de pratiques ne sont pas des succès, à l’opposé de leurs cadets. Tous âges confondus, l’opinion des membres est mitigée quant à l’utilité des communautés de pratique pour leur employeur. Les membres féminins se distinguent en considérant plus souvent contribuer activement aux échanges dans la communauté. Et elles estiment plus souvent que les hommes avoir réalisé des apprentissages professionnels et personnels importants. Le temps moyen consacré à la communauté s’élève à 50 minutes par semaine, ce qui est une source d’insatisfaction pour les membres des communautés. Ils regrettent un manque de reconnaissance de leur participation à la communauté par leur employeur. Par contre les membres de communautés de pratiques apprécient avant tout la qualité des échanges et de la collaboration entre les membres.

A quoi peut réellement servir une communauté de pratiques ? L’échange et le partage de l’information et des savoirs est l’objectif le plus souvent fixé et atteint pour les communautés de pratique. Les communautés réussissent à favoriser l’apprentissage de leurs membres, ce qui fait également partie de leurs priorités. Par contre, la valorisation de l’excellence des pratiques ou de la qualité sont souvent retenus comme priorité mais les communautés n’estiment pas pour autant atteindre ces deux types d’objectifs.

Comment fonctionnent les communautés de pratique ? Leur organisation interne est informelle, la plupart des décisions se prenant par consensus. Elles bénéficient d’un soutien très satisfaisant sur le plan des technologies de l’information. Pour pouvoir y participer, ses membres ne bénéficient pas de moyens supplémentaires si ce n’est, rarement, d’un peu de temps supplémentaire alloué par l’employeur. L’animateur de la communauté a pour rôle essentiel d’aider individuellement les membres et de fournir l’expertise sur les outils d’échanges électroniques, même si les membres croient, au moment de la création de la communauté, que son rôle essentiel est de susciter l’intérêt et la participation collectifs des membres. Les membres sont formés à l’utilisation des logiciels utilisés dans le cadre de la communauté. A la création de la communauté, les membres attendent de leur participation qu’elle leur permette de développer leurs connaissances. Ils ne s’attendent pas à bénéficier d’une reconnaissance particulière de la part de leur employeur mais leur degré habituel engagement dans leur travail compense l’absence de reconnaissance. Les membres ne se connaissent pas entre eux. Ils sont choisis par leurs supérieurs en raison de l’adéquation entre leurs compétences professionnelles et les objectifs de la communauté, et non pour leurs compétences informatiques. Cependant, la majorité des membres ont des connaissances informatiques supérieures à la moyenne (« utilisateurs débrouillards »). C’est l’animateur de la communauté qui les sollicite ensuite (surtout pour les femmes) ou bien le sponsor de la communauté (plus souvent pour les hommes). Les membres potentiels sont consultés sur leur participation et ont le sentiment de pouvoir refuser. Ils affirment ne pas craindre de partager leur expertise professionnelle au sein de la communauté. Ils attendent de leur participation qu’elle leur permette de développer leurs compétences, de pouvoir faire preuve de davantage de créativité et d’innovation, ce qui serait favorable pour leur avenir professionnel.

Modernisation des processus de gestion des identités électroniques de Saint-Gobain

[Ceci est le résumé de l’une de mes réalisations professionnelles. Je m’en sers pour faire ma pub dans l’espoir de séduire de futurs partenaires. Plus d’infos à ce sujet dans le récit de mon parcours professionnel.]

En 2000, l’informatique de Saint-Gobain est tellement décentralisée et hétérogène que la sécurité centrale ignore qui fait ou non partie du groupe. La direction des systèmes d’information me charge de diriger la modernisation des identités électroniques des 200 000 personnes du Groupe. J’analyse les processus clefs à moderniser : arrivée et départ des personnes. Je conduis le changement avec les acteurs concernés (RH, informatique et moyens généraux). Je dirige la conception et le déploiement d’une infrastructure technique de gestion des identités. En 2005, 50 000 des 200 000 personnes sont immatriculées et disposent d’un identifiant informatique unique. L’identité de 30 000 d’entre elles et leur appartenance au Groupe est tenue à jour en temps réel dans l’Annuaire Groupe. La suite du déploiement est planifiée pour les trois ans à venir.

Web scraping with python (part 1 : crawling)

Example One : I am looking for my next job. So I subscribe to many job sites in order to receive notifications by email of new job ads (example = Monster…). But I’d rather check these in my RSS aggregator instead of my mailbox. Or in some sort of aggregating Web platform. Thus, I would be able to do many filtering/sorting/ranking/comparison operations in order to navigate through these numerous job ads.

Example Two : I want to buy a digital camcorder. So I want to compare the available models. Such a comparison implies that I rank the most common models according to their characteristics. Unfortunately, the many sites providing reviews or comparisons of camcorders are not often comprehensive and they don’t offer me the capability of comparing them with respect to my way of ranking and weighting the camcorder features (example = dvspot). So I would prefer pumping all the technical stuff from these sites and manipulate this data locally on my computer. Unfortunately, this data is merged within HTML. And it may be complex to extract it automatically from all the presentation code.

These are common situations : interesting data spread all over the web and merged in HTML presentation code. How to consolidate this data so that you can analyze and process it with your own tools ? In some near future, I expect this data will be published so that it is directly processable by computers (this is what the Semantic Web is intending to do). For now, I was used to do it with Excel (importing Web data, then cleaning it and the like) and I must admit that Excel is fairly good at it. But I’d like some more automation for this process. I’d like some more scripting for this operation so that I don’t end with inventing complex Excel macros or formulas just to automate Web site crawling, HTML extraction and data cleaning. With such an itch to scratch, I tried to address this problem with python.

This series of messages introduces my current hacks that automate web sites crawling and data extraction from HTML pages. The current output of these scripts is a bunch of CSV files that can be further processed … in Excel. I wish I would output RDF instead of CSV. So there remains much room for further improvement (see RDF Web Scraper for a similar but approach). Anyway… Here is part One : how to crawl complex web sites with Python ?. The next part will deal with data extraction from the retrieved web pages, involving much HTML cleansing and parsing.

My crawlers are fully based on the John L. Lee’s mechanize framework for python. There are other tools available in Python. And several other approaches are available when you want to deal with automating the crawling of web sites. Note that you can also try to scrape the screens of legacy terminal-based applications with the help of python (this is called « screen scraping »). Some approaches of web crawling automation rely on recording the behaviour of a user equipped with a web browser and then reproduce this same behaviour in an automated session. That is an attractive and futuristic approach. But this implies that you find a way to guess what the intended automatic crawling behaviour will be from a simple example. In other words, with this approach, you have either to ask the user to click on every web link (all the job postings…) and this gives no value to the automation of the task. Or your system « guesses » what automatic behaviour is expected just by recording a sample of what a human agent would do. Too complex… So I preferred a more down-to-earth solution implying that you write simple crawling scripts « by hand ». (You may still be interested in automatically record user sessions in order to be more productive when producing your crawling scripts.) As a summary : my approach is fully based on mechanize so you may consider the following code as example of uses of mechanize in « real-world » situations.

For purpose of clarity, let’s first focus on the code part that is specific to your crawling session (to the site you want to crawl) . Let’s take the example of the dvspot.com site which you may try to crawl in order to download detailed description of camcorders :

    # Go to home page
    #
    b.open("http://www.dvspot.com/reviews/cameraList.php?listall=1&start=0")
    #
    # Navigate through the paginated list of cameras
    #
    next_page = 0
    while next_page == 0:
     #
     # Display and save details of every listed item
     #
     url = b.response.url
     next_element = 0
     while next_element >= 0:
      try:
       b.follow_link(url_regex=re.compile(r"cameraDetail"), nr=next_element)
       next_element = next_element + 1
       print save_response(b,"dvspot_camera_"+str(next_element))
       # go back to home page
       b.open(url)
       # if you crawled too many items, stop crawling
       if next_element*next_page > MAX_NR_OF_ITEMS_PER_SESSION:
          next_element = -1
          next_page = -1
      except LinkNotFoundError:
       # You certainly reached the last item in this page
       next_element = -1
    #
     try:
      b.open(url)
      b.follow_link(text_regex=re.compile(r"Next Page"), nr=0)
      print "processing Next Page"
     except LinkNotFoundError:
      # You reached the last page of the listing of items
      next_page = -1

You noticed that the structure of this code (conditional loops) depends on the organization of the site you are crawling (paginated results, …). You also have to specify the rule that will trigger « clicks » from your crawler. In the above example, your script first follows every link containing « cameraDetail » in its URL (url_regex). Then it follows every link containing « Next Page » in the hyperlink text (text_regex).

This kind of script is usually easy to design and write but it can become complex when the web site is improperly designed. There are two sources of difficulties. The first one is bad HTML. Bad HTML may crash the mechanize framework. This is the reason why you often have to pre-process the HTML either with the help of a HTML tidying library or with simple but string substitutions when your tidy library breaks the HTML too much (this may be the case when the web designer improperly decided to used nested HTML forms). Designing the proper HTML pre-processor for the Web site you want to crawl can be tricky since you may have to dive into the faulty HTML and the mechanize error tracebacks in order to identify the HTML mistakes and workaround them. I hope that future versions of mechanize would implement more robust HTML parsing capabilities. The ideal solution would be to integrate the Mozilla HTML parsing component but I guess this will be some hard work to do. Let’s cross our fingers.

Here are useful examples of pre-processors (as introduced by some other mechanize users and developpers) :

class TidyProcessor(BaseProcessor):
      def http_response(self, request, response):
          options = dict(output_xhtml=1,
                   add_xml_decl=1,
                   indent=1,
                   output_encoding='utf8',
                   input_encoding='latin1',
                   force_output=1
                   )
          r = tidy.parseString(response.read(), **options)
          return FakeResponse(response, str(r))
      https_response = http_response
#
class MyProcessor(BaseProcessor):
      def http_response(self, request, response):
          r = response.read()
          r = r.replace('"image""','"image"')
          r = r.replace('"','"')
          return FakeResponse(response, r)
      https_response = http_response
#
# Open a browser and optionally choose a customized HTML pre-processor
b = Browser()
b.add_handler(MyProcessor())

The second source of difficulties comes from non-RESTful sites. As an example the APEC site (a French Monster-like job site) is based on a proprietary web framework that implies that you cannot rely on links URLs to automate your browsing session. It took me some time to understand that, once loggin in, every time you click on a link, you are presented with a new frameset referring to the URLs that contain the interesting data you are looking for. And these URLs seem to be dependent on your session. No permalink, if you prefer. This makes the crawling process even more tricky. In order to deal with this source of difficulty when you write your crawling script, you have to open both your favorite text editor (to write the script) and your favorite web browser (Firefox of course !). One key knowledge is to know mechanize « find_link » capabilities. These capabilities are documented in _mechanize.py source code, in the find_link method doc strings. They are the arguments you will provide to b.follow_link in order to automate your crawler « clicks ». For more convenience, let me reproduce them here :

  • text: link text between link tags: <a href= »blah »>this bit</a> (as
    returned by pullparser.get_compressed_text(), ie. without tags but
    with opening tags « textified » as per the pullparser docs) must compare
    equal to this argument, if supplied
  • text_regex: link text between tag (as defined above) must match the
    regular expression object passed as this argument, if supplied
    name, name_regex: as for text and text_regex, but matched against the
    name HTML attribute of the link tag
  • url, url_regex: as for text and text_regex, but matched against the
    URL of the link tag (note this matches against Link.url, which is a
    relative or absolute URL according to how it was written in the HTML)
  • tag: element name of opening tag, eg. « a »
    predicate: a function taking a Link object as its single argument,
    returning a boolean result, indicating whether the links
  • nr: matches the nth link that matches all other criteria (default 0)

Links include anchors (a), image maps (area), and frames (frame,iframe).

Enough with explanations. Now comes the full code in order to automatically download camcorders descriptions from dvspot.com. I distribute this code here under the GPL (legally speaking, I don’t own the copyleft of this entire code since it is based on several snippets I gathered from the web and wwwsearch mailing list). Anyway, please copy-paste-taste !

from mechanize import Browser,LinkNotFoundError
from ClientCookie import BaseProcessor
from StringIO import StringIO
# import tidy
#
import sys
import re
from time import gmtime, strftime
#
# The following two line is specific to the site you want to crawl
# it provides some capabilities to your crawler for it to be able
# to understand the meaning of the data it is crawling ;
# as an example for knowing the age of the crawled resource
#
from datetime import date
# from my_parser import parsed_resource
#
"""
 Let's declare some customized pre-processors.
 These are useful when the HTML you are crawling through is not clean enough for mechanize.
 When you crawl through bad HTML, mechanize often raises errors.
 So either you tidy it with a strict tidy module (see TidyProcessor)
 or you tidy some errors you identified "by hand" (see MyProcessor).
 Note that because the tidy module is quite strict on HTML, it may change the whole
 structure of the page you are dealing with. As an example, in bad HTML, you may encounter
 nested forms or forms nested in tables or tables nested in forms. Tidying them may produce
 unintended results such as closing the form too early or making it empty. This is the reason
 you may have to use MyProcessor instead of TidyProcessor.
"""
#
class FakeResponse:
      def __init__(self, resp, nudata):
          self._resp = resp
          self._sio = StringIO(nudata)
#
      def __getattr__(self, name):
          try:
              return getattr(self._sio, name)
          except AttributeError:
              return getattr(self._resp, name)
#
class TidyProcessor(BaseProcessor):
      def http_response(self, request, response):
          options = dict(output_xhtml=1,
                   add_xml_decl=1,
                   indent=1,
                   output_encoding='utf8',
                   input_encoding='latin1',
                   force_output=1
                   )
          r = tidy.parseString(response.read(), **options)
          return FakeResponse(response, str(r))
      https_response = http_response
#
class MyProcessor(BaseProcessor):
      def http_response(self, request, response):
          r = response.read()
          r = r.replace('"image""','"image"')
          r = r.replace('"','"')
          return FakeResponse(response, r)
      https_response = http_response
#
# Open a browser and optionally choose a customized HTML pre-processor
b = Browser()
b.add_handler(MyProcessor())
#
""""
 Let's declare some utility methods that will enhance mechanize browsing capabilities
"""
#
def find(b,searchst):
    b.response.seek(0)
    lr = b.response.read()
    return re.search(searchst, lr, re.I)
#
def save_response(b,kw='file'):
    """Saves last response to timestamped file"""
    name = strftime("%Y%m%d%H%M%S_",gmtime())
    name = name + kw + '.html'
    f = open('./'+name,'w')
    b.response.seek(0)
    f.write(b.response.read())
    f.close
    return "Response saved as %s" % name
#
"""
Hereafter is the only (and somewhat big) script that is specific to the site you want to crawl.
"""
#
def dvspot_crawl():
    """
     Here starts the browsing session.
     For every move, I could have put as a comment an equivalent PBP command line.
     PBP is a nice scripting layer on top of mechanize.
     But it does not allow looping or conditional browsing.
     So I preferred scripting directly with mechanize instead of using PBP
     and then adding an additional layer of scripting on top of it.
    """
#
    MAX_NR_OF_ITEMS_PER_SESSION = 500
    #
    # Go to home page
    #
    b.open("http://www.dvspot.com/reviews/cameraList.php?listall=1&start=0")
    #
    # Navigate through the paginated list of cameras
    #
    next_page = 0
    while next_page == 0:
     #
     # Display and save details of every listed item
     #
     url = b.response.url
     next_element = 0
     while next_element >= 0:
      try:
       b.follow_link(url_regex=re.compile(r"cameraDetail"), nr=next_element)
       next_element = next_element + 1
       print save_response(b,"dvspot_camera_"+str(next_element))
       b.open(url)
       # if you crawled too many items, stop crawling
       if next_element*next_page > MAX_NR_OF_ITEMS_PER_SESSION:
          next_element = -1
          next_page = -1
      except LinkNotFoundError:
       # You reached the last item in this page
       next_element = -1
    #
     try:
      b.open(url)
      b.follow_link(text_regex=re.compile(r"Next Page"), nr=0)
      print "processing Next Page"
     except LinkNotFoundError:
      # You reached the last page of the listing of items
      next_page = -1
    #
    return
#
#
#
if __name__ == '__main__':
#
    """ Note that you may need to specify your proxy first.
    On windows, you do :
    set HTTP_PROXY=http://proxyname.bigcorp.com:8080
    """
    #
    dvspot_crawl()

In order to run this code, you will have to install mechanize 0.0.8a, pullparser 0.0.5b, clientcookie 0.4.19, clientform 0.0.16 and utidylib. I used Python 2.3.3. Latest clientcookie’s version was to be integrated into Python 2.4 I think. In order to install mechanize, pullparser, clientcookie and clientform, you just have to do the usual way :

python setup.py build
python setup.py install
python setup.py test

Last but not least : you should be aware that you may be breaking some terms of service from the website you are trying to crawl. Thanks to dvspot for providing such valuable camcorders data to us !

Next part will deal with processing the downloaded HTML pages and extract useful data from them.

Identity Management et Customer Relationship Management

Un nouveau concept vient d’être introduit par le Gartner dans le domaine de la gestion de la relation client : le Customer Interaction Hub désigne l’intégration en une seule plate-forme de toutes les applications liées à la gestion de la relation client.
Selon Phil Windley, la mise en oeuvre de ces concentrateurs de la relation clients suppose des méthodes de travail identiques à celles qui permettent l’intégration des identités électroniques (synchronisation, fédération, provisioning, …).

The three laws of identity

Microsoft has definetely not been the leader in identity management systems. For sure, MS Active Directory is being widely deployed. But it is an authentication and administration infrastructure, not an identity management solution. Because of MS ADAM (lightweight LDAP directory) and MS IIS (directory synchronization aka metadirectory) lacking features (compared to their competitors), I often thought that Microsoft was lacking some visionary approach of identity management. I was definitely wrong. They’ve got a guy who seems to have perfectly identified the (long term) future of identity management.

Rapid manufacturing : the dream factory

Histoire de nous faire rêver un peu, Bruce Sterling décrit dans cet article de Wired comment, d’ici quelques années, les machines de prototypage rapide (imprimantes 3D, découpe laser, frittage laser…) deviendront des outils de fabrication express (rapid manufacturing) puis des outils de fabrication de bureau (desktop manufacturing) pour permettre à vous et moi de faire un « sélectionner Freebox / bouton droit / Imprimer… » pour voir une freebox toute neuve et opérationnelle sortir de votre imprimante de bureau. Rêvons un peu…

En attendant, des sociétés (Zcorp, Stratasys, et dans une moindre mesure le français Phenix systems…) vendent déjà des machines de fabrication express, de la taille d’un gros photocopieur, consommant des matériaux à coût raisonnable (moins de 100 dollar par objet) et fabriquant un objet en quelques heures seulement.

Et une école du Ghana s’équipe avec un « fab lab » du MIT.

Firefox gagne 5% des parts de marché de MS Internet Explorer

Le navigateur web Firefox, de la fondation Mozilla, a pris 5% des parts de marché des navigateurs web à son concurrent, Microsoft Internet Explorer. Et pourtant cela ne fait que quelques semaines que la version 1.0 de Firefox a été publiée. Mais la supériorité de Firefox sur IE est déjà largement vantée par la presse, ce qui accélère le mouvement de migration…
Ces données de part de marché sont publiées par OneStat, le « leader mondial des statistiques du web en temps réel », bref une source a priori fiable. Plus de commentaires, sur Slashdot.

Chers spammeurs adorés

Chers spammeurs adorés,

Je connais bien vos adresses, vous m’envoyez régulièrement des mails publicitaires non sollicités. Vous m’écrivez tellement régulièrement que j’ai deviné combien vous aimez la messagerie. Malheureusement, je n’ai pas le temps de vous répondre. Ni de vous lire non plus, d’ailleurs. C’est pourquoi je vous ai ajouté à ma « liste des expéditeurs bloqués » dans mon logiciel de messagerie.

Mais, à défaut de pouvoir vous lire ou faire lire vos mails par mes collègues (qui ne s’y intéressent pas non plus), je pense pouvoir faire quelque chose pour vous. Puisque vous aimez la messagerie, je pense que vous serez heureux de recevoir, à votre tour, dans votre boîte aux lettres de nombreux courriers.

Je publie donc ici la liste de vos adresses de messagerie, dans l’espoir que des âmes charitables entretiendront avec vous une correspondance nourrie.

Cordialement,

— Sig

actu@b.linternaute.com
ads@263.com
advertising@theitjobboard.com
annonce@amazon.fr
announcements@documentum-info.com
audit@stratrg.co.uk
ccombes@arccos.fr
claire.herrenschmidt@unilog.fr
cmorel@access-commerce.com
commercial@e-coursier.com
comptoirdeslangues@effibases.com
contact.documation@reedexpo.fr
debora20@hotmail.com
editor@theitjobboard.com
emea-info@plumtree.com
evenement.fr@softwareag.com
facteur@infopromotions.fr
info.france@opentext.com
info.sap@effibases.com
info@imecom.net
info@it-mailing.com
info@linescort.com
infodi@hitechpros.com
iprigent@aston.fr
ise@hotmail.com
jruel@efront.fr
l.vachon@castsoftware.com
list2@direct.cnet.com
m.attal@igs-fd.com
m.libessart@progressive-fr.com
mailcom@welcomeoffice.com
marketing.fr@asg.com
marketing-ext@coheris.com
midia@cartuchosdetinta.com.br
mlanthonioz@micropole-univers.com
newsletters@companeo.com
oblix@en25.com
pierre.bernassau@documentum.com
plumtreesoftware@plumtree.com
pushdi@hitechpros.com
r.pratt@computerfutures.fr
reed@effibases.com
remi.jacquet@castsoftware.com
reply@optima-online.fr
research@ctp.com
shusson@bea.com
t.moutalica@computerfutures.com
tracy.ryan@plumtree.com
vdxs@hotmail.com
ventureselect@techbreak.prserv.net
vlelong@aston.fr

PS : Bien entendu, je reste à votre disposition pour retirer votre adresse de cette liste si vous le souhaitez.

Alexandre Gueniot va trouver un job

C’est sûr ! Alexandre Gueniot va trouver un job, pas de doute vu que son CV, en plus, d’être original, amusant et bien fait, est en train de faire le tour de la planète par messagerie interposée. Vous avez bien un collègue/ami plus ou moins informaticien qui vous envoie de temps en temps des blagues ou autres fichiers .pps par mail ? Et bien il va bientôt vous envoyer un lien vers le CV d’Alexandre. Ne manquez pas d’aller consulter ce CV pas comme les autres !

Vacances en Marquenterre et baie de Somme

En vue de vos (nos) prochaines vacances en baie de Somme, voici quelques pointeurs :

Vous connaissez bien le Marquenterre ou la baie de Somme ? Vous avez récemment séjourné pour des vacances là-bas ? Alors merci de laisser un commentaire ici pour partager vos impressions et votre expérience !

Portails / CMS en J2EE

Pour créer un portail d’entreprise en J2EE, il y a le choix entre acheter un coûteux portail propriétaire (IBM ou BEA pour ne citer que les leaders des serveurs d’application J2EE) ou recourir à un portail J2EE open source. Mais autant l’offre open source en matière de serveurs d’application J2EE (JBoss, Jonas) atteint une certaine maturité qui la rend crédible pour des projets de grande envergure, autant l’offre open source en matière de portails J2EE semble largement immature. Ceci semble fermer à l’open source le marché des portails et de la gestion de contenu des grandes entreprises pour encore de nombreuses années.

Aux yeux de la communauté J2EE, des cabinets de conseil du secteur et des gros éditeurs, le meilleur produit du marché sera nécessairement celui qui supportera au moins les deux standards du moment : JSR 168 pour garantir la portabilité des portlets d’un produit à l’autre, et WSRP pour garantir l’interopérabilité des portlets distantes entre leur serveur d’application et le portail qui les agrège et les publie. Il y a donc dans cette gamme de produit une course à celui qui sera le plus dans la mode de la « SOA » (Service-Oriented Architecture). Comme portails J2EE open source, on cite fréquemment Liferay et Exo. Cette offre open source n’est pas étrangère à la fanfaronnade SOA (il faut bien marketer les produits, eh oui…). Du coup, l’effort de développement des portails J2EE open source semble davantage porter sur l’escalade de la pile SOA que sur l’implémentation de fonctionnalités utiles. C’est sûrement ce qui amène la communauté J2EE à constater que les portails J2EE open source manquent encore beaucoup de maturité et de richesse fonctionnelle surtout lorsqu’on les compare à Plone, leader du portail / CMS open source. En effet, Plone s’appuie sur un serveur d’application Python (Zope) et non Java (a fortiori non J2EE) ; il se situe donc hors de la course à JSR168 et semble royalement ignorer le bluff WSRP.

Nombreuses sont les entreprises qui s’évertuent à faire de J2EE une doctrine interne en matière d’architecture applicative. Confrontées au choix d’un portail, elles éliminent donc rapidement l’offre open source J2EE (pas assez mûre). Et, plutôt que de choisir un portail non J2EE reconnu comme plus mûr, plus riches en fonctionnalités et moins coûteux, elles préfèrent se cantonner à leur idéologie J2EE sous prétexte qu’il n’y a point de salut hors J2EE/.Net. Pas assez buzzword compliant, mon fils… Pfff, ne suivez pas mon regard… :-(

Innover : qui ? comment ?

L’innovation, tout le monde en parle. Ca tombe bien, ça m’intéresse. L’une des personnes qui en parle le mieux sur le web, c’est selon moi Dave Pollard. Lui-même dit que c’est Clay Christensen. Ce dernier fait le distinguo habituel entre deux types d’innovation :

  • les innovations incrémentales qui consistent à améliorer peu à peu une offre auprès d’un marché donné et bien connu, ce qui avantage les grandes entreprises (car, par définition, bien implantées sur leur marché)
  • les innovations radicales qui consistent à créer des offres radicalement nouvelles et donc à étendre un marché au-delà de ses limites habituelles, pour atteindre de nouveaux clients (et rendre peu à peu obsolète les offres anciennes en grignotant également l’ancien marché).

Les entreprises privées de taille moyenne ont les meilleurs atouts pour innover

Clay Christensen affirme que les entreprises côtées en bourse sont largement handicapées pour innover car leur objectif est d’accroître leurs profitabilité (et donc potentiellement les dividendes aux actionnaires et donc la valeur en bourse) plutôt que d’accroître leur chiffre d’affaires. Elles ont donc tendance à privilégier l’exploitation maximale d’un marché donné plutôt qu’à prendre des risques pour s’aventurer dans des marchés à défricher et donc peu profitables avant un certain temps.

Pour répondre aux innovations de leurs concurrents, leur seul espoir consisterait à copier les innovations radicales de ceux-ci en créant de nouvelles business units. Il leur faudrait ensuite à cloisonner ces dernières de manière à ne pas souffrir de l’inertie propre à la grande entreprise. Selon lui, privilégier un financement essentiellement privé offrirait donc de plus grandes chances de succès à l’entreprise qui souhaite devenir durablement innovante.

A l’opposé sur le spectre de la taille des entreprises, les très petites entreprises ont moins de chances de succès lorsqu’il s’agit d’innover car leurs capacités d’investissement sont habituellement limitées. Elles risquent donc de s’essouffler à vouloir conquérir de nouveaux marchés avec de nouvelles offres qui, si elles se révèlent effectivement intéressantes, pourront être copiées par des entreprises ayant de plus grosses capacités d’investissement et étant donc susceptibles de les doubler pour remporter la mise (« premier arrivé, premier servi ! »). Les très petites entreprises auraient donc intérêt à ne pas avoir les yeux plus gros que le ventre en matière d’innovation.

Pour innover davantage, il faut interroger ses prospects ou certains de ses clients

Dave Pollard défend l’idée que c’est en dialoguant avec certains de ses clients que l’on arrive à identifier leurs besoins non satisfaits et donc à inventer de nouvelles solutions et de nouvelles offres pour les satisfaire. La clef de l’innovation ne résiderait pas dans les technologies et les centres de R&D mais dans le dialogue avec le client. L’innovation serait guidée par le besoin non satisfait (à ne pas confondre avec la demande) et non par l’offre. Pollard précise joliment :

La nécessité est mère de l’invention.

Exit les bricoleurs de génie sauf lorsqu’ils inventent un bricolage qui répond à leur propre besoin (« an itch to scratch », ça vous rappelle quelque chose ?). Selon Pollard,

les innovations qui viennent de la R&D ont tendance à être des solutions en quête de problèmes et celles qui viennent du marketing ont tendance à être des solutions pour lesquelles on essaie de créer artificiellement un besoin grâce à la publicité.

Christensen affirme qu’à force d’écouter ses clients habituels, on en vient à privilégier les solutions existantes et non innovantes car, par définition, si ce sont vos clients habituels, c’est qu’ils sont déjà satisfaits par ce que vous leur offrez : pas de motivation à innover. Christensen affirme donc que c’est avec ceux qui n’achètent pas chez vous qu’il faut dialoguer pour imaginer ce que vous pourriez inventer pour qu’ils deviennent vos clients. Ce à quoi Pollard répond qu’il est préférable d’identifier parmi ses clients habituels, ceux qui sont prêts à faire un effort d’imagination, pour établir un dialogue avec eux (plus facile à faire qu’avec ses simples prospects) et imaginer comment leur vendre davantage.

Savoir raconter la bonne idée

Admettons que j’ai mon client imaginatif ou mon prospect consentant à faire preuve d’imagination. Je l’ai interrogé pour débusquer ses besoins non satisfaits. J’ai réussi à mettre en correspondance l’un de ces besoins avec quelque chose que je sais faire (une technologie, …) et que je pourrais transposer au contexte de mon client. Cette mise en relation besoin non satisfait – technique connue, c’est mon idée innovante. OK. Maintenant, qu’est-ce que je fais avec cette bonne idée ? Toujours selon Pollard, il convient de s’assurer que l’on sait bien raconter cette bonne idée. (Ce n’est que l’une des étapes clefs d’un modèle général des processus d’innovation, commenté par Pollard).

En effet, pour pouvoir mettre son idée en oeuvre et la vendre, il va falloir que je la transplante dans le cerveau de mes collaborateurs, partenaires, fournisseurs et clients. La meilleure manière de s’y prendre consisterait à la raconter sous la forme d’une histoire. C’est le fait de raconter une histoire qui permet le mieux de mettre cette idée dans un contexte pratique et concret, qui permet par exemple au client d’imaginer ma nouvelle offre dans sa vie, son travail au quotidien. Le récit serait le moyen le plus efficace de propager cette idée pour « éduquer » le client (je trouve cette expression méprisante pour le client d’ailleurs). Et

distiller les récits pour en faire des leçons détruit l’essence-même de leur valeur en détruisant la capacité de l’apprenant à internaliser, à digérer et à apprendre l’expérience contextualisée de l’enseignant.

Dave Pollard a publié d’autres articles sur l’innovation. Dès que les ai lu, je vous les commenterai dans ce carnet. A suivre…