Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Liste de jeux pour Silverlight

dans les commentaires de mon post précédent, silverlight girl m'a signalé la présence du pacman dans sa liste de jeux que je vous invite à visiter (http://www.mashooo.com/).

à l'heure actuelle cette liste est constituée de 33 jeux, à noté que c'est aussi une application Silverlight.

Posté le par pierrick | 0 commentaire(s)

Et je mets le son....

un pacman avec du son c'est plus sympa, non ?

j'ai ajouté quelques fonctionnalités

- le son
- les bonus
- les scores flottants
- le mode plein écran

 

amusez vous bien !

Posté le par pierrick | 3 commentaire(s)

un Pacman en Silverlight 2b2

Après un Sudoku, un pacman...mais n'allez pas penser que Silverlight est fait que pour faire des jeux. :-)

 

il n'est pas tout à fait terminé, mais il est fonctionnel.

(cliquer sur le contrôle pour lui donner le focus avant de commencer)

Il manque encore :

  • les bonus
  • la sauvegarde du meilleur score
  • la gestion des sons
  • La gestion de la collision  n' est pas parfaite
  • animations diverses
  • ...

Bon jeu

Posté le par pierrick | 3 commentaire(s)

Sudoku Silverlight 2b2...

Migration vers silverlight 2 béta 2 réussie, et il est possible maintenant de sauvegarder ses parties (dans la limite du stockage offert par Silverlight) :-)

 

 

Bon jeu !

Posté le par pierrick | 1 commentaire(s)

Future<> is Parallel

Le jeu de mot est facile...

J'ai participé à la présentation sur le développement parallèle animée par Steve Teixeira et Keith Yedlin.

Il nous ont présenté la vision de Microsoft sur le développement parallèle,  le fil conducteur est "simplifier" .  

  • simplifier le code client (ne pas polluer le code avec une gestion de Thread, synchronisation,...)
  • simplifier l' utilisation/ l' accès  aux ressources de calculs (multi-processeurs)

pour cela il existe un framework Parallel Fx, qui sera intégrer au framework .Net dans le futur. Ce framework est divisé en deux grandes parties

  1. PLINQ (Parallel LINQ)
    • permet dexecuté des requêtes LINQ en parallèle
  2. TPL (Task Parallel Library)
    • permet de gérer des tâches parallèles

disponible en CTP ici

Un autre point très intérressant fut abordé, le déboggage. En effet déboguer une application contenant des traitements parallèles n' est une chose facile. Microsoft planche actuellement sur une serie d' outils d' aide au déboggage intégrés à Visual Studio, afin de faciliter la maintenance de nos algorithmes parallèles, Steve Teixeira nous à montré une preview dans Visual Studio. Ces outils montre quelles sont parties de notre code en cours d' exécution parallèle, ainsi que la pile d' appel est "filtrée"(pour ne voir que notre code, c' est à dire  en masquant les différents appels intermédiaires de la "tuyauterie").

et enfin ils nous montrés un outil d' analyse, qui affiche la répartition de notre code sur les différents processeurs, les points de synchronisation (qui dans un monde parallèle sont des goulets d' étranglement) 

 

comme le disait l' intitulé de la session nous sommes "..à l' aube de l' ère parallèle"

 

ps : pour ceux qui n' étaient pas présent ne rater pas le webcast...

Posté le par pierrick | 4 commentaire(s)

PFx 2ème CTP disponible

l'equipe PFX, vient d'annoncer la disponibilité de la deuxième CTP du framework parallèle  pour .NET

 

blogs de l'equipe : http://blogs.msdn.com/pfxteam/archive/2008/06/02/8567802.aspx

téléchargement du la CTP: http://www.microsoft.com/downloads/details.aspx?FamilyId=348F73FD-593D-4B3C-B055-694C50D2B0F3&displaylang=en

 

parallèlement votre !

Posté le par pierrick | 1 commentaire(s)

Silverlight 2 beta 2, (breaking changes...)

 

Les changements entre la béta 1 et béta 2 sont nombreux, cette liste est disponible  ici.

 

un autre changement qui n'est pas listé, est le suivant :

