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

Mar.16

AJAX, XMLHttp et le cache !!

En developpant le projet dotnet (lire mon post du 26/02/06) en XHTML/JS à la sauce AJAX, je me suis heurté à un problème de cache !
En effet que l’on utilise l’objet XMLHttpRequest pour Firefox & Co ou l’objet de IE (Microsoft.XMLHTTP), on appelle la méthode open et send pour récuperer un fichier XML par le code :

Le problème de cela, c’est qu’une fois le XML téléchargé, le navigateur le met dans son cache ! Si par la suite vous modifiez votre XML, votre application web ne tiendra pas compte des modifications même en rechargant la page (F5) ce qui est un peu embêtant !
Pour remedier à cela, une technique consiste a appeler la methode setRequestHeader pour définir le Cache-Control à no-cache par le code :

Le problème, c’est que ca marche PAS 😀 Enfin du moins sur pas mon Firefox…. ^^

La technique que j’ai implémenté est de passer des parametres uniques dans l’URL de notre fichier XML !
Je m’explique, les adresses URL http://monserveur/monfichier.xml?id=1 et http://monserveur/monfichier.xml?id=2 retourne tous les deux le même fichier à savoir monfichier.xml, ici les parametres n’ont aucune influence coté serveur mais pour le coté client, le navigateur (IE,FF,..) pense que ce sont 2 fichiers differentes car les URL ne sont pas identique et donc on contourne le problème de cache !!
Personnellement, j’utilise pour cela la fonction getTime() de l’objet Javascript Date qui retourne le nombre de millisecondes depuis le 1er Janvier 1970 ! On obtient bien un parametre unique a moins de déregler son horloge au millieme de seconde près ^^.
Le code final:

Elle est pas belle vie ?? ^^ 🙂

Perso,Dev

Mar.02

Qu’est ce qu’on s’amuse en ASM !!!!

Dans le cadre des cours d’architecture des ordinateurs a Supinfo, je me suis amusé a faire un petit programme COM pour processeur 8086 en assembleur qui calcule la somme des termes des lignes dans une matrice !! (un truc qui sert a rien, je sais !!!)

Le principe est simple, je definie une matrice de 4×3 dans mon programme et il m’affiche le resultat pour chaque ligne !

Exemple matrice nommé tab :

Definie en ASM par :

Le programme nous affiche :

(car 3+4+9=16, 14+11+2=27, etc….)

Sans en faire tout un roman, voici le code (env. 30 lignes) :

Wahou, vive la galère ^^ Heuresement qu’ils ont inventés les langages de haut niveau, parce que voila la galère pour faire un programme relativement simple (….et sans interêt d’ailleur ^^) !

A noter aussi que mon programme ne gere que 2 octects à l’affichage (AH et AL = 8 + 8 = 16bits), ce qui fait que la valeur maximum est 99 à l’affichage, au dessus ca affiche divers caractères !!

Au passage, un grand merci a Alex C. (a.k.a EvilSnake) pour son aide au niveau de la gestion de l’affichage des resultats a l’ecran !! C’est toujours un plaisir de coder avec toi 🙂

Téléchargez le fichier code source ASM

Perso,Dev

Feb.26

AJAX

Dans le cadre de mon projet Dotnet, je me suis mis a utiliser AJAX ^^ C’est pourquoi, je vais brievement vous exposer ce qu’est AJAX avec un petit exemple d’utilisation car je sais que tout le monde préfere la pratique que la théorie !!

AJAX késako ??
Non non je ne fais pas le ménage à l’eau de javel ^^ AJAX c’est tout simplement l’avenir du Web (concept Web 2.0) ! AJAX pour Asynchronous JavaScript And XML (en francais : « XML et Javascript asynchrones ») est une méthode de développement des applications Web !
En effet tous les échanges client<>serveur se font en arrière plan dans des fichiers XML pilotés avec des scripts JS !

