Un peu de mon expérience dans le monde .NET
| | Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|---|
| 28 | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 10 | 11 | 12 | 13 | | 14 | 15 | 16 | 17 | 18 | 19 | 20 | | 21 | 22 | 23 | 24 | 25 | 26 | 27 | | 28 | 29 | 30 | 31 | 1 | 2 | 3 | | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
Search
Navigation
Categories
Blogroll
|

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 :
- Générer une clé => sn –k 3thparty.snk
- Désassembler l’assembly en langage intermédiaire => ildasm.exe 3thparty.dll /out: 3thparty.il
- 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)
.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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
Tips | WinForms