public partial class Page : UserControl
{
   
public Page()
    {
        InitializeComponent();
        Presenter =
new PagePresenter(this);
        MyProperty = 123;
       
this.Loaded += new RoutedEventHandler(Page_Loaded);
    }

   
void Page_Loaded(object sender, RoutedEventArgs e)
    {
       
//this.DataContext = this;
        this.DataContext = Presenter;
    }

    #region properties
   
public PagePresenter Presenter
    {
       
get;
       
private set;
    }
    
    
   
int _MyProperty;
   
public int MyProperty 
    {
       
get { return _MyProperty; }
       
set { _MyProperty = value; } 
    }      
    
    #endregion

impossible d'affecter au DataContext de la page "this, Parent, ...", alors que cela est possible en béta1 et en WPF.

Ce qui en réflechissant n'est pas forcement un mal. Cela nous obligera à utiliser encore les patterns MVP (Model View Presenter), MVVM (ModelView-ViewModel) . Mais hélas pour des petites applications tests, cela nous oblige à ecrire plus de code...

 

à suivre..

Posté le par pierrick | 5 commentaire(s)

Un autre jeu en Silverlight 2.0b1

Je vous propose un sudoku en ligne, j'avais déjà réalisé les versions PDA, Windows Forms, WPF, il ne manquait plus que Silverlight. c'est chose faite,  non sans mal. Il manque pas mal de controls/composants/classes. En bref dans le framework Silverlight, il y a de tout mais en petite quantité...:-)

Pour passer de WPF à Silverlight, il faut tout même repenser un peu son application.

  1. il n'y a que le clic gauche
  2. Pas de DrawingBrush
  3. Pas de GroupBox
  4. Pas de ViewBox
  5. Pas d'Expander
  6. Impossible de surcharger la classe FrameworkElement
  7. revoir l' ensemble des storyboard
  8. revoir l' ensemble du binding

et je pense que j' en oubli..., enfin tout ce que j' utilisais dans la version WPF a due être changé ou refait.

la bonne nouvelle, c' est que je n' ai pas eu à toucher une seule ligne de code de mon modèle de donnée et algorithme de contrôle.

malgré ces quelques 'contraintes' le résultat est très satisfaisant et jouable, essayez !

il me reste à tester la sauvegarde des parties dans le 'local storage' (prochaine version ;-))

En conclusion ce framework est petit mais très puissant !

bon amusement !

 

ps: vous pouvez le tester en pleine page ici

Posté le par pierrick | 7 commentaire(s)

Silverlight 2.0b1 & binding

une limite que je trouve génante sur le binding dans silverlight :

- il n'est pas possible de binder un contrôle visuel une propriété d' une classe qui n'est pas public

image

il suffit de changer la visibilité de MyClass, et de la mettre 'public', en attendant la prochaine beta

Posté le par pierrick | 3 commentaire(s)

Sérialisation XAML ...

La sérialisation XAML est très pratique, mais elle influe sur le 'design' de nos classes.

prenons un exemple :

public class MyClass
{
   
public MyClass()
    {
        Children =
new List<MyClass>();
    }

   
public int MyProperty { get; set; }

    [
DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
   
public List<MyClass> Children { get; set; }
}

une classe très simple, qui utilise une des nouveautés de C# 3.0 les propriétés automatiques, et c' est malheureusement ce fonctionnalité qui pose problème avec la sérialisation.

 

le programme sérialisation/désérialisation

class Program
{
   
static void Main(string[] args)
    {
       
MyClass instance = new MyClass { MyProperty = 123};
        instance.Children.Add(
new MyClass { MyProperty = 456});
        
       
string xaml = XamlWriter.Save(instance);

       
Console.WriteLine(xaml);

       
MyClass root = (MyClass)XamlReader.Load(XmlReader.Create(new StringReader(xaml)));

       
Console.WriteLine("enter to quit");
       
Console.ReadLine();
    }
}

 

mais dès la première exécution...

image

qu'a cela ne tienne, il suffit mettre en privée le set

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
   
public List<MyClass> Children { get; private set; }

mais maintenant c'est à la lecture qui ça "plante"

image

ok pas de problème, je vais supprimer le 'set', mais du coup je perd la notation automatique des propriétés

public class MyClass
{
   
List<MyClass> _Children;

   
public MyClass()
    {
        _Children =
new List<MyClass>();
    }

   
public int MyProperty { get; set; }