Sans AJAX : actuellement, quand vous êtes sur une page A d’un site et que vous demandez la page B, votre navigateur web (IE, Firefox, ..) renvoie une requête HTTP demandant la page B, le serveur vous reponds en vous envoyant tout le code HTML (+ JS, images, CSS, …) de cette page !

Deux inconvenients :

  • on renvoie une requete HTTP, c’est long, le navigateur devient tout blanc, faut le temps qu’il charge la nouvelle page !!!
  • et surtout, c’est bête de tout recharger car en général sur un site, la difference entre 2 pages n’est que le contenu; les menus, l’habillage graphique (design) reste identique !!

Avec AJAX : maintenant grâce a AJAX on resoud ces deux problemes :

  • Avec navigateur charge tout le code HTML de la page A (+ images, css, et scripts JS nottament pour gérer l’AJAX)
  • Quand vous demandez la page B, votre navigateur ne bouge pas, c’est un script JS qui derrière va venir telecharger un fichier XML contenant juste le contenu de la novelle page !

Deux avantages :

  • Impression d’instantané, le contenu arrive sans voir le chargement !
  • Impression d’instantané renforcé par le fait que seul le fichier XML contenant le contenu de la nouvelle page transite par le reseau, ce qui reduit enormement les echanges client<>serveur (le design n’est chargé qu’une seule fois pour la 1er page !)

En une phrase, AJAX va donc révolutionner les applications Web 🙂

Pour plus d’info sur AJAX :http://fr.wikipedia.org/wiki/AJAX
Des exemples AJAX: http://fr.wikipedia.org/wiki/AJAX#Liens_externes

Bon passons à la pratique

Pour cet exemple, on nous allons créer une page qui liste les éléves de ma classe 🙂 Pour cela, nous créons un fichier XML contenant les données :

Vous remarquerez que les ID, Sexe et Age sont contenu dans les attributs de la balise studient alors que les noms sont dans la balise ! (ps: désolé pour les autres éléves, je n’ai pas tout mis, ca veux pas dire que je ne vous aimes pas :-)) L’on nommera ce fichier : eleves.xml

Créons maintenant la page HTML de base doctypé en XHTML 1.0 Strict :

Cette page contient une fonction Javascript : update() qui contiendra tout le code JS pour l’ AJAX, une balise DIV nommé contenu où sera affiché la liste des éléves ainsi qu’un bouton nommé update qui appelera notre fonction update().

Il nous reste plus qu’a ecrire le code de notre fonction update() ! Commencons par definir quelques variables que nous initialiserons :

La variable browser nous permet de savoir si l’on utilise IE ou Firefox (and co comme Opera, etc…) ! En fonction du navigateur, l’on utilise soit l’ActiveX Microsoft XMLHTTP et XMLDOM pour IE ou XMLHttpRequest et createDocument pour les amis de Firefox !

Nous allons maintenant télécharger le XML grace a notre objet objXMLHTTP et stocker dans notre objet objXML grace au code :

Il nous reste plus qu’a exploiter le contenu du XML pour l’afficher ! Pour cela nous allons définir une variable out qui contiendra le code HTML a afficher dans notre balise DIV contenu ainsi qu’une variable nbEleves pour contenir le nombre d’eleves afin d’en faire une boucle.

Nous allons maintenant faire une boucle pour le nombre d’eleves de notre fichier XML et remplir notre variable out par le code :

Vous remarquerez que pour récuperer le contenu d’une balise (et non ses attributs) soit ici le nom de l’eleve, cela differt selon le navigateur que l’on utilise. Sous IE nous utilisons la proprieté text alors que sous Firefox & Co c’est la proprieté textContent.

Il nous reste plus qu’a afficher notre variable out dans notre DIV :

J’ai rajouté l’heure, cela est biensur facultatif !!

Vous pouvez vous amusez à modifier le contenu dans notre fichier XML (eleves.xml) et cliquez sur le bouton « Mise a jour AJAX » de notre page pour voir que celle ci se met a jour sans pour autant faire un allé-retour sur le serveur 🙂

Cet exemple est certe très simple mais ouvre les pleins de voie, a vous de faire marcher votre imagination… Moi je dis, vive AJAX 😀

