Barre horizontale de naviagtion

vendredi 26 novembre 2010

Les compétences ne sont pas éternelles…

En informatique, cependant, nous devons constamment nous poser une question : "Les compétences que j'ai acquises intéressent-elles encore quelqu'un?"

L'informatique évolue plus vite que tout autre secteur économique. Et les informaticiens doivent suivre sans délais cette évolution, sauf à ne plus disposer que de compétences obsolètes.

Lorsqu'un informaticien est en situation de demande d'emploi, la question incontournable est celle-ci : "Mes compétences actuelles correspondent-elles à une demande présente ou future?"

Si la réponse est négative, il n'est plus temps de chercher du travail. Il devient indispensable au préalable de resynchroniser ses compétences avec les demandes des entreprises. C'est ce qui vous permettra de restaurer votre employabilité

Votre employabilité, c'est votre capacité à donner envie aux entreprises de vous employer.


Restaurez votre employabilité…

En informatique, si vos compétences sont obsolètes, il est vraisemblable que vous ne retrouverez pas un emploi à la hauteur de vos souhaits professionnels, et peut-être pas d'emploi du tout.

Il est temps de vous remettre à vos études et vous familiariser avec les technologies "fashion" du moment.

L'informatique est comme la mode. Synchronisez-vous avec les technologies montantes sur lesquelles les entreprises sont demandeuses et en manque de ressources. Là , vous les intéresserez!


Démontrez votre expertise grâce aux certifications…

Certaines entreprises ont mis en place des parcours d'évaluations techniques organisés autours d'entretiens, de questionnaires écrits, de mises en situation, …

Si votre expertise est réelle, et si vous avez l'opportunité de parvenir jusqu'au stade de ces tests, vous êtes en bonne voie.

Mais comment évaluer votre niveau d'expertise, et transmettre cette information, au même titre qu'on parlerait d'un Bac+2, d'une maîtrise, d'un ingénieur, … ?

Les certifications vous permettent de démontrer votre expertise.

jeudi 11 novembre 2010

Qu’est ce que la RFID ?

La RFID (radio frequency identification) est une méthode pour stocker et
récupérer des données à distance en utilisant des marqueurs appelés
« radio-étiquettes » (« RFID tag »). Les radio-étiquettes sont de petits
objets, tels que des étiquettes autoadhésives, qui peuvent être collées ou
incorporées dans des produits.

Le RFID sur le long terme ?

De plus en plus de villes font le choix d’une taxe sur le poids des
ordures plutôt qu’une taxe sur l’enlèvement de celle ci. Par un système
incitatif de pesée embarquée, les habitants payent en fonction du poids
de leurs ordures ménagères. Le but de notre application serait de faciliter
le tri sélectif tout en sauvegardant la planète.
A terme les puces RFID vont se généraliser dans les emballages. Notre
cuisine permettra le passage d’un produit à un déchet, de l’achat à la
poubelle. En simplifiant la chaine, cela permettra aux enfants et aux
adultes de ne plus se tromper dans les poubelles ainsi qu’aux
aveugles.

Requêter Active Directory via .NET

Active Directory, le service d’annuaire de Microsoft se repose sur le protocole LDAP. Pouvoir se connecter à l’Active Directory, y ajouter des utilisateurs, des groupes, etc… est possible avec le framework .NET grâce au namespace System.DirectoryServices.

Avant de commencer le code, il faut ajouter une référence dans votre projet vers System.DirectoryServices.

Se connecter à Active Directory

La connexion se fait en 2 temps. Premièrement, on créé un DirectoryEntry avec le serveur, nom d’utilisateur, mot de passe, etc… Si une correspondance est faite dans l’AD, on continue. Si le couple utilisateur/mot de passe, l’adresse du serveur n’est pas bonne, etc… une exception de type DirectoryServicesCOMException sera levée. Si la connexion est faite, on pourra tester que pour se connecter, l’utilisateur doit être dans le groupe administrateur. Cette recherche se fait à l’aide d’un DirectorySearcher. La syntaxe du filtre est celle propre à LDAP. Le filtre utilisé ci-dessous, vérifie que l’utilisateur a bien pour nom « Aymeric », qu’il appartient au groupe administrateur et qu’il est bien de type « user ».