    [
DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
   
public List<MyClass> Children { get { return _Children; } }
}

effectivement le problème se pose surtout sur les propriétés de type collections.

Le temps que l' on a gagné en utilisant cette nouvelle notation pour nos propriétés on le perd en partie, lorsque l'on veut utiliser le format XAML pour le sérialisation.....

Posté le par pierrick | 5 commentaire(s)

un moteur de databinding pour Silverlight 2.0 b1

Je vous présentais il y a quelques temps, un moteur de databinding pour le Framework 2.0  (ici et ici). Je l'ai porté pour silverlight 2.0.

L'exercice de portage fut intéressant...

En effet le CLR silverlight 2.0 étant plus réduit en taille et en fonctionnalités.

  • IBindingList n'existe pas
  • [Serializable] n'existe pas
  • SynchronizationContext n'existe pas
  • ...

Bref un certain  nombre de petits changements qu' ils faut contourner pour faire fonctionner un assemblage prévu  pour le CLR 2.0 en Silverlight 2.0.

Le tout est sur codeplex !

Posté le par pierrick | 0 commentaire(s)

Nouvelle version de F# (1.9.4.15)

Une nouvelle version de F# est disponible sur le site de Microsoft Research  . Pour les détails de cette version je vous renvoie au post de Don Syme, c'est impressionnant !

Posté le par pierrick | 0 commentaire(s)

IPod touch / WPF

Heureux possesseur d' un ipod touch, je trouve l' ergonomie de ce PDA(, lecteur MP3) très intuitive.

image image

Vous désirez intégrer ce look dans vos application windows ?

je vous est concocté une libraire WPF contenant

  • le page scroller

image

    • ce contrôle qui vous permet de faire défiler les pages horizontalement
  • le Button, la Listbox, la Checkbox (façon interupteur)

image

en voici un aperçu !

image

Le tout est disponible sur codeplex : http://www.codeplex.com/WpfIpodControls

Posté le par pierrick | 0 commentaire(s)

Quiz C#

En partant avec Mistu pour Seattle, devinez le sujet de discussion......

Pour ceux qui le connaisse, vous savez qu' il a toujours plus d' un quiz dans son sac.

 

prenons deux classes

image

lors de l' instanciation de la classe Dog, dans quel ordre s' exécute les constructeurs  ?

class Program
{
   
static void Main(string[] args)
    {
       
Dog d = new Dog();
       
Console.ReadLine();
    }
}

class Animal
{
   
public Animal()
    {
       
Console.WriteLine("Animal constructor");
    }
}

class Dog : Animal
{
   
public Dog()
        :
base()
    {
       
Console.WriteLine("Dog constructor");
    }
}

 

c' est relativement facile, le constructeur de la classe "Animal" est exécuter en premier.

Ajoutons des membres.

class Program
{
   
static void Main(string[] args)
    {
       
Dog d = new Dog();
       
Console.ReadLine();
    }
}

class Animal
{
   
int _age = 0;

   
public Animal()
    {
       
Console.WriteLine("Animal constructor");
    }
}

class Dog : Animal
{
   
int _category = 1;

   
public Dog()
        :
base()
    {
       
Console.WriteLine("Dog constructor");
    }
}

1) à quel moment ces membres sont initialisés ces membres ?

2) dans quel ordre sont initialisés "_age" et "_category" ?

si vous copier le code dans Visual Studio, et que vous placez des points d' arrêts sur les constructeurs et membres vous obtiendrais le résultat suivant :

 

- initialisation de "_category"

- initialisation de _"age"

- exécution du constructeur Animal

- exécution du constructeur Dog

 

Mais pourquoi les membres sont initialisés dans le sens inverse (Dog, puis Animal) de l' exécution des constructeurs ?

La raison est simple : c' est à cause de la polymorphie.

En effet depuis le constructeur Animal, il est possible de faire appel à une méthode polymorphe, qui serait surchargée par Dog.

