L’énergie

30. novembre 2010

L’une des prochaines révolutions technologiques vraiment primordiales sera à mon sens une révolution autour de l’énergie. Notre civilisation, si elle veut continuer à progresser doit impérativement résoudre cet épineux problème de l’approvisionnement énergétique.

Quand je vois le gaspillage actuel ou nous devons bruler de la matière (pétrole, charbon, gaz) pour faire bouillir de l’eau pour faire tourner des bobines ca me sidère.

Même les centrales nucléaires ne sont pas plus avancer techniquement, elles restent des grosses bouilloires (même si la manière de faire bouillir l’eau est différente).

Pour ma part (et du haut de toute mon incompétence) je me dis qu’un jour nous aurons accès à de l’énergie illimitée. J’en veux pour preuve la célèbre formule d’Einstein : e=mc². Ce qui pourrait se traduire par l’énergie est égale à la masse d’un objet multipliée par la vitesse de la lumière (300 000 km/s) au carré. Donc en gros si l’on arrivait à convertir totalement la masse d’un objet en énergie on aurait accès à une masse d’énergie phénoménale.

Bien entendu, tout cela reste aujourd’hui de la science-fiction mais j’ai espoir. De toute manière la conquête de l’espace (notre prochaine étape, soyons en sûr) passera par une bien meilleure maitrise de l’énergie.

Philo

UrzaGatherer 2.1

22. novembre 2010

UrzaGatherer 2.1 vient juste de sortir. Cette version ajoute le support de l’évaluation du prix des cartes.

Donc pour la petite histoire, l’intégralité est estimée à plus de 50.000€. Ca calme.

image

Les cartes les plus chères sont bien sur les plus rares:

image

Le Black Lotus (Alpha) reste le grand champion avec plus de 3000€ l’unité (vous noterez que l’icone en début de ligne montre que je ne l’ai pas, donc si vous cherchiez une idée de cadeau pour Noel…)


Le tout disponible sur Codeplex: http://urzagatherer.codeplex.com/

UrzaGatherer

C’est ma fore ?

17. novembre 2010

Ah!ah! Mon dieu que c’est drôle. Donc le sujet du jour est l’usage du sémaphore.

Le problème à la base est le suivant: J’utilise la TPL (Task Parallel Libray) de .NET pour effectuer des requêtes WEB en parallèle. Le code en question donne donc:

foreach (IHTMLElement el in (IHTMLElementCollection)document.body.all)
{
    if (el.tagName == "A")
    {
        string uri = el.getAttribute("href").ToString();
        tasks.Add(Task.Factory.StartNew(() => Process(uri)));
    }
}

Task.WaitAll(tasks.ToArray());

Dans la méthode Process, il y a principalement l’appel à une URI pour récupérer une image:

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
WebResponse webResponse = webRequest.GetResponse();

Grâce à la TPL, mon code va donc être exécuté et schedulé par le framework et je vais pouvoir profiter à fond de tous les coeurs de mon ordinateur (ordinateur de bourgeois, il faut bien l’admettre car il contient 8 coeurs).

Notons au passage que j’ai ici fait le choix de faire explicitement des tasks mais que j’aurai pu écrire le même code sans les tasks en utilisant Parallel.ForEach.

 

Toutefois, il y a un hic. En effet, le site que je requête ne permet que 4 connexions en simultanée en provenance d’une même adresse IP. Or, ici je vais avoir de nombreuses tâches qui vont se lancer et qui vont donc générer de nombreuses connexions web. Le problème c’est que les quatre premières vont bien passer mais les suivantes vont être mises en attente par le serveur et risqueront très probablement de partir en timeout.

Il faut donc que je contrôle mes tasks (ou mon Parallel.ForEach) pour que les ordres ne soit pas plus de 4 à s’exécuter à la fois.

On pourrait bien sûr (comme je le vois si souvent sur les superbes architectures que je croise un peu partout) monter une usine à gaz monstrueuse qui s’occuperait de séquencer les jobs, de mettre en attente les envois de tasks, etc..

Mais on pourrait aussi être pragmatique et utiliser les outils à notre disposition. Et c’est là qu’entre en jeu le sémaphore (tadammmm!!!).

Ce dernier (et ceci depuis la nuit des temps, au moins) permet de contrôler l’accès à des ressources en nombre limité. Et c’est exactement ce que j’ai ici : je ne peux avoir que 4 requêtes en simultanées. Je vais donc juste déclarer un sémaphore ayant 4 ressources:

Semaphore semaphore = new Semaphore(4, 4);

Puis dans ma méthode Process (celle donc qui est exécutée par les tasks), je vais juste rajouter deux lignes (une tout au début et une tout à la fin) qui auront pour but de contrôler l’accès à la ressource:

semaphore.WaitOne();
...
semaphore.Release();

Ainsi, les 4 premières tasks passeront sans problème la barrière du WaitOne (qui décrémentera en interne le nombre de ressources disponibles) et à partir de la 5ème task, l’appel sera bloqué (de manière passive bien sur).

Dès qu’une task arrive sur le Release, elle libérera une ressource débloquant par la même une task en attente. Ainsi j’ai bien la garantie que mes requêtes web ne partiront pas en timeout et ceci avec un impact minimal Sourire

Donc vive TPL et les sémaphores!

.Net, TPL

Collecto bascule sur SQL Azure

16. novembre 2010

Bon certains me diront (à juste titre) que je suis un peu piquouzé Microsoft mais force est de constater que la réalité est là : j’ai basculé le serveur de données de Collecto vers SQL Azure en moins de 20 minutes!

