Le Blog...

Aujourd’hui, quelques réflexions disparates sur le blog lui-même.

1. De la raison d’être d’un Blog

Il n’a de sens (de mon point de vue) qu’en tant que moyen de communication (et non de promotion… n’est-ce pas Jean ?). On ne dit pas tout le temps la même chose à tout le monde. Je pars du principe qu’il y a donc nécessairement dans ces logorrhées des parties que l’on souhaite ne partager qu’avec un sous ensemble de son public habituel.
 
J’ai dans l’idée de répondre à ces enjeux de cibles et de contenu en jouant à deux niveaux différents qui me semblent complémentaires (et tous deux nécessaires). Ces deux mécanismes s’appliquent à des granularités différentes : le Post dans son ensemble et au sein du texte lui-même.

2. Catégories, Canaux de diffusion & Sécurité(s)

Gérer la diffusion du Post lui-même se fait très simplement grâce aux catégories que l’on peut associer à tout Post d’une part et d’autre part par la configuration du site qui héberge le blog.
Exemple de configuration :

  • La page Cuke qui porte le blog lui-même (et où l’on peut ajouter un nouveau Post) n’est accessible qu’à l’auteur et éventuellement d’autres personnes avec lesquelles l’auteur n’a pas de secrets).
  • L’affichage du blog sur cette page est sans restriction : aucun filtre de catégories n’est actif.
  • Des modules d’affichage de Blog sont disposés sur n’importe quelle page du site et filtre les Post par leurs catégories : les ACLs filtrent les utilisateurs et les Catégories filtrent le contenu.
  • Note sur la sécurité
    • C’est le Blog qui est sécurisé : en terme d’ACL on considère que les Posts partagent, héritent, de l’ACL du Blog auquel ils appartiennent.
    • Cela suppose, par exemple, que les liens « lire la suite » (s’ils existent) affichés par le module d’affichage de Blog sont cryptées : un Post n’est pas protégé en soi, il ne l’est que parce qu’un utilisateur lambda ne peut y accéder. Attention, ce n’est pas une réelle protection, il ne s’agit que d’une faible « protection par l’obscurité » en cachant le canal et non l’objet.

D’un point de vue strict, les Posts ne sont réellement sécurisés que via l’ACL du Blog. L’utilisation de la catégorisation est un moyen de gérer la « diffusion multi-canaux », pas de sécuriser le contenu (si vous ne saisissez pas l’importance de cette distinction, demandez moi de vous l’expliquer, c’est crucial J).
Ce choix est un compromis. Rien n’empêche de permettre la définition d’un ACL spécifique au niveau de chaque Post si nécessaire, l’ACL du Blog container étant simplement la protection par défaut.

3. Les appartés

Au sein du texte lui-même, l’idée est de pouvoir facilement faire des apartés à destination d’une ou plusieurs personnes. Le but de ces îlots de contenu est d’apporter en situation, au plus près du contenu général, un éclairage différent en fonction du lecteur, par exemple :

  • Demander l’avis d’un collègue ou d’une communauté sur un point particulier.
  • Aller plus loin dans une explication : un développeur peut dans un aparté faire référence à une implémentation non publique… ou à un bug récent…
  • Faire une « Private joke ».
  • Poser une note pour soi même.

Ce filtrage peut-il reposer sur les catégories ? Non, je ne le pense pas, et ce pour deux raisons :

  • Ces apartés ciblent des lecteurs particuliers, dans des buts divers (cf. ci-dessus) certes, mais toujours à des destinataires explicites.
  • Sémantiquement, le contenu de ces bribes de texte est fondamentalement lié à leur environnement : ils n’apportent pas (ou ne devraient pas apporter) de nouvelles thématiques : ils décorent un contenu, ils se positionnent au niveau pragmatique plutôt que sémantique.

Comment offrir cette possibilité d’apartés à l’auteur ? En encadrant ces apartés par des balises explicites de protection. Ces balises définissent les cibles pouvant lire le contenu : il suffit d’énumérer simplement les noms (login) des utilisateurs (ou les noms des groupes d’utilisateurs) accrédités.
Proposition : [Cuke.Filter Allow="Guillaume, 12531, P.Cuke.G.Supervisors"]aparté[/Cuke.Filter]

