Faisons des petits sablés pour la St Valentin !

Written by erik - 13 february 2010 13:30

Aujourd'hui c'est le jour avant la Saint Valentin. Ca veut dire que c'est le jour où on fait un truc stupide pour pouvoir dire à sa chérie : "tu as vu j'ai pensé à toi !" et après elle dit : "Oh c'est trop mignon !". On a pas forcement le coeur à ça comme le dit si bien xkcd. Mais pour une fois j'ai envie de faire ca bien et ma chérie à adoré les "Petit Ecoliers de LU"(TM). Mon plan pour demain est : Petit sablé au chocolat.

En faire une vingtaine m'a pris de l'ordre d'une heure et demi. C'est à moduler avec le fait que je savais deja faire une pate sablé et que je manque de matériel.

Pour commencer il faut faire une pate sablé. On trouve des tonnes de recettes sur le net mais celle que j'ai utilisé est la suivante. Dans un saladier on met 130g de farine, une pincé de sel. On rajoute 100g de beurre coupé en petit bout (mais pas fondu). On met de l'ordre de 100g de sucre. J'ai utilisé une moitié de sucre au citron et une moitié de sucre normal. Une fois que l'on a mis tout ca dans le saladier, il faut melanger en ecrasant le beurre pour qu'il ne soit plus possible de distinguer le beurre de la farine et du sucre. Ca fait un genre de poudre comme si on avait effrité un quatre quart. Pour finir la pate sablé, on rajoute un oeuf et on petrit la tout pour obtenir une pate uniforme (On ne met pas d'eau dans une pate sablé !).

Une fois que l'on a notre boule de pate on va l'etaller comme pour faire une tarte. On farine un plan de travail et un rouleau à patisserie. Puis on étale la pate. Comme on ne compte pas faire une tarte, on s'en fout un peu que ca soit rond. Mais c'est toujours efficace de l'étaler dans plusieurs directions.

Une fois que la pate est étalé, on découpe des biscuits avec un emporte pièce. Si on en a un en forme de coeur, c'est cool. Perso, j'ai fait ca avec un verre. On pose le verre tete en bas sur la pate et on le tourne jusqu'a séparer un cercle parfait. On met le furtur biscuit de cote et on recommence. Attention à ne pas empiler les futurs biscuits; comme ils ne sont pas encore cuits, ils vont coller entr eux. Comme on ne peut pas utiliser toute la pate en une fois, il faut replier ce qui reste de pate, refaire une boule et recommencer. A chaque fois il faut rajouter de la farine et la pate peut devenir trop seche, l'humidifier peut aider à ce qu'elle ne se brise pas.

C'est un bon moment pour allumer le four a 200 Celsius. Pendant qu'il chauffe on va preparer le chocolat. On met du chocolat dans une casserole. J'ai utilisé 2 carrés de chocolat noir Ghirardelli (extra noir 80% de cacao de la taille des carrés de Lindt) et de l'ordre de 80g de pépite chocolat à cookie. On fait fondre le choloat mais sans le faire bruler. Quand le chocolat a commencé à fondre, j'ai rajouté de l'extrait d'orange (C'est un peu plus bourrin que la fleur d'oranger, mais je n'en avais pas). On peut gouter le chocolat pour savoir si on a mis ce qu'il fallait dedans. (Le chocolat fondu ce n'est pas chaud; ce n'est pas du caramel. Non je ne pense à personne en particulier quand je dis ca !? )

Pendant que le chocolat fond, le four doit être chaud, et c'est le bon moment pour enfourner nos petits sablés. Perso je l'ai ai mis dans des plats à tarte (en 2 fournés parceque je n'en avait pas assez). Quand les petits sablé sont un peu cuit, on les retourne. On sait qu'ils sont assez cuits parcequ'on arrive à les faire glisser à l'interieur du plat (comme les crèpes en fait ! ). On les cuits de l'autre cote. La cuisson est assez rapide, je n'ai pas chronomètre, mais je dirais de l'ordre de 7 minutes sur la premiere face et 3 minutes sur l'autre face.

On retire les petits sablé du four pour pouvoir mettre le chocolat fondu dessus. On fait ca relativement facilement en utilisant l'arrière d'une cuillière. Utiliser les bords du plat à tarte est utile pour ne pas avoir à toucher les petits sablés qui sont brulants. Personnellement, je prefere avoir des petits sables fins avec une fine couche de chocolat. Comme ca, on peut en faire plus.

On remet les petits sablés dans le four pour que le chocolat cuise. Si la couche de chocolat est fine, cela ne prends que quelque minutes.

Finalement, on retire les petits sablé du four et on les mets dans une boite, ou si vous avez oublié (comme moi), on les met dans une assiètte. Regardez comme c'est joli !

vue d'ensemble en zoom

Bon j'espère que ma chérie va apprecier. Bilan : 1h30 a les preparer et les cuire ( J'ai du faire deux fournés et j'ai essayer de mettre le chocolat sur le sablé pas cuit, mais ce n'est pas aussi bien) et 1h a écrire ce poste de blog.