Ma base de données SQL Server 2008R2 qui au préalable était hébergé sur une Dedibox vient donc de migrer vers SQL Azure (sur un datacenter européen).

Rien à dire de plus, c’est propre, ça marche bien. Bravo!

 

Collecto

Tutorial : Utilisation simple de LINQ pour gérer le tri d’une listbox

10. novembre 2010

Voici notre problématique du jour : avoir une listbox affichant une liste d’objets avec la nécessité de trier selon 3 critères chacun portant sur une propriété différente de nos objets.

Pour notre exemple, les objets sont de ce type:

public class UserProxy
{
    public Guid ID
    { set; get; }
    public string Login
    { set; get; }
    public DateTime Date
    { set; get; }
    public DateTime LastConnection
    { set; get; }

    public string Mail { get; set; }
}

Le but est de pouvoir trier par Login, Date et LastConnection.

Mise en place de la ListBox


Rien de compliqué ici, une simple ListBox avec un DataTemplate permettant d’afficher le Login et la LastConnection:

<ListBox Grid.Row="1" x:Name="lstUsers" >
<ListBox.ItemTemplate> <DataTemplate DataType="UserProxy"> <Grid ToolTip="{Binding Mail}"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition/> <ColumnDefinition Width="Auto"/> </Grid.ColumnDefinitions> <Image Source="user.png" Width="20" Height="20" Margin="4"/> <TextBlock Text="{Binding Login}" FontSize="24" Grid.Column="1"
Margin="10,0" VerticalAlignment="Center"/> <TextBlock Text="{Binding LastConnectionString}" FontSize="14"
Grid.Column="2" Margin="5,0" FontStyle="Italic" VerticalAlignment="Center"/> </Grid> </DataTemplate> </ListBox.ItemTemplate> <ListBox.FocusVisualStyle> <Style TargetType="ListBoxItem"> <Setter Property="Foreground" Value="White" /> </Style> </ListBox.FocusVisualStyle> </ListBox>

Binding de base

Partant du principe que notre liste d’utilisateurs s’appelle users, le binding sur la liste se définit donc comme suit:

lstUsers.ItemsSource = users

Ajout de la notion de triage


Pour la notion de triage nous allons faire appel à LINQ. En effet, ce dernier introduit les méthodes d’extension OrderBy et OrderByDescending qui s’appliquent aux objets implémentant l’interface IEnumerable<>.

Ainsi le code avec la gestion du tri devient:

lstUsers.ItemsSource = users.OrderBy(u=>u.Login);

On peut le voir sur le code ci-dessus, la méthode d’extension OrderBy prend donc en paramètre un délégué générique dans lequel j’ai mis une expression lamba prenant un UserProxy en paramètre et retournant une chaine de caractères.

La signature précise de OrderBy est d’ailleurs un délégué de type System.Func<TSource, TKey> c’est à dire un délégué prenant un objet de classe TSource en paramètre et retournant un objet de classe TKey (qui sera utilisé comme clef pour le tri).

Partant de ce principe et grâce aux expressions lambdas, nous pouvons définir trois variables comme suit:

readonly Func<UserProxy, object> nameKeySelector  = (u=>u.Login);
readonly Func<UserProxy, object> dateKeySelector = (u=>u.Date);
readonly Func<UserProxy, object> connectionKeySelector = (u => u.LastConnection);

Grâce à ces trois variables, nous allons fournir une méthode qui saura gérer le tri ascendant et descendant et qui surtout saura prendre en charge nos expressions:

        void SortDatas(Func<UserProxy, object> keySelector)
        {
            if (users == null)
                return;

            if (keySelector == null)
                keySelector = previousKeySelector;

            if (keySelector == previousKeySelector)
            {
                asc = !asc;
            }
            else
            {
                asc = true;
            }

            previousKeySelector = keySelector;

            if (asc)
                lstUsers.ItemsSource = users.OrderBy(keySelector);
            else
            {
                lstUsers.ItemsSource = users.OrderByDescending(keySelector);
            }
        }

Pour que la méthode fonctionne il faut juste rajouter deux variables supplémentaires:

        bool asc = true;
        Func<UserProxy, object> previousKeySelector;

L’usage de cette méthode devient donc relativement simple puisqu’il suffit de l’appeler avec l’une de nos expressions pour effectuer le tri associé (et si on l’appelle plusieurs fois de suite avec la même expression, le sens de tri sera inversé):

        private void dateSort_Click(object sender, RoutedEventArgs e)
        {
            SortDatas(dateKeySelector);
        }

        private void nameSort_Click(object sender, RoutedEventArgs e)
        {
            SortDatas(nameKeySelector);
        }

        private void connectionSort_Click(object sender, RoutedEventArgs e)
        {
            SortDatas(connectionKeySelector);
        }

Et le tour est joué Sourire

.Net, WPF, Tutorial

Collecto sur Frogz:)

10. novembre 2010

Bewise, partenaire du tour de France Windows Azure!

9. novembre 2010

En tant que membre du programme Azure Circle, Bewise co-organise avec Microsoft le tour de France Windows Azure sur la région Sud-ouest.

A Toulouse le mardi 16 novembre, nos experts interviendront sur les plateformes Windows Azure et SQL Azure.

Cet évènement s'adresse aux éditeurs de logiciels, aux startups et plus généralement aux partenaires stratégiques de Microsoft en France.

Pour s’inscrire c’est par ici.

Bewise