Blog de Grégory GHEZ

Pour chaque [ingénieur logiciel] qui affirme : "Personne ne s'embêtera à faire çà", vous trouverez un gamin en Finlande qui s'embêtera à le faire.  - Alex Mayfield

  Home :: Contact :: Syndication  :: Login
  37 Posts :: 4 Stories :: 3 Comments :: 0 Trackbacks

Article Categories

Archives

Message Categories

Liens

mardi 18 avril 2006 #

Mon blog a desormais changer d'adresse :

http://www.gregoryghez.com/

A bientot !

posted @ 15:13 | Feedback (19)

mercredi 5 octobre 2005 #

Je viens de terminer la rédaction d'un article sur ce sujet, disponible dès à présent sur le site du laboratoire .net à cette adresse : http://www.labo-dotnet.com/Articles/Office/Spreadsheet%20ML%20et%20génération%20de%20fichier%20Excel/0/1547.aspx
posted @ 22:23 | Feedback (9)

vendredi 23 septembre 2005 #

posted @ 14:30 | Feedback (21)

lundi 19 septembre 2005 #

Voici deux petites astuces qui vous permettront d'écrire en gras et italique des mots de votre conversation avec le client de messagerie de google.

_mot_ : mot

*mot* : mot

posted @ 19:29 | Feedback (112)

dimanche 18 septembre 2005 #

On se demande comment et d'où :)

posted @ 17:26 | Feedback (20)

jeudi 15 septembre 2005 #

Le constructeur se lance dans le système open source pour une gamme de portables destinés aux PME.
La distribution de Linux utilisée dans ces ordinateurs est la Mandriva Linux Discovery 10.1. HP a voulu offrir dans ces ordinateurs une version de Linux possédant un environnement de travail le plus abouti possible pour rivaliser avec Windows.

Un Dual boot avec Windows XP Pro est proposé par défaut au cas ou... ;)

 

Les détails de l'offre:

http://h41087.www4.hp.com/solutions/administrations/hpeduc/linux/offre_nc6120.html

posted @ 01:13 | Feedback (6)

mardi 13 septembre 2005 #

Microsoft sort prochainement une nouvelle version de sa suite Office, la version 12 (La 11 correspondait à Office 2003).

Voici un lien ou vous pourrez découvrir des captures d'écrans de ce nouvel opus:
http://pdc.xbetas.com/?page=o12preview1

 

La nouvelle barre d'outils Word:

posted @ 13:24 | Feedback (7)

lundi 12 septembre 2005 #

Je sais déjà que je vais me retrouver comme avec mon post sur le goto avec des 10aines de commentaires de défenseur des principes divins du .NET, mais çà m'est égal, j'adore vous voir dans cet état :)

Je me lance, dans ce post je vais vous montrer comment manipuler le contenu d'une image en .NET de la manière la plus rapide qu'il me semble faisable de faire: l'utilisation de code unsafe (pointeurs) mais toujours dans le but de gagner en performance et non d'obscurcir le code.

En effet, il existe une méthode de traitement dans la classe Bitmap qui permet de récupérer les données de l'image en mémoire. Il s'agit de la méthode LockBits :

Rectangle bmpRect = new Rectangle(0, 0, bmp.Width, bmp.Height); // bmp est de type Bitmap
BitmapData bmpData = bmp.LockBits(bmpRect, ImageLockMode.ReadOnly, bmp.PixelFormat);


L'objet BitmapData contient les données internes de l'image et notament un pointeur vers le début des données de l'image en mémoire. La propriété Scan0 remplit ce rôle:

byte* data = (byte*)bmpData.Scan0;

Inutile de préciser qu'à partir de ce moment, nous passons en mode non managé car nous faisons un accès direct à la mémoire via data. C'est pourquoi la méthode contenant ce code doit comporter le mot clé unsafe (Le projet doit également être compilé avec l'attribut /unsafe afin d'accepter ce code, voir les propriétés du projet dans VS.NET).