Classified in : Homepage, fr, cooking - Tags : none - 7 comments

Quand les conteneurs standards deviennent trop lents

Written by erik - 08 november 2009 20:00

Aujourd'hui j'ai envie de parler d'optimisation de code et plus précisément d'un cas particulier qui m'est arrivé lors de l'écriture de QixDS . Pour résumer : des balles se déplacent dans l'écran et le joueur fait apparaître des murs afin d'enfermer les balles dans un espace le plus restreint possible.

Lorsque le joueur fait apparaître un mur, le jeu vérifie si une zone de l'écran ne contient aucune balle. Si une telle zone existe, le jeu la rempli entièrement. Le code responsable de cette fonctionnalité était relativement lent. En fait, il faisait baisser le framerate. L'algorithme qui fait cela est un algorithme de recherche de composante connexe dans un graphe qui ressemble basiquement à:

Pile p;
Marque = false;
Case c = (x,y);
p.empiler ();
Marque[c] = true;

Tant que (! p.vide())
{
  Case c = p.depiler();
  Pour chaque voisin v de c
  {
    Si (Marque[c] == false ET ! c.estUnMur())
    {
      p.empiler(c);
      Marque[c]=true;
    }
  }
}

On peut voir que ce code est intensif sur la Pile. Dans l'implémentation lente, la pile était std::stack de la STL. La stack de la STL est implementée au dessus d'une deque. Je me suis dit que la deque de la STL se redimensionne automatiquement et que donc elle fait des vérifications d'accès à chaque insertion qui sont superflues. En l'occurence, je sais que le nombre maximal d'objets qui seront dans la pile est inférieur aux nombres de cases dans mon jeu. Ce nombre étant petit par rapport à la taille de la mémoire, je peux allouer toute la mémoire une bonne fois pour toute et supprimer toutes les vérifications d'accès à la pile.

J'ai donc remplacé la pile de la STL par une pile ad hoc qui alloue la mémoire que demande le programmeur à la construction et qui ne fait pas de vérifications sur les bornes du tableau. En effet, si le programmeur fait une utilisation correcte de la pile, ces vérifications sont inutiles.

Quand je raconte ça, les gens sont toujours un petit peu sceptique. Je fournis donc aujourd'hui des tests montrant qu'une telle implémentation est plus rapide que celle (plus générique) de la STL. Le code de test est disponible. Basiquement, il s'agit d'empiler 228 entiers ( soit 268 millions d'entiers ) sur la pile en garantissant que la pile sera toujours de taille inférieur à 28.

Quatre implémentations différentes sont maintenant présentées. Tout d'abord StlStack est l'implémentation utilisant std::stack de la STL. Pile est l'implémentation décrite précédemment : la mémoire est allouée à la création de l'objet et aucune vérification n'est faite a posteriori. PileSafe ajoute les vérifications de bornes sur le tableau (un test par accès à la structure en plus par rapport à Pile). Finalement, PileTemplate connaît la taille du tableau à la compilation et retire ainsi l'allocation dynamique de la mémoire du tableau et, ainsi, une indirection.

Les quatre implémentations sont testées sur 4 machines différentes (Merci chris_27 et dargor pour les tests). Les quatre machines utilisent g++ et le code est compilé en -O2 -DNDEBUG. Les mesures de temps sont faites avec time. Une seule mesure de temps est fournie par test mais les valeurs sont cohérente d'un run à l'autre. Les résultats sont présentés dans le tableau ci-dessous:

Machine
ThinkPadTarsonisEEEbox B202Aspire One
ProcesseurIntel(R) Core(TM)2 Duo CPU T7500 @ 2.20GHz Genuine Intel(R) CPU T2130 @ 1.86GHzIntel(R) Atom(TM) CPU N270 @ 1.60GHz Intel(R) Atom(TM) CPU N270 @ 1.60GHz ("GenuineIntel" 686-class) 1.60 GHz (downclocked to 800Mhz )
Compilateurg++ (Debian 4.3.2-1.1) 4.3.2g++ (Debian 4.3.4-6) 4.3.4g++ (Debian 4.3.2-1.1) 4.3.2g++ (GCC) 3.3.5 (propolice)
StlStack2.14s15.56s14.24s22.01s
Pile1.42s7.34s8.19s11.47s
PileSafe1.40s6.48s11.88s15.65s
PileTemplate1.44s7.66s8.51s8.33s

Les résultats montrent que l'implémentation manuelle Pile sans vérifications est toujours plus rapide que l'implémentation de la STL (de 25% à 50% en fonction de la machine).

La comparaison de Pile, PileSafe et PileTemplate est par contre plus étonnante. On s'attendrait à ce que PileTemplate soit plus rapide que Pile (puisqu'il y a une indirection de moins dans PileTemplate). Et que Pile soit plus rapide que PileSafe (puisqu'il y a un test en plus dans PileSafe). Cependant sur ThinkPad et Tarsonis, PileSafe est l'implémentation la plus rapide et PileTemplate est l'implémentation la plus lente (les temps de calcul sur ThinkPad sont faibles mais l'ordre ne change pas si on augmente le nombre de calcul). En revanche, PileSafe est plus lent que Pile sur EEEboxB202 et AspireOne. PileTemplate est sensiblement plus rapide que Pile sur AspireOne et légèrement plus lent sur EEEboxB202.