(Page complete : https://sebastien.warin.fr/…/ajax.txt)

Perso,Dev

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.07

MacroSeb.GenererProprietes()

Je vous présente ma petite macro pour VS 2005 que j’ai ecris la semaine derniere en cours de prog. evenementielle avec Rédo!
Elle permet très rapidement de créer des propriètes (champs et accesseurs associés) en VB.net ou C# (detection automatique !). Une petite approche de la RAD de type bruteforce ^^

Exemple en C#:

J’écris dans mon fichier source:

J’execute ma macro, et elle me remplace le tout par :

Ce qui me fait gagner énormement de temps dans mes developpements… Et elle le fait aussi bien en VB.net (elle detecte au préalable l’extention du fichier source ! « .cs » = code c# ou « .vb » = code VB)

Niveau code, rien de bien compliqué, moins de 150lignes, elle commence par récupérer l’extention du fichier pour choisir le langage à generer en sortie, puis elle enregistre dans un tableau a 2 dimensions le nom de la propriete et son type, elle efface tout puis ecrit dans le bon langage, les champs (privés) et les accesseurs (get/set public).

A noter: pour que la macro fonctionne, vous devez ecrire une seule propriete par ligne de la facon suivante : <nom> <type> (ex: nom string)

Télécharger la macro ici

Perso,Dev,.NET

Feb.05

Un escargot dans une matrice !!!

Titre un peu surprenant je vous l’accorde 🙂

Dans le cadre de mon projet SimImmuno II, j’ai besoin de connaître quelles sont les cellules qui avoisine une cellule donnée. Pour cela, chaque cellule est placée dans une matrice (tableau à deux dimensions !).

Le but de l’algorithme est de parcourir cette matrice à partir d’un point donnée (la position de la cellule) en tournant autour comme un escargot.

Petit exemple illustré :

Pour ne penser qu’à l’algorithme oublions les histoires de cellule. Prenons un tableau de 100×100 avec un point de référence aux coordonnées 50;50.

Nous voulons juste récupérer les coordonnées des positions autour de notre point de référence qu’empruntera notre escargot (Il suffira après de tester si aux coordonnées visitées il y a ou pas la présence d’une cellule).

Dans notre cas, les coordonnées à visiter sont : 50;49, 51;49, 51;50, 51;51, 50;51, 49;51, 49;50, 49;49, etc…

Si l’on illustre ça par le schéma :

On peut observer que l’on avance de x cases suivant notre avancement par multiple de 2 : 2 fois 1case, 2fois 2cases, 2fois 3cases, 2fois 4 cases, etc… L’on appellera cela le nombre de pas qui s’incrémentera tous les 2 avancement. Puis l’on « tourne » : Haut->Droit->Bas->Gauche->Haut->etc…

Pour coder ca en c#, définissions tout d’abord une énumération pour la direction :

Nous allons maintenant créer une fonction Tourner qui prend en argument la direction précédente et retourne la nouvelle direction de cette maniere : Haut->Droit->Bas->Gauche->Haut->etc.. Ce qui nous ammene à écrire :

Maintenant, il nous faut une fonction nous permettant de nous renvoyer les coordonnées de la prochaine position en fonction de la position précédente, du nombre de pas et de la direction (a noter que les positions sont matérialisés par l’objet Point possédant les propriétés X et Y) :

Une fois tout cela créé, il nous reste plus qu’a créer la fonction principale du programme composée de 3 boucles :

  • La 1er, boucle de 0 au nombre de pas (nommé jump) et calcule les prochaines positions.
  • La 2eme, boucle de 0 a 2 et appelle la 1er boucle, incrémente jump puis appelle la fonction Tourner
  • Enfin la dernière, de 0 a X où X le point d’arrêt.

Le code donne :

Et voila le tour est joué ! Si l’on s’amuse a mettre le code :

à l’endroit de Insérer le code voulu ! nous obtenons :

Facile non ? 🙂

Dev,Algo,.NET