Blog sur les technos .net
Puisque ces mystères me dépassent, feignons d'en être l'organisateur.

[Management .net] Du nouveau dans la gestion des traces de vos applications .net

By TheGrandBlack

.NET incorporait déja un mécanisme tres puissant afin de pouvoir tracer ( logger, faire des messages de log ) vos applications; Vous pouviez implémenter un log, en utilisant System.Diagnostics et cela via l'objet l'objet Trace, on pouvait écrire des logs; ces messages etaient ensuite relayer par des listeners et suivant ces listeners on pouvait écrire soit vers des fichiers textes, des fichiers XML, l'eventLog de Windows etc ...
On pouvait définir le niveau de trace, par exemple en développement définir un niveau tres haut de maniere à avoir toutes les traces et en production fixer un niveau tres bas afin de ne retenir que les erreurs de l'application.
L'appel a l'instruction permettant de logger etait conditionner par deux directives de compilation DEBUG & TRACE ce qui faisait qu'une partie des instructions de log etait supprimer lors de compilation en mode production.
Malheureusement ces classes du FrameWork 1.0 et 1.1 ne permettaient pas de catégoriser les messages sortant;
Dans mon architecture .net 1.0 & 1.0 j'avais du mettre en place une nouvelle classe appelée TraceManager dont le but etait de catégoriser les messages sortant :
- Information
- Warning.
- Error
- Debug.

J'avais aussi implémenter 3 Listeners :
- XML, EventLog ( plus complet ), SQL dans ces listeners on prenait en compte la possibilité de tracer un objet .net en utilisant la sérialisation et en tracant aussi les informations de la pile ( ligne, application etc ... )

Dans la future version de .net ( .net 2.0, Whidbey 2005 VS.NET ) les mécanismes de traces ont evolués. La catégorisation est maintenant pris en compte en utilisant une énumération TraceEventType, vous pouvez aussi invoquer directement la méthode adéquate mySource.TraceInformation ; le tracages des informations de l'application et de la pile aussi;
Je vous invite à découvrir à partir du blog BCLTeam's WebLog