01string host = "192.168.65.156";
02string DN = "DC=aymeric,DC=lan";
03string domain = "AYMERIC";
04string user = "Aymeric";
05string logonName = String.Format(@"{0}\{1}", domain, user);
06string password = "Sup1nf0";
07string path = String.Format("LDAP://{0}", host);
08
09// Connection
10try
11{
12 DirectoryEntry de = new DirectoryEntry(path, user, password, AuthenticationTypes.Secure);
13
14 DirectorySearcher ds = new DirectorySearcher(de);
15 ds.Filter = "(&(&(objectClass=user) " +
16 "(memberOf=CN=Administrators,CN=Builtin," + DN + "))" +
17 "(samAccountName=" + user + "))";
18 SearchResult result = ds.FindOne();
19
20 if (result != null)
21 {
22 Console.WriteLine("Connected....");
23 }
24 else
25 {
26 Console.WriteLine("Connection Failed....");
27 }
28}
29catch (DirectoryServicesCOMException ex)
30{
31 Console.WriteLine(ex.Message);
32}

Ajout d’un nouvel utilisateur

La création d’un nouvel utilisateur passe par la création d’un nouveau DirectoryEntry à l’intérieur de celui déjà créé lors de la connexion à l’annuaire. Les informations relatives au nouvel utilisateur sont ensuite ajoutées via la collection de Properties que contient le DirectoryEntry. Le prénom, nom et surnom sont les seules propriétés spécifiées dans l’exemple ci-dessous.

Attention cependant à la propriété « memberOf« , qui contient les groupes auxquels appartient l’utilisateur. Cette propriété est en lecture seule et ne peut donc pas être modifiée. Pour ajouter un utilisateur dans un groupe, il faut partir du groupe en question (décrit plus tard dans l’article).

01// Add a user
02Console.WriteLine("Add a new user");
03
04string firstName = "Scott";
05string lastName = "Guthrie";
06string username = "scottgu";
07string container = "CN=Users";
08
09string userPath = String.Format("CN={0},{1}", username, container);
10DirectoryEntry newUser = de.Children.Add(userPath, "user");
11newUser.Properties["samAccountName"].Value = username;
12newUser.Properties["givenName"].Value = firstName;
13newUser.Properties["sn"].Value = lastName;
14
15newUser.CommitChanges();
16
17string guid = newUser.Guid.ToString();
18
19newUser.Invoke("SetPassword", new object[] { password });
20newUser.CommitChanges();
21
22Console.WriteLine("{0} {1} aka {2} : {3}", firstName, lastName, username, guid);

Comme expliqué ci-dessus, ce code est à mettre à la suite de celui établissant la connexion à la base de données. Les exceptions levées par ce code sont toujours du type DirectoryServicesCOMException.

Pour ajouter un groupe, le principe est le même. Dans le Add(), il faut simplement remplacer le 2ème paramètre par « group » et non « user« .

Ajouter un utilisateur à un groupe

Pour ajouter un utilisateur dans un groupe, il faut impérativement que l’utilisateur soit déjà créé, ce qui implique que l’on ne peut pas ajouter un utilisateur à un groupe de la même manière que son nom ou prénom. Il faut, comme expliqué plus haut dans l’article, ajouter un utilisateur via un groupe. Il faut donc recréer un DirectoryEntry qui représente le groupe en question, puis y ajouter l’utilisateur.

1Console.WriteLine("Add the new user in the Administrators group");
2
3DirectoryEntry grp = de.Children.Find("CN=Administrators,CN=Builtin");
4grp.Invoke("add", newUser.Path);
5
6Console.WriteLine("{0} {1} aka {2} is now administrator", firstName, lastName, username);

Supprimer un utilisateur ou un groupe

Pour supprimer un utilisateur ou un groupe, il faut partir du DirectoryEntry initial (créé pour la connexion) et appeler la méthode Remove() en y passant le DirectoryEntry representant l’objet à supprimer. Dans l’exemple ci-dessous, on supprime l’utilisateur nouvellement créé.

