May.19

Les collections génériques sous .NET 2.0

Résumé:
Dans cet article, nous allons voir les collections génériques introduites avec le nouveau framework .NET 2.0. C’est l’espace de noms (namespace) System.Collections.Generic qui contient les interfaces et classes qui définissent des collections génériques permettant aux utilisateurs de créer des collections fortement typées. Nous verrons dans cet article les différentes collections génériques proposées par le framework 2.0 (dictionnaires, listes, piles, etc…) à travers des explications claires accompagné d’exemple.

Sommaire:

Pour ceux qui serait intéressé :

Perso,Dev

Apr.26

My Sudoku Day n° 2

Allez 2ème et dernier jour de Sudoku pour moi ^^ J’ai en effet un peu ameiloré mon programme de Sudoku, et je vous presente la version final 1.1 ^^

Les nouveautés sont simples :

  • Possibilité de charger une grille depuis un fichier
  • Possibilité d’enregistrer la solution
  • Changement d’unité de mesure du temps ^^

Ce qui m’a permis de tester mon programme sur d’autre grille parce que jusque la je n’ai fait que resoudre une seule grille et en plus comme me dit Kevin : c’est du niveau Facile !!

Donc j’ai directement attaqué par une grille non pas du niveau facile, ni moyen, ni difficile (ca serai trop facile ^^) mais en niveau diabolique carrement ! Mon fichier TXT ressemble à ca :

J’execute mon petit programme « sudokusolver.exe diabolique.txt« , qui me ressout la grille (marre des screenshots, donc on fera sans), me demande de l’enregistrer où je dis « oui », et me créé le fichier :

C’est pas beau ca ?? 😀

Tu remarquera une fois de plus mon ti kevin qu’il me l’a resolu en 0 seconde, c’est pourquoi j’ai du changer d’unité de temps et donc pour etre exate il l’a résolu en 50ms (et 10ms pour la grille facile du 20minutes d’hier) !! Amuse toi a me preparer autant de grille que tu veux, je t’attends demain 🙂

Le code de la nouvelle version du programme console ICI (ps: le moteur n’a pas été modifié, seulement le programme console pour gérer le chargement et l’enregistrement des grilles)

Pour finir, vive le sudoku ^^

Perso,Dev

Apr.25

My Sudoku Day

Le sudoku n’est plus à presenter… Dire que certain ont fait des millions en créant des programmes capables de générer des grilles.. (ca aurait dû Netastate sur ce marché ^^).

Bref toujours est-il que bon nombre de personne s’eclatent ou plutôt se prennent la tête (hein chérie :-)) sur ce genre de casse tête !

Personnellement, j’ai fait mon 1er sudoku ce matin dans le train 🙂 (c’est bien Seb ^^) ! Et j’en suis venu à une conclusion : quitte a se prendre la tête autant se prendre la tête une bonne fois pour toute !!! C’est alors que je me suis mis en tête, a mon arrivée a Supinfo ce matin, de faire un résolveur de Sudoku : c’est ma journée Sudoku 😀

Plusieurs méthodes existent pour resoudre ce genre de problème ! Personnellement j’ai utilisé la méthode du BackTracking (kesako ici) qui consiste a placer les chiffres dès qu’ils sont possibles et de revenir en arrière quand ca ne l’est plus !

Avant :

Après :

Mon petit Kévin remarquera la vitesse de résolution pour cette grille : 0secondes ^^ Tu sais bien que je suis trop rapide pour toi 😀 (j’entends encore « ouai il pu ton algo, c’est de la m**** » ^^)

Bon biensur, dans l’état actuel, c’est assez galère pour entrer la grille dans le programme car elle est directement inscrite en dur dans le code mais vous remarquerez que mon application se compose de 2 fichiers :

  • Moteur.cs : contenant tout le moteur de résolution du sudoku et donc exploitable depuis n’importe qu’elle application (faudait refaire une belle interface graphique, XAML kevin ?? ^^ ou appli web !)
  • Program.cs : programme console qui exploite le moteur avec un exemple d’une grille trouvé dans le 20 minutes de ce matin.