class Animal
{
   
int _age = 0;

   
public Animal()
    {
        testMethod();
       
Console.WriteLine("Animal constructor");
    }

   
protected virtual void testMethod()
    {
    }
}

class Dog : Animal
{
   
int _category = 1;

   
public Dog()
        :
base()
    {
       
Console.WriteLine("Dog constructor");
    }
   
protected override void testMethod()
    {
       
Console.WriteLine("Dog testMethod");
    }
}

Ainsi lors de l 'exécution de Dog.testMethod(), "_category" est initialisée alors que le constructeur n' a pas été encore exécuté.

 

Il est vrai que l'on ne pose pas tous les jours ce genre de questions, mais il toujours intéressant de savoir comment ça marche.

Posté le par pierrick | 6 commentaire(s)

Problème de binding en WPF

Qui n' a jamais eu de problème de binding avec WPF,... a part celui qui ne fait de WPF,.... ?

j' entends par problème de binding, le fait que le binding ne se réalise pas,...

par exemple :

- nom de propriété inexistante (erreur de frappe, ou autre)

- DataContext est null ou qui pointe sur un autre objet que celui attendu, lors de l' initialisation du binding.

 

depuis le framework 3.5, il est possible d' activer les traces dans le XAML.

 

Beatriz en parle très bien

http://www.beacosta.com/blog/?p=52

et ce post que je trouve très didactique :

http://blogs.ugidotnet.org/ccavalli/archive/2008/04/03/92032.aspx

 

à garder dans vos favoris...

Posté le par pierrick | 1 commentaire(s)

WPF, Un canvas virtuel

WPF nous fournit par défaut un 'VirtualizingStackPanel' qui nous permet de virtualiser les éléments graphiques dans une listbox ou une lisview. Sur le blog "WPFPerformance" vous trouverez un exemple de canvas virtuel écrit par Chris Lovett.

image  

L'exemple est très didactique. De plus un "white paper" est fournit, qui nous explique que l' implémentation est basé sur un QuadTree.

Posté le par pierrick | 0 commentaire(s)
Classé sous :

LINQ un pas vers le langage fonctionnel ... ?

Quand on commence à utiliser LINQ (C#) tous les jours, on ne peu plus s' en passer. Si bien que j' ai remarqué que l' on peut trouver une certaine ressemblance à F# dans l' écriture, notamment sur les pipelines.

prenons un exemple (QSort sur un IEnumerable) :

public static IEnumerable<T> QSort<T>(this IEnumerable<T> source) where T : IComparable<T>
{
   
if (!source.Any())
       
return source;

   
var pivot = source.First();
   
var rList = source.Skip(1);

   
var pivotLeft = from X in rList
                   
where X.CompareTo(pivot) < 0
                   
select X;
   
var pivotRight = from X in rList
                    
where X.CompareTo(pivot) >= 0
                    
select X;
   
return pivotLeft.QSort().Union(new T[]{pivot}).Union(pivotRight.QSort());
   
//return rightList.Where(X => X.CompareTo(pivot) < 0 ).QSort()
    // .Union(new T[] { pivot })
    // .Union(rList.Where(X => X.CompareTo(pivot) >= 0).QSort());
   
//ou
    //var left = rList.Where(x => x.CompareTo(pivot) < 0).QSort();
    //var right = rList.Where(x => x.CompareTo(pivot) >= 0).QSort();
    //return left.Union(new T[] { pivot }).Union(right);

}

et la même fonction en F#

let rec qsort source =
 
match source with
  | [] -> []
  | pivot::rightList
-> 
   
let left =  rightList |> List.filter (fun x -> x < pivot) |> qsort;
   
let right = rightList |> List.filter (fun x -> x >= pivot) |> qsort;
    left @ pivot :: right

 

évidemment le pattern matching n' existe pas en LINQ (C#), mais on reconnaît facilement les différentes étapes:

public static IEnumerable<T> QSort<T>(this IEnumerable<T> source) where T : IComparable<T>
{
   
if (!source.Any())  
       
return source;  //[] -> []

   
var pivot = source.First(); //pivot::rightList ->
   
var rList = source.Skip(1);

   
var pivotLeft = from X in rList //List.filter (fun x -> x < pivot)
                   
where X.CompareTo(pivot) < 0
                   
select X;
   
var pivotRight = from X in rList //List.filter (fun x -> x >= pivot)
                    
where X.CompareTo(pivot) >= 0
                    
select X;

    //left @ pivot :: right
   
return pivotLeft.QSort().Union(new T[]{pivot}).Union(pivotRight.QSort());

    //var left = rList.Where(x => x.CompareTo(pivot) < 0).QSort();
    //var right = rList.Where(x => x.CompareTo(pivot) >= 0).QSort();
    //return left.Union(new T[] { pivot }).Union(right);
}

la ressemblance est peut être plus frappante en utilisant l' écriture "Method Syntax" (en commentaire dans le code ci-dessus). Nous sommes bien loin du C# 1.0..., merci LINQ !

dans un avenir plus ou moins proche, n' y aura t-il pas une convergence entre ces langages ?

Posté le par pierrick | 3 commentaire(s)

"PowerCommands" un addin sympatique pour VS 2008

Après CoolComands qui est un addin très pratique pour Visual studio 2005, Microsoft nous livre sa version nommée "PowerCommands" pour VS 2008.

image

J'apprécie le "Remove and Sort Usings" sur un projet complet !

 

avec tous ces addins, il va falloir inventer une "ribbon bar" sur le clic droit.....

Posté le par pierrick | 1 commentaire(s)

Vidéo sur "Inside Task Parallel Library"

Le parallélisme étant à la mode, surtout une réalité ....

image

il va bien falloir les occuper mes processeurs :-)