1de.Children.Remove(newUser);
2de.CommitChanges();
3
4Console.WriteLine("{0} {1} aka {2} is deleted", firstName, lastName, username);

Afin de libérer toute les ressources, il faut fermer les DirectoryEntry créés.

1newUser.Close();
2grp.Close();
3de.Close();

Le projet utilisé pour cet article est disponible ici.

vendredi 5 novembre 2010

Actualisation Webservice

si vous avez ajouter à nouveau service offert par un webservice et ce webservice est utilisé par une autre application asp.net ,il faut




mercredi 3 novembre 2010

Export report view to PDF/EXCEL

  • Export PDF


public void ExportRerportToPDF(string FileNameOutput)
{
string mimeType;
string encoding;
string extension;
Warning[] warnings;
string[] streamids;
byte[] Bytes = ReportViewer1.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streamids, out warnings);

#region save In DIsk
//FileStream fs = new FileStream(@"c:\" + FileNameOutput + "." + extension, FileMode.Create);
//fs.Write(Bytes, 0, Bytes.Length);
//fs.Close();
#endregion

#region View Immidiatly In Cuurent HTTP Flux
HttpContext.Current.Response.Buffer = true;
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ContentType = mimeType;
HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename="+FileNameOutput+"." + extension);
HttpContext.Current.Response.BinaryWrite(Bytes);
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();
#endregion
}

  • Export Excel


public void ExportRerportToExcel(string FileNameOutput)
{
Warning[] warnings;
string[] streamids;
string mimeType;
string encoding;
string extension;
string deviceInfo;
deviceInfo = "True";
byte[] bytes = ReportViewer1.LocalReport.Render("Excel", null, out mimeType, out encoding, out extension, out streamids, out warnings);

#region save In DIsk
FileStream fs =new FileStream(@"c:\" + FileNameOutput + ".xls", FileMode.Create);
fs.Write(bytes, 0, bytes.Length);
fs.Close();
#endregion

#region View Immidiatly In Cuurent HTTP Flux
HttpContext.Current.Response.Buffer = true;
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ContentType = mimeType;
HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + FileNameOutput + "." + extension);
HttpContext.Current.Response.BinaryWrite(bytes);
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();
#endregion

}

mardi 2 novembre 2010

Count the total number of records in all user tables

I once had a management request for the total number of records in a database. This may not be a particularly useful statistic, but ...

To count the number of records in a table:

select count(*) from

To count the number of user-tables:

select count(*) from sysobjects where type='U'

To count the total number of records in all the user tables (this uses cursors to loop through considering each table at a time):

declare table_cursor CURSOR for select name from sysobjects where type='U'

declare @table_name sysname
declare @num_recs int
declare @count_sql as nvarchar(128)
declare @total_recs int

set @total_recs = 0

open table_cursor
fetch next from table_cursor into @table_name
while @@FETCH_STATUS=0
begin
set @count_sql = 'select @num_recs = count(*) from ' + @table_name
exec sp_executesql @count_sql,N'@num_recs int output',@num_recs output
print @table_name + ' ' + cast(@num_recs as varchar)
set @total_recs = @total_recs + @num_recs
fetch next from table_cursor into @table_name
end
close table_cursor
deallocate table_cursor

print 'Total number of records: ' + cast(@total_recs as varchar)

Réduire le temps de chargement d’une page ASP.NET avec le SQL Server Cache Dependency

Un système de cache permet de mettre temporairement des données en mémoire sur le serveur permettant un affichage plus rapide des pages du site web.

En ASP.NET, il existe plusieurs solutions pour créer un système de cache :

  • Output Caching : Une copie de la page web finale (HTML) est stockée sur le serveur. Lors du prochain appel à la page, la copie stockée sera automatiquement rendue au client n’exécutant ainsi pas les requêtes SQL, traitements côté serveur, etc… La copie expirera automatiquement après un temps préalablement configurée ou si le serveur manque de mémoire.
  • Data Caching : Il est possible de stocker en mémoire sur le serveur des données comme un DataSet. Si le DataSet est mis en cache, on évite ainsi un appel à la base de données. Contrairement à l’Output Caching, c’est à vous de définir les objets qui seront mis en cache.