Sur ceux je vous souhaite a tous une bonne soirée, et a bientôt 🙂

Sans oublier les sources :

Perso,Dev

Apr.21

Les Complexes, pas complexe !!!

Très souvent en Informatique, on a besoin des maths. Les Complexes en font partie, on les utilisent beaucoup quand on travaille sur des applications graphique 2d/3d ! Personnellement, je les utilisent nottament dans mon simulateur d’immunologie (SimImmuno). Malheuresement, ma plateforme adorée .NET ne comporte pas de classe lié a l’utilisation des Complexes d’où mon idée de faire une structure pouvant manipuler les bases des complexes (operations de base, module, argument, etc..) pour pouvoir jouer avec les complexes dans n’importe quelle application !
La structure que j’ai ecrite nommé Complexe comporte :

  • 1 constructeur pour créer de nouveau complexe :

  • 2 accesseurs en get/set pour pouvoir recuperer ou modifier les parties Reelles et Imaginaires du complexe

  • 4 accesseurs en lecture seule (get seulement) pour récupérer le Conjugué, le module, l’argument et le carré d’un complexe :

  • 1 méthode : Rotation qui retourne un nouveau complexe de la rotation du complexe par un angle (en double) et d’un centre (Complexe)

  • 4 surcharges d’operateurs pour les operations +, -, *, / respectivement addition, soustration, multiplication, division :

  • Et pour finir 1 surcharge de la methode ToString() afin de pouvoir recuperer le complexe en string sous la forme a+ib :

Bref il y a toutes les fonctions de bases sur les complexes pour pouvoir les utiliser très facilement dans vos développements 🙂

Screenshot du programme de Demo en mode Console :

Code source du programme console de Demo
Code source de ma structure complexe (v1.0)
UPDATE :
Code source de ma classe complexe (v1.1 du 22/02/07)

Pas si complexe les complexes maintenant 😀

Perso,Dev,.NET

Apr.06

MONAD… Enfin – vivement :)

Ah vivement les prochains Windows, en 1er ligne avec Windows Vista (date de lancement décalé à Janvier 2007) !

Pourquoi ? Parce que MONAD 😀 Ca vous parle ?

Monad est le nom de code pour le MSH (Microsoft Shell) qui sera le nouvel interpreteur de comande (shell) de la gamme Windows qui remplacera le bon vieux CMD.EXE !

Parce que, il faut l’avouer, l’invite de commande de Windows est quand meme très limité surtout si on le compare aux shells que l’on retrouve sous Unix/Linux !

Déjà et surtout, a mon plus grand bonheur, ce nouveau shell sera entierement integré a l’environnement .NET qui permettra une grande extensibilité ! On pourra ecrire des scripts en .net pour dessiner une fenetre graphique, piloter des applications serveur (exchange, iis, etc..) et client (gamme office, etc..), faire des requetes SQL et traiter les données, et plein d’autre chose (faites place a votre imagination et aux possibilités qu’offre .NET ^^).

Bref, un nouveau shell digne de ceux du monde Linux qui ravira bon nombre d’entre nous ! Théoriquement il devrait sortir avec Windows Vista, mais d’apres certaine source, son lancement sera retardé… Affaire a suivre ^^

Vous pouvez déjà tester Monad, diffusé librement par MS, actuellement en Beta 3.1 ICI.

Evidement, ce nouveau systeme offre pour les « pirates » de nouvelle voix 😀 A ce sujet, il existe déjà un 1er virus (read here) ^^

Quelques ressources :

  • Code snippets: petite banque de scripts et cmdlets pour Monad ICI
  • MSH: explications anglaise sur Wikipedia ICI
  • Pliens de liens sur Monad ICI
Info

Feb.09

La galère des Threads sous .NET 2.0 :-)

On s’est retrouvé, ben et moi, lors de l’ecriture de notre logiciel Skin.be dans une petite galère avec l’utilisation des Threads sous le .NET 2.0 !

