mardi 17 avril 2012

Batch Build

Re,

oui on ne peut pas dire que ce blog soit à jour : juste une petite astuce que je transmet car très efficace dans la vie de tous les jours.

Reprise du livre blanc NDepend : http://www.ndepend.com/Res/NDependWhiteBook_Assembly.pdf, l'idée est de créer des batches pour builder les solutions. On économise de nombreuses secondes (et de nombreux clics) ce qui est fort agréable.

Il suffit juste de faire un batch et d'appeler le fichier sln à l'aide de MSBUILD et hop, le tour est joué :

%windir%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe D:MonSuperlongChemin\.MySoluce.sln /property:Configuration=Debug /property:Platform=x86


Quand on a 6 ou 7 solutions et qu'il y en a en 2005, 2010, je peux vous dire que c'est très confortable de n'avoir qu'à faire un double-clic pour compiler :




mardi 20 juillet 2010

Réflexions sur le développement logiciel

Un petit billet qui fait une fois encore office de relai dont je vous transmet le résumé ici et

Il s'agit d'un résumé sur la conférence de Martin Fowler et Neal Ford (ThoughtWorks) de l'USI. Une fois de plus, il s'agit d'une réflexion sur le développement logiciel.

Je ne vais pas paraphraser ce blog sauf cette phrase :
Les développeurs sont donc les personnages les plus importants dans le développement logiciel. Or ils ne sont pas prévisibles, il est donc stupide de voir les gens comme des ressources. L’utilisation du jour/homme fait beaucoup de tord à notre industrie. Je connais personnellement des personnes qui font en 1 journée ce que d’autres font en 20 jours. Et je me mets dans les 20 jours. Et inversement, je peux faire des choses en 1 journée qui demanderaient 20 jours à un autre développeur. Nous ne sommes pas égaux devant les problèmes de programmation. Nous ne pouvons donc pas prévoir la fin d’un projet en divisant le nombre de jours par la " quantité de ressources disponibles" . Mettez-vous cela dans le crâne une fois pour toute.

mercredi 24 mars 2010

Les interfaces ? Explication

Je fais suivre cette explication sur les interfaces dont l'exemple est clair comme de l'eau de roche :

Une interface c'est un contract qui définit ce qu'un object peut faire. L'object peut avoir plusieurs rôles differents et donc plusieurs interfaces.
Mais ça décrit pas comment il le fait, ni si il le fait bien.

ex: La classe Zidane implemente l'interface footballeur, donc il peut faire du foot. La classe MickaelJordan implement l'interface Basketeur, il peut donc jouer avec les mains au baskets.

Et la classe ThierryHenry implemente les interfaces Footballeur et Basketeur il peut donc jouer au foot et au basket. Dadal

vendredi 23 octobre 2009

SQL Server - lister les messages

Passage rapide : Pour afficher tous les messages d'erreurs d'SQL Server :

SELECT * FROM sys.sysmessages
WHERE msglangid = 1036

Voilà

PS : (fonctionne pour Sql Server 2008)

mardi 23 juin 2009

Quick Info

Shortcut Visual Studio pour afficher les informations courantes : Ctrl+K, Ctrl+I. Voilà, comme ça je ne perdrais plus de temps à chercher ;-)

dimanche 22 février 2009

Hashtable, Dictionary<TKey, TValue> etc.

Rentrons directement dans le vif du sujet : Je ne vous présente plus la classe Hashtable, ni la classe Dictionary<TKey, TValue>. Et bien j'ai fait une petite constatation et je voulais vous en faire part ô chers lecteurs. Supposons qu'à partir de 2 collections diverses, nous souhaitions en peupler une troisième :

// Notre 1ère collection :
// On crée 3 personnes et on les ajoute à notre 1ère collection
Personne jaco = new Personne("Pastorius", "John Francis Anthony", new DateTime(1951, 12, 1));
Personne marcus = new Personne("Miller", "Marcus", new DateTime(1959, 6, 14));
Personne victor = new Personne("Wooten", "Victor Lemonte", new DateTime(1964, 11, 8));

List<Personne> topBassists = new List<Personne>();
topBassists.Add(jaco);
topBassists.Add(marcus);
topBassists.Add(victor);

// Notre 2è collection
// On récupère à partir d'une source tierce, 3 autres personnes.
Personne s = new Personne("Clarck", "Stanley", new DateTime(1948, 10, 17));
Personne m = new Personne("Miller", "Marcus", new DateTime(1959, 6, 14));
Personne v = new Personne("Wooten", "Victor Lemonte", new DateTime(1964, 11, 8));