4. Conséquences, impacts et effets de bord

Cette capacité introduit une nécessaire étape de parsing préalable à tout affichage mais des optimisations sont possibles en utilisant les attributs des textes html.
Le comportement à l’indexation est simple: aucun aparté ne doit être indexé avec le contenu. Si indexation il doit y avoir, celle-ci doit intégrer totalement la sécurité (les apartés doivent être indexés en tant que documents distincts qui référencent leur texte d’origine).
 
La gestion de la diffusion par catégories est simple et ne pose pas de problèmes particuliers. En revanche, les apartés introduisent nettement plus d’effets de bord. Une option peut être intéressante mais certainement à développer… un jour.

Quand j’entends le mot culture, je sors mon revolver !

Est-ce vraiment Göring qui a dit ça ? Réponse ici : http://tatoufaux.com/spip.php?article398 (vu le nom du site, on devine la réponse). La culture en question en ce qui me concerne est celle de l’utilisateur et du contenu d’un site web. Cela n’a jamais été une problématique simple (et avec les moteurs de recherche, le droit à l’à peu près est oublié).En l’occurrence, il s’agit de sortir un algorithme correct qui prenne simultanément en compte :

  • L’éventuel cookie de l’utilisateur
    • S’il y en a un, il peut être « PubUser » ou non. Un « PubUser » doit être redirigé a minima (pour la cohérence de la navigation) là où pour un non « PubUser » (typiquement un administrateur ou un gestionnaire de contenu), on peut éviter de rediriger.
    • Sans cookie, la requête est considérée comme une requête de moteur.
  • La culture indiquée dans l’url, le cookie ou les informations du navigateur, croisée avec la culture par défaut du portail ou ses cultures actives sans oublier le statut de l’utilisateur qui peut, ou non, avoir le droit de voir toutes les cultures d’un site indépendamment de la restriction que peut apporter un portail.
  • Le nom de domaine qui peut être associé à un portail, avec pour certains utilisateurs (les « PubUser » et les requêtes sans cookie) une redirection systématique vers le nom de domaine du portail (ce qui entraîne la perte de l’éventuel cookie).
  • La présence ou non d’une publication semi-statique (qui dépend de la page exacte et de la culture), celle-ci pouvant n’être qu’une simple réécriture d’url (c’est la page dynamique qui est utilisée).
  • Le mode en cours pour le site (url en .cuke ou utilisation directe de Cuke.aspx).

L’idée générale étant de rediriger vers l’url exacte pour les moteurs (ou toute requête sans cookie), cette url ne devant contenir la culture que pour les cultures qui ne sont pas la culture par défaut.
Ce n’est pas terminé, il manque des tests unitaires et certains mécanismes, notamment en ce qui concerne le filtre sur les cultures actives, la gestion des 404 et la prise de compte des pages virtuelles (K-Item)…
Pas facile la culture...

NextResult() and so what ?

J’ai parfois du mal à me souvenir du fonctionnement précis de certaines API. Le comportement du IDataReader avec plusieurs résultats en fait partie. Un petit test unitaire s’impose :