Nous avons donc accès à une zone mémoire linéaire qu'il va falloir comprendre comme un tableau à deux dimensions contenant les pixels aux coordonnées x,y de notre image. Voici comment est stockée l'image en mémoire et la relation entre cette représentation et les propriétés Stride et Scan0 de la classe BitmapData:

 (source: http://www.bobpowell.net/lockingbits.htm)

On utilisera donc le code suivant pour parcourir les pixels de notre image:

int i = 0;
for (int
x=0; x<bmp.Width; x++)
{
   for (int
y=0; y<bmp.Height; y++)
   {
      i = y * bmpData.Stride + x * 3;
      // manipulation du pixel ;)
   }
}


Il suffit donc d'indexer notre pointeur que l'on peut considérer comme un tableau afin d'obtenir les nuances rouge, vert et bleu (et alpha éventuellement) de notre pixel. Dans le cas présent mon image est enregistré en 24bpp donc les pixels se trouvent tous les x * 3 bytes.

data[i+2] // rouge
data[i+1] // vert
data[i] // bleu

Remarque: Lorsque vous créez une image avec l'instruction new Bitmap(...) sans préciser le paramètre PixelFormat, l'image est créée en 32bpp et il faut donc utiliser x * 4 pour parcourir l'image dans la formule précédente pour i (data[i+3] représente alors la nuance alpha).
Si vous souhaitez changer le contenu de data, cela est possible, il faut préciser le paramètre ImageLockMode de LockBits à ImageLockMode.ReadWrite ou ImageLockMode.WriteOnly.

Une fois que vous avez fini votre traitement, n'oubliez surtout pas d'appeler la méthode UnlockBits afin de permettre au Garbage Collector de disposer de cet espace mémoire à sa guise pour sa gestion.

bmp.UnlockBits(bmpData);

 

Voici la manière la plus simple en code managé pour parcourir une image:

for (int x=0; x<bmp.Width; x++)
{
   for (int
y=0; y<bmp.Height; y++)
   {
      Color c = bmp.GetPixel(x, y);
      // code de manipulation
   }
}

Le problème avec cette méthode se pose lorsque l'on doit manipuler des images de grande taille. On se trouve alors à effectuer bmp.Width * bmp.Height appels à la méthode GetPixel() ce qui ralentit considérablement l'éxécution de la routine.

Une autre méthode encore consiste à parcourir les informations accessibles par Scan0 via la méthode System.Runtime.InteropServices.Marshal.ReadByte(bmpData.Scan0, i). Mais vous voyez que le problème de GetPixel se retrouve ici car pour chaque nuance il va falloir faire appel à cette méthode.

N'hésitez pas à me soumettre vos idées sur le sujet.

posted @ 17:18 | Feedback (8)

dimanche 11 septembre 2005 #

Il s'agit d'une instruction très peu utilisée mais qui peut s'avérer fort utile dans certains cas.
goto sert à faire saut non-conditionnel vers un label référencé autre part dans le code.

Exemple:

string
[] tab = {"Bonjour", "les", "gens"};
foreach (string s in
tab)
{
   foreach (char c in
s)
   {
      if
 (c == 'e')
         goto
Suite;
   }
}
return;

Suite:
   MessageBox.Show("Le caractère 'e' a été trouvé dans une des chaînes.");

Dans cet exemple, on comprends bien l'intérêt du goto, qui permet de passer directement à la suite du code si le test est concluant. Si nous n'avions pas utiliser le goto, on aurait eu la construction suivante:

string[] tab = {"Bonjour", "les", "gens"};
bool present = false
;

foreach
(string s in tab)
{
   foreach (char c in
s)
   {
      if
(c == 'e')
      {
         present =
true
;
         break
;
      }
   }

   if
(present)
      break
;
}

if
(present)
   MessageBox.Show("Le caractère 'e' a été trouvé dans une des chaînes.");

On voit bien qu'au niveau de la lisibilité et des performances, l'instruction goto l'emporte, en effet, vous évitez un saut non-conditionnel ainsi qu'un test conditionnel. Vous gagnez également quelques lignes de code, ce qui n'est pas pour déplaire lorsque l'on traite avec des fichiers contenant plusieurs milliers de lignes.

Remarques:
Lorsque vous déclarez un label (Suite dans notre exemple), vous devez impérativement le faire suivre d'une instruction. En effet, s'il n'y avait pas d'instruction entre le label et la fin de notre méthode, cela reviendrait à faire appel à l'instruction return directement.
Vous ne pouvez pas non plus faire un saut non-conditionnel goto vers un endroit du code qui ne serait pas dans la portée du code éxécutant l'instruction goto (On ne peut pas faire un saut du dehors d'une boucle vers l'intérieure de celle-ci par exemple).

Lien MSDN

posted @ 02:37 | Feedback (39)

vendredi 9 septembre 2005 #

Vous devez déjà en avoir entendu parler un tout petit peu, il s'agit d'une méthode de développement web permettant de rendre les intéractions entre la page web (application web) et l'internaute plus fluides, comme s'il travaillait sur une application de bureau.

AJAX permet en effet en rendre transparent à l'utilisateur le chargement des différentes zones dynamiques de la page. Par exemple, supposez que l'on est un listing de produits sur un site ecommerce et que l'utilisateur cliques sur la fiche d'un produit. Il n'est pas nécessaire dans ce cas de figure de recharger tous les éléments décoratifs et de navigation (tels que les menus) du site.
Dans un site traditionnel, la page est rechargée avec un contenu central différent. Avec l'utilisation de la méthode AJAX, l'utilisateur ne voit que le contenu central qui change sans que la page ait eu besoin de se recharger.

Explication:
Lorsque l'utilisateur cliques sur le bouton pour afficher la fiche du produit, un code javascript s'éxécute, ce dernier va récupérer la fiche produit sur le serveur web puis remplacer le contenu du div central par le contenu de la fiche produit qu'il vient de récupérer dans une variable.
C'est donc le javascript qui va aller chercher la page à afficher.

 
Gmail est un très bon exemple de site utilisant AJAX. (Si vous possédez un compte pour tester bien sûr ;))

C'est une description très simplifiée de ce que permet de faire AJAX et je vous invite à lire cet article technique du site de Sun : http://java.sun.com/developer/technicalArticles/J2EE/AJAX/

posted @ 14:53 | Feedback (12)