On le savait, Microsoft tend de plus en plus vers l'open source. Après avoir ouvert un site dédié ou encore après avoir rendu public les sources du Framework .Net, une nouvelle page était en préparation depuis quelques temps, dans le but de promouvoir le développement et le déploiement d'applications open source et de présenter ses acteurs chez Microsoft.

Forge New Powers

Depuis hier soir, il est enfin disponible en ligne et on y trouve :

  • des présentations et interviews de développeurs,
  • des outils de mise en route (le site codeplex que j'utilise, Visual Studio Express, ...),
  • des communautés open source (Port 25, ...),
  • le Hero Hack Pack, contenant les versions d'évaluations de Windows Server 2008 et de Visual Studio 2008.

Je trouve l'initiative bienvenue car il m'arrive de partager mes sources, et ce sont des projets tels que BlogEngine.Net qui m'ont motivé dans ce sens. Mais le fait de lire des titres tels que Be a hero (rien que ça !) ou Open Source Heroes in Action me choque un peu, un brin d'humilité ne fait de mal à personne ^^.

programmablewebJ'ai récemment découvert Programmable Web, un site qui recense les principales APIs disponibles sur le web(644  actuellement) ainsi qu'une très grande quantité de mashups les utilisant (2755). Indispensable !

Je trouve que c'est plutôt une bonne idée que d'indexer les APIs au même endroit, d'autant plus qu'on peut facilement trouver ce qu'on cherche puisqu'ils sont classés par catégories (mapping, blogging, photos, vidéos, recherche, ...) mais également par popularité ou encore par date de mise à jour.
Comble du développeur, chaque API est décrite dans une page dans laquelle on retrouve :

  • les informations globales (catégorie, date de mise à jour, description, ...),
  • les protocoles et format de données utilisés,
  • les mashups composés par l'API,
  • des tutoriaux (ou How-To).

Détails d'une API

Pour compléter encore un peu plus le contenu, un scorecard est disponible, il s'agit un tableau qui agrège le nombre de mashups utilisés par catégorie pour chaque fournisseur (Google, Microsoft, Amazon, eBay, ...), ainsi qu'une page listant tous les concours ouverts, dont les prix sont plutôt intéressants. Avis aux amateurs !

Hu ? J'explique... Il faut tout d'abord savoir que le site ASP.NET héberge les téléchargements et les tutoriaux qui ont attrait à la technologie Microsoft du même nom, ainsi que sa communauté de développeurs. Les blogs mis à disposition sur la plateforme étaient jusqu'à présent réservés aux Microsoftees ainsi qu'aux MVP (Microsoft Most Valuable Professional).

Il y 2 semaines, Joe Stagner annonce sur son blog qu'il est possible d'en créer un sous simple acceptation du copyright . Toujours désireux de participer activement à la communauté, j'ai décidé de faire la demande pour y écrire mes articles techniques. De plus, les publications peuvent être diffusés dans la liste générale des articles du site.

Pour les intéressés, voici les quelques liens indispensables :

Le service, gratuit, présente tout de même quelques contraintes : présence de pub entre chaque article (on a rien sans rien...) et tout n'est pas personnalisable (notamment au niveau des styles et des liens), mais bon c'est déjà pas mal !

Mon article technique précédent est donc à présent disponible sur mon blog ASP.NET, ainsi que dans le flux des articles techniques du site, la preuve en images...

http://weblogs.asp.net

La problématique est simple : j'ai besoin de récupérer le nom complet d'un utilisateur qui se connecte grâce à l'authentification Windows (Active Directory) sur l'intranet que je suis en train de développer pour un client en ASP.Net et C#.

Dans un premier temps, je veux simplement récupérer le nom de connexion de l'utilisateur (de type DOMAIN\User) que je vais ensuite réutiliser dans une variable appelée principal.

this.Context.User.Identity.Name

Avant de pouvoir rechercher les informations, il faut définir le nom de domaine, le filtre de recherche dans l'AD contenant le nom de connexion, et les propriétés à récupérer.

string filter = string.Format("(&(ObjectClass={0})(sAMAccountName={1}))",
                              "person", principal.Split('\\')[1]);
string domain = "DOMAIN";
string[] properties = new string[] { "fullname" };

Concernant le filtre, on cherche une personne (person) pour laquelle on ne garde en argument que le nom de connexion sans le domaine (dans une variable domain à part), d'où l'utilisation de la méthode Split(). Quant aux propriétés, seul le nom complet fullname nous intéresse.

Il ne reste plus qu'à définir les objets suivants, en leur passant les paramètres nécessaires (dont les variables définies ci-dessus) :

DirectoryEntry adRoot = new DirectoryEntry("LDAP://" + domain, null, null,
                                            AuthenticationTypes.Secure);
DirectorySearcher searcher = new DirectorySearcher(adRoot);
searcher.SearchScope = SearchScope.Subtree;
searcher.ReferralChasing = ReferralChasingOption.All;
searcher.PropertiesToLoad.AddRange(properties);
searcher.Filter = filter;

SearchResult result = searcher.FindOne();
DirectoryEntry directoryEntry = result.GetDirectoryEntry();

Après avoir récupéré l'objet correspondant à la recherche, il ne reste plus qu'à en extraire les propriétés demandées.

string fullName = directoryEntry.Properties["displayName"][0].ToString();
string firstName = directoryEntry.Properties["givenName"][0].ToString();
string lastName = directoryEntry.Properties["sn"][0].ToString();
string email = directoryEntry.Properties["mail"][0].ToString();

 

Après Windows Live Writer et dans ma lancée de développement d'extensions, j'ai décidé de créer un contrôle pour BlogEngine.NET qui me permet d'afficher mes updates Twitter sur mon blog. Pour cela, la documentation m'a été très utile !

Très simplement, le contrôle est appelé dans la page de cette manière :

<blog:Twitter runat="server" ID="Twitter" Username="julesss"
   Password="mypassword" NumberOfStatuses="5" />

où :

  • Username (obligatoire) : nom d'utilisateur du compte Twitter,
  • Password (obligatoire) : mot de passe du compte Twitter,
  • Timeline (optionnel) : type d'updates à afficher parmi User, Friends or Public,
  • NumberOfStatuses (optionnel) : nombre d'updates à afficher.

Comme précédemment, j'ai créé un projet CodePlex qui héberge les sources et qui décrit où placer le code dans le projet BlogEngine.NET, pour les commentaires c'est ici ou là-bas !

    

Comme vous le savez, j'utilise Windows Live Writer pour publier des articles sur mon blog car je trouve cet outil excellent. Seulement voilà, quand j'ai besoin d'appliquer un style CSS à un mot, une phrase ou un paragraphe, il faut que je bascule en affichage Code HTML (pas si clair que ça) et que je l'édite à la main. Pour combler ce grand vide, j'ai développé un petit plug-in qui me va bien et qui me permet d'ajouter un style au texte sélectionné.

Bouton Insérer un style CSS
bouton d'insertion

Insérer un style CSS     Insérer un style CSS
interface du plug-in qui permet de choisir la balise et le nom du style à ajouter

J'en suis ensuite arrivé à me dire qu'il était dommage de ne pas partager cet outil, je ne dois pas être le seul dans ce cas mais chaque utilisateur a probablement d'autres besoins : utiliser la balise environnante plutôt que d'en créer une nouvelle, appliquer un nouveau style plutôt que d'en utiliser un existant, ...

CodePlexC'est la raison pour laquelle j'ai décidé de créer un projet sur le site CodePlex, communauté open source de Microsoft, de façon à partager le plug-in (exécutable et sources) et surtout d'avoir un feedback sur ce dernier pour l'améliorer sur les points cités ci-dessus.

N'hésitez pas à me laisser vos commentaires, idées ou autre expérience. Pour télécharger les sources ou visiter le projet sur CodePlex, c'est par ici, sinon c'est juste en-dessous.

    

Pour les besoins d'une application web chez un client, je dois utiliser le moteur de recherche de texte intégral sur certaines tables de la base de données, méthode plus rapide que les requêtes TRANSACT-SQL.
Mon environnement de développement est Windows Vista et SQL Server 2005 SP1.

Pour mettre en place la solution, il faut commencer par définir un index sur la (les) table(s) dont on a besoin, pour ce faire dans SQL Server Management Studio (console de gestion de SQL Server 2005), il faut cliquer droit sur une table puis Index de texte intégral > Définir l'index sur le texte intégral... puis suivre l'assistant (choix de la clé primaire, des champs à indexer, ...) mais là, les ennuis commencent.

sqlserver_error
pas de création d'index de texte intégral si le service de recherche n'est pas démarré

Une première erreur survient, après quelques recherches et grâce aux outils de configuration de SQL Server 2005, je m'aperçois que le service MSFTESQL de recherche de texte intégral (SQL Server FullText Search (MSSQLSERVER) dans la console de services) n'est pas démarré, mais ce n'est pas pour autant qu'il en est capable.

service_error
le service de recherche de texte intégral dépend d'un autre service

Deuxième problème rencontré, et pour comprendre ce qui se passe, je suis obligé de fouiller dans le journal Système de Windows qui me dit plus clairement que :

Le service SQL Server FullText Search (MSSQLSERVER) dépend du service suivant : NTLMSSP. Ce dernier n’est peut-être pas installé.

Bonne nouvelle ! Et comment résoudre le problème au final ? En installant tout simplement le Service Pack 2 de SQL Server 2005.

Pour la suite il me reste à reprendre la configuration commencée ci-dessus et appliquer mes requêtes, dont voici rapidement quelques exemples.

Recherche de texte dans une colonne

SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Mountain" OR "Road" ')

Recherche de texte dans tous les champs

SELECT *
FROM Production.Product
WHERE CONTAINS(*, 'Mountain')

Recherche de texte avec le début d'un mot

SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Chain*" ');

Recherche de texte dérivé (féminin, pluriel, ...)

SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, ' FORMSOF (INFLECTIONAL, ride) ');