[Test]
public void TestDataReaderBehavior()
{
       ExecuteReader( "select 1;",
              delegate( IDataReader r )
       {
             Assert.IsTrue( r.Read(), "We are directly BEFORE the first record." );
             Assert.AreEqual( 1, r.GetInt32( 0 ) );
             Assert.IsFalse( r.Read() );
             Assert.IsFalse( r.Read(), "One can always call Read." );
             Assert.IsFalse( r.NextResult() );
             Assert.IsFalse( r.NextResult(), "One can always call NextResult." );
             Assert.IsFalse( r.IsClosed, "A data reader must explicitely be closed (except if obtained with ExecuteReader( CommandBehavior.CloseConnection )." );
       } );
 
       ExecuteReader( "select 1; select 2;",
              delegate( IDataReader r )
       {
             Assert.IsTrue( r.Read() );
             Assert.AreEqual( 1, r.GetInt32( 0 ) );
             Assert.IsTrue( r.NextResult() );
             Assert.IsTrue( r.Read(), "Here also we are BEFORE the first record." );
             Assert.AreEqual( 2, r.GetInt32( 0 ) );
             Assert.IsFalse( r.Read() );
             Assert.IsFalse( r.NextResult() );
       } );
 
       ExecuteReader( "select 1 from sys.tables where 0=1; select 2;", 
              delegate( IDataReader r )
       {
             Assert.IsFalse( r.Read(), "First select has no results." );
             Assert.IsTrue( r.NextResult() );
             Assert.IsTrue( r.Read() );
             Assert.AreEqual( 2, r.GetInt32( 0 ) );
             Assert.IsFalse( r.Read() );
             Assert.IsFalse( r.NextResult() );
       } );
 
       ExecuteReader( "select 1;select 'Impossible' from sys.tables where 0=1;select 3",
              delegate( IDataReader r )
       {
             Assert.IsTrue( r.Read() );
             Assert.AreEqual( 1, r.GetInt32( 0 ) );
             Assert.IsTrue( r.NextResult(), "There is a 2nd result..." );
             Assert.IsFalse( r.Read(), "...but it is empty." );
             Assert.IsTrue( r.NextResult(), "There is a 3rd result..." );
             Assert.IsTrue( r.Read() );
             Assert.AreEqual( 3, r.GetInt32( 0 ) );
             Assert.IsFalse( r.Read() );
             Assert.IsFalse( r.NextResult() );
             Assert.IsFalse( r.IsClosed );
       } );
}

Cela vaut bien un long discours, non ?
En tous cas, cela vaut mieux que la documentation MSDN ci-dessous qui annonce faussement qu’après l’appel à NextResult, le lecteur est positionné sur le premier enregistrement. J’ai signalé l’erreur (après m’être créé un login .Net passport suite à des années de résistance).

Je vais pouvoir compter les jours avant la correction Smile.
 
Update jeudi 8 octobre 2009 : Il n’y a toujours pas eu de corrections mais une contribution supplémentaire de David Matson qui considère que l’interprétation de la remarque doit se comprendre au niveau de chaque result set et non au niveau des lignes.

Il a complètement raison ce monsieur !

Les arbres de connaissances

Je viens de passer quelques heures sur le net au sujet des Arbres de connaissances de Pierre Levy et Michel Authier. Après avoir lu le livre de ces derniers (Les arbres de connaissances, La Découverte/Poche, éd. 1999). Plein de bonnes idées à relever. La lecture du livre (allez, ce n’est pas un pavé, faites un effort) est à mon avis nécessaire, les informations sur le net ne couvrent pas l’intégralité de l’approche qui est plutôt riche.
Je ne vais pas retranscrire ni résumer ici le sujet mais me contenter de quelques remarques.
Les arbres de connaissances s’inscrivent dans une démarche humaniste, de partage, de respect des singularités de chacun. Cela se veut une alternative réaliste et actuelle à la vision classique de la définition et de la reconnaissance des compétences en privilégiant l’individu ET son parcours d’apprentissage.
 
