Destin ou hasard ?
Microsoft, Apple, Google... 3 sociétés omniprésentes à leur actuelle, à telle point qu'on peut se demander comment elles en sont arrivées là.
Bill Gates semble ainsi, au début de sa carrière, avoir été au bons endroits aux bons moments, et a été suffisamment intelligent pour saisir toutes ces occasions. Quant à Apple, l'historique de la société est loin d'être aussi glorieux que ce qu'on connait d'eux depuis quelques années.
Et pour Google, je viens d'apprendre une histoire pour le moins intéressante : en 1998, Larry Page et Sergey Brin montent Google, avec comme activité le moteur de recherche. Et pourtant, en 1999, ils cherchent à revendre la société afin de pouvoir finir tranquillement leurs études ! A l'époque, Excite, une société spécialisée dans les moteurs de recherche, se voit offrir la possibilité de racheter Google pour 1 million de dollars, puis pour 750 000, mais ne le fera pas.
A peine 11 ans plus tard, on sait tous ce qu'il est devenu de Google... Comme quoi tout cela ne tient qu'à bien peu de choses...
Source : 01net.com
Optimiser Ubuntu pour les VMs
Comme cité dans un précédent billet, j'utilise un Ubuntu virtualisé pour le développement au boulot. Le transfert de Parallels sur l'iMac à VMWare sur mon Macbook s'est plutôt bien passé, sauf qu'au lieu de pouvoir allouer 2 coeurs et 2Go de RAM à la VM, sur le Macbook je ne peux donner qu'1 coeur et 1Go...
Et Ubuntu est alors très lent (ce qui peut paraitre bizarre). En fait, quand j'utilise juste Eclipse ou Netbeans, ça va. Mais les 2 en même temps (et avec un bon gros Firefox à côté, bien entendu...), c'est horrible, dès que je veux basculer de l'un à l'autre la fenêtre est vierge, et ça prend 10 à 20 secondes pour redessiner le contenu... Et pendant tout ce temps, le disque dur gratte comme un malade. On pourrait appeler ça un symptôme, et fort heureusement, il existe un remède !
Par défaut, il semblerait que Linux utilise pas mal de swap, même si on a beaucoup de RAM libre. Ca pourrait en effet expliquer pourquoi ça gratte en permanence... En tapant la commande suivante, vous aurez un indicateur précis de comment ça swap :
cat /proc/sys/vm/swappiness
Chez moi, cette valeur était à 60 par défaut, ce qui est semble-t-il trop élevé pour un portable. Du coup, j'ai utilisé une commande pour rabaisser cette valeur à 15 :
sudo sysctl -w vm.swappiness=15
Et depuis, tout tourne bien ! Le disque dur ne fait plus de bruit, et le passage d'une appli à une autre est instantané, même avec plein d'onglets ouverts dans Firefox
Lambda Calcul pour les nuls
Hier j'ai eu un cours (Typage et Polymorphisme) où ça parlait à nouveau de Lambda Calcul. Dit comme ça, tout le monde s'en fout
Mais en fait ce qui était sympa c'est le TD/TME qui a suivi, au cours duquel on avait un lien à aller voir :
http://worrydream.com/AlligatorEggs/
Je vous l'accorde, rien que le nom du lien est déjà suspect... Mais en fait c'est une méthode pour apprendre le Lambda Calcul sans jamais utiliser aucun terme de ce dernier. En gros une méthode purement visuelle, avec des alligators et des oeufs. C'est plutôt bien fait (en tout cas à mes yeux de pauvre petit codeur qui ne sait rien dessiner), et assez marrant à lire (même si on sait déjà en faire).
Pourquoi utilise-t-on des clés de 128 bits ?
Question simple abordée en cours de Cryptanalyse l'autre jour. La réponse est en fait assez logique, en partant des constats suivants :
- Une année dure environ 225 secondes (365 jours, 24 heures par jour, 3600 secondes par heuere)
- Chaque année, 228 PC sont vendus (autour de 250 millions)
- Un PC à 2Ghz a une puissance de calcule d'en gros 231 cycles par seconde
Du coup, si on multiplie tout ça, on peut évaluer le nombre de cycles produits chaque année à 284. C'est une approximation, mais suffisante pour voir ressortir quelque chose : un clé de 80 bits pourrait être crackée par un brute-force en un temps raisonnable si on dispose de suffisamment de PCs. Alors qu'en 128 bits, on a de la marge !
Alors là, vous allez me dire "oui, mais chaque année on vend de plus en plus de PCs...". Certes. Mais même si on double le nombre de PCs vendus, ça ne fait jamais que 229 au lieu de 228, donc on passe de 284 à 285 pour le nombre de cycles, ce qui ne change pas grand chose par rapport à 128 bits.
Et de même, on sait que la puissance des ordinateurs double, à la louche, tous les 18 mois. Mais chaque doublement ne fait qu'incrémenter d'1 notre "compteur".
Grâce à ce petit calcul, on sait qu'une clé 128 bits devrait tenir sans trop de problème pour les quelques années à venir (sauf faille dans l'algorithme de chiffrement !).
La routine…
Voici une image très sympa sur laquelle je suis tombée, je vous en fait donc profiter...
Source : korben.info
Retour de l’IFA