Il existe des briques permettant de tracer les applications .net ( Log4Net, Logging Block de Microsoft, etc ...
 

Encore une Media-Box UPnP : la D-LINK DSM-320RD

By TheGrandBlack


Une evolution de la platine D-LINK afin de distribuer le multimédia dans la maison ( ou le bureau ) avec lecteur CD/DVD.

Cette platine relativement complète, comprend un lecteur de carte multi-formats : (SD, Memory Stick, MMC, et Compact Flash Type I/II (pour vos photos).

D'autre part, la DSM-320RD supporte le standard Windows Media Connect et les "droits" Windows Media DRM (!!!). Deux types de connexions sont disponibles : Ethernet et WiFi 802.11g !















Elu produt de l'année 2005/2006 par EISA
 

Nouveautés : Apple invente la souris à 2 boutons et à molette

By TheGrandBlack

Que dis-je 2 boutons, non 4 boutons; C'est à croire que Apple n'a pas fini d'inventer l'informatique.
Apres le choix du fondeur Intel pour ses nouveaux ordinateurs, voila que Apple copie la souris du PC; La souris est quasi identique à celle du PC mais avec un design Mac.
Découvrez la souris qui a réinventé la roue ( Roulette ) : La Mighty Mouse

Ce que l'histoire ( le site ) ne dit pas c'est que cette souris est réclamée depuis fort longtemps par les utilisateurs de Mac.

Apple a quand même tenu à déposer un brevet pour cette souris. Brevet qui concerne le déplacement de la souris ou plus exactement le déplacement tout azimuts.
 

Les news de la rentrée

By TheGrandBlack

- SQLI rachete ASTON; on aurait dit que cela va beaucoup mieux pour SQLI. Comme quoi dans ce monde il ne faut juré de rien.

- Plumtree se fait racheter par BEA : Apres 4 années dans le rouge on peut espérer que cela ira beaucoup mieux.
BEA tient à affirmer ( ou a rassurer ) que PlumeTree Portal est complémentaire à WebLogic Portal;
 

WebCollab qu'est-ce que c'est ?

By TheGrandBlack

A collaborative web-based system for projects and project management; WebCollab is easy to use, and encourages users to work together. The software is functionally elegant and secure without being cumbersome for users, or graphically intensive.
 

Google : Let's Talk

By TheGrandBlack

Google sort un client de messagerie instantanée "Talk" (Windows) basé sur Jabber et le protocole libre XMPP. C'est une excellente nouvelle pour les utilisateurs, et un nouvel élément d'inquiétude pour Microsoft et ses copains aux technos/standards fermés. Il suffit d'ouvrir ou de disposer d'un compte GMail pour bénéficier automatiquement du service, également accessible depuis d'autres clients jabber (gaim, psi, adium, etc.) moyennant un paramétrage spécifique.
 

Google va-t-il devoir censurer ses cartes satellites?

By TheGrandBlack

La dernière petite merveille technologique du moteur de recherche, Google Earth, permet de zoomer sur n'importe quel endroit dans le monde, à partir d'une image satellite. Cette fonctionnalité a beaucoup inquiété l'Organisation australienne pour les sciences et technologies nucléaires (Ansto): elle a découvert qu'il était possible d'obtenir une vue d'ensemble très précise du seul réacteur nucléaire du pays, basé à Lucas Heights (entre Sydney et Melbourne), via Google Earth.

La suite sur ZDNet
 

Vol de données bancaires de grande ampleur décelé sur la Toile

By TheGrandBlack

Des pirates ont récupéré une masse importante d'informations confidentielles de clients d'une cinquantaine de banques. Ils se sont probablement servis d'un programme espion de type "keylogger" qui enregistre les frappes sur les claviers de PC.

C'est un salarié de Sunbelt, Patrick Jordan, qui a découvert le pot aux roses pendant un contrôle de routine, alors qu'il infectait délibérément, à des fins de test, un PC avec une variante de CWS. «Il s'est rendu compte que la machine qu'il testait était devenue un zombie (*) qui appelait un serveur distant. Il est remonté jusqu'à ce serveur et a découvert une fraude ultra-sophistiquée», relate Eckelberry. C'est ce serveur qui héberge les fichiers logs contenant les données saisies par les internautes espionnés.

La suite sur ZDNet
 

Que direz-vous d'aller faire un tour sur la lune ?

By TheGrandBlack

Ajourdh'ui vendredi, que direz-vous d'aller faire un tour sur la lune ( ou simplement d'y rester pour certain ).
Ne vous inquiéter pas, les vieux débris que nous sommes n'allons pas prendre la navette, nous risquerons de perdre des morceaux.
Je vous propose autre chose partir avec la GoogleMania et oui encore eux.

Cliquez sur Google Moon et voila
 

[.NET] Comment convertir les caractères accentués en caractères non accentués ?

By TheGrandBlack
Auparavant lorsqu'on manipulait des chaines ANSI il suffisait de convertir cette chaine en majuscule puis en minuscule et là on se retrouvait avec une chaine sans accent.

Lorsqu'on travaille en Unicode c'est un peu différent, puisque les majuscules accentuées existent.
Comment peut on donc faire ?
Voila un exemple de code CSharp vous permettant de faire cela :


private static string ConvertAccentToNoAccent(string p_value)
{
byte[] v_bytes = Encoding.GetEncoding(1251).GetBytes(p_value);
return Encoding.ASCII.GetString(v_bytes);
}


La chaine suivante
éè&~\ààà=mmmmmmmkkkkkù!*?,<>
sera transformée en
ee&~\aaa=mmmmmmmkkkkku!*?,<>

Keyword C# .net System.Text Encoding Accent Charactere ANSI UNICODE ISO-8859-1 Latin-1 Western Europeen Replace
 

.NET et l'intéropérabilité PInvoke

By TheGrandBlack




L'intéropérabilité avec .net peut utiliser plusieurs canaux :

  • Web Services
  • COM
  • Enterprise Services
  • Plateform Invokation Services ( PInvoke )

C'est de ce dernier dont je souhaitait m'entretenir avec vous.
.net permet d'invoquer des fonctions placées dans des librairies windows (actuellement on peut parler de l'API win32 en .dll) en utilisant une classe d'attribut "DllImport".
Syntaxe :


[AttributeUsage(AttributeTargets.Method)]
public class DllImportAttribute: System.Attribute
{
public DllImportAttribute(string dllName) {...}
public CallingConvention CallingConvention;
public CharSet CharSet;
public string EntryPoint;
public bool ExactSpelling;
public bool PreserveSig;
public bool SetLastError;
public string Value { get {...} }
}

La classe d'attribut DllImportLes paramètres :
- CallingConvention
la convention d'appel (stdCall )
Attention : une convention d'appel définie 2 choses :
- L'ordre de passage des paramètres; de gauche à droite ou de droite à gauche.
- Qui va néttoyer la pile; l'appelant ou la méthode.
On parle alors des conventions suivantes : Pascal, cdecl, Register, stdCall, ...
Petite parenthèse à propos de la convention stdCall : Microsoft à indiqué lors de la sortie de l'API Win32 que cette convention devait être la convention par défaut de Windows, c'est pour cela que généralement vous allez rencontrer cette convention, mais rien ne le garantie donc vérifier dans la documentation ( comme disent les américains RFD = Read the Fucking Doc ) ou demander le prototype ou le fichier d'entête de la fonction.

- CharSet
Le jeu de caractères utilisé (Auto).
- EntryPoint
Nom du point d'entrée ( nom de la méthode)
- ExactSpelling
Corespondance des paramètres (false)
- PreserveSig
Signature préservée, sinon HRESULT et Out paramètre (True)
- SetLastError
Met à jour le flag SetLastError (false).

Exemple :

using System;
using System.Runtime.InteropServices;
namespace exDll
{
class Class1
{
[DllImport("user32.dll")]
static extern int MessageBoxA(int hWnd, string msg,string caption,int type);
static void Main(string[] args)
{
MessageBoxA(0,"Hello world","bonjour",0);
}
}
}
Bon pourquoi je vous parle de cela, alors que cette technique existe depuis le début du FrameWork;
tout simplement pour introduire un site qui est totalement dédié à cette partie dans .net;
je parle du site http://www.pinvoke.net/default.aspx
Ce site peut être tres utile si vous avez besoin de ce type d'intéropérabilité.
Il est crée sous forme de Wiki ( ou plus exactement c'est un FlexWiki, pour les connaisseurs), donc vous allez aussi pouvoir l'alimenter.
 

Comment transformer un flux XML en HTML en appliquant un XSLT ?

By TheGrandBlack


Vous souhaitez faire une transformation ( XML-->XML, XML-->TEXT, XML-->HTML ), alors ce petit bout de code peut vous intéresser.
Bien sur il vous prendre en compte le fait qu'en .net on peut faire cela de dix-milles façon donc ce bout de code n'est qu'un point de départ.


private string GetHtml(string p_xml, string p_xsl)
{
XmlTextReader v_xslTextReader = new XmlTextReader(new StringReader(p_xsl));
XslTransform v_xslTransform = new XslTransform();
v_xslTransform.Load(v_xslTextReader, null, null);

XmlDataDocument v_xmlDataDocument = new XmlDataDocument();
v_xmlDataDocument.LoadXml(p_xml);

StringWriter v_writer = new StringWriter();
XmlTextWriter v_xmlTextWriter = new XmlTextWriter(v_writer);
v_xslTransform.Transform(v_xmlDataDocument, null, v_xmlTextWriter, null);
return v_writer.ToString();
}


Keywords : XSLT DOM DomDocument
 

Vendre c'est bien, vendre/eduquer c'est encore mieux

By TheGrandBlack

Canon, célèbre pour son éventail d'objectifs de qualité, pour ses appareils argentique et aujourd'hui numérique ou il règne en maitre a fini par comprendre que vendre simplement ne suffit plus.
Aujourd'hui le marché est inondé d'APN ( Appareils Photo Numérique ), maintenant plus que jamais il faut montrer comment s'en servir.

Le canal choisi par Canon c'est le Web, un site tres bien fait ( dommage je n'ai encore trouvé la version francaise ). Avec ce site la photographie devient plus simple.

Site pour comprendre la photographie.

Un chemin à suivre pour tous les constructeurs.
 

[FireFox] Mon navigateur me réaprend l'HTML, vite indiquez moi la sortie de l'auberge !!!

By TheGrandBlack

Imaginons le code HTML/JavaScript suivant :


<html>
<head>
</head>
<body>
<div id="div1">
<div id="div2" onclick="alert(this.parentNode.childNodes[0].id)">clickme</div>
</div>
</body>
</html>
En cliquant sur le texte je devrait avoir une alerte avec le texte de "div2"; Cela fonctionne tres bien sous IE.
Essayons sous FireFox : j'obtiens une erreur me disant que c'est indéfinie????
Que s'est-il passé ? En cherchant un peut on s'apercoit que le code suivant : le même sans retour à la ligne fonctionne.


<html>
<head>
</head>
<body>
<div id="div1"><div id="div2" onclick="alert(this.parentNode.childNodes[0].id)">clickme</div></div>
</body>
</html>

Mais que fait FireFox ?
En réalité il parse l'espace ( ou le retour à la ligne ) comme étant le premier élément; donc le div2 devient le second élément.

Conclusion
Eh oui il y en a une ( juste pour éviter des tonnes de commentaires ).
Les FireFoxFan justifieront cela par le fait que c'est normal; ils trouveront même un article dans la W3C; c'est bien; pourquoi pas;
Mais moi; ce qui m'interesse c pas de prendre part à la petite guè-guerre entre IE-FireFox mais plutot d'avoir des navigateurs qui fonctionnent correctement.
 

La montée en charge préoccupe les principaux sites Web français

By TheGrandBlack

Une étude du cabinet Benchmark Group analyse les grands choix matériels, logiciels et de pilotage technique des grands sites Web en France, ainsi que leurs orientations budgétaires. (13/07/2005).

Pour ceux qui sont pressés 2 chapitres :

Les responsables des infrastructures Web veulent toutefois garder la maîtrise des choix et des développements : ainsi "les applicatifs Web d'e-commerce ou de publication sont, dans plus des deux tiers des cas, réalisés spécifiquement, tandis que les plates-formes serveurs font, à l'exception des systèmes de gestion des bases de données, la part belle aux solutions Open Source" indique Benchmark Group.

La plate-forme LAMP utilisée dans 14% des cas seulement


 

Utilisez le chemin le plus court pour créer vos WebParts SharePoint : Le RAD

By TheGrandBlack

Jusqu'a maintenant on ne pouvait créer une webPart SharePoint qu'en utilisant du code ( custom controls ). La communauté SharePoint a fait bouger les choses en vous permettant de creer des WebParts en utilisant des UserControls.
Appeler SmartPart cette brique de developpement vous permet en quelques clics et des glissements de souris d'avoir un design pour vos WebParts.
Ce document vous explique les SmartParts
A lire aussi The Mit's Blogs ( in French ), qui souligne le rapprochement qu'on peut avec les WebParts en ASP.NET 2.0;

Ayant connu cette technologie sous VS.NET 2005, je mettais posé la question pourquoi cela n'existait pas sous SharePoint. Je vous en parle car d'ici la semaine prochaine j'aurais à valider cette implémentation dans un projet, ce sera aussi pour l'occasion de pratiquer les SmartParts; Je l'ai installé sur mon poste depuis sa sortie, mais faute de temps je n'ai pu le tester.


Télécharger la librairie SmartPart
 

[DSL Designer ] Où se termine la modélisation et où commence l'implémentation ?

By TheGrandBlack


Microsost publie une nouvelle version de son outil "DSL Designer". cet outil vous permet la mise en place de votre propre modélisation intégré à Visual Studio et la génération de code en fonction de cette modélisation.

Vous allez pouvoir gouter ( si ce n'est déja fait ) à ce qu'on appelle des modèles spécfiques à un domaine (Domain Specific Langage ).

Guillaume nous en parle sur son blog.

ou si vous préférer des images qui bougent une présentation video de DSL Designer
 

Google recrute encore chez Microsoft : plaintes à la clef

By TheGrandBlack

Microsoft et Google ne vont certainement pas devenir les plus grands associés du monde. Le vieux géant du logiciel commence en effet à voir d'un mauvais oeil l'expansion du néo-géant du web. Entre ces géants aux pouvoirs grandissant, seul un rachat pourrait les rapprocher. Cependant ces derniers temps, Google agace de plus en plus Microsoft, pour la simple et bonne raison que le leader des moteurs de recherche recrute de plus en plus parmi les employés du créateur de Windows, et pas n'importe quels employés qui plus est...

Suite de l'article ...
 

Glossaire informatique : Pourquoi ne pas se situer sur la même longeur d'onde.

By TheGrandBlack

L'informatique devient quelques fois un vrai verbiage, et j'ajouterais même que certains adorent jouer de ce verbiage.

PMA* : Pour que les choses avancent, il faut se comprendre, et avançer dans la même direction.

Je vous propose donc ce glossaire informatique


*PMA : Petit mot de l'auteur.
 

Quel design HTML/XHTML/FLASH vais-je mettre en place pour mon site ?

By TheGrandBlack

Vous souhaiter mettre en place un site, et dans un premier temps vous concentrez sur la technique ( voir la mécanique ).
Ou alors vous souhaiter tester la notion de theme dans ASP.NET 2.0 ( Whidbey , 2005 )
Pourquoi ne pas opter un FreeTemplate pour ensuite en attendant de migrer vers le template final.

Je vous propose deux site :
- WebDesignHelper : On a le choix.
- Open Source Web Design : ( tres bien pour les templates XHTML )
 

Brevet Logiciels !!!!!!!!??????

By TheGrandBlack


Maintenant que cela s'est calmé autour du brevet logiciel, je vais en profiter pour soulever une interrogation.

Dans un pays comme la France ou l'on protège tout :
- Le Terroir
- le mot "Champagne".
- On veut tout labéllisé, ( au cas ou le consommateur, n'aurait plus la notion de goût ou peut-être quelque fois c'est l'étiquette qu'on vend avant tout ).
- Interdiction de photographier les monuments ( bon d'accord, c'est juste tolérer, mais en cas de conflit, c'est pour ta pomme )
- Interdiction d'avoir une camera, ou appareils photos dans les spectacles.
- Protéger un maximum la vie des célébrités ( peut-être pour mieux nous bassiner avec celle des hommes politiques ).
- Un pays ou j'ai l'impression en les ecoutant que tout le monde possède une science infinie sur tout.
- il y a les droits d'auteurs, la redevance télé, Etc ...

Avec tout cela j'ai beaucoup mal à comprendre, que pour le brevet logiciel cela soit passer comme cela.
Je ne parle pas du fait que cela soit refuser ou accepter.

Mais j'ai plutot eu l'impression d'entendre des gens qui ne maitrisaient pas du tout le sujet, pour eux on aurait dit le bouton rouge qui déclenchait la bombe, et la réponse etait il est urgent de ne rien faire.
Cela veut-il dire que si on devait voter pour les droits d'auteur, ce serait non à l'unanimité ????????????.

Une histoire qui n'a pas été très clair; on vit une époque où l'on ne vote pas une loi parce qu' elle est juste, mais simplement pour 2 raisons :
- Il faut que cela nous rapporte.
- Il ne faut pas qu'on perde nos acquis.
Mais le pire c'est qu'on essaye de persuader l'opinion publique ( ou générale ) que c'est une question de justice - Encore faut-il savoir l'expliquer.

 

Gizmo ?= Skype + SIP

By TheGrandBlack



Gizmo un petit dernier qui risque de faire parler de lui, lancer par Michael Robertson, le créateur de MP3.Com et de Linspire, vient secouer la branche ou était perché Skype, et il risque de lui faire du mal.

Basé sur une API Opensource donc nimporte qui peu proposé une implémentation, et qui plus est il utilise un standard qu'est SIP, donc une grande intéropérabilité.
Il est disponible sous windows et MacOs X gizmo
 

Vous avez dit OpenSource et C# ?

By TheGrandBlack

Si on jetait un coup d'oeil sur la liste des projets OpenSource en C# ( bon vu le nombre, on va se limiter à sourceForge.net ).
Liste des projets C# sur SourceForge.net

Quelques morceaux de choix ( je me suis arrêter à la page 10, il y en avait bcp trop, je vous invite donc à aller faire un tour ).
  • 6. Netron - Generic diagramming, graph-drawing and graph-layout kit for the Microsoft .Net framework
  • 8. SharpDevelop - SharpDevelop is an open source IDE for the .NET platform. It is entirely written in C#, and supports various project types in multiple programming languages
  • 17. NASA World Wind - NASA World Wind is a graphically rich 3D virtual globe for use on desktop computers running Windows. It combines NASA imagery generated from satellites that have produced the Blue Marble, Landsat 7, SRTM, MODIS and more.
  • 21. Ajax.NET Library - The Ajax.NET Library is an implementation of AJAX (Asynchronous JavaScript and XML) for the Microsoft .NET Framework. AJAX is used by Google Maps, Google Mail, Flickr,... This library will export methods to use it directly on the client-side JavaScript
  • 25. NxBRE - NxBRE is a lightweight Business Rule Engine (aka Rule Based Engine) for the .NET platform, composed of a forward-chaining inference engine and an XML-driven flow control engine. It supports RuleML 0.86 Naf Datalog and Visio 2003 modeling.
  • 26. RSS Bandit - A desktop news aggregator written in C#.
  • 46. QueryCommander - Sql editor, simular to the Microsoft Query Analyzer, in a Visual Studio type of enviroment. QueryCommander includes features like IntelliSense, automatic comment header, xml-documentation, xml2data etc. 100% of all donations go to Plan International
  • 57. NHibernate - A .NET port of the excellent Java Hibernate (http://www.hibernate.org/) relational persistence tool.
  • 60. dotLucene a search engine library - dotLucene is the .NET implementation of the Lucene full-text search engine library
  • 66. Simple Rule Engine - SRE (Simple Rule Engine) is a lightweight forward chaining inference rule engine for .NET. Its 'simple' because of the simplicity in writing and understanding the rules written in XML, but this 'simple' engine can solve complex problems.
  • 141. NDoc - NDoc is an extensible code documentation generation tool for .NET developers.
  • 158. GPSProxy - GPSProxy is a .NET Compact Framework application that copies GPS data from one COM port on a Pocket PC to another, optionally translating the GPS data format from NMEA 0183 to the Garmin GPS protocol.
  • 185. XUL# - XUL# is a c# library for writing web and stand-alone application with Mozilla XUL user interface. The same application can be hosted into ASP.NET or Windows.Form (or Mono) Language: C#, XUL, HTML
  • 204. MCMS CustomPropertyDbEx - An alternate solution to MCMS Custom Properties: CustomPropertyDbEx moves all custom properties to a seperate database permitting custom properties for all CMS assets: channels, postings, template galleries, templates, resource galleries, resources, etc.
  • 212. FlexWiki - FlexWiki is a collaborative web-based authoring environment implemented on the Microsoft .NET platform.

PMA : (Petit mot de l'auteur ) Parmi tous ces projets, j'en ai utilisé ou tester un certain nombre celui qui m'avait bcp marqué est le moteur de règle NxBre, je devais etudier les moteurs de règle sous .net à l'époque j'avais sélectionné :
- Yasu
- NxBre
- BlazeAdvizor de Fair Isaac
- IRule
( Je n'avais retenu que ces quatres, car le temps imparti pour rendre mon rapport etait de 3 jours en prenant en compte la demi journee de formation que j'ai eu avec quelqu'un de Fair Isaac. )

Par rapport à mes besoins mon choix se portait bcp plus sur IRule et BlazeAdvizor, mais j'ai pu parcourir le source de NxBre, tout comme Yasu je dois dire que le code est d'un bon niveau.

 

Un DAAB ( Data Access Application Block ) générique pour ADO.NET 2.0

By TheGrandBlack


On a connu plusieurs version du DAAB de l'équipe Architect de Microsoft. Cette librairie est une des plus utilisée dans le développement .net, lorsqu'il s'agit de mettre en place une application à architecture N'Tier cohérente en .net.
Dans cette article je vous propose une version générique ( generic ) prenant en compte les nouvelles spécificités de ADO.NET 2.0.

Les fichiers de configurations de .net 2.0 maintenant lors de la définition d'une chaine de connexion mettent en relation la chaine permettant de se connecter à la base et le provider utilisé.


<connectionStrings>

<add name="ConnectionString" connectionString="Password=sa;
User ID=sa;
Data Source=127.0.0.1;
Initial Catalog=DB_PORTAL_V1D"

providerName ="System.Data.SqlClient"/>
</connectionStrings>
On peut mettre en place une classe de base pour notre DAL ( Data Access Logic ) afin de récupérer les informations de connexions.


using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using System.Web.Configuration;

namespace Net.Gavarin.Portal.Data
{
public class BaseData
{
public static ConnectionStringSettings Settings
{
get
{
return ConfigurationManager.ConnectionStrings["ConnectionString"];
}
}
}
}
De maniere à pouvoir mettre en place notre DAL, incorporant nos méthodes de type CRUD ( Create, Read, Update, Delete ).


using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using Net.Gavarin.Data;

namespace Net.Gavarin.Portal.Data
{
public class DBCatalog : BaseData
{

public static DataSet Get()
{
return DbHelper.ExecuteDataset(
Settings,
CommandType.StoredProcedure,
"PORTAL_GetCatalog",
null);
}

public static DataSet Get(int p_ID)
{
SqlParameter[] v_params = new SqlParameter[1];

v_params[0] = new SqlParameter();
v_params[0].ParameterName = "@CTL_ID";
v_params[0].DbType = DbType.Int32;
v_params[0].Value = p_ID;

return DbHelper.ExecuteDataset(
Settings,
CommandType.StoredProcedure,
"PORTAL_GetCatalogByID",
v_params);
}
}
}


Exemple de DAAB Générique ADO.NET 2.0


using System;
using System.Data;
using System.Data.Common;
using System.Collections;
using System.Configuration;

namespace Net.Gavarin.Data
{
[CLSCompliant(true)]
public static class DbHelper
{
#region constructors
#endregion
#region Private utility methods

private static void AttachParameters(
DbCommand p_command,
DbParameter[] p_commandParameters)
{
if( p_command == null )
throw new ArgumentNullException("p_command");

if( p_commandParameters != null )
{
foreach (DbParameter v_p in p_commandParameters)
{
if( v_p != null )
{
if ( ( v_p.Direction == ParameterDirection.InputOutput
v_p.Direction == ParameterDirection.Input ) &&
(v_p.Value == null))
{
v_p.Value = DBNull.Value;
}
p_command.Parameters.Add(v_p);
}
}
}
}


private static void AssignParameterValues(
DbParameter[] p_commandParameters,
DataRow p_dataRow)
{
if ((p_commandParameters == null) (p_dataRow == null))
{
return;
}

int v_i = 0;
foreach(DbParameter v_commandParameter in p_commandParameters)
{
if( v_commandParameter.ParameterName == null
v_commandParameter.ParameterName.Length <= 1 )
throw new ArgumentException(
string.Format(
"Please provide a valid
parameter name on the parameter #{0},
the ParameterName property has
the following value: '{1}'."
,
v_i, v_commandParameter.ParameterName ) );

if (p_dataRow.Table.Columns.IndexOf(v_commandParameter.ParameterName.Substring(1)) != -1)
v_commandParameter.Value = p_dataRow[v_commandParameter.ParameterName.Substring(1)];
v_i++;
}
}


private static void AssignParameterValues(
DbParameter[] p_commandParameters,
object[] p_parameterValues)
{
if ((p_commandParameters == null) (p_parameterValues == null))
{
return;
}

if (p_commandParameters.Length != p_parameterValues.Length)
{
throw new ArgumentException("Parameter count
does not match Parameter Value count."
);
}

for (int v_i = 0, v_j = p_commandParameters.Length; v_i < v_j; v_i++)
{
if (p_parameterValues[v_i] is IDbDataParameter)
{
IDbDataParameter paramInstance = (IDbDataParameter)p_parameterValues[v_i];
if( paramInstance.Value == null )
{
p_commandParameters[v_i].Value = DBNull.Value;
}
else
{
p_commandParameters[v_i].Value = paramInstance.Value;
}
}
else if (p_parameterValues[v_i] == null)
{
p_commandParameters[v_i].Value = DBNull.Value;
}
else
{
p_commandParameters[v_i].Value = p_parameterValues[v_i];
}
}
}


private static void PrepareCommand(
DbCommand p_command,
DbConnection p_connection,
DbTransaction p_transaction,
CommandType p_commandType,
string p_commandText,
DbParameter[] p_commandParameters,
out bool p_mustCloseConnection )
{
if( p_command == null )
throw new ArgumentNullException("p_command");

if( p_commandText == null p_commandText.Length == 0 )
throw new ArgumentNullException( "p_commandText" );

if (p_connection.State != ConnectionState.Open)
{
p_mustCloseConnection = true;
p_connection.Open();
}
else
{
p_mustCloseConnection = false;
}
p_command.Connection = p_connection;
p_command.CommandText = p_commandText;
if (p_transaction != null)
{
if( p_transaction.Connection == null )
throw new ArgumentException( "The transaction was rollbacked or
commited, please provide an open transaction."
, "p_transaction" );
p_command.Transaction = p_transaction;
}
p_command.CommandType = p_commandType;
if (p_commandParameters != null)
{
AttachParameters(p_command, p_commandParameters);
}
return;
}
#endregion private utility methods & constructors
#region Basics methods


public static DbProviderFactory GetFactoryAlias(ConnectionStringSettings p_connectionSettings)
{
if ( string.IsNullOrEmpty(p_connectionSettings.ProviderName) )
{
return DbProviderFactories.GetFactory("System.Data.SqlClient");
}
else
return DbProviderFactories.GetFactory(p_connectionSettings.ProviderName);
}


public static DbConnection CreateConnection(ConnectionStringSettings p_connectionSettings)
{
DbConnection v_conn = GetFactoryAlias(p_connectionSettings).CreateConnection();
v_conn.ConnectionString = p_connectionSettings.ConnectionString;
return v_conn;
}


public static DbParameter CreateParameter(ConnectionStringSettings p_connectionSettings)
{
return GetFactoryAlias(p_connectionSettings).CreateParameter();
}


public static DbParameter CreateParameter(
ConnectionStringSettings p_connectionSettings,
string p_parameterName,
DbType p_dbType)
{
DbParameter v_param = CreateParameter(p_connectionSettings);
v_param.ParameterName = p_parameterName;
v_param.DbType = p_dbType;
return v_param;
}


public static DbParameter CreateParameter(
ConnectionStringSettings p_connectionSettings,
string p_parameterName,
DbType p_dbType,
int p_size)
{
DbParameter v_param = CreateParameter(p_connectionSettings, p_parameterName, p_dbType);
v_param.Size = p_size;
return v_param;
}


public static DbParameter CreateParameter(
ConnectionStringSettings p_connectionSettings,
string p_parameterName,
object p_value)
{
DbParameter v_param = CreateParameter(p_connectionSettings);
v_param.ParameterName = p_parameterName;
v_param.Value = p_value;
return v_param;
}


public static DbCommand CreateCommand(ConnectionStringSettings p_connectionSettings)
{
return GetFactoryAlias(p_connectionSettings).CreateCommand();
}


public static DbCommand CreateCommand(
ConnectionStringSettings p_connectionSettings,
string p_cmdText)
{
DbCommand v_cmd = CreateCommand(p_connectionSettings);
v_cmd.CommandText = p_cmdText;
return v_cmd;
}


public static DbCommand CreateCommand(
ConnectionStringSettings p_connectionSettings,
string p_cmdText,
DbConnection p_connection)
{
DbCommand v_cmd = CreateCommand(p_connectionSettings, p_cmdText);
v_cmd.Connection = p_connection;
return v_cmd;
}


public static DbDataAdapter CreateDataAdapter(ConnectionStringSettings p_connectionSettings)
{
return GetFactoryAlias(p_connectionSettings).CreateDataAdapter();
}


public static DbDataAdapter CreateDataAdapter(
ConnectionStringSettings p_connectionSettings,
DbCommand p_selectCommand)
{
DbDataAdapter v_ada = CreateDataAdapter(p_connectionSettings);
v_ada.SelectCommand = p_selectCommand;
return v_ada;
}

#endregion
#region ExecuteNonQuery

public static int ExecuteNonQuery(
ConnectionStringSettings p_connectionSettings,
CommandType p_commandType,
string p_commandText,
params DbParameter[] p_commandParameters)
{
if ( p_connectionSettings == null )
throw new ArgumentNullException("p_connectionSettings");

using ( DbConnection v_connection = CreateConnection(p_connectionSettings) )
{
v_connection.Open();
return ExecuteNonQuery(
p_connectionSettings,
v_connection,
p_commandType,
p_commandText,
p_commandParameters);
}
}

public static int ExecuteNonQuery(
ConnectionStringSettings p_connectionSettings,
DbConnection p_connection,
CommandType p_commandType,
string p_commandText,
params DbParameter[] p_commandParameters)
{
if ( p_connection == null )
throw new ArgumentNullException("p_connection");

DbCommand v_cmd = CreateCommand(p_connectionSettings);
bool v_mustCloseConnection = false;

PrepareCommand(
v_cmd,
p_connection,
(DbTransaction)null,
p_commandType,
p_commandText,
p_commandParameters,
out v_mustCloseConnection);

int v_retval = v_cmd.ExecuteNonQuery();

v_cmd.Parameters.Clear();
if ( v_mustCloseConnection )
p_connection.Close();
return v_retval;
}


public static int ExecuteNonQuery(
ConnectionStringSettings p_connectionSettings,
DbTransaction p_transaction,
CommandType p_commandType,
string p_commandText,
params DbParameter[] p_commandParameters)
{
if( p_transaction == null )
throw new ArgumentNullException( "p_transaction" );

if( p_transaction != null && p_transaction.Connection == null )
throw new ArgumentException( "The transaction was rollbacked or
commited, please provide an open transaction."
, "p_transaction" );

DbCommand v_cmd = CreateCommand(p_connectionSettings);
bool v_mustCloseConnection = false;
PrepareCommand(
v_cmd,
p_transaction.Connection,
p_transaction,
p_commandType,
p_commandText,
p_commandParameters,
out v_mustCloseConnection );

int v_retval = v_cmd.ExecuteNonQuery();

v_cmd.Parameters.Clear();
return v_retval;
}
#endregion ExecuteNonQuery
#region ExecuteDataset

public static DataSet ExecuteDataset(
ConnectionStringSettings p_connectionSettings,
CommandType p_commandType,
string p_commandText,
params DbParameter[] p_commandParameters)
{
if ( p_connectionSettings == null)
throw new ArgumentNullException("p_connectionAlias");

using ( DbConnection v_connection = CreateConnection(p_connectionSettings) )
{
v_connection.Open();

return ExecuteDataset(
p_connectionSettings,
v_connection,
p_commandType,
p_commandText,
p_commandParameters);
}
}


public static DataSet ExecuteDataset(
ConnectionStringSettings p_connectionSettings,
DbConnection p_connection,
CommandType p_commandType,
string p_commandText,
params DbParameter[] p_commandParameters)
{
if( p_connection == null )
throw new ArgumentNullException( "p_connection" );

DbCommand v_cmd = CreateCommand(p_connectionSettings);
bool v_mustCloseConnection = false;

PrepareCommand(
v_cmd,
p_connection,
(DbTransaction)null,
p_commandType,
p_commandText,
p_commandParameters,
out v_mustCloseConnection );

using ( DbDataAdapter v_da = CreateDataAdapter(p_connectionSettings, v_cmd) )
{
DataSet v_ds = new DataSet();
v_da.Fill(v_ds);
v_cmd.Parameters.Clear();

if( v_mustCloseConnection )
p_connection.Close();

return v_ds;
}
}


public static DataSet ExecuteDataset(
ConnectionStringSettings p_connectionSettings,
DbTransaction p_transaction,
CommandType p_commandType,
string p_commandText,
params DbParameter[] p_commandParameters)
{
if( p_transaction == null )
throw new ArgumentNullException( "p_transaction" );

if( p_transaction != null && p_transaction.Connection == null )
throw new ArgumentException( "The transaction was rollbacked or
commited,please provide an open transaction."
, "p_transaction" );

DbCommand v_cmd = CreateCommand(p_connectionSettings);
bool v_mustCloseConnection = false;
PrepareCommand(
v_cmd,
p_transaction.Connection,
p_transaction,
p_commandType,
p_commandText,
p_commandParameters,
out v_mustCloseConnection );

using ( DbDataAdapter v_da = CreateDataAdapter(p_connectionSettings, v_cmd) )
{
DataSet v_ds = new DataSet();
v_da.Fill(v_ds);
v_cmd.Parameters.Clear();
return v_ds;
}
}
#endregion ExecuteDataset
#region ExecuteReader

private enum DbConnectionOwnership
{
/// <summary>Connection is owned and managed by DbHelper</summary>
Internal,
/// <summary>Connection is owned and managed by the caller</summary>
External
}


private static DbDataReader ExecuteReader(
ConnectionStringSettings p_connectionSettings,
DbConnection p_connection,
DbTransaction p_transaction,
CommandType p_commandType,
string p_commandText,
DbParameter[] p_commandParameters,
DbConnectionOwnership p_connectionOwnership)
{
if( p_connection == null )
throw new ArgumentNullException( "p_connection" );

bool v_mustCloseConnection = false;
DbCommand v_cmd = CreateCommand(p_connectionSettings);
try
{
PrepareCommand(
v_cmd,
p_connection,
p_transaction,
p_commandType,
p_commandText,
p_commandParameters,
out v_mustCloseConnection );

DbDataReader v_dataReader;
if (p_connectionOwnership == DbConnectionOwnership.External)
{
v_dataReader = v_cmd.ExecuteReader();
}
else
{
v_dataReader = v_cmd.ExecuteReader(CommandBehavior.CloseConnection);
}

// Detach the DbParameters from the command object, so they can be used again.
// HACK: There is a problem here, the output parameter values are fletched
// when the reader is closed, so if the parameters are detached from the command
// then the SqlReader can´t set its values.
// When this happen, the parameters can´t be used again in other command.
bool v_canClear = true;
foreach(DbParameter commandParameter in v_cmd.Parameters)
{
if (commandParameter.Direction != ParameterDirection.Input)
v_canClear = false;
}

if (v_canClear)
{
v_cmd.Parameters.Clear();
}

return v_dataReader;
}
catch
{
if( v_mustCloseConnection )
p_connection.Close();
throw;
}
}


public static DbDataReader ExecuteReader(
ConnectionStringSettings p_connectionSettings,
CommandType p_commandType,
string p_commandText,
params DbParameter[] p_commandParameters)
{
if ( p_connectionSettings == null)
throw new ArgumentNullException("p_connectionSettings");

DbConnection v_connection = null;
try
{
v_connection = CreateConnection(p_connectionSettings);
v_connection.Open();

return ExecuteReader(
p_connectionSettings,
v_connection,
null,
p_commandType,
p_commandText,
p_commandParameters,
DbConnectionOwnership.Internal);
}
catch
{
if( v_connection != null )
v_connection.Close();
throw;
}

}


public static DbDataReader ExecuteReader(
ConnectionStringSettings p_connectionSettings,
DbConnection p_connection,
CommandType p_commandType,
string p_commandText,
params DbParameter[] p_commandParameters)
{
return ExecuteReader(
p_connectionSettings,
p_connection,
(DbTransaction)null,
p_commandType,
p_commandText,
p_commandParameters,
DbConnectionOwnership.External);
}


public static DbDataReader ExecuteReader(
ConnectionStringSettings p_connectionSettings,
DbTransaction p_transaction,
CommandType p_commandType,
string p_commandText,
params DbParameter[] p_commandParameters)
{
if( p_transaction == null )
throw new ArgumentNullException( "p_transaction" );

if( p_transaction != null && p_transaction.Connection == null )
throw new ArgumentException( "The transaction was rollbacked or
commited, please provide an open transaction."
, "p_transaction" );

return ExecuteReader(
p_connectionSettings,
p_transaction.Connection,
p_transaction,
p_commandType,
p_commandText,
p_commandParameters,
DbConnectionOwnership.External);
}
#endregion ExecuteReader
#region ExecuteScalar

public static object ExecuteScalar(
ConnectionStringSettings p_connectionSettings,
CommandType p_commandType,
string p_commandText,
params DbParameter[] p_commandParameters)
{
if ( p_connectionSettings == null)
throw new ArgumentNullException("p_connectionSettings");
using ( DbConnection v_connection = CreateConnection(p_connectionSettings) )
{
v_connection.Open();
return ExecuteScalar(
p_connectionSettings,
v_connection,
p_commandType,
p_commandText,
p_commandParameters);
}
}


public static object ExecuteScalar(
ConnectionStringSettings p_connectionSettings,
DbConnection p_connection,
CommandType p_commandType,
string p_commandText,
params DbParameter[] p_commandParameters)
{
if( p_connection == null )
throw new ArgumentNullException( "p_connection" );

DbCommand v_cmd = CreateCommand(p_connectionSettings);

bool v_mustCloseConnection = false;
PrepareCommand(
v_cmd,
p_connection,
(DbTransaction)null,
p_commandType,
p_commandText,
p_commandParameters,
out v_mustCloseConnection );

object v_retval = v_cmd.ExecuteScalar();

v_cmd.Parameters.Clear();

if( v_mustCloseConnection )
p_connection.Close();

return v_retval;
}


public static object ExecuteScalar(
ConnectionStringSettings p_connectionSettings,
DbTransaction p_transaction,
CommandType p_commandType,
string p_commandText,
params DbParameter[] p_commandParameters)
{
if( p_transaction == null )
throw new ArgumentNullException( "p_transaction" );

if( p_transaction != null && p_transaction.Connection == null )
throw new ArgumentException( "The transaction was rollbacked or
commited, please provide an open transaction."
, "p_transaction" );

DbCommand v_cmd = CreateCommand(p_connectionSettings);
bool v_mustCloseConnection = false;

PrepareCommand(
v_cmd,
p_transaction.Connection,
p_transaction,
p_commandType,
p_commandText,
p_commandParameters,
out v_mustCloseConnection );

object retval = v_cmd.ExecuteScalar();
v_cmd.Parameters.Clear();
return retval;
}
#endregion ExecuteScalar
#region FillDataset

public static void FillDataset(
ConnectionStringSettings p_connectionSettings,
CommandType p_commandType,
string p_commandText,
DataSet p_dataSet,
DataTableMapping[] p_tableMappings,
params DbParameter[] p_commandParameters)
{
if ( p_connectionSettings == null )
throw new ArgumentNullException("p_connectionSettings");

if( p_dataSet == null )
throw new ArgumentNullException( "p_dataSet" );

using ( DbConnection v_connection = CreateConnection(p_connectionSettings) )
{
v_connection.Open();
FillDataset(
p_connectionSettings,
v_connection,
p_commandType,
p_commandText,
p_dataSet,
p_tableMappings,
p_commandParameters);
}
}


public static void FillDataset(
ConnectionStringSettings p_connectionSettings,
DbConnection p_connection,
CommandType p_commandType,
string p_commandText,
DataSet p_dataSet,
DataTableMapping[] p_tableMappings,
params DbParameter[] p_commandParameters)
{
FillDataset(
p_connectionSettings,
p_connection,
null,
p_commandType,
p_commandText,
p_dataSet,
p_tableMappings,
p_commandParameters);
}


public static void FillDataset(
ConnectionStringSettings p_connectionSettings,
DbTransaction p_transaction,
CommandType p_commandType,
string p_commandText,
DataSet p_dataSet,
DataTableMapping[] p_tableMappings,
params DbParameter[] p_commandParameters)
{
FillDataset(
p_connectionSettings,
p_transaction.Connection,
p_transaction,
p_commandType,
p_commandText,
p_dataSet,
p_tableMappings,
p_commandParameters);
}


private static void FillDataset(
ConnectionStringSettings p_connectionSettings,
DbConnection p_connection,
DbTransaction p_transaction,
CommandType p_commandType,
string p_commandText,
DataSet p_dataSet,
DataTableMapping[] p_tableMappings,
params DbParameter[] p_commandParameters)
{
if( p_connection == null )
throw new ArgumentNullException( "p_connection" );

if( p_dataSet == null )
throw new ArgumentNullException( "p_dataSet" );

DbCommand v_command = CreateCommand(p_connectionSettings);
bool v_mustCloseConnection = false;
PrepareCommand(
v_command,
p_connection,
p_transaction,
p_commandType,
p_commandText,
p_commandParameters,
out v_mustCloseConnection );

using ( DbDataAdapter v_dataAdapter = CreateDataAdapter(p_connectionSettings, v_command) )
{
if (p_tableMappings != null && p_tableMappings.Length > 0)
v_dataAdapter.TableMappings.AddRange(p_tableMappings);

v_dataAdapter.Fill(p_dataSet);
v_command.Parameters.Clear();
}

if( v_mustCloseConnection )
p_connection.Close();
}
#endregion
#region UpdateDataset

public static void UpdateDataset(
ConnectionStringSettings p_connectionSettings,
DbCommand p_insertCommand,
DbCommand p_deleteCommand,
DbCommand p_updateCommand,
DataSet p_dataSet,
string p_tableName)
{
if( p_insertCommand == null )
throw new ArgumentNullException( "insertCommand" );

if( p_deleteCommand == null )
throw new ArgumentNullException( "deleteCommand" );

if( p_updateCommand == null )
throw new ArgumentNullException( "updateCommand" );

if(string.IsNullOrEmpty(p_tableName) )
throw new ArgumentNullException( "tableName" );

using ( DbDataAdapter v_dataAdapter = CreateDataAdapter(p_connectionSettings) )
{
v_dataAdapter.UpdateCommand = p_updateCommand;
v_dataAdapter.InsertCommand = p_insertCommand;
v_dataAdapter.DeleteCommand = p_deleteCommand;
v_dataAdapter.Update (p_dataSet, p_tableName);
p_dataSet.AcceptChanges();
}
}
#endregion
}
}
 

Comprendre et maitriser les WebParts; ASP.NET 2.0

By TheGrandBlack


Un article sur les WebParts .Net 2.0 en avant premiere de la revue Microsoft Systems Journal : MSJ.
Cet article co-écrits par deux experts en la matiere :
Ted Pattison et Fritz Onion.

Vous retrouverez les details suivant :
- Using Web Parts to create modular Web portal applications
- Personalization and customization features
- Using custom user controls as Web Parts
- Creating a personalization provider.

Et Bien sur ne manquez pas le blog de Fredrik Normén une référence en terme d'exemple sur les WebParts ASP.NET 2.0.
 

WebDav quand tu nous tiens ...

By TheGrandBlack


Oui encore faut-il connaitre son existance, WebDav encore appelé aussi "Web Folders" c'est a dire pouvoir accèder à une organisation de fichiers à distance avec un protocole simple à sécuriser ( Http ), et surtout la possibilité d'avoir une zone d'échange, de travail pour une équipe puisque Web-Dav prend en compte la gestion du "Check-in" "Check-Out". c'est à dire que celui qui fait sortir un fichier du référentiel met un verrou dessus; donc les autres ne pourront pas l'utiliser.

L'outil SharePoint ( SPS, WSS ) de Microsoft est un tres bon exemple d'utilisation de WebDav.
En .net une sociéte a mis en place ( depuis un certain temps ) un librairie WebDav pour .net

Autre solution si vous ne voulez pas débourser, l'écrire vous même : Pour commander WebDav il suffit de lui envoyer du XML, écrire dans un premier temps que les fonctions dont vous avez besoin.
Commencer par télécharger WebDav pour Windows si vous utilisez ce système.
 

Soyez "Connected Home", soyez libre, oui mais comment ?

By TheGrandBlack

Oui "Connected Home", ne veut pas simplement dire qu'on possède internet à la maison; non bien sur cela va beaucoup plus c'est le nouveau marché que les constucteurs aimeraient s'approprier.
"Connected Home" c'est votre réseau familial
- PC
- Imprimante
- Chaine Hi-Fi/Home DVD
- Scanner
- APN ( appareils photo numérique)
- Téléphone ( oui même le téléphone ).
- Télévision.
- Video ( DVD, Films, Divx, etc ..)
- Musique ( MP3, DVD, CD, WAP, Achat de musique en ligne )
- Gravure CD
- Albums multimédias ( Photos, Films, etc .. )
- Et j'en oubli.

Oui ils voudraient bien ce marché, mais force de constater qu'ils s'y prennent comme des pieds, aucun d'entre eux ne souhaitent partir sur une entente. Resultat chez nous c'est une vrai caverne d'ALIBABA et un "boxon" monstre :
- Multiples chargeurs
- Aucune communications.
- pas d'interfaces communes
- et bien sur je ne parle pas des télécommandes, je dois en possèder plus d'une dizaine.
- c'est sur que les appareils sont dix fois plus simple que la programmation qu'on a connu avec les magnétoscope, mais on possède 20 fois plus d'appareils qui n'ont aucune relations.

Messieurs les constructeurs seraient-ils possible de faire un effort ?

Merci à uPnP
UPnP (Universal Plug and Play).
Système de détection et de reconnaissnace automatique d'équipements. La technologie Universal Plug and Play est un protocole qui permet de relier simplement plusieurs ordinateurs et autres équipements informatiques entre eux. La technologie UPnP utilise des standards bien connus comme TCP/IP pour découvrir des équipements et les services disponibles sur un réseau. UPnP va aussi permettre d'exercer un contrôle sur certains équipements d'un réseau interne.

Je me permettrais de souligner l'initiative "uPnP" qui va dans le bons sens
Cette norme permettant de faire communiquer tous les périphériques entre eux surtout sans fil à la patte.

Par exemple imaginez-vous tranquillement dans votre jardin, ou même sur la plage pas loin de chez vous avec votre autoradio en train d'écouter la musique de votre ordinateur.

Philips MCW 770




Ou dans votre cuisine en train d'écouter les chansons numérisées entreposées sur votre disque dur, bien sur sans fil à la pa-patte.
Roku Soundbridge






Cette technologie "uPnP" utilise des flux XML pour communiquer; vous avez déja plusieurs implémentations ( OpenSource, Microsoft, etc ..).
SOHO : Standards simplifiant la mise en réseaux d?équipements communicants dans les maisons et dans les entreprises (SOHO : Small Office Home Office).

Slides de présentation de uPnP
Intel vous propose une implémentation en .net, et si je ne m'abuse je crois que la version serveur de Microsoft "Windows Media Connect" est basé en parti sur le FrameWork .net
Dans les forums on commence à voir fleurir des questions sur par exemple : Comment envoyer une image en codeBase64 dans un flux XML ?
uPnP est là et bien là; même si certains ignorent cette vérite, qu'on ne s'inquiète pas, elle n'est pas ailleurs ou du moins pas dans ces technos qui fleurissement comme des petits pains ( pour parler Franchouille ).
Si je prends par exemple "FreePlayer" qui veut nous faire croire que le point central de la maison c'est la télé; ( Cela me rappelle un peu tous les MiniPod d'un certain Apple qui veut nous apprendre comment écouter la musique ).

Je pense que certains les suivront; ils seront peut-être nombreux; eh bien tant pis pour eux.
Nous nous suivrons une norme, une pensee commune : liste des sociétés qui adherent à uPnP
Cette technologie valable pour la "Home", mais aussi pour le bureau donnera beaucoup plus de soupplesse à nous futures applications lorsqu'il s'agira de partager un périphérique ou un fichier multimédia.

Imaginons une application mobile ( Pocket PC, Tablet PC , etc ...) qui pourra en fonction des champs uPnP environnants pourrait se connecter et retransmettre des informations sur la ville qu'on est en train de visiter; je ne parle pas des radios internet qui font partie intégrante de cette techno; Le monde est marche et certains ont écris des applications afin que chaque ordinateurs dans le monde puisse être serveur Multimédia sur Internet.

On sait que une partie des spécifications de uPnP permet de retransmettre tous ce qui est multimedia, on pourrait imaginer la poosibilité d'avoir une application qui se connecte à notre serveur POP3 ou IMAP pour récupérer les emails et les transmettent sous forme d'images ( JPEG ) pour qu'on puisse les visualiser sur la télévision ou sur les futurs écrans uPnP.

Oui Parlons des futurs ecrans uPnP; je pense qu'il est possible de creer des ecrans avec la technologie uPnP ( j'espere qu'un contructeurs m'entendra ). on pourrait installer ces ecrans un peu partout ( Bureau ou la maison ) et ces ecrans grace à leur télécommande on pourrait aller chercher des images d'un ou de plusieurs serveur uPnP.
Exemple simple :
- Home : Dans la cuisine la possibilite d'afficher les recettes de cuisine.
- Bureau : Diffuser la communication de la societe dans les allés.
- Public : Diffuser des publicités.

Oui me direz vous une partie de ces champs d'applications existent déja; Oui mais avec une technologie lourde, cheres, et non accessible à la petite societe de moins de 200 personnes, et qui plus est fait travailler beaucoup moins de personnes que permettrait uPnP.

Car avec uPnP, il y a aussi un tres gros marché au niveau développement d'applications, qui ne demandent qu'a voir le jour.

Installation d'un serveur uPnP ( remarque vous pouvez aussi télécharger la version Microsoft : Windows Media Connect )
Mise en oeuvre d'UPnP sur OSGi
Orb :
Orb est un logiciel ( gratuit ) révolutionnaire et utilisant uPnP qui permet d?accéder gratuitement à tous les contenus multimédia présents sur son ordinateur à distance (musiques, photos, vidéos, télévisions) depuis n?importe quel support connecté à Internet (téléphone portable, smartphone, PDA, ordinateur).
 

MSCMS Manager : Un outil pour gérer vos postings

By TheGrandBlack

MCMS Manager

In Microsoft Content Management Server, after the creation of sites, there is no common way to do modifications on the Postings. When something goes wrong with Postings, it is not easy to figure out what went wrong, with either Site Manager or by going through the site. Also, analyzing IIS log for MCMS sites is not straightforward. This tool can be used with Site Manager to analyze Postings and user visits of MCMS sites without much effort. Also this tool can be used to analyze templates, resources and to generate scripts for automation of deployment process...
 

[.NET] Etes vous CoVariance ou ContraVariance avec les délégués ?

By TheGrandBlack

Trève de jeu de mots.
Savez que .NET 2.0 ( version 2005 nom de code WhidBey ) a introduit la notion de Covariance et de ContraVariance au niveau des délégués ( delegate ).
Qui n'a pas eu besoin un jour, de Covariance et de ContraVariance dans les délégués ?

Ne répondez pas tous en même temps.
Bon, je vois qu'il y a des timides; je vais au risque de vous apprendre quelque chose que vous savez déja, vous donnez une petite explication :

CoVariance
La notion de covariance implique la valeur renvoyée par un délégué.
Remontons un peu dans le temps c'est à dire dans la version 1.x de .NET, et regardons le fonctionnnement des delegate.
Pour cela je vais prendre 2 classes :
- Une classe Parente
- Une classe Fille

Mettons en place, 2 délégués, renvoyant une instance de Parente et une instance de fille.



using System;
using System.Collections.Generic;
using System.Text;

namespace Net.Gavarin
{
public delegate Parente ParenteEventHandler();
}

using System;
using System.Collections.Generic;
using System.Text;

namespace Net.Gavarin
{
public delegate Fille EnfantEventHandler();
}

En .net 1.x il n'est pas possible d'affecter au délégué "ParenteEventHandler" une méthode renvoyant un ancetre de Parent. L'exemple suivant ne fonctionne pas :




static Parente GetParente()
{
return new Parente();
}

static Enfant GetEnfant()
{
return new Enfant();
}
static void Main(string[] args)
{
ParenteEventHandler A = new ParenteEventHandler(GetEnfant);
}


Mais en .NET 2.0 avec la notion de CoVariance c'est correct et cela fonctionne.
ContraVariance

Le mécanisme de contravariance est tres proche de ce qu'on vient de voir, sauf que cela ne s'applique pas à la valeur renvoyée, mais aux paramètres.

Conclusion
J'espere avoir été suffisament simple dans mes explications.
Si j'arrive à trouver un peu de temps on en reviendra pour voir ensemble les champs d'application. On peut déja dire que cela amène une certaine flexivité dans la programmation puisqu'on a ce typage fort dans l'écriture des "delegate".
 

[.NET] Un MARS et ça repart

By TheGrandBlack

Une nouvelle fonctionnalité de .NET 2.0 ( ADO.NET 2.0 ) et SQL SERVER 2005 (Yukon )
MARS = Multiple Active ResultSets.
Dans la version 1.x du provider managé de SqlServer une des contraintes lors de la manipulation d'un ensemble de données connectées etait qu'on ne pouvait avoir qu'un ensemble de données active à la fois pour une connexion donnée, OleDb donnait l'impression d'en avoir plusieurs, mais ce n'était qu'une impression car en réalité il s'appuyait sur de multiples connexions non poolées.
Dans SqlServer 2005, il y a maintenant MARS qui donne la possibilité d'avoir plusieurs SqlDataReader ouvert pour une connexion.
Pour mettre en place cela; il faut passer par plusieurs instance de SqlCommand, cela booste les performances car on peut travailler en parralelle sur les SqlDataReader.

La fonctionnalité MARS est activée par défaut, mais si vous souhaiter le désactiver vous pouvez spécifier dans la chaine de connexion "MultipleActiveResultSets=false".
Pour le provider OleDb il faut utiliser le MDAC 9.0.
 

Ajax Fan For Ever; Ils sont là ...

By TheGrandBlack
Ils sont là, et ils commencent à être de plus en plus nombreux. De qui je parle ?
Eh bien des Ajax Fan, des Ajax Blogs oui vous trouverez de plus en plus des blogs dédiés à Ajax en mieux ( cerise sur le gateau ) Ajax+.NET je vous présente ce blog dédié à Ajax et à .net

AjaxFanAndDotNetFanForEverAndGodSave...
 

Comment faire apparaitre la règle dans l'éditeur de Visual Studio 2005 Beta 2

By TheGrandBlack


Dans la version 2005 de Visual studio ( Beta 2, cette version ayant pour nom de code Whidbey ), on a la possibilité de faire apparaitre une règle de travail, bien utile pour délimiter ses lignes.

Cette fonctionalité n'est pas accessible à partir de l'IDE actuellement.
Pour l'activer il faut :

  1. Lancer Regedit ( c'etait pour le fun, j'aurais pu commencer par le point 2 )
  2. Aller à [HKEY_CURRENT_USER]\Software\Microsoft\VisualStudio\8.0\Text Editor
  3. Creer une valeur chaine "Guides"
  4. Lui donner une valeur (couleur, min , max ) exemple : "RGB(128,0,0) 2, 80"

Et voila c'est fait, en redémarrant VS.NET 2005 c'est OK.
Vous pouvez en avoir jusqu'a 13 guides.
Rule dans Visual Studio 2005

 

Les différentes phases de l'invocation d'une page aspx version 2

By TheGrandBlack


Que direz voous d'allez voir ce qui se passe lors d'une requête vers une page aspx maintenant qu'on passe à la version 2 de .net;
Pour obtenir un poster ASP.NET Page LifeCyle

 

ADO.NET version 2 et la généricité [ Generic coding ADO.NET 2.0]

By TheGrandBlack


Microsoft nous propose dans sa nouvelle version de ADO.NET la possibilité de mettre en place une certaine généricité dans le codage de nos applications u sein de la couche Data.
Bien sur pour ceux qui suivent, ils auront compris que je ne parle pas de la généricité = Template, mais bien des ajouts dans ADO.NET [ bon les autres peuvent sortir ]
L'ancienne monture des interfaces ( IDbConnection, IDbCommand, IDataReader etc ... ) censées nous apporter de la généricité dans le version 1.0 de ADO.NET ont été complétées, Microsoft a finit par comprendre que cela ne pouvait pas suffir, car ecrire du code propre et indépendant des providers et être quand même obliger d'instancer les classes spécifiques, cela ne pouvait pas convenir.

J'ai été de ceux, qui avait choisis dans un premier temps, de faire de l'instanciation dynamique, ( Reflection ) , j'avais aussi ajouter une notion d'alias comme en DELPHI [Merci Delphi].

Aujourd'hui je découvre que Microsoft a été dans ce sens, [ Delphi l'avait compris tres tôt ].
Dans la version de ADO.NET 2.0 on possède maintenant de nouvelles classes DbCommand, DbConnection, DbParameter, etc ... qui nous oblige plus à instancier les classes d'un provider afin d'obtenir l'interface générique, pour moi c'est une tres grande avancées de la part de ADO.NET.



public static DbProviderFactory GetFactoryAlias(ConnectionStringSettings p_connectionSettings)
{
return DbProviderFactories.GetFactory(p_connectionSettings.ProviderName);
}

/// <summary>
/// Initialise une nouvelle instance de la classe DbConnection
/// </summary>
/// <param name="p_connectionSettings">Informations de connexion</param>
/// <returns>nouvelle instance de la classe DbConnection</returns>
public static DbConnection CreateConnection(ConnectionStringSettings p_connectionSettings)
{
DbConnection v_conn = null;
v_conn = GetFactoryAlias(p_connectionSettings).CreateConnection();
v_conn.ConnectionString = p_connectionSettings.ConnectionString;
return v_conn;
}

Il reste encore quelques points noirs, par exemple tous le monde sait que l'appel aux requêtes paramètrées, et aux procédures stockées diffèrent d'une base à l'autre :

  • En Sql Server : on utilise des paramètres nommés et préfixés avec "@"
  • En Oracle : on a aussi des paramètres nommées et preéfixés avec ":" ( non obligatoire )
  • En Odbc & OleDb : on utilise des paramètres indicés

Il faudrait que le frameWork puisse prendre en compte cette gestion de paramètres afin de normaliser cela, un peu comme le faisait DELPHI, que toute cette cuisine soit masquée [Abstraction]

Bon je sais que des petits malins, me diront que la généricité en base de données n'existe pas, et je leur dirais que vous avez tout a fait raison, d'ailleurs la discussion ne porte pas la dessus, tout le monde sait tres bien qu'il y a des différences entre Oracle, SqlServer, Access etc ...

Mais l'idée c'est d'avoir une application capable de subir un changement de base en tres peu de temps, cad qu'on doit pouvoir se concentrer à ce qui est propre à la base de données lors de cette migration. Avoir un faible couplage [ je dis bien un faible couplage, et non un couplage faible] entre la coouche Data de mon application et la base de données utilisée.

Pour ceux qui souhaite avoir plus d'informations sur ces changements de ADO.NET 2.0