Dans cet article, c’est une partie du Data Caching qui nous intéresse : le SQL Server Cache Dependency. Le principe de cette méthode de caching est de limiter les appels à la base de données en mettant en cache le résultat d’une requête SQL et en l’utilisant tant que la table à qui elle fait appel n’est pas modifiée.

Concrètement si un GridView utilise un SqlDataSource pour récupérer toutes les colonnes de la table MaTable dans une base de données.

  • Sans SQL Cache Dependencies, à chaque exécution de la page, un appel à la base de données sera fait pour récupérer les informations dans la table MaTable.
  • Avec SQL Cache Dependency, lors de la première exécution de la page un appel à la base de données sera fait puis lors de chaque appel le résultat de la requête sera récupéré dans le cache. Si la table vient à être modifiée, un nouvel appel à la base de données sera fait, et ainsi de suite.

Comment mettre en place le SQL Server Cache Dependency

Attention, la mise en place décrite ci-dessous ne fonctionne que sur SQL Server 2005 et plus. Pour SQL Server 2000 le SQL Cache Dependency est possible, mais beaucoup plus lourd à mettre en place.

Premièrement, pour activer les notifications sur SQL Server (qui permettront d’avertir du changement dans une table), démarrer Visual Studio Command Prompt (Démarrer -> Tous les programmes -> Microsoft Visual Studio 2010 -> Visual Studio Tools -> Visual Studio Command Prompt).

Tapez ensuite : SqlCmd -S

command_prompt

Entrez ensuite les requêtes suivantes :

1USE
2ALTER DATABASE SET ENABLE BROKER
3GO

Attention, pour que cette requête s’exécute avec succès, aucune autre session ne doit être ouverte pour cette base de données.

Il faut ensuite ajouter une entrée dans le web.config pour indiquer que la base de données utilisera le cache :

1<system.web>
2 <caching>
3 <sqlCacheDependency enabled="true">
4 <databases>
5 <add name="Ma_Base" connectionStringName="Site" pollTime="20000"/>
6 databases>
7 sqlCacheDependency>
8 caching>
9system.web>
  • name : Nom de la base de données
  • connectionStringName : nom de la chaine de connexion définie dans le web.config
  • pollTime : temps entre chaque notification (ici 20s)

Il faut ensuite activer les notifications pour la base de données et pour la table concernée. Pour pouvoir accéder à la classe SqlCacheDependencyAdmin, importez System.Web.Caching dans votre page.

1string cnx = ConfigurationManager.ConnectionStrings["Site"].ToString();
2SqlCacheDependencyAdmin.EnableNotifications(cnx);
3SqlCacheDependencyAdmin.EnableTableForNotifications(cnx, "Ma_Table");

Dernière étape, activer le Cache dans les propriétés du SqlDataSource ou ObjectDataSource.

cache_datasource

EnableCaching doit être passé à true et SqlCacheDependency doit contenir MaBase:MaTable.

Il faut noter qu’une table AspNet_SqlCacheTablesForChangeNotification est créée pour stocker les changements dans la base de données. A chaque modification le champ changeId est incrémenté de 1.

Les performances

Pour démontrer les performances de ce système de cache, j’ai fait des tests sur une requête SQL qui récupère les 34487 villes de France. Le test se base sur 10 exécutions de page dans les 2 cas et avec une désactivation du cache du navigateur.

Sans cache, l’exécution moyenne des pages est de 0,4825s alors qu’avec le cache, on obtient une exécution moyenne de 0,0284s soit une exécution 17 fois inférieure.

resultat

Il est possible de télécharger ici le projet utilisé pour les tests.

lien Source

Regular_Expression

http://en.csharp-online.net/CSharp_Regular_Expression_Recipes%E2%80%94Using_Common_Patterns

Regular_Expression

http://en.csharp-online.net/CSharp_Regular_Expression_Recipes%E2%80%94Using_Common_Patterns

Ajax Toollkit

http://www.asp.net/ajax/videos