Un peu de mon expérience dans le monde .NET
# Thursday, February 18, 2010
Signer (Strong Name) une assembly tierce
Je développe une tâche personnalisé pour SSIS (sujet très intéressant, abordé probablement lors d’un prochain post) et fait face à un problème : afin d’être enregistré dans la GAC, mon composant doit être signé (Strong Name), ainsi que toute les assembly référencées …

Pour mon développement pas de problème (sn –k key.snk & [assembly: assemblyKeyFileAttribute(@"key.snk")]

Mais que faire des composant 3th party, dont je n’ai évidement pas les sources ?

Voici ma solution :
  1. Générer une clé => sn –k 3thparty.snk
  2. Désassembler l’assembly en langage intermédiaire => ildasm.exe 3thparty.dll /out: 3thparty.il
  3. Réassembly l’assembly, en ajoutant la clé => ilasm.exe 3thparty.il /dll /output=3thparty.dll /key=3thparty.snk

Fonctionne bien évidement seulement si l’assembly n’a pas été obfuscée …


Thursday, February 18, 2010 3:55:04 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  .NET 3.5 | Tips

# Tuesday, December 09, 2008
Visual Studio 2008 tip : accéder au propriétés d'un projet en double cliquant sur le dossier 'properties'

J'ai, pendant quelques années, accédé aux propriétés d'un projet en sélectionnant celui-ci dans l'explorateur de solution, puis boutons droite / menu contextuel, et sélection du menu properties, comme illustré dans la figure 1. Depuis hier, je sais qu'il est possible d'accéder aux propriétés d'un projet en double cliquant sur le dossier 'properties' de celui-ci ... (figure 2)

    

 Figure 1                                      Figure 2


Tuesday, December 09, 2008 12:52:10 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  Tips | VS2008

# Thursday, January 24, 2008
SQL-Server et changement du nom de machine

Dans le cadre d’un POC (Proof Of Concept), j’ai décidé de changer le nom du serveur de base de donnée afin que ce laboratoire soit ‘auto-documenté’ (c’est plus claire quand les machines s’appellent ‘Directory Services’, ‘Publisher’ au lien de ‘WIN-1234’ et ‘WIN-1235 …). Cette modification intervient APRES l’installation de SQL-Server.

 

Le changement de nom s’effectue très simplement depuis l’administration de l’ordinateur (Poste de travail/ Gérer). Jusqu’ici, tout va bien.

 

Lors de la première connexion à la base de donnée via SQL-Server Management Studio, la mire propose toujours l’ancien nom de l’ordinateur. Pas de souci, il suffit de remplacer celui-ci par son nouveau nom et la connexion s’effectue correctement.

 

Un problème survient lorsque l’on désir gérer la réplication. En effet, pour une mystérieuse raison, la réplication (Replication.Utilities) cherche toujours à accéder au serveur avec l’ancien nom …

 

 

 

Un rapide coup d’œil sur les tables système permet de trouver la source du souci :

select * from sys.servers

Retourne des informations du serveur SGDB, et retourne surtout dans la colonne ‘NAME’ l’ancien nom de la machine L

 

Le souci sera rapidement résolut en supprimant le serveur et en le recréant à l’aide des procédures stockées suivantes :

sp_dropserver ‘WIN-1235’

sp_addserver @server=‘Publisher’, @local=’local’

 

Et tout rentre dans l’ordre.


Thursday, January 24, 2008 1:36:14 PM (GMT Standard Time, UTC+00:00)  #    Comments [0]  SQL-Server 2005 | Tips | Merge Replication

# Monday, November 19, 2007
Reflection

Voici une reflection dont il faut se souvenir lorsque l'on développe du software :

Solve Problems - Realize that to more than 99.9% of the worlds population, code/technology are simply a means to an end. Software solves problems. The world really doesn't care how or why it works.

7 of the Hardest Things I Learned About Writing Software


Monday, November 19, 2007 8:21:28 AM (GMT Standard Time, UTC+00:00)  #    Comments [0]  Tips

# Thursday, October 25, 2007
SQL Tips #7

Requêtes ayant été les plus exécutées

Les DMV sys.dm_exec_query_stats, en association avec sys.dm_exec_sql_text, permet de connaître les requêtes ayant été les plus exécutées.

SELECT TOP 50    
        SUM(T1.execution_count),
        T2.text
FROM  
    sys.dm_exec_query_stats T1 
CROSS APPLY sys.dm_exec_sql_text(T1.plan_handle) T2    
GROUP BY 
        T1.plan_handle,
        T2.text
ORDER BY 
    SUM(T1.execution_count) 
DESC

Thursday, October 25, 2007 10:50:55 AM (GMT Daylight Time, UTC+01:00)  #    Comments [0]  SQL-Server 2005 | Tips

SQL Tips #6

Requêtes ayant consommées le plus de cycle I/O

Les DMV sys.dm_exec_query_stats, en association avec sys.dm_exec_sql_text, permet de connaître les requêtes ayant consommées le plus de cycle I/O.

SELECT TOP 50    
        SUM(T1.total_physical_reads + T1.total_logical_reads + T1.total_logical_writes),
        T2.text
FROM  
    sys.dm_exec_query_stats T1 
CROSS APPLY sys.dm_exec_sql_text(T1.plan_handle) T2    
GROUP BY 
        T1.plan_handle,
        T2.text
ORDER BY 
    SUM(T1.total_physical_reads + T1.total_logical_reads + T1.total_logical_writes ) 
DESC

 


Thursday, October 25, 2007 10:49:40 AM (GMT Daylight Time, UTC+01:00)  #    Comments [0]  SQL-Server 2005 | Tips

SQL Tips #5

Requêtes ayant consommées le plus de cycle CPU

Les DMV sys.dm_exec_query_stats, en association avec sys.dm_exec_sql_text, permet de connaître les requêtes ayant consommées le plus de cycle CPU.

SELECT TOP 50
    SUM(T1.total_worker_time), 
    T2.text
FROM  
    sys.dm_exec_query_stats T1 
CROSS APPLY sys.dm_exec_sql_text(T1.plan_handle) T2    
GROUP BY 
        T1.plan_handle,
        T2.text
ORDER BY 
        SUM(T1.total_worker_time) 
DESC

Thursday, October 25, 2007 10:48:47 AM (GMT Daylight Time, UTC+01:00)  #    Comments [0]  SQL-Server 2005 | Tips

SQL Tips #4

Requêtes ayant souffert de blocages

Les DMV sys.dm_exec_query_stats, en association avec sys.dm_exec_sql_text, permet de connaître les requêtes ayant le plus souffert de blocages (le temps d’exécution est supérieur au temps ‘travaillé’, signifiant que la requête à été victime temporairement d’un blocage).

SELECT TOP 50    
        SUM(T1.total_elapsed_time - T1.total_worker_time),
    T2.text
FROM  
    sys.dm_exec_query_stats T1 
CROSS APPLY sys.dm_exec_sql_text(T1.plan_handle) T2    
GROUP BY 
        T1.plan_handle,
        T2.text
ORDER BY 
        SUM(T1.total_elapsed_time - T1.total_worker_time ) 
DESC

Thursday, October 25, 2007 10:47:21 AM (GMT Daylight Time, UTC+01:00)  #    Comments [0]  SQL-Server 2005 | Tips

# Wednesday, October 24, 2007
SQL Tips #3

Les DMV dm_db_missing_index_* permettent de déterminer les indexes manquants. Ces informations sont basées sur l’analyse de l’exécution des requêtes depuis le démarrage de SQL-Server 2005.

Quatre DMV permettent d’obtenir des informations, d’un point de vue générale  jusqu’au détail (détail de colonnes à indexer).

La hiérarchie est la suivante :
dm_db_missing_index_group_stats          Information générale
-> dm_db_missing_index_groups             Information sur un groupe d’indexes
     -> dm_db_missing_index_details        Information sur un index
          -> dm_db_missing_index_columns Information des colonnes d’un index

Le calcul de la priorité (l’importance) de création d’un index est basé sur trois paramètres :
1. Le coût
2. l’impacte
3. le nombre de lecture

En effet, créer un index sur une table n’ayant qu’un index primaire aura un grand impact sur la performance. Par contre, si cette table n’est accédée qu’un fois pas année, la création de cet index ne devrait pas être un priorité. Mieux vaut alors insérer un index sur une table accédée de miliers de fois par minutes, même si l’impacte par requête est faible.

La requête suivante indique les indexes manquant a créer, par ordre de priorité (selon le calcule ci-dessus) :

SELECT 
    T1.avg_total_user_cost * T1.avg_user_impact * (T1.user_seeks + T1.user_scans) AS 'Priorite', 
        T3.*
FROM 
    sys.dm_db_missing_index_group_stats T1
INNER JOIN sys.dm_db_missing_index_groups T2 
    ON T2.index_group_handle = T1.group_handle
INNER JOIN sys.dm_db_missing_index_details T3 
        ON T3.index_handle = T2.index_handle
WHERE
        T3.database_id = 8 – A remplacer par l’ID de la base désirée
ORDER BY 
    avg_total_user_cost * avg_user_impact * (user_seeks + user_scans)
DESC;

Note :
Le résultat des DMV est le reflet de la base lors de l’execution des DMV. Lors de la création d’indexes basé sur ces vues, prendre soins de sauvegarder les informations. En effet, suite à la création d’un index, les DMV vont réévaluer les informations.


Wednesday, October 24, 2007 2:36:44 PM (GMT Daylight Time, UTC+01:00)  #    Comments [0]  SQL-Server 2005 | Tips

SQL Tips #2

Un index est fragmenté lorsque l’ordre logique des informations stockées dans les pages (basée sur les clés de l’index) ne correspondent plus à l’ordre physique des informations stockées dans les fichiers de données.

SQL-Server 2005 offre deux possibilités :
- La réorganisation de l’index
   S’applique lorsque le taux de fragmentation de l’index se situe entre 5% et 30%.
- La reconstruction de l’index
   S’applique lorsque le taux de fragmentation de l’index est supérieur à  30%.

La DMV sys.dm_db_index_physical_stats nous renseigne sur le taux de fragmentation. La requête suivante liste tous les indexes d’un serveur (pour lister uniquement une base, changer le premier paramètre de la DMV), dont le taux de fragmentation est supérieur à 5%.

SELECT 
    T3.Name AS Table_Name, 
    T2.Name AS Index_Name,
    T1.avg_fragmentation_in_percent
FROM 
    sys.dm_db_index_physical_stats(null,null,null,null,null) AS T1 
INNER JOIN  sys.indexes T2 
    ON  T1.OBJECT_ID = T2.OBJECT_ID 
    AND T1.INDEX_ID = T2.INDEX_ID 
INNER JOIN  sys.tables T3 
    ON T3.OBJECT_ID = T2.OBJECT_ID 
WHERE 
    T1.avg_fragmentation_in_percent > 5 
    AND T2.Name IS NOT NULL 
ORDER BY 
    T1.avg_fragmentation_in_percent 
DESC

Wednesday, October 24, 2007 1:22:08 PM (GMT Daylight Time, UTC+01:00)  #    Comments [0]  SQL-Server 2005 | Tips

SQL Tips #1

Un index devient inutiles lorsque le nombre de mise à jour de l’index (update) est supérieur au nombre fois que cet index est utilisé pour une lecture (seeks, scans & lookup). Le moteur passe donc plus de temps à le maintenir à jour qu’il n’est réellement utilisé … C’est comme maintenir un annuaire téléphonique à jour alors que les abonnées utilisent d’autre moyen (carnet d’adresse local, …) pour se contacter.

La DMV sys.dm_db_index_usage_stats nous donne ces informations :

SELECT
     user_updates AS '#ECRITURE', 
    user_seeks + user_scans + user_lookups AS '#LECTURE'
FROM 
        sys.dm_db_index_usage_stats
WHERE
        user_updates > (user_seeks + user_scans + user_lookups)

Wednesday, October 24, 2007 1:05:25 PM (GMT Daylight Time, UTC+01:00)  #    Comments [0]  Tips | SQL-Server 2005

# Tuesday, October 16, 2007
Rendre une méthode obsolète …

J’ai cherché comment rendre une méthode obsolète en .NET. En effet, j’ai crée une nouvelle méthode lors de l’évolution d’un projet, mais ne pouvais pas supprimer (ou remplacer) l’ancienne méthode.

 

La solution est simple : il suffit d’ajouter l’attribut [Obsolete]

 

Trois signature s’offrent à nous :

[Obsolete]

void Methode() {}

Qui indiquera simplement, via intellisense, que la méthode est obsolète

 

[Obsolete(« Cette méthode à été remplacée par XXX » )]

void Methode() {}

Qui indiquera simplement, via intellisense, que la méthode est obsolète en indiquant la raison.

 

[Obsolete(« Cette méthode à été remplacée par XXX », true )]

void Methode() {}

Générera en plus une erreur lors de la compilation.

 


Tuesday, October 16, 2007 12:14:50 PM (GMT Daylight Time, UTC+01:00)  #    Comments [0]  C# | Tips

# Friday, August 31, 2007
Vaut son pesant de cacahouètes …

 Dans une ListView, on ajoute les colonnes en ajoutant des ColumnHeader. Cette objet à une propriété Width, qui permet de définir la largeur de la colonne en pixels.

 

C’est maintenant que cela devient rigolo ! Il est possible (et c’est même documenté ici) d’assigner une valeur négative (-1 ou –2) … -1 ajustera la largeur de la colonne à la largeur maximum des éléments affichés dans celle-ci. –2 ajustera la largeur de la colonne à la largeur du texte du header …

 

Il aura fallu combien d’ingénieurs pour arriver à cette solution ?


Friday, August 31, 2007 8:10:46 AM (GMT Daylight Time, UTC+01:00)  #    Comments [0]  Tips | WinForms