D'où viennent ces différences de performances ? Est-ce que l'ordre est correct sur les machines EEEboxB202 et AspireOne parce qu'ils utilisent des processeur Atom et que les processeurs plus classiques de ThinkPad et Tarsonis ont des optimisations internes plus erratique ? Les résultats de AspireOne correspondent à nos attentes mais ont été obtenus sur une ancienne version de gcc. Est ce que les nouvelles versions de gcc lissent les différences ?

Finalement, PileSafe obtient de meilleurs résultats que l'implémentation de la STL. On aurait attendu que les deux implémentations aient à peu près les mêmes performances. Cela semble indiquer que l'implémentation de la STL fournit une fonctionnalité supplémentaire. Dans tous les cas, il semble clair que reimplémenter des structures de données pour un cas particulier peut améliorer les performances d'un programme. Les différences peuvent ne pas sembler très probantes sur des processeurs efficaces comme les dernières générations d'Intel, mais elles ont clairement fait la différence sur ARM9 dans QixDS.

Classified in : Homepage, fr, geek, programming - Tags : none - 1 comment

La magie des front end

Written by erik - 27 august 2009 21:00

Soki m'avait demande une demo du code que j'ai ecrit pour mon Nokia n810 le week end dernier. J'avais promis que j'en ferait une, mais j'ai eu d'autre chats a fouetter cette semaine. Mais bon, chose promise chose due.

Le n810 fonctionne sur maemo (une distribution linux fournie par Nokia); l'api graphique est GTK/Hildon et il faudrait adapter le code un chouia pour que ca marche sur Linux classique. Donc j'ai fait une video (encode bizarre mais ca marche dans mplayer) avec un emulateur de maemo pour donner une idee de comment ca marche. (On ne se moque pas, c'est assez bizarre de parler devant son ordinateur sans personne qui ecoute en directe.)

Le code C.

Classified in : Homepage, fr, geek, programming - Tags : none - 1 comment

Ouverture

Written by erik - 27 august 2009 19:37

Bonjour a vous et bienvenu sur mon 'blog'.

Je voulais a la base ecrire un blog pour tenir les gens informes de ma vie aux USA, mais finalement j'ai glande et je ne l'ai mis en ligne qu'aujourd'hui (27 aout). Ca fait 8 mois que j'y suis et j'ai donc un peu moins de chose a vous raconter a ce propos. Par contre, j'ai toujours besoin d'un endroit ou poser des informations, des geekeries... Donc j'ouvre finalement mon 'blog' quand meme.

Quelques informations sur le 'blog' en general. Vous devez savoir que j'aime bien faire les choses a la main, c'est pour ca que le blog est assez sobre (certain dirait minimalistes meme). Vous devez aussi vous douter que j'utilise un clavier qwerty donc ca veut dire que j'ecris sans accent.

Vous avez la possibilite de poster des commentaires. Je ne compte pas moderer les commentaires et je ne compte pas non plus faire de compte utilisateurs, ca veut dire que vous pouvez dire n'importe quoi et le signer avec n'importe quel nom. Mais j'ai confiance en vous, je sais que vous ne ferez pas de connerie (de toute facon j'ai les logs :) ). Il y a potentiellement des gens de plusieurs communautes qui liront ce blog, donc essayez d'eviter les commentaires acerbes :).

Classified in : Homepage, 3617mylife, fr - Tags : none - no comments

«previous page 3 of 3

Categories

Archives

Tags

Last articles

Last comments