List<Personne> smvBassists = new List<Personne>();
smvBassists.Add(s);
smvBassists.Add(m);
smvBassists.Add(v);

//..
// Enfin on souhaite récupérer une liste de personnes avec comme source les 2 listes précédentes.
List<Personne> jazzFestival = new List<Personne>();
jazzFestival.AddRange(topBassists);
jazzFestival.AddRange(smvBassists);

Vous l'avez deviné on va se retrouver avec des doublons dans notre liste.


C'est là qu'intervient la classe hashtable ou Dictionary<TKey, TValue>. Elle va nous permettre de gérer les doublons :

Dictionary<string, Personne> jazzFestivalTriee = new Dictionary<string, Personne>();

foreach (Personne p in jazzFestival)
{
if (!jazzFestivalTriee.ContainsKey(p.Nom))
jazzFestivalTriee.Add(p.Nom, p);
}

Et là, on se retrouve avec une collection d'éléments uniques. Top non ? Bon ok, il n'y a pas de quoi s'énerver :) Bon alors le petit truc que j'ai trouvé c'est qu'on peut se passer de la condition if (!jazzFestivalTriee.ContainsKey(p.Nom)) , sans pour autant se faire jeter une exception à la figure. En fait il faut simplement passer par l'indexeur du hashtable / Dictionary<TKey, TValue> :

foreach (Personne p in jazzFestival)
{
jazzFestivalTriee[p.Nom] = p;
}

Et le résultat est identique.



Chouette non ? Et en plus on y gagne en perf (enfin on est dans l'ordre du chouïa :) Voici ce petit tableau récapitulatif :



































Dictionary<Tkey, Tvalue>



Hashtable


Avec condition if

1426



2522


Sans condition if

1262



2217


Gain observé (en %)

12,99524564



13,75732972


Quelques remarques : tout d'abord, sur quel code ont été faites les mesures :
List<Personne> listeAtrier = new List<Personne>();

for (int i = 0; i < 5300000; i++) // 5,3 millions
listeAtrier.Add(new Personne(i.ToString(), (i * 2).ToString(), new DateTime(1981, 11, 23)));

for (int i = 0; i < 1500000; i++) // 1,5 millions
listeAtrier.Add(new Personne(i.ToString(), (i * 2).ToString(), new DateTime(1981, 11, 23)));


Donc j'ai crée une liste de 'personne' 5,3 millions d'items et puis j'en ai ajouté encore 1,5 millions qui sont identiques à ce de la première (pour qu'il y est des doublons dans la liste). La suite du code n'a rien de surprenant :

Hashtable listeTriee = new Hashtable();
//Dictionary<string, Personne> listeTriee = new Dictionary<string, Personne>();

Stopwatch timer = new Stopwatch();
timer.Start();
foreach (Personne p in listeAtrier)
{
//if (!listeTriee.ContainsKey(p.Nom))
//listeTriee.Add(p);
listeTriee[p.Nom] = p;
}
timer.Stop();
Console.WriteLine(listeAtrier.Count);
Console.WriteLine(listeTriee.Count);
Console.WriteLine(timer.ElapsedMilliseconds);

Voilà, pour d'autres optimisations, vous pouvez aller ici.

lundi 16 février 2009

Snippets Visual Studio 2008

Ca fait un petit moment que je voulais le faire et c'est l'arrivée de C# 3 et des automatic properties qui m'y ont poussé. Les snippets. En effet, j'utilise pas mal les snippets (merci Ge-Off ;-)) et depuis c# 3 quand on fait un prop ou un propg on obtient ça :

public int MyProperty { get; set; }
Or ce n'est pas toujours ce qu'on veut. Ce qu'on veut c'est redéfinir le getter ou le setter donc ce qu'on veut c'est ça :

private int myVar;

public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
rien de bien sorcier mais à force... donc si comme moi, ces raccourcis vous manquent, rejoignez mon groupe Facebook téléchargez donc ces quelques petits fichiers xml qui vous rendront la vie meilleure :)

Installez-les dans le répertoire des snippets (par exemple : C:\Program Files\Microsoft Visual Studio 9.0\VC#\Snippets\1033\Visual C# pour VS 2008)


Et puis quelques uns que j'utilise assez souvent :

  • cr.snippet : Console.Read();
  • cwr.snippet : Console.WriteLine(); Console.Read();