C’est quoi un thread ?
Lorsque vous démarrez une application, Windows crée automatiquement un nouveau « thread » d’exécution spécialement pour votre application. Ce « thread » permet d’isoler votre application dans son propre environnement unique, bien séparé de tout autre application. Attention, il ne faut pas les confondre avec les AppDomain ! Un thread est une « unité d’execution » alors qu’un domaine d’application et une « unité d’isolation d’execution » !! J’eclaircirai tout cela plus tard…

A quoi ca sert un thread ?
Les threads permettent d’effectuer plusieurs taches dans votre programme en même temps : le multi-tache ! Imaginez un serveur web mono-thread où 2 clients se connecte en meme temps : 1er arrivé, 1er servi : 1 seul client à la fois ce qui n’est pas super !! Hors avec les threads, dès qu’un client se connecte, un nouveau thread est lancé independement des autres pour pouvoir « s’occuper » de nouveau client !

Rapport entre Skin.be et les threads
Dans notre petit logiciel, quand vous cliquez sur « Télécharger », une fonction est appellée et vient faire une boucle pour télécharger toutes les images. Seulement cette fonction étant très gourmande et étant executée dans le meme thread fige l’interface graphique !
Notre programme devient donc tout « blanc » (plus de rafraichissement graphique) et on peut plus le controler a moins d’attendre la fin du téléchargement ! Pas génial hein !
Donc pour remedier a cela, nous executons la fonction de téléchargement dans un autre thread ce qui permet de garder le contrôle sur notre GUI (interface graphique du programme).

La où ca devient galère !
Le probleme dans notre cas, c’est qu’a chaque image téléchargée, notre fonction de Telechargement rafraichit la GUI au moyen d’une ProgressBar (10%..20%..30%…) et d’un petit label: « Telechargement de la photo 2/8 ».
Seulement sous .NET 2.0, si vous modifiez un controle d’un autre thread vous aurez un beau message de votre compilateur :

Illegal cross-thread operation: Control ‘ProgressBar’ accessed from a thread other than the thread it was created on

Le .NET framework 2.0 détecte lui même que l’on cherche a modifier une propriété du label dans un autre thread que le thread principal ce qui provoque cette erreur !

Comment fait on alors ?
Il faut en fait demander au contrôle d’effectuer lui même la resynchronisation ! Pour cela on va utiliser des délégués.
Déclarons-le au debut de notre programme :

Puis dans votre code, créez une fonction pour la mise a jour de votre contrôle (ou vos contrôles) :

Dans notre cas la fonction UpdateControlProgress récupérera l’avancement dans l’objet sender qui sera convertie en Integer, puis on viendra mettre a jour notre ProgressBar et label en fonction.
Il ne reste plus qu’a appeler cette fonction par notre délégué dans le code de votre Thread :

(nb: i est un Integer representant l’avancement du téléchargement dans notre application !)

C’etait simple non ? 🙂

Dev,.NET

Feb.09

AppDomain

Je m’étais intérressé il y a quelques semaines aux AppDomain sous .NET donc je vous en touche quelques mots 🙂

Les AppDomain ou domaines d’application sont des environnements dans lequelles vont s’executer votre programme. Ce sont en gros des processus mais au niveau du CLR .net !

Dés que vous lancez un programme .net il est chargé dans un nouveau domaine d’application qui contient votre programme .net (assembly) ainsi que les assembly qu’il a besoin pour fonctionner (réferences) ! .NET offre la possibilité, par System.AppDomain, de les controler.

Cela à 2 avantages :

  • la securite car le programme .net est dans un espace clos : le domaine.
  • les performances : tres utile dans le cas d’une application à plugins. On peut charger chaque plugins dans un domaine different du principal pour voir les décharger (tuer) a la volée !!

Pour plus d’infos, je vous conseille vivement 2 très bons articles et en francais s’il vous plaît :

Et sur ceux, bonne nuit 🙂

.NET