Enfin de retour de l'IFA 2010 ! (depuis quelques jours, mais j'ai fait une pause ^^)
C'était la première fois pour moi que j'allais dans un tel salon, et je dois dire que c'est très intéressant (sur un plan personnel car j'adore ça, et sur un plan professionnel car ça permet de bien se situer par rapport à la concurrence, et de voir un peu mieux ce qu'il faut faire ou éviter).
Je vous invite à lire la suite si vous voulez des infos sur les télés et les tablettes
Quel est le meilleur endroit pour programmer ?

Je pose cette question qui peut paraitre un peu bizarre suite à un sujet sur developpez.com qui parlait de différentes vérités sur les programmeurs, comme quoi la programmation est avant tout affaire de réflexion, et non pas d'écriture de code à la chaine devant son PC.
Du coup, ça m'amène à une question : où et quand ais-je "conçus" les différents algos (ou bidouilles ou ce que vous voulez ^^) que j'utilise le plus, ou qui ont été les plus "importants" ? Au final j'ai fait une petite liste (plus ou moins dans l'ordre d'importance, le premier étant le mieux), et ce qui est intéressant c'est que globalement, ce n'est pas quand je suis au boulot !
- Les transports en commun. Le top du top, ce n'est pas quand je suis sur l'EEE PC ou le Mac, c'est quand je suis debout parce qu'il y a trop de monde, que je ne peux "rien" faire, et que tu coups je suis "obligé" de réfléchir ^^ C'est souvent là que je trouve des solutions à des problèmes, ou que je tombe sur une approche beaucoup plus simple d'un truc que j'avais commencé et dont je n'étais pas satisfait.
- La voiture, mais uniquement quand je conduis (parce que dans ce cas ma copine dors à côté... sinon si ce n'est pas moi qui conduit je discute avec le conducteur...). C'est peut-être une déformation suite à l'écoute des cours de maitre Queinnec quand j'étais au volant (il filait ses cours en mp3 !!).
- La douche. Simple et efficace, tous les matins, ça permet à la fois de se réveiller tranquillement, de faire le point sur la journée précédente, et de se mettre en marche pour la journée à venir.
- Au boulot, avec une feuille et un crayon. Je ne sais pas trop pourquoi, mais si je dois vraiment concevoir un truc, à la base je lâche le clavier, je prends un calepin et un crayon, et c'est parti ! C'est quand je reste scotché au clavier que j'ai du mal à laisser venir les idées. Parfois je n'écris rien sur la feuille, mais ça doit juste être une manière de prendre du recul.
- En faisant la vaisselle, activité connue et reconnue comme nécessité une activité cérébrale intense ^^
- Au lit. Parce que parfois j'ai du mal à trouver le sommeil (ou alors je me réveille trop tôt), et du coup l'esprit galope.
Et vous, c'est plutôt où et quand ? ^^
Empilement d’appels…
Dans le reader qu'on fait, quand je veux ajouter une fonctionnalité (ou juste une méthode à la con) dans la couche du reader, voilà ce qu'il faut ajouter (j'ai mis en rouge les méthodes C/C++, en orange les méthodes Java "génériques", et en vert la partie Android)
- La méthode dans l'objet C++ qui s'occupe de faire le rendu (normal)
- La méthode virtuelle dans la classe abstraite de type Reader
- La méthode JNI qui appelle la méthode sur un objet de type Reader
- La méthode Java dans la classe Reader qui utilise le code JNI
- La méthode Java dans l'interface IReader (pour que tout le monde puisse voir la méthode précédemment ajoutée...)
- La méthode Java dans la classe Presenter (car on n'accède pas directement au Reader)
- La méthode qui utilise la méthode du Presenter dans le code, côté Android (enfin !)
Du coup quand je fais ça je réfléchis bien à si j'ai plusieurs méthodes à ajouter, car... La partie en rouge est sous Eclipse sous Linux (et se compile en ligne de commande), la partie en orange sous Netbeans sous Linux, et la partie en vert sous Eclipse sous MacOSX ^^.
SGBD : tri radix sur GPU
Une équipe de l'Université de Virginia a annoncé avoir atteint le milliard de clés triées par secondes grâce à l'utilisation d'un Radix Sort... sur GPU !
Je n'ai pas encore pris le temps de regarder le code ou les détails techniques, mais en tout cas tout est disponible sur Google Code. Pour information, les meilleures implémentations sur les meilleurs CPU n'atteignent "que" 560 millions de clés triées par secondes. On a donc des performances 2 fois supérieures, ce qui n'est pas mal du tout pour un début...
Pour avoir toutes les infos, le code, et les discussions, c'est par là : http://code.google.com/p/back40computing/wiki/RadixSorting
VM dans VM dans VM…
Je bosse sur un Mac, mais j'ai besoin de compiler des trucs sous Linux, et du coup une partie de notre développement Android, je le fais sous Linux grâce à Parallels. Du coup, quand on fait tourner du code Java sur Android, on a :
- La JVM d'Android qui fait tourner le code
- L'émulateur d'Android qui fait tourner la JVM
- Parallels qui fait tourner Linux pour avoir l'émulateur
Ca fait quand même 3 VM imbriquées, mine de rien... Pas mal ! (en même temps ça rame ^^)
IFA Berlin 2010

Juste un petit mot pour dire que la semaine prochaine j'aurai la chance d'aller à l'IFA 2010, à Berlin, histoire de voir un peu ce qui se fait (et va se faire) niveau smartphones/tablettes/etc
Je ne manquerai pas de faire un rapport dès que j'aurai le temps ! (ça sera l'occasion de tester l'application WordPress pour Android d'ailleurs)
(drôlement sympa ce logo...)
Blog de Mathias
Petit billet rapide pour dire que Mathias (alias Darkmath pour les intimes) a lancé son blog, avec déjà quelques billets très intéressants sur le parallélisme et la concurrence. Je vous conseille d'y faire un tour !
blog.tamago.fr
Subpixel
Je ne sais plus trop ce que je cherchais quand je suis tombé sur un article sur les subpixels, mais ça m'a rappelé de bons souvenirs et c'est un truc que je trouve assez sympa ^^
Le principe est très simple : un écran (LCD) possède des pixels, mais en fait chaque pixel est lui-même composé de 3 composantes (rouge, vert, bleu), disposées côte à côte. Donc en fait (de façon classique), on a à gauche le sous-pixel rouge, au milieu le sous-pixel vert, et à droite le sous-pixel vert. Grâce à ça, on peut en fait augmenter artificiellement la résolution de l'écran en utilisant ces sous-pixels au lieu de se contenter de pixels pleins. C'est utilisé dans les OS sous différents noms pour le rendu des polices.
En pratique, est-ce super ? Oui et non. Sur certains écrans je trouve que ça donne un côté gênant sur les polices, avec une sensation bizarre de couleur foireuse sur les bords des lettres (puisqu'effectivement le bord sera rouge ou bleu selon les cas). C'est assez subtil, mais ça peut déranger.
C'est assez intéressant comme principe, donc je vous invite à regarder le lien vite fait (ainsi que les images qui vont avec). Sinon, pour l'anecdote, de temps en temps les sous-pixels donnent des effets bizarres : j'avais un affichage avec une zone rouge, et au-dessus une zone bleue. Et bien j'avais l'impression que les 2 zones n'étaient pas alignées horizontalement, alors que c'était le cas. Du moins, au niveau du rendu/soft c'est le cas, mais effectivement en pratique si on fait des zones purement rouges et purement bleues, elles sont par nature (sur les LCD) légèrement décalées.
(à noter que comme toujours l'article wikipedia sur ce sujet est assez sympa aussi)
JSON vs XML
Du coup, à certains endroits, j'ai remplacé ça par du XML. C'est assez pratique au cours du développement car si les structures de données évoluent (essentiellement par l'ajout de nouveaux champs, ou le déplacement/réorganisation de la structure), les méthodes pour parser le XML changent très peu (voire pas du tout si on n'a fait qu'ajouter un champs), donc c'est super pratique et évolutif. Sauf que le XML, c'est un poil lourd (à lire et à écrire), avec plein de petits cas foireux et tout.
C'est là qu'intervient JSON : une syntaxe un peu façon XML, mais prévue pour du Javascript à la base, et qui est un peu plus simple tout en offrant (globalement) les mêmes possibilités. Ce n'est pas révolutionnaire en terme de possibilités, mais le fichier final est généralement plus petits, et le parseur est moins complexe, donc pour les besoins de petits développement rapides ça m'a l'air plus adapté.
Petit comparatif rapide entre XML et JSON (je repompe celui de Wikipedia parce qu'il est simple et illustratif ^^)
Syntaxe JSON
{
"firstName": "John",
"lastName": "Smith",
"age": 25,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021"
},
"phoneNumber": [
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "fax",
"number": "646 555-4567"
}
]
}
Syntaxe XML
<xml>
<Object>
<Property><Key>firstName</Key> <String>John</String></Property>
<Property><Key>lastName</Key> <String>Smith</String></Property>
<Property><Key>age</Key> <Number>25</Number></Property>
<Property><Key>address</Key>
<Object>
<Property><Key>streetAddress</Key> <String>21 2nd Street</String></Property>
<Property><Key>city</Key> <String>New York</String></Property>
<Property><Key>state</Key> <String>NY</String></Property>
<Property><Key>postalCode</Key> <String>10021</String></Property>
</Object>
</Property>
<Property><Key>phoneNumber</Key>
<Array>
<Object>
<Property><Key>type</Key> <String>home</String></Property>
<Property><Key>number</Key> <String>212 555-1234</String></Property>
</Object>
<Object>
<Property><Key>type</Key> <String>fax</String></Property>
<Property><Key>number</Key> <String>646 555-4567</String></Property>
</Object>
</Array>
</Property>
</Object>
</xml>
Bon, c'est un exemple un peu extrême, et en vrai on peut faire mieux pour la syntaxe XML en utilisant judicieusement les attributs. Mais ça illustre le fait que la syntaxe JSON est tout de même plus lisible et épurée, essentiellement grâce à la suppression des balises fermantes. On distingue une particularité de JSON que je trouve pas mal : on a à la fois '{' et '[', qui ont des significations différentes :- { pour les objets- [ pour les listes/arrays/tableaux (c'est pareil)
Il faut tout de même relativiser un peu car la sytaxe XML de l'exemple est particulièrement verbeuse, et qu'en utilisant des attributs on peut obtenir une version XML aussi courte que la version JSON... Mais ce qui m'intéresse dans ce format est plutôt la simplicité pour le parser, donc je vais probablement migrer quelques petits trucs dessus très prochainement.
Source : Wikipedia
JamVM ARM bugs
J'avais parlé dans un précédent billet d'un souci qu'on avait, avec une exception levée dans une méthode toString, pour convertir un long en String... Et bien le problème est de retour, et en fait ça vient de la machine virtuelle qu'on utilise : JamVM.
Le soucis est relativement con, et clairement énoncé dans le bugtracker : "unary minus (-) in jamvm 1.5.4 fails for long on ARM". Or, comment marche la méthode toString ? Si on a un nombre positif, on converti, et si on a un nombre négatif, on affiche '-' au début, on le rend positif, et on le converti. Du coup, la méthode toString va lever une exception et planter lamentablement dès qu'on va convertir un long négatif, puisqu'on n'est pas en mesure de le rendre positif...
Super !