Dès la création du concept (lors des travaux de la mission publique pour l'université de France confiée par Edith Cresson alors premier ministre à Michel Serres et à laquelle ont participé Michel Authier et Pierre Lévy), une entreprise est créée : Trivium (http://www.trivium.fr/). Cet entreprise « porte » le concept et l’outille grâce à un logiciel d’analyse et de représentation desdits arbres. Une association complète le dispositif : arbor & sens.
 
Rien à dire là-dessus (les Concepts, tout sympathique soient-ils, ont souvent bien besoin d’une structure d’entreprise pour pouvoir se développer) si ce n’est de vous recommander vivement la lecture du paragraphe Trivium et le rapport au pouvoir de « Eclaircissement sur quelques fondamentaux des Arbres de connaissances ». Ceux que les rapports complexes entre idée généreuse, pouvoir et investissements nécessaires intéressent y trouveront matière à réflexion.

Un brevet sur l'algorithme

Personnellement, un détail m’interpelle : l’algorithme de classification qui permet le calcul d’un arbre à partir des parcours d’apprentissage serait (voir plus bas) protégé par un brevet. Marrant non ?
 
Dans « Principes Théoriques des Arbres de Connaissances® » (on remarquera le ®) les fondamentaux sont effectivement décrits.
 
Faisons maintenant une hypothèse : imaginons un instant que je donne des cours dans une école d’informatique… En tant qu’informaticien passionné de ces aspects depuis des années, j’aurai déjà deux ou trois idées que j’aimerai tester au sujet de la modélisation des compétences et il me viendrait (pure hypothèse donc) l’opportunité de mettre en pratique ces idées.
Et là, brusquement, je me dis : « Tiens, je vais intégrer à l’intranet le calcul des arbres de connaissances... »
Je fais également l’hypothèse que je saurai exhiber un algorithme sur la base de l’article cité précédemment. Croyez moi, ce que je vais pondre a certaines chances de ressembler beaucoup à l’original. Il sera certainement moins efficace (mais les volumes dont j’ai besoin sont faibles), ne disposera pas de la finition de l’original (mais j’en expérimenterai les réglages au fur et à mesure et en fonction de mes besoins), ne sera pas industrialisé (mais sera complètement dédié à et intégré dans l’architecture qui m’intéresse).
 
Que se passera-t-il ? Je n’en sais rien.
Les idées ne sont pas brevetables. Un algorithme est une idée. Et ici, on n’est même pas sur un algorithme, vraiment sur une pure idée (structurer un espace mathématique). Alors, à quoi sert ce brevet ?

Existe-t-il ?

Je n’ai pas réussi ni à confirmer ni à infirmer l’existence de ce brevet. La seule allusion est dans un article critique de Josiane Teissier du Cereq de 1998, « Les Arbres de Connaissances : objet de controverse et expérimentations à suivre... ». Par ailleurs, rien à l’INPI ni à l’étranger semble-t-il.
Cependant, rien non plus sur l’algorithme lui-même.
Il semble en définitive que l’on se trouve là devant ce que les spécialistes en sécurité appellent la sécurité par l’obscurité… et son efficacité est reconnue comme faible sinon nulle.

Outlook et ses plugins…

Un ami a un problème de mail à supprimer automatiquement selon certains critères : les mails contiennent un identifiant et une révision, il ne faut garder pour un identifiant que la dernière révision. Le travail est à effectuer répertoire par répertoire au choix de l’utilisateur.  L’occasion pour moi de jeter un œil sur VSTO (Visual Studio Tool for Office) qui permet de développer (en .Net) des plugins pour Office.
Il y a quelques années, j’avais utilisé les Primary Interop Assemblies (PIAs). Cela fonctionnait bien que la programmation en C# soit assez désagréable (beaucoup de paramètres optionnels, d’où une utilisation intensive de System.Reflection.Missing.Value). VB.Net est certainement plus adapté.
 
En résumé, les modèles de projets de VS2008 (Add New Project > Visual C # > Office > 2003 ou 2007) utilisent les PIA et fournissent une couche supplémentaire autour des interfaces COM des applications Office. Apparemment, une attention toute particulière a été portée aux référencements circulaires des objets et autres joyeusetés qui ont toujours fait de ce type de développement un chemin de croix (les bons jours). Voir par exemple Outlook Shutdown and VSTO Add-ins.
En terme de développement, pas de souci majeur : sur ma machine, en ciblant Outlook 2007, le debugger lance Outlook, pas de processus oublié en mémoire. Rien à dire.
 
Mais, malheureusement, il faut cibler Outlook 2003. Alors qu’il semble trivial de déployer vers des Office 2007, faire un installeur pour la version précédente d’Office c’est tout un plaisir. D’abord, mauvaise surprise lorsque l’on rouvre le projet 2003 : il est automatiquement mis à jour en 2007 ! La solution est ici : Using VS 2008 to continue working on Office 2003 Add-ins. Ensuite, pour l’installation sur les postes clients, c’est beaucoup plus délicat. Voir Deploying Office 2003 Solutions with Windows Installer, et surtout, bonne chance.