Joe Duffy, Huseyin Yildiz, Daan Leijen, Stephen Toub, nous montrent le fonctionnement de TPL, et ce que le futur nous réserve en termes de parallélisme. tout simplement époustouflant !

Posté le par pierrick | 0 commentaire(s)

Récursif & parallèle...

un excellent article de l' équipe PFX (Parallel Framework), sur comment parallèliser un algorithme récursif tel que le parcours d' un arbre, le tri "quickSort", "MergeSort" sans passer par PFX. Et Vous l' aurez compris l' article se termine en nous montrant que l' utilisation de ce framework est aussi adapté aux algorithmes récursifs.

exemple :

public static void Process<T>(Tree<T> tree, Action<T> action)
{
   
if (tree == null) return;

   
// Process the current node, then the left, then the right
    action(tree.Data);
    Process(tree.Left, action);
    Process(tree.Right, action);
}

//With PFX
public static void Process<T>(Tree<T> tree, Action<T> action)
{
   
if (tree == null) return;
    Parallel.Do(
        () => action(tree.Data),
        () => Process(tree.Left, action),
        () => Process(tree.Right, action));
}

source : http://blogs.msdn.com/pfxteam/archive/2008/01/31/7357135.aspx

Posté le par pierrick | 1 commentaire(s)
Plus de Messages Page suivante »


Les 10 derniers blogs postés

- [Expression Web] Astuce de la Semaine : Utilisation et Configuration des Extraits de Code par Chronos, Blog d'un Intégrateur .NET le il y a 4 heures et 11 minutes

- Faire de l'AJAX sans restrictions de domaine par Kévin Gosse le il y a 6 heures et 40 minutes

- [IronPython] : IronPython & Silverlight 2 - Part II par Kim's Blog le 07-22-2008, 14:50

- [WPF] Des requêtes NDepend pour analyser vos projets WPF par Thomas Lebrun le 07-21-2008, 09:27

- Liste de jeux pour Silverlight par Pierrick's Blog le 07-20-2008, 14:37

- T_PAAMAYIM_NEKUDOTAYIM par MadMatt le 07-19-2008, 16:16

- Et je mets le son.... par Pierrick's Blog le 07-19-2008, 12:09

- SharePoint : Comment interdire l’accès à un utilisateur pour tous les sites d’une Web Application par Blog Technique de Romelard Fabrice le 07-18-2008, 19:05

- VPC - Reset de la position de la console par Blog technique de Nicolas Boonaert le 07-18-2008, 16:29

- Un bug dans IE rendra cette page… non-imprimable ! par Le blog de FremyCompany le 07-18-2008, 15:33