Pour aller plus loin, la documentation détaillée chez Microsoft c'est par ici.

Google a récemment sorti sa dernière API qui permet de construire des graphiques à la volée. C'est très simple car il suffit de passer les différents paramètres dans l'url pour obtenir le camembert ci-dessous par exemple.


répartition des visites pour le site net4wam.com

http://chart.apis.google.com/chart?
chs=410x125
&chd=t:13,28,59
&cht=p3
&chl=Acc%C3%A8s%20direct|Sites%20r%C3%A9ferents|Moteur%20de%20recherche
&chco=f00000

Les graphiques proposés sont très complets tant par les types et les options disponibles, de plus la documentation est très bien fournie (raison pour laquelle je ne détaille pas l'url).
Du coup, je me suis intéressé à concevoir un contrôle C# pour l'utiliser dans mes projets web mais celui-ci existe déjà :

Encore une très bonne idée née chez Google qui évitera de mettre en oeuvre des solutions de reporting complexes tels que Reporting Services ou Dundas pour publier des graphiques simples.

En général, il est particulièrement appréciable de déclarer des variables globales dans un projet, comme par exemple une chaîne de connexion à une base de données ou encore une variable d'application, de façon à ne les modifier qu'une seule fois en cas de besoin.
Le Framework .Net possède l'objet ConfigurationManager qui permet d'accéder aux fichiers de configuration web.config pour les applications web et app.config pour les applications Windows, tant en lecture qu'en écriture.

Les variables d'application

Ce sont les variables contenues dans la balise appSettings des fichiers de configuration, elles sont déclarées avec une clé key et une valeur value (hum, logique...) :

<appSettings>
    <add key="name" value="julesss" />
</appSettings>

Lecture d'une variable d'application

Rien de plus évident que de récupérer une valeur, l'objet ConfigurationManager possède une collection AppSettings qui contient l'ensemble de ces variables, reste à définir l'index ou le nom de la clé à récupérer.

string sName = ConfigurationManager.AppSettings["name"];

De la même sorte, on peut récupérer les chaînes de connexion du fichier de configuration en utilisant la collection ConnectionStrings.

Écriture d'une variable d'application

Il est intéressant de pouvoir créer ou mettre à jour dynamiquement des variables dans le fichier de configuration, par exemple pour stocker une valeur définie lors du déploiement ou l'installation de l'application. C'est possible en 4 lignes :

Configuration config = WebConfigurationManager.OpenWebConfiguration("~") as
Configuration;
AppSettingsSection appSection = config.GetSection("appSettings") as
AppSettingsSection;
appSection.Settings["name"].Value = txtName.Text;
config.Save();

Bien que ces fichiers de configuration ne soient plus ni moins des fichiers xml, il est également aisé de les modifier, mais le ConfigurationManager permet d'accéder beaucoup plus facilement à n'importe quelle section.

Sources

     Télécharger les sources

Lorsqu'on crée un nouveau contrôle web personnalisé, qui hérite de la classe WebControl (System.Web.UI.WebControls), il peut être intégré dans la boîte à outils de Visual Studio de façon à être utilisé comme les contrôles existants, avec un icône personnalisé et sans avoir à être créé par le code.

LogoControl_ToolBox LogoControl_Render

Afin d'exposer ces possibilités, j'ai créé un contrôle qui affiche une image et son texte alternatif (wouhou !) selon le diagramme de classes ci-dessous.

LogoControl_Diagram

Lire la suite...

J'AI DIT

COMMENTAIRES RECENTS