<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8957427119997194894</id><updated>2012-02-11T19:12:53.986+01:00</updated><category term='oatr'/><category term='gandhi'/><category term='cc-by'/><category term='code (applescript)'/><category term='dessin'/><category term='code (python)'/><category term='maybeshewill'/><category term='art'/><category term='wtf'/><category term='paranoïa'/><category term='jouet'/><category term='paul boutin'/><category term='outil'/><category term='traduction'/><category term='cc-by-nc'/><category term='citation'/><category term='leplus'/><category term='mac-advocacy'/><category term='gibson'/><category term='blogs'/><category term='physique'/><category term='the drums'/><category term='adrien havet'/><category term='facebook'/><category term='code (c)'/><category term='diy'/><category term='jkb.log'/><category term='codechef'/><category term='humour'/><category term='soman'/><category term='code (bash)'/><category term='gui'/><category term='musique'/><category term='hacker'/><category term='rock alternatif'/><category term='msie'/><category term='rot13'/><category term='photo'/><category term='jardinage'/><category term='world of warcraft'/><category term='dot2array'/><category term='joel spolsky'/><category term='crap'/><category term='photo panoramique'/><category term='festival'/><category term='rock garage'/><category term='project euler'/><category term='man at work'/><category term='itunes'/><category term='cc-by-sa'/><category term='code (lua)'/><category term='helios'/><category term='lovecraft'/><category term='litterature'/><category term='nick cave'/><category term='wired'/><category term='path finder'/><category term='benchmark'/><category term='bd'/><category term='guitare'/><category term='graphisme'/><category term='grinderman'/><category term='photo hdr'/><category term='code (php)'/><category term='msn'/><category term='drum n bass'/><category term='black sun empire'/><category term='code (blogger)'/><category term='cthulhu'/><category term='spoj'/><category term='lafougere'/><category term='humeur'/><category term='hack'/><category term='belgique'/><category term='statistiques'/><category term='math'/><category term='lastfm'/><category term='workaround'/><category term='tool'/><category term='zune'/><category term='ebm'/><category term='jessica daubertes'/><category term='esr'/><category term='activisme'/><category term='mythe'/><category term='censure'/><category term='ma vie.com'/><category term='sonisphere'/><category term='foss-advocacy'/><category term='journalisme'/><category term='warcraft 3'/><category term='dune'/><category term='ipod'/><category term='twitter'/><category term='mavie.com'/><category term='expo'/><category term='microsoft'/><category term='fail'/><category term='jeux'/><category term='industrial'/><title type='text'>JKB.log</title><subtitle type='html'>Mono(b)logue de Jean Karim "V.I.R.U.S." Bockstael.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default?start-index=101&amp;max-results=100'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>107</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-6948372590479083481</id><published>2012-02-11T15:43:00.002+01:00</published><updated>2012-02-11T15:47:28.326+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='art'/><category scheme='http://www.blogger.com/atom/ns#' term='adrien havet'/><category scheme='http://www.blogger.com/atom/ns#' term='graphisme'/><category scheme='http://www.blogger.com/atom/ns#' term='jessica daubertes'/><category scheme='http://www.blogger.com/atom/ns#' term='expo'/><title type='text'>Chemins foncés</title><content type='html'>&lt;p&gt;Vous je ne sais pas, mais moi ce que je retiens de toutes les déclarations de 2011 c'est : &lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;"Des gosses ? Pourquoi on aurait des gosses alors qu'à la place on peut acheter des vinyls ?"&lt;/blockquote&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;p&gt;C'est de &lt;a href="http://twitter.com/purdey2000"&gt;@purdey2000&lt;/a&gt;, relativement bourrée (et relativement à poil mais là n'est pas le propos). En vrai elle a un nom, Jessica Daubertes, et un vrai métier, graphiste. Graphiste comme "je sais dessiner et j'ai un vrai sens esthétique", pas "j'ai piraté Photoshop et Illustrator et là je suis un tuto LOL". Sérieusement, &lt;a href="http://portfolio.purdeydemille.net/"&gt;jetez un oeil à son travail&lt;/a&gt;, ça vaut la peine.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Si j'en parle maintenant, c'est surtout parce qu'elle et son cher et tendre directeur artistique pédant (&lt;a href="http://cargocollective.com/monsieurmonsieur"&gt;mais talentueux donc il peut&lt;/a&gt;) exposent leurs dessins à côté de sérigraphies dès la semaine prochaine. Ça s'appelle Chemins Foncés, ça se passe à La Boutik à Reims et ça dure jusqu'au 20 avril. &lt;a href="http://fortifem.fr/"&gt;Tout est dit chez Førtifem&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-6948372590479083481?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/6948372590479083481/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2012/02/chemins-fonces.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6948372590479083481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6948372590479083481'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2012/02/chemins-fonces.html' title='Chemins foncés'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-6170024719127362757</id><published>2011-07-14T12:15:00.005+02:00</published><updated>2011-07-14T12:59:47.166+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='festival'/><category scheme='http://www.blogger.com/atom/ns#' term='musique'/><category scheme='http://www.blogger.com/atom/ns#' term='leplus'/><category scheme='http://www.blogger.com/atom/ns#' term='sonisphere'/><title type='text'>Le Sonisphère à la française, c'est chaud mais c'est bon</title><content type='html'>Quand on m'a dit "y'a un Sonisphere en France cette année et le Big Four y vient et c'est dans le nord" j'ai du pousser un cri de l'ordre de "WHOUPUTAINONYVAONYVAONYVA" et, avec trois vikings de mes amis, j'y vais.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Nous étions quelques centaines à ne pas avoir été mis au courant assez tôt de la nécessité de réserver le camping, du coup on se retrouve devant le parc Walygator, à quelques kilomètres du site du festival, dans une plaine dure et sans la moindre ombre mais dotée quand même de douches et toilettes. Des navettes sont organisées pour nous mener au site et nous en ramener ; si l'attente est longue à l'aller, au retour c'est peine perdue et presque tous se tapent le trajet à pied dans la nuit noire Lorraine.&lt;br /&gt;&lt;br /&gt;Le site est étonnant, c'est... un parking ? En tout cas c'est en trois niveaux et couvert de béton, de bitume, et de gravier bitumé qui laisse des chouettes traces noires sur le pantalon à force de s'y asseoir. Le niveau supérieur accueille les deux scènes du festival, l'une face à l'autre, ça surprend mais comme les concerts se font en alternance c'est cohérent. Au niveau intermédiaire une grande surface de restauration est couverte de bancs entourés par des stands à bouffe et un bar à Guinness et Grimbergen qui est le bienvenu (sérieusement amis Français, faut faire quelque chose parce que votre Kronenbourg là ça ne peut pas durer). Au niveau inférieur se trouve l'entrée du site, une petite scène pour les concerts off, un shop, et une autre série de bancs mais couverts donc ombragé. Profitez-en, c'est la seule zone d'ombre de tout le site ; entre le soleil de plomb et le sol en goudron, faites le calcul.&lt;br /&gt;&lt;br /&gt;Les concerts s'enchaînent bien, un peu trop bien même, on n'a pas le temps de bien se placer d'un concert à un autre, surtout quand c'est un set court. L'avantage c'est que comme les deux scènes sont proches l'une de l'autre on a quand même un peu de vue et du son dès le départ.&lt;br /&gt;&lt;br /&gt;Le son. Parlons-en. Je ne sais pas qui est ingénieur son pour ce festival, mais il devrait sérieusement songer à changer de métier. Les façades sont peu fournies mais distribuent des basses à ne plus savoir qu'en faire, ce qui fait que dès que ça devient enthousiaste sur la double pédale ou sur la basse (autant dire "tout le temps sauf pendant les solos") on se fait violer les oreilles par une grosse pâte de laquelle les guitares ont bien du mal à se dégager. Moi qui porte des earplugs qui atténuent moins les basses que le reste, vous imaginez ma joie de découvrir cette particularité de l'acoustique locale.&lt;br /&gt;&lt;br /&gt;Malgré cela les groupes nous offrent des superbes shows. Une mention toute particulière à Bukowski qui est pour moi la belle découverte du festival, surprise pour Bring Me The Horizon dont les fans ont du adorer la prestation puisque je suisscotché par leur présence de scène sans aimer leur musique. Ma grosse claque du samedi est sans hésiter Gojira, les basses abusives collent quand même bien à leur musique, ou alors c'est qu'ils ont un putain de talent, je ne sais pas trop. Slipknot dans une formation amputée et en couleurs des débuts nous sert un set qui tire vers ses origines et doit avoir un effet "madeleine de Proust" sur bien d'autres que moi, puissant mais teinté d'émotion.&lt;br /&gt;&lt;br /&gt;Les Big Four, fidèles à leur réputation, savent faire honneur à leur rang : Slayer sert une belle déferlante de puissance pure sans la moindre pause, la foule vibre au groove d'Anthrax, Megadeth est d'une perfection virtuose presque froide mais impressionnante de précision ; quant à Metallica... METALLICA quoi, deux heures de thrash bien trempé dans les gencives, old-school puissant et rapide devant une foule nombreuse qui apprécie à sa juste valeur l'écran géant (tout le fond de scène en fait) et la juste dose de pyrotechnie.&lt;br /&gt;&lt;br /&gt;Des bons souvenirs, des pieds douloureux, un fameux coup de soleil, mais l'envie certaine qu'il y ait un Sonisphere France en 2012, voilà ce que j'en ramène. Il faut souffrir pour avoir des beaux concerts, semble-t-il.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;(cet article a été rédigé pour &lt;a href="http://leplus.nouvelobs.com/contribution/172020;le-sonisphere-a-la-francaise-c-est-chaud-mais-c-est-bon.html"&gt;Le Plus&lt;/a&gt;, blog du Nouvel Observateur ; ceci est la version que je leur ai soumis, sans édition de leur part)&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-6170024719127362757?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/6170024719127362757/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2011/07/le-sonisphere-la-francaise-cest-chaud.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6170024719127362757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6170024719127362757'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2011/07/le-sonisphere-la-francaise-cest-chaud.html' title='Le Sonisphère à la française, c&apos;est chaud mais c&apos;est bon'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-873140608301272352</id><published>2011-07-11T13:00:00.003+02:00</published><updated>2011-07-11T13:36:21.331+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mythe'/><category scheme='http://www.blogger.com/atom/ns#' term='code (php)'/><category scheme='http://www.blogger.com/atom/ns#' term='benchmark'/><title type='text'>PHP : for() mieux que foreach(), un mythe ?</title><content type='html'>Dans mon boulot je dois fournir pas mal de PHP, qui sera parfois mis à mal et donc doit être un peu performant. Un jour au détour d'un backlog IRC je vois passer un argument du type "il faut remplacer les foreach() par des for() sinon ça consomme trop de mémoire".&lt;br /&gt;&lt;br /&gt;Ah bon ?&lt;br /&gt;&lt;br /&gt;Deux coups de googlage et voilà d'autres commentaires du même ordre, mais aucun n'est soutenu par des mesures, du coup faut que j'essaie.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Pour tester, j'ai le petit script suivant :&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;$largearray = array();&lt;br /&gt;for ($i = 0, $max = 1000; $i &lt; $max; $i++) {&lt;br /&gt;    for ($j = 0, $max = 100; $j &lt; $max; $j++) {&lt;br /&gt;        $largearray[$i][$j] = rand(0, 100000);&lt;br /&gt;    }   &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$base = memory_get_usage();&lt;br /&gt;foreach ($largearray as $value) {&lt;br /&gt;    $foo = $value; // oui, ca ne sert a rien&lt;br /&gt;}&lt;br /&gt;print "foreach : ".(memory_get_peak_usage() - $base)."\n";&lt;br /&gt;&lt;br /&gt;$base = memory_get_usage();&lt;br /&gt;for ($i = 0, $max = count($largearray); $i &lt; $max; $i++) {&lt;br /&gt;    $foo = $largearray[$i];&lt;br /&gt;}&lt;br /&gt;print "for : ".(memory_get_peak_usage() - $base)."\n";&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;C'est d'une simplicité criminelle : d'abord on se remplit un array bidimensionnel avec des valeurs aléatoires, ensuite on va boucler dessus et bêtement copier chaque sous-tableau dans une variable qui ne sert à rien. Avant de boucler on obtient l'usage mémoire, pour mieux distinguer ce que génère le parcours.&lt;br /&gt;&lt;br /&gt;Seulement voilà, moi on me parlait de "deux fois moins de mémoire" et j'obtiens ceci à l'exécution (valeurs en octets) :&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;foreach : 1540&lt;br /&gt;for : 1496&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Quelqu'un a pu observer un grand écart de consommation mémoire entre un for() et un foreach() sur les mêmes données ?&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-873140608301272352?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/873140608301272352/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2011/07/php-for-mieux-que-foreach-un-mythe.html#comment-form' title='4 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/873140608301272352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/873140608301272352'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2011/07/php-for-mieux-que-foreach-un-mythe.html' title='PHP : for() mieux que foreach(), un mythe ?'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-1407714447802303296</id><published>2011-07-03T21:59:00.004+02:00</published><updated>2011-07-03T22:10:20.988+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lovecraft'/><category scheme='http://www.blogger.com/atom/ns#' term='litterature'/><category scheme='http://www.blogger.com/atom/ns#' term='humeur'/><category scheme='http://www.blogger.com/atom/ns#' term='traduction'/><category scheme='http://www.blogger.com/atom/ns#' term='cthulhu'/><title type='text'>Du pouvoir de la ponctuation</title><content type='html'>Parce que j'aime &lt;a href="https://twitter.com/#!/jkbockstael/status/84309207783972864"&gt;enfoncer le clou&lt;/a&gt; :&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;In his house at R'lyeh, dead Cthulhu waits dreaming.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;(&lt;i&gt;The Call of Cthulhu&lt;/i&gt;, Howard Philips Lovercraft)&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Dans sa demeure de R'lyeh la morte, Cthulhu attend en rêvant.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;(&lt;i&gt;L'appel de Cthulhu&lt;/i&gt;, traduction française de Jacques Papy et Simone Lamblin)&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Selon la transcription, il y a une virgule ou pas avant "dead Cthulhu", mais dans les deux cas l'outrage est le même, "dead" se rapporte évidemment à "Cthulhu", pas à "R'lyeh".&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-1407714447802303296?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/1407714447802303296/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2011/07/du-pouvoir-de-la-ponctuation.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1407714447802303296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1407714447802303296'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2011/07/du-pouvoir-de-la-ponctuation.html' title='Du pouvoir de la ponctuation'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-1754745093224445337</id><published>2011-05-12T12:21:00.000+02:00</published><updated>2011-05-13T22:23:38.598+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humeur'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='wtf'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><title type='text'>De la déchéance de l'enseignement</title><content type='html'>Avant-hier, ce cher &lt;a href="http://malloxcast.com/"&gt;Mallox&lt;/a&gt; &lt;a href="https://twitter.com/Mallox/status/67961017606471682"&gt;twittait une question piège&lt;/a&gt; :&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;6÷2(1+2)= ?&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;C'est fourbe, hein ?&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Ce qui est un peu amer, c'est les réponses qu'il a reçu. Pour une raison qui m'échappe, des francophones qui admettent le sens de lecture de gauche à droite l'oublient quand il s'agit d'évaluer des opérations de même niveau. Chouette.&lt;br /&gt;&lt;br /&gt;Si vous voulez vous faire encore plus mal, il y a un fil &lt;a href="http://answers.yahoo.com/question/index?qid=20110428210248AA7we0U"&gt;Yahoo!Answers&lt;/a&gt; sur le sujet, où certaines justifications deviennent hilarantes tellement elles partent dans le "ça dépend" teinté de mysticisme. Sérieusement, WTF ?&lt;br /&gt;&lt;br /&gt;Ça remonte à si loin que ça "PEMDAS" ? C'est si incompréhensible ? Loin de moi l'envie de cracher sur les joyeux hippies qui voudraient que nos têtes blondes ne travaillent plus, n'apprennent plus rien par coeur, ne soient jamais évalués... enfin si, en fait j'ai envie de leur cracher dessus avec force et véhémence. Tu vois ce qui arrive, quand on cesse de driller sur des choses élémentaires ? Hein ? HEIN ? HEIN LARRY, TU VOIS CE QUI ARRIVE ? Z'êtes mignons tout plein, mais là on se retrouve cernés de bras cassés qui doivent sortir une calculatrice pour diviser par 10, elle est belle la civilisation.&lt;br /&gt;&lt;br /&gt;Putain de branquignolles.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-1754745093224445337?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/1754745093224445337/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2011/05/de-la-decheance-de-lenseignement.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1754745093224445337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1754745093224445337'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2011/05/de-la-decheance-de-lenseignement.html' title='De la déchéance de l&apos;enseignement'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-1751025195616232509</id><published>2011-05-07T01:26:00.003+02:00</published><updated>2011-05-07T01:33:02.115+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='code (applescript)'/><category scheme='http://www.blogger.com/atom/ns#' term='ipod'/><category scheme='http://www.blogger.com/atom/ns#' term='itunes'/><title type='text'>Afficher les albums par ordre chronologique sur un iPod</title><content type='html'>J'utilise iTunes pour la gestion de ma librairie musicale, et &lt;a href="http://www.pixiapps.com/ecoute/"&gt;Ecoute&lt;/a&gt; pour la lecture. Ecoute a une interface légère, disponible de partout, et a la chouette possibilité d'afficher les albums d'un même artiste par ordre chronologique. Par contre, sur mon iPod, les albums d'un même artiste sont affichés dans l'ordre alphabétique, ce qui franchement n'a aucun sens.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Aucune option de présentation sur l'iPod ne permet de changer cela, par contre en sachant que l'iPod trie ses morceaux comme iTunes, je peux utiliser les champs "sort machin" pour forcer un critère de tri qui soit différent du champs affiché. Si dans le champs "sort album" je mets l'année de sortie suivie du nom de l'album, j'arrive à un tri d'abord par année de sortie, ensuite par ordre alphabétique au sein d'une même année. Exactement ce qu'il me faut.&lt;br /&gt;&lt;br /&gt;Par contre c'est fastidieux, donc j'ai écrit un petit AppleScript, à placer dans ~/Library/iTunes/Scripts pour pouvoir l'appeler depuis le menu Script d'iTunes quand on a sélectionné les morceaux d'un même album :&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-- Fix albums display order&lt;br /&gt;-- Changes the "sort album" field, to ensure that albums get displayed in chronological order on iPods.&lt;br /&gt;-- CC-BY-NC 2011, Jean-Karim Bockstael, &lt;jkb@jkbockstael.be&gt;&lt;br /&gt;tell application "iTunes"&lt;br /&gt; -- input checking&lt;br /&gt; if selection is {} then&lt;br /&gt;  display dialog "You must select at least a track"&lt;br /&gt;  return&lt;br /&gt; else&lt;br /&gt;  set selected_tracks to selection&lt;br /&gt;  repeat with a_track in selected_tracks&lt;br /&gt;   if a_track's album = "" then&lt;br /&gt;    display dialog "All tracks must have their Album field filled"&lt;br /&gt;    return&lt;br /&gt;   end if&lt;br /&gt;   if a_track's year = "" then&lt;br /&gt;    display dialog "All tracks must have their Year field filled"&lt;br /&gt;    return&lt;br /&gt;   end if&lt;br /&gt;  end repeat&lt;br /&gt;  if length of selected_tracks &gt; 1 then&lt;br /&gt;   set cur_album to album of item 1 of selected_tracks&lt;br /&gt;   set cur_year to year of item 1 of selected_tracks&lt;br /&gt;   repeat with a_track in selected_tracks&lt;br /&gt;    if a_track's album is not equal to cur_album then&lt;br /&gt;     display dialog "All tracks must share the same album name"&lt;br /&gt;     return&lt;br /&gt;    end if&lt;br /&gt;    if a_track's year is not equal to cur_year then&lt;br /&gt;     display dialog "All tracks must share the same release year"&lt;br /&gt;     return&lt;br /&gt;    end if&lt;br /&gt;    set cur_album to a_track's album&lt;br /&gt;    set cur_year to a_track's year&lt;br /&gt;   end repeat&lt;br /&gt;  end if&lt;br /&gt;  -- actual work&lt;br /&gt;  repeat with a_track in selected_tracks&lt;br /&gt;   set a_track's sort album to (a_track's year as string) &amp; " " &amp; (a_track's album as string)&lt;br /&gt;  end repeat&lt;br /&gt; end if&lt;br /&gt;end tell&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Hope this helps :-)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-1751025195616232509?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/1751025195616232509/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2011/05/afficher-les-albums-par-ordre.html#comment-form' title='5 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1751025195616232509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1751025195616232509'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2011/05/afficher-les-albums-par-ordre.html' title='Afficher les albums par ordre chronologique sur un iPod'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-8419557191932423555</id><published>2011-04-17T15:38:00.003+02:00</published><updated>2011-04-17T15:44:26.983+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code (php)'/><category scheme='http://www.blogger.com/atom/ns#' term='cc-by'/><title type='text'>PHP : Déterminer la langue d'un visiteur</title><content type='html'>C'est dimanche, il fait beau, et je me dis que je publierais bien un truc que j'avais codé pour le boulot vendredi : la détermination, parmi des possibilités de langue, de la langue la plus appropriée au visiteur. Ça casse rien, mais c'est un problème courant donc une solution peut faire gagner du temps à pas mal de monde ;-)&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Niveau implémentation, on se base sur le header HTTP &lt;code&gt;Accept-Language&lt;/code&gt; et une liste de langues possibles fournies par l'appelant :&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;// get_prefered_language : renvoie la langue que le visiteur prefere&lt;br /&gt;// en fonction de ce qu'il renseigne via sa requete HTTP&lt;br /&gt;// et de ce qu'on indique comme disponible, ou null si rien ne va&lt;br /&gt;// $available_langs est un array, par exemple array('it','fr', 'en')&lt;br /&gt;function get_preferred_language($available_langs) {&lt;br /&gt; // Parse du header HTTP Accept-Language&lt;br /&gt; $langs = array();&lt;br /&gt; // Cet en-tete HTTP est de la forme en-US,en;q=0.8,fr;q=0.6&lt;br /&gt; foreach (explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $httplang) {&lt;br /&gt;  $rawlang = explode(';q=', $httplang);&lt;br /&gt;  if (strpos($rawlang[0], '-') !== FALSE) {&lt;br /&gt;   // On ne garde que la partie "langue" de la locale, si jamais&lt;br /&gt;   $rawlang[0] = substr($rawlang[0], 0, strpos($rawlang[0], '-'));&lt;br /&gt;  }&lt;br /&gt;  if (count($rawlang) == 1) {&lt;br /&gt;   $rawlang[1] = 1.0; // Si aucun poids n'est precise, c'est que le poids vaut 1&lt;br /&gt;  }&lt;br /&gt;  $langs[$rawlang[1]] = $rawlang[0]; // Z'avez qu'a mettre des poids distincts :p&lt;br /&gt; }&lt;br /&gt; krsort($langs, SORT_NUMERIC);&lt;br /&gt; // Choix de la meilleure langue disponible&lt;br /&gt; foreach($langs as $weight =&gt; $code) {&lt;br /&gt;  if (in_array($code, $available_langs)) {&lt;br /&gt;   return $code;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; // Ah ben zut alors, pas de bol&lt;br /&gt; return null;&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-8419557191932423555?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/8419557191932423555/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2011/04/php-determiner-la-langue-dun-visiteur.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/8419557191932423555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/8419557191932423555'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2011/04/php-determiner-la-langue-dun-visiteur.html' title='PHP : Déterminer la langue d&apos;un visiteur'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-4841056852094988267</id><published>2011-04-14T12:26:00.000+02:00</published><updated>2011-04-14T12:26:00.488+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='esr'/><category scheme='http://www.blogger.com/atom/ns#' term='hacker'/><category scheme='http://www.blogger.com/atom/ns#' term='traduction'/><title type='text'>"Comment devenir un hacker" en version 1.03</title><content type='html'>&lt;a href="http://blog.jkbockstael.be/2008/12/comment-devenir-un-hacker.html"&gt;Il y a de cela déjà "un certain temps"&lt;/a&gt;, j'avais traduit le &lt;a href="http://catb.org/~esr/faqs/hacker-howto.html"&gt;"How to become a Hacker" d'Eric Raymond&lt;/a&gt; en français, déçu par la piètre qualité ou l'obsolescence des traductions existantes (en passant ça m'a valu &lt;a href="http://blog.jkbockstael.be/2008/12/comment-devenir-un-hacker.html?showComment=1229364360000#c5158323490870552161"&gt;une menace de poursuite judiciaire&lt;/a&gt;, mais ça m'a permis de découvrir &lt;a href="http://jean-marc.manach.net/"&gt;Jean-Marc Manach&lt;/a&gt; donc j'y gagne au change). L'&lt;a href="http://catb.org/~esr/faqs/hacker-howto.html"&gt;original&lt;/a&gt; a évolué, la &lt;a href="http://files.jkbockstael.be/hacker-howto-fr.htm"l&gt;traduction&lt;/a&gt; évolue aussi.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;En fait j'avais loupé deux versions de l'original, la 1.42 et la 1.43, donc il y a eu un peu plus de boulot que simplement retirer la mention selon laquelle Perl est plus populaire que Python. Voilà ce qui arrive quand on n'est pas assez attentif à ce qui est publié. Enfin bon, c'est en ligne, et ça constitue donc la version française du hacker-howto la plus à jour qui soit, même si ESR doit avoir quelque chose contre le français, ça fait trois ans qu'il ignore mes mails et refuse de mentionner l'existence de la moindre traductions française dans l'original. Ah, les égos enflés...&lt;br /&gt;&lt;br /&gt;Voilà, "&lt;a href="http://files.jkbockstael.be/hacker-howto-fr.html"&gt;Comment devenir un Hacker&lt;/a&gt;" est plus à jour que jamais. Enjoy :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-4841056852094988267?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/4841056852094988267/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2011/04/comment-devenir-un-hacker-en-version.html#comment-form' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/4841056852094988267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/4841056852094988267'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2011/04/comment-devenir-un-hacker-en-version.html' title='&quot;Comment devenir un hacker&quot; en version 1.03'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-1004780762507289992</id><published>2011-03-17T12:21:00.004+01:00</published><updated>2011-03-17T12:33:10.040+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humeur'/><category scheme='http://www.blogger.com/atom/ns#' term='censure'/><category scheme='http://www.blogger.com/atom/ns#' term='oatr'/><title type='text'>Pentes glissantes</title><content type='html'>Chez nous aut' en Belgique, on aime bien créer des organismes publics, ça nous évite de devoir effectivement agir. Parmi ces belles inventions se trouve le &lt;i&gt;Centre pour l'égalité des chances et la lutte contre le racisme&lt;/i&gt; dont le titre explicite ne cache pas la mission, qui est de lutter contre les discriminations en général et le racisme en particulier. En fait il ne fait qu'appliquer un contexte légal qui interdit les propos racistes, antisémites, xénophobes. Nos amis Français ont le même genre de loi, la loi Gayssot par exemple.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;Je vous épargne le texte de loi, mais en gros ça dit qu'on ne peut pas parler ou agir en raciste, antisémite, xénophobe, et même négationniste. La volonté derrrière étant clairement d'éviter des dérives extrêmes en empêchant les extrémistes d'haranguer la foule. C'est sûr que clamer &lt;i&gt;"si on avait laisser Hitler finir le travail, on n'en serait pas là"&lt;/i&gt; ce n'est pas exactement le genre de discours qui donne envie de se métamorphoser en bisounours mignon.&lt;br /&gt;&lt;br /&gt;Du coup, les propos nazis, ça incite à la haine, c'est mal, on ne peut pas. Tout le monde approuve, ça applaudit dans les chaumières. Encore une belle victoire face à la haine humaine.&lt;br /&gt;&lt;br /&gt;Dans la lignée évidemment, tous les propos racistes sont haineux aussi. J'ai jamais eu envie de faire des bisous en entendant &lt;i&gt;"je suis au chômage mais c'est à cause de tous ces étrangers hein ! Ces marloufs qui débarquent ici nous piquer nos jobs et qui engrossent leurs Fatmas pour choper des allocs en masse avec cette marmaille qu'ils ne sauront pas tenir après et qui vont agresse des gens dans le métro au point qu'on doive envisager d'y envoyer l'armée..."&lt;/i&gt;. OK, le racisme c'est la haine, du coup c'est interdit, normal.&lt;br /&gt;&lt;br /&gt;Bon tant qu'à faire, les homophobes on ferait pas pareil ? &lt;i&gt;"Ouais moi ces grandes zazas qui se roulent des patins devant nos enfants avant d'aller se faire emmancher par de parfaits inconnus dans des backrooms sordides ça me dégoûte ! Les enverrai bien sucer des pissenlits par la racine, au lieu de pomper des joncs !"&lt;/i&gt; Houlà c'est de l'incitation au meurtre ça ! Interdisons les propos homophobe, ils incitent à la haine !&lt;br /&gt;&lt;br /&gt;D'ailleurs, entre racisme et homophobie, on arrive doucement à l'archétype du fan de foot non ? Gueuler "enculé" à tout bout de champs par exemple, c'est un peu de l'homophobie ça ? D'ailleurs remarquez qu'on assiste fréquemment à des altercations violentes entre fanatiques d'une couleur et fanatiques de l'autre. Le foot en soi c'est bien, les fans de foot haineux c'est mal. On peut laisser le foot, mais il faut interdire les stades et les rassemblements dans les bistrots pendant les matches. Pas de direct à la TV, juste les résultats dans la presse le lendemain.&lt;br /&gt;&lt;br /&gt;Mouais, moi je remarque qu'ils sont agressifs et violents les soirs de matches mais ces soirs-là ils se sont aussi rincés le gosier de multiples litres de mauvaise bière. Et constatez les bagarres dans les cafés une fois les abrutis suffisamment avinés... mais c'est bien sûr ! Le problème c'est l'alcool ! Cet alcool infâme qui change l'homme en bête ! INTERDISONS L'ALCOOL !&lt;br /&gt;&lt;br /&gt;J'entends d'ici les esprits chagrins dire que la prohibition de l'alcool avait réussi aux USA à transformer de petits groupes de voyous anecdotiques en puissantes mafias dont les ramifications tiraient les ficelles de l'économie et de la politique, et ce en quelques années à peine. L'efficacité à l'américaine, en quelque sorte. Nous le savons, et nous savons en tirer les leçons, nous. Parce que bon hein, faut dire ce qui est, on est pas des amerloques non plus, on sait tirer des leçons du passé et ne pas refaire les mêmes erreurs, nous. Nous ne sommes pas comme ces gens-là.&lt;br /&gt;&lt;br /&gt;Tiens, c'était pas un tout petit peu du racisme ça, d'ailleurs ?&lt;br /&gt;&lt;br /&gt;&lt;i&gt;(Retrouvez cette chronique et d'autres stupidités dans &lt;a href="http://www.onatoujoursraison.be/"&gt;On a toujours raison&lt;/a&gt;, en direct le jeudi soir et en podcast tout le temps.)&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-1004780762507289992?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/1004780762507289992/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2011/03/pentes-glissantes.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1004780762507289992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1004780762507289992'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2011/03/pentes-glissantes.html' title='Pentes glissantes'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-3574709109799153568</id><published>2010-12-05T20:43:00.006+01:00</published><updated>2010-12-06T07:31:10.103+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code (php)'/><category scheme='http://www.blogger.com/atom/ns#' term='cc-by'/><category scheme='http://www.blogger.com/atom/ns#' term='dot2array'/><title type='text'>PHP : dot2array, une couche d'abstraction pour utiliser facilement des tableaux à plusieurs dimensions.</title><content type='html'>Des fois on a du temps à tuer, du coup on entame un projet de programmation mais en avançant dedans on se retrouve à avoir besoin de code utilitaire réutilisable... et une fois que c'est fait on se dit qu'en fait c'est pratique et ça servirait bien à d'autres, donc que ce serait bien de le publier quelque part. Ici, je suis dans un train de retour de Strasbourg, et j'avais besoin d'un moyen simple et lisible de parcourir des tableaux multi-dimentionnels.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Sans plus attendre, voici le résultat de cette petite session improvisée, un exemple d'utilisation concrete de ces fonctions (en fait, leur raison d'être à la base) suit plus bas (&lt;a href="http://files.jkbockstael.be/code/dot2array.tgz"&gt;et est disponible ici&lt;/a&gt;) : &lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;// dot2array&lt;br /&gt;// Abstraction layer allowing to get and set values from a multidimentional array&lt;br /&gt;// by using a dot notation. Can be quite useful when working with configuration arrays.&lt;br /&gt;// CC-BY 2010, Jean-Karim Bockstael &amp;lt;jkb@jkbockstael.be&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// getValue : getter accessor&lt;br /&gt;// Example : getValue($items, 'foo.bar.baz') = $items['foo']['bar']['baz']&lt;br /&gt;function getValue($items, $itempath) {&lt;br /&gt; if (empty($items)) {&lt;br /&gt;  throw new Exception("Could not get value: Empty items argument.");&lt;br /&gt; }&lt;br /&gt; if (empty($itempath)) {&lt;br /&gt;  throw new Exception("Could not get value: Empty itempath argument.");&lt;br /&gt; }&lt;br /&gt; $names = explode('.',$itempath);&lt;br /&gt; $names = array_reverse($names);&lt;br /&gt; $item = &amp;$items;&lt;br /&gt; while (count($names) &gt; 0) {&lt;br /&gt;  $name = array_pop($names);&lt;br /&gt;  if (!isset($item[$name])) {&lt;br /&gt;   throw new Exception("Could not get value: no value at this path.");&lt;br /&gt;  }&lt;br /&gt;  $item = &amp;$item[$name];&lt;br /&gt; }&lt;br /&gt; return $item;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// setValue: setter accessor&lt;br /&gt;// Example : setValue($items, 'foo.bar.baz', 42) =&gt; $items['foo']['bar']['baz'] = 42&lt;br /&gt;function setValue(&amp;$items, $itempath, $value) {&lt;br /&gt; if (empty($items)) {&lt;br /&gt;  throw new Exception("Could not set value: Empty items argument.");&lt;br /&gt; }&lt;br /&gt; if (empty($itempath)) {&lt;br /&gt;  throw new Exception("Could not set value: Empty itempath argument.");&lt;br /&gt; }&lt;br /&gt; if (empty($value)) {&lt;br /&gt;  throw new Exception("Could not set value: Empty value argument.");&lt;br /&gt; }&lt;br /&gt; $names = explode('.',$itempath);&lt;br /&gt; $names = array_reverse($names);&lt;br /&gt; $item = &amp;$items;&lt;br /&gt; while (count($names) &gt; 0) {&lt;br /&gt;  $name = array_pop($names);&lt;br /&gt;  if (!isset($item[$name])) {&lt;br /&gt;   $item[$name] = array();&lt;br /&gt;  }&lt;br /&gt;  $item = &amp;$item[$name];&lt;br /&gt; }&lt;br /&gt; $item = $value;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Les attentifs auront remarqué que le setter vérifie si un élement existe et le crée si besoin est. Maintenant, le pourquoi ! J'ai un fichier de configuration qui est de cette forme-là :&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;$configuration['database']['host'] = 'localhost';&lt;br /&gt;$configuration['database']['name'] = 'DB-exemple';&lt;br /&gt;$configuration['database']['user'] = 'user-exemple';&lt;br /&gt;$configuration['database']['password'] = '5up3r53cr37';&lt;br /&gt;$configuration['platform']['language'] = 'french';&lt;br /&gt;$configuration['platform']['admin']['name'] = 'Jean-Karim Bockstael';&lt;br /&gt;$configuration['platform']['admin']['email'] = 'jkb@jkbockstael.be';&lt;br /&gt;// ...&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Doté de ceci, j'aimerais pouvoir faire quelque chose de ce goût-là : &lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;// ...&lt;br /&gt;$link = mysql_connect(getConfig('database.host'), getConfig('database.user'), getConfig('database.password'));&lt;br /&gt;// ...&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;En utilisant dot2array c'est possible, moyennant une fonction wrapper (allez, deux, c'est le même prix) : &lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;require("dot2array.php");&lt;br /&gt;require("configuration.php");&lt;br /&gt;&lt;br /&gt;// Getter&lt;br /&gt;function getConfig($itempath) {&lt;br /&gt; global $configuration;&lt;br /&gt; return getValue($configuration, $itempath);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Setter&lt;br /&gt;function setConfig($itempath, $value) {&lt;br /&gt; global $configuration;&lt;br /&gt; setValue($configuration, $itempath, $value);&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Elle n'est pas belle, la vie ? Allez hop, c'est cadeau (CC-BY, faut juste reconnaître que je suis un mec génial) donc profitez-en bien ;-) &lt;a href="http://files.jkbockstael.be/code/dot2array.tgz"&gt;Téléchargement ici.&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-3574709109799153568?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/3574709109799153568/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2010/12/php-dot2array-une-couche-dabstraction.html#comment-form' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/3574709109799153568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/3574709109799153568'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2010/12/php-dot2array-une-couche-dabstraction.html' title='PHP : dot2array, une couche d&apos;abstraction pour utiliser facilement des tableaux à plusieurs dimensions.'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-3290287501834958006</id><published>2010-07-31T13:51:00.001+02:00</published><updated>2010-07-31T13:51:00.344+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='the drums'/><category scheme='http://www.blogger.com/atom/ns#' term='musique'/><category scheme='http://www.blogger.com/atom/ns#' term='humeur'/><category scheme='http://www.blogger.com/atom/ns#' term='crap'/><category scheme='http://www.blogger.com/atom/ns#' term='lafougere'/><title type='text'>The Drums - The Drums</title><content type='html'>Il y a peu j'ai vu passer un twitt de &lt;a href="http://twitter.com/ylebout"&gt;Yann Lebout&lt;/a&gt; (garçon intéressant, il parle peu mais parle bien, tout le contraire de moi) qui s'interrogeait rhétoriquement sur la similarité entre &lt;b&gt;The Drums&lt;/b&gt; et The Cure. Etant moi-même assez friand de l'oeuvre des décoiffés en noir, j'ai tiqué et il me fallait écouter ce premier album des Drums dont beaucoup disent qu'il est bien parti pour être disque de l'année. Je ne sais pas pour vous, mais pour moi "disque de l'année" c'est péjoratif. Ce n'est pas dans mes habitudes de parler de ce qui ne me plait pas, mais je vais faire une exception, tiens...&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;The Drums est un groupe fondé en 2008 des cendres de Elkland (un truc électronique, rien à voir, splitté en 2006) par quatre garçons dans le vent, américains mais gentils. En 2009 ils sont shortlistés pour &lt;i&gt;BBC Sound Acts of 2010&lt;/i&gt;, classés 5èmes dans cette même liste en janvier 2010, matraquent les esprits à grands renforts de MTV (être signé chez Island ça aide), du coup se hissent dans les votes de lecteurs et font une entrée dans les charts pas trop mauvaise (16èmes chez les britons). Ouais. C'est un groupe qui a deux ans mais fait de la première partie de Kings of Leon, c'est-y pas beau l'entertainment moderne ? Et pendant ce temps plein de talentueux rament comme des dingues...&lt;br /&gt;&lt;br /&gt;C'est pas tout ça, que cache ce disque qui est une "révélation" pour tant ? D'emblée on est accueilli par des relents d'élctronique cheap qui laissent vite la place à du bon gros rythme bien pop, le genre conçu pour bien péter sur toutes les radios. D'ailleurs un rapide coup d'oeil révèle qu'ils sont pour la plupart très proches du fameux 3 minutes 40 de la radio, comme c'est curieux. C'est pop, en 4/4, y'a du reverb, on fait péter le couplet-refrain sans risquer autre chose, et à première vue la production n'a pas été faite par des sourds. Deuxième morceau, même recette... &lt;br /&gt;&lt;br /&gt;Mais dites-moi... la guitare me rappelle les deux tiers du répertoire des Cure, c'est normal ? A vrai dire la batterie et la basse pareil. Le chant beaucoup moins, c'est de la voix de puceau qui se donne un genre hipster, ça agace, mais le reste c'est pas possible quoi c'est du voulu on me vend un cover-band camouflé en révélation ! Le groupe cite comme influences The Smith et Joy Division (entre autres), faut croire que c'est normal... enfin ceci dit, quand au fil des morceaux les références se font aussi flagrantes, on ne doit plus dire "influences" mais "fournisseurs", non ? Ou alors c'est moi qui râle. &lt;br /&gt;&lt;br /&gt;Vient ensuite l'horriblement agaçant "Let's go surfing" qui a le mérite de durer moins de 3 minutes, et la même recette est réchauffée, resservie ad nauseum toujours dans un format très pratique pour les radios qui n'aiment pas prendre de risque. Comme c'est commode. Comme c'est lassant.&lt;br /&gt;&lt;br /&gt;Ah ben quoi, c'est déjà fini ? C'était pas si long que ça finalement. Ah. 43 minutes. Tout s'explique...&lt;br /&gt;&lt;br /&gt;En bref, pas de quoi fouetter un chat, ceci est un n-ième disque de pop dont la production est techniquement impeccable ; quelques tubes efficaces à court terme qui exploitent comme ils peuvent les sons, rythmes, et mélodies d'une période brittanique et d'une période surf dont les plus jeunes ignorent jusqu'à l'existence. Sûrement sympathique sur scène. Ils vont en vendre des disques, ça c'est sûr. Mais, demain, qui se souviendra ? Sur ces bonnes paroles, je vous laisse en compagnie de l'influence flagrante...&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/F-L9_IDjtH0&amp;amp;hl=en_US&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/F-L9_IDjtH0&amp;amp;hl=en_US&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;(Cet article a été publié sur &lt;a href="http://leblogdelafougere.wordpress.com/"&gt;La Fougère&lt;/a&gt;, blog musical sans restriction.)&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-3290287501834958006?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/3290287501834958006/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2010/07/drums-drums_31.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/3290287501834958006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/3290287501834958006'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2010/07/drums-drums_31.html' title='The Drums - The Drums'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-667626827809104759</id><published>2010-07-07T23:14:00.001+02:00</published><updated>2010-07-07T23:16:29.005+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humour'/><category scheme='http://www.blogger.com/atom/ns#' term='citation'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>Dans ton lit, dans ton cul.</title><content type='html'>Pour ceux qui me connaissent, ou qui me lisent régulièrement, ce n'es en aucun cas une nouveauté que je ne suis pas un sinistre. Donc j'aime les conneries, et avec Internet et ses &lt;i&gt;memes&lt;/i&gt; je ne suis jamais en reste. Pourtant aujourd'hui ce n'est pas d'un &lt;i&gt;meme&lt;/i&gt; à la 4chan que je me suis amusé, mais d'un délire de fin de soirée arrosée entre amis (mes soirées sont trop branchées, vous n'y entrerez pas). L'idée est simple et tient en 6 lettres : "DTLDTC", ou "dans ton lit, dans ton cul". Pas exactement une proposition indécente mais un appel au détournement de maximes, titres, et autres phrases connues. Lancé l'idée sur Twitter ce matin pour voir si ça marche aussi bien sur les geeks que sur les amateurs de Corsendonk brune, et ça marche plutôt bien !&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Quelques morceaux choisis, sans ordre particulier, pour la totale faites confiance &lt;a href="http://twitter.com/#search?q=%23dtldtc"&gt;la recherche Twitter&lt;/a&gt; :&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Robert Mailleux dans ton lit, c'est du sérieux dans ton cul. #spécialpourlesbelges (&lt;a href="http://twitter.com/shirineouldamer"&gt;@shirineouldamer&lt;/a&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;"L'union dans ton lit fait la force dans ton cul" ou encore "Le respect dans ton lit garanti dans ton cul" #dtldtc #slogans #be1306 (&lt;a href="http://twitter.com/vertbruxelles"&gt;@vertbruxelles&lt;/a&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;le Brompton de @emich dans ton lit est l'attraction du jour dans ton cul #dtldtc (&lt;a href="http://twitter.com/pakal_vision"&gt;@pakal_vision&lt;/a&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Que le premier qui n'a jamais été dans ton lit, te jette la première pierre dans ton cul (&lt;a href="http://twitter.com/avaveen"&gt;@avaveen&lt;/a&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;L'hirondelle dans ton lit ne fait pas le printemps dans ton cul (&lt;a href="http://twitter.com/batmrou"&gt;@batmrou&lt;/a&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Le gland dans ton lit ne tombe jamais bien loin du chêne dans ton cul (&lt;a href="http://twitter.com/Mcflee13"&gt;@Mcflee13&lt;/a&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Jamais deux dans ton lit sans trois dans ton cul (&lt;a href="http://twitter.com/jdek_twit"&gt;@jdek_twit&lt;/a&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Dans mon lit il y a des cactus dans mon cul (&lt;a href="http://twitter.com/3nJ0y"&gt;@3nJ0y&lt;/a&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;@_klf Je t'en prie #danstonlit c'était un plaisir #danstoncul (&lt;a href="http://twitter.com/frenchfigaro"&gt;@FrenchFigaro&lt;/a&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Jean qui rit dans ton lit Jean qui pleure dans ton cul. (&lt;a href="http://twitter.com/Blahypocondriac"&gt;@Blahypocondriac&lt;/a&gt;)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Et le Prix du Pisse-Froid revient à &lt;a href="http://twitter.com/Le_Velu"&gt;@Le_Velu&lt;/a&gt; pour son superbe cri contre l'humour de merde :&lt;br /&gt;&lt;quote&gt;&lt;br /&gt;#dtldtc c pour recycler toutes les blagues déjà faites avec "entre les draps, entre les cuisses"? On se fait chier un peu non?&lt;br /&gt;&lt;/quote&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-667626827809104759?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/667626827809104759/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2010/07/dans-ton-lit-dans-ton-cul.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/667626827809104759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/667626827809104759'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2010/07/dans-ton-lit-dans-ton-cul.html' title='Dans ton lit, dans ton cul.'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-4381023398045506593</id><published>2010-07-06T18:15:00.001+02:00</published><updated>2010-07-06T18:15:00.100+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Qu'est-ce qu'on peut écrire en hexadécimal ?</title><content type='html'>Pour l'instant au boulot je travaille avec un gentil &lt;strike&gt;morveux&lt;/strike&gt;étudiant fort sympathique qui assume une certaine geekitude nécessaire pour ce genre de métier. Par exemple, au lieu de glander totalement sur ToiTuyau, il a codé un petit bout de C, un programme qui vérifie quels mot on peut écrire uniquement avec des caractères hexadécimaux. Amusant. Et puis ça peut servir si on manque d'inspiration pour une IPv6 ou un magic number. Moi je l'ai refait mais en Python. Parce que Python, c'est bien.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#!//usr/bin/python&lt;br /&gt;&lt;br /&gt;# Filtre sur les mots qu'on peut exprimer en hexadecimal&lt;br /&gt;# Input: liste de mots sur STDIN, un mot par ligne&lt;br /&gt;# Output: les mots valides, en hexadecimal, avec la version lisible&lt;br /&gt;# Jean-Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;import sys&lt;br /&gt;import string&lt;br /&gt;&lt;br /&gt;HEXCHARS = ('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f')&lt;br /&gt;&lt;br /&gt;for line in sys.stdin:&lt;br /&gt;    word = line[:-1].lower().translate(string.maketrans('tioslg','710519'))&lt;br /&gt;    for letter in word:&lt;br /&gt;        hexable = letter in HEXCHARS&lt;br /&gt;        if not hexable:&lt;br /&gt;            break&lt;br /&gt;    if hexable:&lt;br /&gt;        print word + ' ' + line,&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Moi, le Python, j'aime bien.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-4381023398045506593?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/4381023398045506593/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2010/07/quest-ce-quon-peut-ecrire-en.html#comment-form' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/4381023398045506593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/4381023398045506593'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2010/07/quest-ce-quon-peut-ecrire-en.html' title='Qu&apos;est-ce qu&apos;on peut écrire en hexadécimal ?'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-1286229150445427887</id><published>2010-07-03T12:00:00.000+02:00</published><updated>2010-07-03T12:00:00.384+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rock alternatif'/><category scheme='http://www.blogger.com/atom/ns#' term='musique'/><category scheme='http://www.blogger.com/atom/ns#' term='nick cave'/><category scheme='http://www.blogger.com/atom/ns#' term='rock garage'/><category scheme='http://www.blogger.com/atom/ns#' term='grinderman'/><category scheme='http://www.blogger.com/atom/ns#' term='lafougere'/><title type='text'>Grinderman - Grinderman</title><content type='html'>Si j'annonce un side-project mené par des quinquagénaires qui se séparent du calme de leur musique habituelle pour faire du rock garage bien gras, que les chansons sont écrites pour la guitare mais par un chanteur qui a toujours délaissé cet instrument, que l'album a été enregistré en quatre jours, ça vous fait peur ? Y'a de quoi, tous les ingrédients sont réunis pour générer un bon gros disque pour papy-hasbeen qui veut jouer au jeunot. Sauf qu'ici l'idée vient d'un certain Nick Cave.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Grinderman est né au cours de la tournée de promotion de &lt;i&gt;"Abattoir blues / The lyre of Orpheus"&lt;/i&gt; de Nick Cave and the Bad Seeds. Ce cher Mr Cave s'est mis à écrire des chansons en composant pour la guitare (alors que ceux qui suivent savent que Nick Cave n'est pas exactement un guitariste). Le voici avec quelques chansons sur de la musique simple mais efficace, il embarque des amis des Bad Seeds (Warren Ellis, Jim Sclavunos, et Martin Casey) et ils partent enregistrer ça comme démo.&lt;br /&gt;&lt;br /&gt;Ces quelques chansons ont formé la base de ce qui sera le premier album de Grinderman, intitulé sobrement &lt;i&gt;"Grinderman"&lt;/i&gt;. De leur propre aveu, les quatre compères n'ont pas du tout cherché à produire quelque chose qui ait du succès mais quelque chose qui les défoule, qui les libère. Après tout, ils ont les Bad Seeds comme source de revenus presque garantie, et ont tous largement passé l'âge d'aller faire la catin sur MTV. Et poum, en 2007 voici enregistré (en quatre jours de studio selon la légende) le premier album de Grinderman.&lt;br /&gt;&lt;br /&gt;Mais que dit-il se disque ? Eh bien d'entrée de jeu avec un gros gras &lt;i&gt;Get it on&lt;/i&gt; on annonce la couleur. Pas question d'ochestration complexe et raffinée comme dans les Bad Seeds, l'heure est au défoulement, au brut de décoffrage. Un retour aux tendances de The Birthday Party (groupe post-punk dans lequel Cave a officié quelques temps, qui mérite une écoute aussi) peut-être, mais en tout cas de la pêche et du rentre-dedans bien couillu. Continuons avec &lt;i&gt;No pussy blues&lt;/i&gt; aux paroles tordantes, &lt;i&gt;Electric Alice&lt;/i&gt; et &lt;i&gt;Grinderman&lt;/i&gt; hypnotiques, ... mais c'est qu'ils savent faire quelque chose de simple aux accents de garage sans pour autant tomber dans la facilité du bourrin en plus ! Des artistes moi je vous dis ! On repart dans des endiablées plus rock'n'roll le temps d'un &lt;i&gt;Depth Charge Ethel&lt;/i&gt; avant de revenir à de la bonne chanson de texte avec le magistral &lt;i&gt;Go tell the women&lt;/i&gt; mais c'est vite reparti pour le duo pêchu &lt;i&gt;I don't need you (to set me free)&lt;/i&gt; et &lt;i&gt;Honey Bee (let's fly to Mars)&lt;/i&gt;. &lt;i&gt;Man on the moon&lt;/i&gt; d'une émotion déchirante, où Nick Cave rappelle quel bon chanteur il est, &lt;i&gt;When my love comes down&lt;/i&gt; tendu à souhait, et enfin &lt;i&gt;Love bomb&lt;/i&gt; pour cloturer comme il se doit ce disque un peu trop court en fait. 40 minutes de bonheur ça fait jamais que 40 minutes...&lt;br /&gt;&lt;br /&gt;Un disque mené de main de maître, où Nick Cave sait rappeler une fois de plus que son succès n'est pas volé, et qu'il sait s'entourer de musiciens d'exception. Comme l'ont dit d'autres avant moi : il n'y a rien à jeter de ce disque. Un délice à découvrir ou redécouvrir avant la sortie du deuxième album, prévue pour septembre 2010.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;(Cet article a été publié sur &lt;a href="http://leblogdelafougere.wordpress.com/"&gt;La Fougère&lt;/a&gt;, blog musical sans restriction.)&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-1286229150445427887?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/1286229150445427887/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2010/07/grinderman-grinderman.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1286229150445427887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1286229150445427887'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2010/07/grinderman-grinderman.html' title='Grinderman - Grinderman'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-1921793002402638442</id><published>2010-07-01T12:02:00.002+02:00</published><updated>2010-07-01T16:35:55.762+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='black sun empire'/><category scheme='http://www.blogger.com/atom/ns#' term='musique'/><category scheme='http://www.blogger.com/atom/ns#' term='drum n bass'/><category scheme='http://www.blogger.com/atom/ns#' term='lafougere'/><title type='text'>Black Sun Empire - Cruel and Unusual</title><content type='html'>Le mouvement drum'n'bass a eu son espèce d'époque de grande gloire, on ne parlait que de ça et pour être un mec cool il fallait forcement s'être fait réveiller par la police la tête dans la boue d'une freeparty dont le mur de son martèle depuis des heures. Maintenant c'est plus trop ça, c'est plutôt les pop acidulées ou à tendance revival qui ont la cote, donc je peux parler de drum'n'bass. De drum'n'bass hollandaise. Paie ton stéréotype.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Black Sun Empire est une bête à trois têtes, nommées Rene Verdult, Milan Heyboer, et Micha Heyboer. Venus d'Utrecht dans la plate mais charmante Hollande, ils sont comme leurs compatriotes de Noisia des hommes à tout faire qui ont évolué dans les styles et les vagues, mixé, remixé, collaboré avec plus d'artistes qu'on pourrait en citer, ... et continuent encore de produire via leurs deux labels et d'organiser des soirées. C'est bon là on a rangé au placard le stéréotype du hollandais avec sa meule de gouda et son joint au bec qui regarde passer une péniche ?&lt;br /&gt;&lt;br /&gt;Comme souvent dans ce milieu, et à l'inverse des stars MTV, Black Sun Empire a du beaucoup tourner, mixer, faire danser et se faire connaître avant d'avoir l'occasion d'enregistrer un album &lt;i&gt;full-length&lt;/i&gt;. Ce premier album est sorti en 2005, soit après dix ans d'activité donc, et s'intitule &lt;b&gt;Cruel and Unusual&lt;/b&gt;. Huit titres qui curieusement n'essaient pas de s'enchaîner. Chacun a droit à son introduction, à son développement, à sa conclusion. Ceci est un album, un vrai.&lt;br /&gt;&lt;br /&gt;C'est plaisant d'ailleurs, dès le début l'auditeur est accueilli dans un paysage sonore qui sait s'installer à son aise malgré l'urgence qui est imposée par le rythme drum'n'bass, l'énergie vient par vagues plutôt qu'en une grosse baffe et on se laisse emmener. &lt;i&gt;The Cooler&lt;/i&gt;, &lt;i&gt;Everything&lt;/i&gt;, &lt;i&gt;Bitemark&lt;/i&gt;, ... Chaque titre prend son temps mais amène son beat typé, racé, plus "drum" que "bass". Et ça y va sur les &lt;i&gt;featurings&lt;/i&gt; qui passent de Noisia à Corrupt Souls en passant par SKC et Illy Emcee. Les sons sont travaillés, les rythmes entêtants, on a bien vite envie de se retrouver devant les mêmes dans une salle obscure au milieu de centaines de gens &lt;strike&gt;défoncés à l'exta&lt;/strike&gt; bien partis pour danser pendant des heures. &lt;i&gt;Hideous&lt;/i&gt;, &lt;i&gt;Sideways&lt;/i&gt;, &lt;i&gt;Future Frame&lt;/i&gt;, ... mouais en fait il manque un tout petit quelque chose. C'est du bon son, mais des fois ça manque un peu de structure, on ne sait pas exactement où ils vont par moments. Dommage, sans ça ce serait parfait. &lt;i&gt;Breathe&lt;/i&gt; à l'introduction relaxante à souhait, au déroulement narratif qui ferait presque penser à de la musique de film. Et puis plus rien. Boh. C'est court, 55 minutes.&lt;br /&gt;&lt;br /&gt;Black Sun Empire nous a servi là un album qui souffre ça et là de marques de jeunesse, qui seront rattrapées dans les galettes suivantes. Ça n'empêche absolument pas "Cruel and Unusual" d'être un moment de plaisir qui se laisse autant écouter en musique de fond qu'à fond les ballons. De la drum'n'bass comme on en fait peu, trop peu.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;(Cet article a été publié sur &lt;a href="http://leblogdelafougere.wordpress.com/"&gt;La Fougère&lt;/a&gt;, blog musical sans restriction.)&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-1921793002402638442?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/1921793002402638442/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2010/07/black-sun-empire-cruel-and-unusual.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1921793002402638442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1921793002402638442'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2010/07/black-sun-empire-cruel-and-unusual.html' title='Black Sun Empire - Cruel and Unusual'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-1960302369406521448</id><published>2010-06-09T12:18:00.001+02:00</published><updated>2010-07-01T16:35:43.098+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='industrial'/><category scheme='http://www.blogger.com/atom/ns#' term='soman'/><category scheme='http://www.blogger.com/atom/ns#' term='musique'/><category scheme='http://www.blogger.com/atom/ns#' term='ebm'/><category scheme='http://www.blogger.com/atom/ns#' term='lafougere'/><title type='text'>Soman - Mask</title><content type='html'>L'Allemagne est un beau pays. En tout cas, en matière de musiques électronique, elle a été gestatrice de grands précurseurs et continue de porter en son sein des scènes électroniques non négligeables parce qu'influentes de par le monde (les adeptes de &lt;i&gt;house music&lt;/i&gt; me contrediront). Parmi toutes ces perles trop souvent méconnues, une est particulièrement discrète mais vaut vraiment de tendre l'oreille : &lt;b&gt;Soman&lt;/b&gt;.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Soman est un projet à une seule tête, en la personne de Kolja Trelle, qui fut en son temps ingénieur son pour Absurd Minds ou Hocico, qui a remixé pour VNV Nation, et a quand même été signé chez Out Of Line ce qui n'est pas rien. Stylistiquement on lui colle souvent une étiquette &lt;i&gt;EBM&lt;/i&gt; / &lt;i&gt;powernoise&lt;/i&gt;, mais Soman est un mélange bien particulier de genre &lt;i&gt;noise&lt;/i&gt;, &lt;i&gt;electro&lt;/i&gt;, &lt;i&gt;techno&lt;/i&gt; avec des incursions &lt;i&gt;industrial&lt;/i&gt;, &lt;i&gt;minimal&lt;/i&gt;, ... bref une drôle de bête qu'on a du mal à classer alors qu'elle a une personnalité bien propre.&lt;br /&gt;&lt;br /&gt;Soman a sorti trois albums et un EP depuis 2003, celui qui m'intresse dans le cas présent est l'album &lt;b&gt;Mask&lt;/b&gt; sorti en 2007 sur le label indépendant &lt;a href="www.infacted-recordings.de"&gt;Infacted&lt;/a&gt; (oui, c'est allemand ;-)).&lt;br /&gt;&lt;br /&gt;Mask s'ouvre avec &lt;i&gt;Descent&lt;/i&gt;, une introduction déconstruite qui fait penser à l'effondrement d'un vaisseau au travers de plusieurs épaisseurs de baton ; c'est bruyant, brutal, dissonant et ça casse tout repère qu'on pourrait garder. &lt;i&gt;Descent&lt;/i&gt; n'est qu'une ouverture vers le premier vrai morceau, &lt;i&gt;Mask&lt;/i&gt;, qui annonce sans détour la couleur que prennent les oeuvres de Soman : des basses lourdes et nettes, des mélodies qui filent dans des aigus entêtants, une voix se pose dessus avec un chant en anglais qu'on n'entendra presque plus sur le reste du disque. La ligne de basse est omniprésente, elle martèle sans pitié l'auditeur qui est balancé au rythme de mélodies qui se déroulent lentement, progressivement. Simple et sans compromis, Soman sait ce qu'il veut, et il le fait.&lt;br /&gt;&lt;br /&gt;Tout ceci peut paraître agressif, violent, un peu trop rentre-dedans pour ne pas céder aux plus vils stéréotypes du boum-boum, mais en fait il n'en est rien. Morceau après morceau on se laisse prendre par ces 4/4 entêtants, ces sonorités qui savent faire planer, cette voix sur &lt;i&gt;Eye to eye&lt;/i&gt; qui n'est pas sans rappeler Pzychobitch, et surtout la production impeccable qui emballe le tout. L'artiste est ingénieur son et ça s'entend, tout est impeccable, les effets sont pertinents et subtils (ou, comme sur &lt;i&gt;Detail&lt;/i&gt; deviennent part entière de la mélodie), le mixage laisse sa part à chaque voix. Mettez ce disque en musique de fond et avant de vous en rendre compte un pied battra, une tête balancera, ... c'est ça, l'effet de Soman. Du beau boulot.&lt;br /&gt;&lt;br /&gt;En bref, un disque qui n'est pas forcément le plus accessible de tous, mais qui sait convaincre ceux qui lui laisse le temps de les séduire. Brut sans être brutal, net mais en finesse.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;(Cet article a été publié sur &lt;a href="http://leblogdelafougere.wordpress.com/"&gt;La Fougère&lt;/a&gt;, blog musical sans restriction.)&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-1960302369406521448?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/1960302369406521448/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2010/06/soman-mask.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1960302369406521448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1960302369406521448'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2010/06/soman-mask.html' title='Soman - Mask'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-3127870164448290884</id><published>2010-06-03T13:35:00.001+02:00</published><updated>2010-06-03T13:36:52.813+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='musique'/><category scheme='http://www.blogger.com/atom/ns#' term='maybeshewill'/><category scheme='http://www.blogger.com/atom/ns#' term='lafougere'/><title type='text'>Maybeshewill - Not for want of trying</title><content type='html'>Au royaume du post-rock et assimilés, il y a les mastodontes Mogwai, Godspeed You! Black Emperor, God is an astronaut, ou autres Explosions in the sky ... et puis il y a les nouveaux venus, les moins connus, ceux qui pour l'une ou l'autre raison ne sont pas des noms qu'on a déjà entendus mais qui valent vraiment le détour. &lt;b&gt;Maybeshewill&lt;/b&gt; est très clairement de ceux-là.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Maybeshewill est un groupe britannique, originaire de Leicester, un trio au studio (James Collins, Robin Southby, John Helps), quatuor sur scène (Jamie Ward les rejoint armé de sa basse); Maybeshewill est indépendant, Maybeshewill est même un de ces groupes DIY (Do It Yourself) ; preuve vivante que tout s'apprend et qu'un artiste peut assurer sa production, enregistrement, mastering et distribution lui-même. Maybeshewill c'est donc un groupe de musiciens, un label, une agence de booking, un studio d'enregistrement et une structure de promotion. Je ne sais pas si vous avez idée du travail de bénédictin que ça représente, mais ces garçons en ont, et en veulent !&lt;br /&gt;&lt;br /&gt;L'album &lt;i&gt;"Not for want of trying"&lt;/i&gt; est leur premier, sorti en 2008. C'est d'ailleurs là que ça devient impressionnant, ce premier album est d'une maturité, d'un aboutissement qui laissent coi. Mélodies, orchestration, enregistrement, mixage ... tout est impeccable, d'un professionnalisme qui donnerait à rougir à bien des professionnels. L'album s'ouvre sur &lt;i&gt;"Ixnay on the autoplay"&lt;/i&gt;, une introduction en 102 secondes portée au piano et samples aux sonorités réminescentes de 65daysofstatic. Et là, on entre dans le vif du sujet avec &lt;i&gt;"Seraphim &amp;amp; Cherubim"&lt;/i&gt; où la batterie arrive, insistante et obsédante, soutenue par une guitare saturée. la force est là, l'émotion est là, le piano revient vite la rejoindre pour ce qui est vite un entrelac de passages léger en dialogue de piano et d'arpèges aériens, et de passages plus lourds qui forcent presque à se lever et courir le poing en avant.&lt;br /&gt;&lt;br /&gt;Effectivement comme ouverture ça rappelle tellement 65daysofstatic que beaucoup ont certainement lâché ici en collant une étiquette "YA65DOS" avant d'aller voir ailleurs.&lt;br /&gt;&lt;br /&gt;Grave erreur.&lt;br /&gt;&lt;br /&gt;Le disque continue avec l'énergique &lt;i&gt;"The Paris Hilton sex tape"&lt;/i&gt; et déjà l'alchimie de Maybeshewill fait son effet. Ici il n'y a pas d'usage abusif du contretemps ou d'une boîte à rythme qui flirterait avec le breakcore comme le ferait 65daysofstatic ; ici tout semble s'articuler de façon très naturelle, l'instrumental déroule son histoire tout en sincérité et sans faux artifices, toujours porté par une batterie mise en avant, on se surprend à battre la mesure et il faut bien l'admettre, c'est puissant. Vient &lt;i&gt;"I'm in awe, Amadeus"&lt;/i&gt; où un deuxième clavier se joint au premier, les frontières entre musiques électroniques et post-rock se gomment avec un naturel déconcertant, et c'est tellement bon ... et toujours ces crescendo qui savent aller jusqu'à l'instant climactique où les émotions explosent en un paysage sonore terriblement beau. L'émotion se mèle tout aussi bien à la force dans le souple mais énergique &lt;i&gt;"We called for an ambulance but a fire engine came"&lt;/i&gt;, à ce stade-ci il est bien clair que les comparaisons avec 65daysofstatic n'ont pas lieu d'être, Maybeshewill sait mener un voyage sonore de main de maître.&lt;br /&gt;&lt;br /&gt;Du chant à deux voix sur &lt;i&gt;"Heartflusters"&lt;/i&gt;, le retour de l'urgence, de la détresse sur &lt;i&gt;"C.N.T.R.C.K.T."&lt;/i&gt;, la terrible mélancolie de &lt;i&gt;"He films the clouds pt. 2"&lt;/i&gt; et comme duo final la plage titulaire &lt;i&gt;"Not for want of trying"&lt;/i&gt; et la berceuse &lt;i&gt;"Takotsubo"&lt;/i&gt; qui à deux sont comme une preuve que Maybeshewill sait en deux morceau nous promener dans toutes les émotions, tous les paysage qui ont fait de cet album un plaisir dont on ne voit pas passer le temps.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"Not for want of trying"&lt;/i&gt; est un album qui sait se faire abordable sans sombrer dans les stéréotype, une belle porte d'entrée vers les expérimentations que la niche post-rock réserve. Je le recommande vivement.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;(Cet article a été publié sur &lt;a href="http://leblogdelafougere.wordpress.com/2010/06/01/maybeshewill-not-for-want-of-trying/"&gt;La Fougère&lt;/a&gt;, blog musical sans restriction.)&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-3127870164448290884?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/3127870164448290884/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2010/06/maybeshewill-not-for-want-of-trying.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/3127870164448290884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/3127870164448290884'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2010/06/maybeshewill-not-for-want-of-trying.html' title='Maybeshewill - Not for want of trying'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-8329268954595793042</id><published>2010-06-02T23:45:00.001+02:00</published><updated>2011-03-28T11:41:59.858+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code (php)'/><category scheme='http://www.blogger.com/atom/ns#' term='msie'/><category scheme='http://www.blogger.com/atom/ns#' term='fail'/><category scheme='http://www.blogger.com/atom/ns#' term='workaround'/><category scheme='http://www.blogger.com/atom/ns#' term='wtf'/><title type='text'>Microsoft Internet Explorer et les fichiers CSV générés par PHP</title><content type='html'>Je ne sais pas si je l'ai mentionné, mais dans la vraie vie j'ai un vrai métier, et ce vrai métier implique (entre autres choses passionante) pas mal de développement sur-mesure en PHP. Aujourd'hui un client m'a fait (re)découvrir une triste vérité : dans la vie, il y a les standards, il y a Microsoft Internet Explorer, et l'intersection entre les deux ensemble est pour ainsi dire inexistante. Pourtant je ne lui parlais pas de haute technologie, je lui parlais de fichiers CSV (comma-separated values), un format bien plus vieux que moi.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Le contexte est assez simple : soit une plateforme d'e-learning (basée sur le logiciel libre Chamilo), le commanditaire souhaitait pouvoir fournir au client final un moyen simple d'obtenir les données de suivi de ses apprenants dans un format pratique. Nous avons donc convenu des champs de données à fournir, de leur format, et d'un modus operandi. Le plus simple pour le client étant de disposer d'une URL lui fournissant directement un fichier CSV avec des données à jour, j'ai concoté un script PHP qui va chercher à la demande les données qu'il faut, les formatte en CSV, et les sert en tant que tel au client. En pratique, le client ouvre une URL dans son navigateur, le fichier est téléchargé, et comme c'est bien fait le navigateur lui propose directement d'ouvrir son fichier dans Excel (ou équivalent). Pratique.&lt;br /&gt;&lt;br /&gt;Pour ce faire la recette est simple : les en-têtes HTTP permettent de définir un "Content-type" donc de dire clairement au navigateur "ce que je te donne là, c'est des données de tel type, pas du texte brut dénué de sens". Un petit tour dans les textes normatifs me disent que le MIME-type pour du CSV est "text/mime", j'ai donc codé la fonction suivante :&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;function serve_as_csv($csvdata) {&lt;br /&gt; $date = date("Y-m-d");&lt;br /&gt; $filename = "tracking-$date.csv";&lt;br /&gt; header("Content-length: ".strlen($csvdata));&lt;br /&gt; header("Content-type: text/csv");&lt;br /&gt; header("Content-Disposition: attachment; filename=$filename");&lt;br /&gt; ob_start();&lt;br /&gt; echo $csvdata;&lt;br /&gt; ob_end_flush();&lt;br /&gt; exit;&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Jusqu'ici tout va bien, tous les navigateurs s'en sortent. Sauf IE. Ce brave petit n'est pas foutu de reconnaître un MIME-type défini il y a une quinzaine d'années, on n'est pas sorti de l'auberge. La documentation de Microsoft conseille de le servir en tant que "application/download" mais évidemment ça ne marche pas plus. On ne va quand même pas imaginer que de la documentation Microsoft pour contourner un défaut d'un logiciel Microsoft soit fiable ...&lt;br /&gt;&lt;br /&gt;J'ai donc du passer en revue tous les MIME-types plus ou moins délirants qui pourraient vaguement être associés à un CSV. Aucun n'est bon. On vise à côté, il faut d'abord expliquer à cette andouille comment on gère du cache, ensuite on voit. Arrive donc la combinaison gagnante:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;function serve_as_csv($csvdata) {&lt;br /&gt; $date = date("Y-m-d");&lt;br /&gt; $filename = "tracking-$date.csv";&lt;br /&gt; header("Content-length: ".strlen($csvdata));&lt;br /&gt; header("Pragma: must-revalidate");&lt;br /&gt; header("Cache-Control: must-revalidate");&lt;br /&gt; header("Content-type: application/vnd.ms-excel");&lt;br /&gt; header("Content-Disposition: attachment; filename=$filename");&lt;br /&gt; ob_start();&lt;br /&gt; echo $csvdata;&lt;br /&gt; ob_end_flush();&lt;br /&gt; exit;&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Là ça fonctionne avec Internet Explorer. Le souci vient par contre pour le reste du monde, qui ne sait absolument pas que faire de ce "application/vnd.ms-excel" défini dans aucune RFC et du coup propose tout au plus de télécharger le fichier, en tout cas pas de l'ouvrir avec un logiciel aapproprié. Génial. Donc il faut effectuer une vérification sur le User-Agent, quelque chose du goût de :&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) {&lt;br /&gt; // Ceci n'est pas un navigateur&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Mais pour une raison qui doit certainement ne regarder que le jardinier du sultan du Brunei, Opera se déclare comme "Compatible MSIE" donc ce check est borké, puisqu'Opera ne sait pas trop (à juste titre) quoi faire de "application/vnd.ms-excel", ce n'est pas assez. Mais ce qui est bon c'est que ce n'est que la dernière particularité foireuse à prendre en compte. Donc, au bout de 30 minutes d'essais-erreurs, ça, ça marche :&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;function serve_as_csv($csvdata) {&lt;br /&gt; $date = date("Y-m-d");&lt;br /&gt; $filename = "tracking-$date.csv";&lt;br /&gt; header("Content-length: ".strlen($csvdata));&lt;br /&gt; if ((strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) &amp;&amp; (strpos($_SERVER['HTTP_USER_AGENT'], 'Opera') == false)) { &lt;br /&gt;  header("Pragma: must-revalidate");&lt;br /&gt;  header("Cache-Control: must-revalidate");&lt;br /&gt;  header("Content-type: application/vnd.ms-excel");&lt;br /&gt;  }&lt;br /&gt; else {&lt;br /&gt;  header("Content-type: text/csv");&lt;br /&gt;  }&lt;br /&gt; header("Content-Disposition: attachment; filename=$filename");&lt;br /&gt; ob_start();&lt;br /&gt; echo $csvdata;&lt;br /&gt; ob_end_flush();&lt;br /&gt; exit;&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Pfiou ! Donc voilà, ici pour la postérité.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-8329268954595793042?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/8329268954595793042/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2010/06/microsoft-internet-explorer-et-les.html#comment-form' title='5 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/8329268954595793042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/8329268954595793042'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2010/06/microsoft-internet-explorer-et-les.html' title='Microsoft Internet Explorer et les fichiers CSV générés par PHP'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-7265541257267968103</id><published>2010-06-02T00:01:00.003+02:00</published><updated>2010-06-02T00:11:26.171+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogs'/><category scheme='http://www.blogger.com/atom/ns#' term='musique'/><category scheme='http://www.blogger.com/atom/ns#' term='ma vie.com'/><category scheme='http://www.blogger.com/atom/ns#' term='lafougere'/><title type='text'>Où l'auteur annonce qu'il publie ailleurs (déjà)</title><content type='html'>J'ai &lt;a href="http://blog.jkbockstael.be/2010/05/ou-lauteur-annonce-quil-va-publier.html"&gt;mentionné il y a peu&lt;/a&gt; le fait qu'on m'a embrigadé pour participer à un blog musical de tous genres et toutes époques. Le blog est en ligne, il s'appelle &lt;a href="http://leblogdelafougere.wordpress.com/"&gt;&lt;b&gt;La Fougère&lt;/b&gt;&lt;/a&gt;, et j'y ai publié aujourd'hui &lt;a href="http://leblogdelafougere.wordpress.com/2010/06/01/maybeshewill-not-for-want-of-trying/"&gt;ma première chronique&lt;/a&gt;. La machine est lancée :-)&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Comme annoncé le projet a été lancé et sera entretenu par des passionnés pour d'autres passionnés. L'objectif n'est pas de faire du trafic pour s'en mettre plein les fouilles avec de la pub, d'ailleurs on ne se prend pas trop au sérieux (je dis ça je dis rien, faut pas attendre d'un blog qui s'appelle "La Fougère" qu'il soit particulièrement sinistre). Le but est de partager, de faire découvrir, et de découvrir. Tout simplement.&lt;br /&gt;&lt;br /&gt;Ma première contribution porte sur &lt;i&gt;"Not for want of trying"&lt;/i&gt;, le très bon premier album de Maybeshewill, &lt;a href="http://leblogdelafougere.wordpress.com/2010/06/01/maybeshewill-not-for-want-of-trying/"&gt;lisible ici&lt;/a&gt;.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-7265541257267968103?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/7265541257267968103/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2010/06/ou-lauteur-annonce-quil-publie-ailleurs.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/7265541257267968103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/7265541257267968103'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2010/06/ou-lauteur-annonce-quil-publie-ailleurs.html' title='Où l&apos;auteur annonce qu&apos;il publie ailleurs (déjà)'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-1877954057968537161</id><published>2010-05-31T09:30:00.000+02:00</published><updated>2010-05-31T10:15:32.117+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humeur'/><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='activisme'/><title type='text'>Quit Facebook Day</title><content type='html'>Aujourd'hui nous sommes les 31 mai 2010, jour choisi pour l'accomplissement de leur croisade par les organisateurs du &lt;a href="http://www.quitfacebookday.com/"&gt;Quit Facebook Day&lt;/a&gt;. Je suis le seul qui s'étonne de voir qu'on ait besoin d'un meneur pour choisir de ne pas suivre un autre meneur ?&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Le principe de Quit Facebook Day est celui que sous-entend son nom : à date fixée, les participants quittent Facebook en supprimant leurs comptes. Tous ensemble, le même jour ; portée symbolique, message fort, tout ça tout ça ... La raison invoquée est un peu la même que d'habitude : &lt;i&gt;Facebook is Evil&lt;/i&gt;, collecte de données personnelles à l'insu de notre plein gré (enfin c'était quand même écrit, mais passons), termes et conditions à géométrie variable, rétention de données. &lt;br /&gt;&lt;br /&gt;En fait, il faut bien l'admettre, dire du mal de Facebook en 2010 c'est un peu comme dire du mal de George W Bush en 2005 ; avant tout une question de bien-penseance, ensuite éventuellement des convictions personnelles. On n'aime pas les termes et conditions de Facebook parce qu'un blogger influent en a dit du mal. Pourraient être légion les sites qui collectent des données de profilage et en font de la publicité personnalisée (donc qui vaut cher, faut pas avoir fait HEC pour comprendre ça), mais tant qu'on ne les pointe pas du doigt tout le monde s'en fout. Vous lisez les termes et conditions avant de cliquer sur "j'approuve" vous ? Moi non plus.&lt;br /&gt;&lt;br /&gt;Passons, sinon on va penser que j'approuve complêtement le caractère changeant de la politique de confidentialité de Facebook (à qui de toute façon je ne confie que des choses que j'accepte de voir portées sur la place publique). Voyons voir l'ampleur du bras vengeur symbolique que Quit Facebook Day va abattre sur Mark et ses potes, c'est d'autant plus aisé que la page du projet indique un compteur des e-activites 2.0 qui se sont e-engagés à e-agir en cliquant sur un bouton. Bon bon bon ... alors ... 25865 promesses. Pas mal ! Tiens, en proportion du total ça fait combien ? Facebook compte aux alentours de 400 millions d'utilisateurs. Clairement, Mark tremble.&lt;br /&gt;&lt;br /&gt;Le plus rigolo ? L'événement est vanté &lt;a href="http://www.facebook.com/may31quitfbday"&gt;par&lt;/a&gt; &lt;a href="http://www.facebook.com/pages/Quit-Facebook-Day/114738051901418"&gt;trois&lt;/a&gt; &lt;a href="http://www.facebook.com/pages/May-31st-Quit-Facebook-Day/128167190529610"&gt;pages&lt;/a&gt; sur Facebook. Halala l'activisme 2.0 ...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-1877954057968537161?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/1877954057968537161/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2010/05/quit-facebook-day.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1877954057968537161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1877954057968537161'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2010/05/quit-facebook-day.html' title='Quit Facebook Day'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-6992687099636299411</id><published>2010-05-26T14:30:00.002+02:00</published><updated>2010-05-27T15:59:03.032+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogs'/><category scheme='http://www.blogger.com/atom/ns#' term='musique'/><category scheme='http://www.blogger.com/atom/ns#' term='mavie.com'/><title type='text'>Où l'auteur annonce qu'il va publier ailleurs (aussi)</title><content type='html'>Tiens on dirait que, quoique tardif, le printemps est arrivé bel et bien avec son regain d'énergie, de motivation, et de coups de bit^W^W^Wprojets enthousiastes. Bien ça ! Il était presque temps. Vous l'avez déjà fait à plusieurs ? Moi pas, donc je m'y essaie et nous verrons bien ce que ça donne.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;L'idée a germé dans l'esprit d'Antoine "FrenchFigaro" Berbineau, &lt;a href="http://considerationssansimportance.wordpress.com/"&gt;dont la plume vaut vraiment le détour&lt;/a&gt;, et consiste en un blog de chroniques musicales par et pour des passionnés. Aucun limite de style ou d'époque, pas d'écho de ce que les grands médias crient tous en choeur (donc pas de chronique du dernier Lady Gaga ou Christophe Maé), mais une poignée de mélomanes aux goût aussi variés et eccléctiques que possible qui vont faire de leur mieux pour vous fournir un flux constant de chroniques sincères. Evidemment, si j'en parle c'est que je fais partie de ceux qui ont été embrigadés pour participer à la chose, et ce que j'y publierai sera sûrement publié ici aussi.&lt;br /&gt;&lt;br /&gt;L'idée ce n'est pas de faire des pageviews par milliers en se la jouant démago, encore moins de faire du fric. On parle de blog comme ils auraient toujours du le rester: sincères, désintéressés, pour le plaisir de partager une découverte ou une opinion. On dira ce qu'on voudra mais des fois ça manque, de ne pas se demander en lisant une critique positive si son auteur a été payé pour ne dire que du bien.&lt;br /&gt;&lt;br /&gt;Voilà voilà, plus de détails quand ça passe en concret, mais dans l'immédiat je suis joie et enthousiasme :-)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-6992687099636299411?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/6992687099636299411/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2010/05/ou-lauteur-annonce-quil-va-publier.html#comment-form' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6992687099636299411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6992687099636299411'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2010/05/ou-lauteur-annonce-quil-va-publier.html' title='Où l&apos;auteur annonce qu&apos;il va publier ailleurs (aussi)'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-299724901377672881</id><published>2010-04-23T18:38:00.000+02:00</published><updated>2010-04-23T18:39:45.028+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humeur'/><category scheme='http://www.blogger.com/atom/ns#' term='belgique'/><title type='text'>Splits België !</title><content type='html'>Ça y est, on y est revenu. A nouveau ça s'insulte dans tous les sens en se rejetant la faute. Ça titre gros, ça résume à l'emporte-pièce, ça ne comprend pas dans la presse étrangère, ça ne sait plus quoi dire pour ne pas se répéter dans la presse nationale, ça crée des solutions aux comptoirs des troquets.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Non je ne vais pas rejoindre les politiciens de comptoir qui vous trouvent des solutions à des dossiers épineux à grands coups de "yaka ceci" et "yakapa cela". Je n'ai pas cette prétention. Je suis juste attristé.&lt;br /&gt;&lt;br /&gt;Vous ne trouveriez pas ça triste, vous, qu'un pays qui était parmi les pionniers du gommage de frontières internationales en vienne à se déchirer autour d'une frontière intranationale qu'il a réussi à se créer lui-même ?&lt;br /&gt;&lt;br /&gt;Moi si.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-299724901377672881?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/299724901377672881/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2010/04/splits-belgie.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/299724901377672881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/299724901377672881'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2010/04/splits-belgie.html' title='Splits België !'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-9135231648256613529</id><published>2010-04-02T18:05:00.000+02:00</published><updated>2010-04-02T18:05:00.041+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hacker'/><category scheme='http://www.blogger.com/atom/ns#' term='traduction'/><title type='text'>"Comment devenir un hacker" mis à jour</title><content type='html'>Il y à un peu plus de deux ans d'ici, &lt;a href="http://blog.jkbockstael.be/2008/12/comment-devenir-un-hacker.html"&gt;j'annonçais&lt;/a&gt; la mise en ligne de ma traduction de "&lt;a href="http://catb.org/~esr/faqs/hacker-howto.html"&gt;How to become a hacker&lt;/a&gt;" (Eric Steven Raymond) en français. Depuis, ce post est lu de manière régulière, j'ose en conclure que cette traduction est utile à au moins quelques personnes. L'original ayant été mis à jour, une mise à jour s'imposait.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;De plus, ma traduction était hébergée sur un espace d'hébergement fourni par mon FAI donc dépendant d'un contrat avec ce dernier et portant une URL pas forcément élégante. D'une pierre deux coups, j'en ai profité pour créer un espace de stockage digne de ce nom pour ce document et quelques autres choses qui tôt ou tard mériteront d'y prendre place. Il va de soi qu'un travail de relecture assez conséquent a été effectué aussi, pas mal de coquilles subsistaient et des formulations sentait un peu le Babelfish. Nul n'est parfait ;-)&lt;br /&gt;&lt;br /&gt;Vous pouvez donc dès à présent profiter de la toute nouvelle toute belle version de "&lt;a href="http://files.jkbockstael.be/hacker-howto-fr.html"&gt;Comment devenir un hacker&lt;/a&gt;", et les commentaires pour améliorer cette traduction sont toujours les bienvenus :-)&lt;br /&gt;&lt;br /&gt;Un grand merci à Dari pour son coup de main sur la relecture, il s'est fendu avec enthousiasme d'un travail pourtant pénible.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-9135231648256613529?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/9135231648256613529/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2010/04/comment-devenir-un-hacker-mis-jour.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/9135231648256613529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/9135231648256613529'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2010/04/comment-devenir-un-hacker-mis-jour.html' title='&quot;Comment devenir un hacker&quot; mis à jour'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-5470556408678041677</id><published>2009-12-13T23:23:00.004+01:00</published><updated>2009-12-13T23:29:12.461+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Exercice de 'pataprogrammation: le tri à gobelets</title><content type='html'>Tiens et si on parlait d'informatique, pour changer un peu, et pour rappeler aux moins attentifs de l'assistance que votre serviteur est avant toute chose ce qu'il convient d'appeller un "computer geek"? Mais bon, ne parlons pas d'informatique trop sérieuse quand même, ça s'écarterait du sujet ;-)&lt;br /&gt;&lt;br /&gt;Un mien ami, qui fut mien camarade de cours quand nous usions les bancs de la fac d'info de Namur, est il me semble l'instigateur de la 'pataprogrammation, qui est à la programmation ce que la 'pataphysique est à la physique. Je pense que l'amie Wikipedia saura mieux que moi vous expliquer ce qu'est cette fameuse 'pataphysique, retenez surtout que son inventeur est le père de Ubu, ça donne le ton.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Ce joyeux farfelu a donc déliré un jour et inventé le "tri à gobelets" qui est sans aucun doute le moins efficace des algorithmes de tri. L'idée est simple: permutons deux éléments du tableau à trier, choisis au hasard, et répétons l'opération jusqu'à ce que le tableau soit effectivement trié.&lt;br /&gt;&lt;br /&gt;Bon, intuitivement c'est une atrocité cet algorithme, mais en fait c'est une atrocité à quel point? Comme le dit son auteur, il s'exécute de façon pas trop péniblement lente pour des tableaux de petite taille, mais avec peu de chance on peut y perdre beaucoup de temps. De plus, l'alogorithme n'a aucune garantie de terminaison autre que la fin des temps. Brillant! Donc pour avoir une mesure, j'ai pondu le programme suivant:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/python&lt;br /&gt;# Implementation de l'algorithme de tri par gobelets, invente par Benoit Vleminckx&lt;br /&gt;# http://www.javafr.com/codes/TRI-GOBELET-BEAKER-SORT_48639.aspx&lt;br /&gt;&lt;br /&gt;import random&lt;br /&gt;&lt;br /&gt;def is_sorted(tab):&lt;br /&gt;    """ renvoie True ssi tab est trie par ordre croisant """&lt;br /&gt;    for i in range (0,len(tab)-1):&lt;br /&gt;        if tab[i] &gt; tab[i+1]:&lt;br /&gt;            return False&lt;br /&gt;    return True&lt;br /&gt;&lt;br /&gt;def beakersort(tab):&lt;br /&gt;    """Trie le tableau tab par l'algorithme du tri a gobelets"""&lt;br /&gt;    # pour la science&lt;br /&gt;    iterations = 0&lt;br /&gt;    while not is_sorted(tab):&lt;br /&gt;        iterations += 1&lt;br /&gt;        # determination de deux indices aleatoires differents&lt;br /&gt;        index1 = -1&lt;br /&gt;        index2 = -1&lt;br /&gt;        while (index1 == index2):&lt;br /&gt;            index1 = random.randint(0,len(tab)-1)&lt;br /&gt;            index2 = random.randint(0,len(tab)-1)&lt;br /&gt;        # permutation des elements a ces indices&lt;br /&gt;        tab[index1],tab[index2] = tab[index2],tab[index1]&lt;br /&gt;    print len(tab), iterations&lt;br /&gt;    return tab&lt;br /&gt;&lt;br /&gt;# Mesures hautement scientifiques!&lt;br /&gt;for tablength in range (3,11):&lt;br /&gt;    for testnum in range (0,100):&lt;br /&gt;        testtab = range(0,tablength)&lt;br /&gt;        random.shuffle(testtab)&lt;br /&gt;        beakersort(testtab)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Remarquons que j'y suis optimiste puisque je suppose que chaque application de l'algorithme va effectivement se terminer un jour. Il faut savoir vivre dangereusement parfois...&lt;br /&gt;&lt;br /&gt;Conclusion? Pas brillantes du tout. En résumé pour des tailles de tableau allant de 3 à 10 on obtient ceci (valeurs exprimées en nombre de permutations avant achèvement):&lt;br /&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;th&gt;Longueur&lt;/th&gt;&lt;th&gt;Minimum&lt;/th&gt;&lt;th&gt;Maximum&lt;/th&gt;&lt;th&gt;Moyenne&lt;/th&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;30&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;105&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;659&lt;/td&gt;&lt;td&gt;117&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;3779&lt;/td&gt;&lt;td&gt;917&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;81&lt;/td&gt;&lt;td&gt;23892&lt;/td&gt;&lt;td&gt;5096&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;330&lt;/td&gt;&lt;td&gt;199540&lt;/td&gt;&lt;td&gt;38792&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;11321&lt;/td&gt;&lt;td&gt;1791937&lt;/td&gt;&lt;td&gt;339068&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;21080&lt;/td&gt;&lt;td&gt;17668142&lt;/td&gt;&lt;td&gt;4145666&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Magnifiquement inefficace, n'est-ce pas?&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-5470556408678041677?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/5470556408678041677/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/12/exercice-de-pataprogrammation-le-tri.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/5470556408678041677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/5470556408678041677'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/12/exercice-de-pataprogrammation-le-tri.html' title='Exercice de &apos;pataprogrammation: le tri à gobelets'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-1503213179383848264</id><published>2009-11-23T02:04:00.003+01:00</published><updated>2009-11-23T02:25:40.714+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jardinage'/><category scheme='http://www.blogger.com/atom/ns#' term='diy'/><category scheme='http://www.blogger.com/atom/ns#' term='ma vie.com'/><title type='text'>Première tentative de jardinage miniature, une semaine après</title><content type='html'>Dimanche dernier j'avais &lt;a href="http://blog.jkbockstael.be/2009/11/premiere-tentative-de-jardinage.html"&gt;succombé&lt;/a&gt; à l'envie subite de reproduire une idée glanée au cours d'une séance de glandage-surfage. C'est une première tentative, je ne sais absolument pas où je vais, d'autant plus que les plantes transplantées ont changé de conditions de lumière, de température, d'humidité...&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Finalement je pense ne pas m'en tirer trop mal pour un début. Les brins d'herbe ont un peu poussé, mais aussi un peu jauni. Je soupçonne un léger manque de lumière, l'éclairage a été adapté en fonction. L'éclairage du bureau sur lequel repose ce mini-jardin risque fort de changer dans un plus ou moins court terme, mais de toute façon on reste en intérieur donc si une plante ou l'autre ne sait pas se contenter de la lumière disponible il me restera juste à en trouver une de remplacement.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9oCvnRQKziE/SwnkgFAJJVI/AAAAAAAAANA/MvoM-bpqjd0/s1600/20091123_minimossgarden.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 233px; height: 320px;" src="http://1.bp.blogspot.com/_9oCvnRQKziE/SwnkgFAJJVI/AAAAAAAAANA/MvoM-bpqjd0/s320/20091123_minimossgarden.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5407104067384714578" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Jusqu'ici, ça va plutôt bien. Nous verrons bien la suite.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-1503213179383848264?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/1503213179383848264/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/11/premiere-tentative-de-jardinage_23.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1503213179383848264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1503213179383848264'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/11/premiere-tentative-de-jardinage_23.html' title='Première tentative de jardinage miniature, une semaine après'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9oCvnRQKziE/SwnkgFAJJVI/AAAAAAAAANA/MvoM-bpqjd0/s72-c/20091123_minimossgarden.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-905180257240418851</id><published>2009-11-16T00:42:00.006+01:00</published><updated>2009-11-17T11:24:50.636+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mavie.com'/><category scheme='http://www.blogger.com/atom/ns#' term='jardinage'/><category scheme='http://www.blogger.com/atom/ns#' term='diy'/><title type='text'>Première tentative de jardinage miniature</title><content type='html'>Je suis tombé tout à l'heure sur &lt;a href="http://lifehacker.com/5404522/"&gt;un post assez intéressant&lt;/a&gt; du blog Lifehacker à propos de la robustesse de la mousse et de ce fait son adaptation à des mini-jardins d'intérieur. L'idée est que la mousse nécessite pas ou peu de terre, et aucune forme de soin au-delà de l'arrosage. Ça faisait un bout de temps que je voulais mettre de la verdure sur mon bureau, donc allons-y!&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Petite expédition pour obtenir de la matière première, laquelle n'a pas été particulièrement pénible; ça aide d'avoir un grand jardin deux étages plus bas. Me voilà donc avec un peu de mousse décrochée du sol, que j'ai retirée en découpant autour d'elle et en glissant une spatule dessous pour la soulever sans l'arracher. La terre supplémentaire était sous la mousse prélevée, ainsi je suis sûr qu'elle est appropriée. Les cailloux sont du gravier qui servait à mettre un couche de drainage dans le fond des pots de fleur. Réutilisons!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9oCvnRQKziE/SwCX2J8eKfI/AAAAAAAAAMg/1RqjRs2vNYk/s1600-h/091116_minimossgarden_0.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_9oCvnRQKziE/SwCX2J8eKfI/AAAAAAAAAMg/1RqjRs2vNYk/s320/091116_minimossgarden_0.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5404486509482879474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Le conteneur quant à lui est un verre d'une certaine variété d'une certaine marque de gueuse, certainement subtilisé lors d'une bacchusienne expédition entre amis, qu'importe. Les audacieux font ce genre de jardin miniature dans le fond d'une bouteille de vin... heu... un autre jour! Je le remplis de terre jusqu'à atteindre presque l'endroit le plus large du ballon, ça me donnera de la marge de manœuvre.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9oCvnRQKziE/SwCX9V9CC_I/AAAAAAAAAMo/JKQ2fivurT8/s1600-h/091116_minimossgarden_1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_9oCvnRQKziE/SwCX9V9CC_I/AAAAAAAAAMo/JKQ2fivurT8/s320/091116_minimossgarden_1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5404486632965540850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;J'y place les plus beaux morceaux, découpés au couteau, les pierres prennent place pour former un arrière-plan sympathique. Il faudra certainement un peu de temps avant que la croissance de la mousse ne remplisse les interstices, mais je sais être patient :)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9oCvnRQKziE/SwCYD1Ha56I/AAAAAAAAAMw/_AQSGHZ3nnQ/s1600-h/091116_minimossgarden_2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_9oCvnRQKziE/SwCYD1Ha56I/AAAAAAAAAMw/_AQSGHZ3nnQ/s320/091116_minimossgarden_2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5404486744409827234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Le surplus a trouvé sa place dans un autre pot de format différent. Les gourmands attentifs auront reconnu qu'il a contenu dans une autre vie une délicieuse crème brûlée.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9oCvnRQKziE/SwCYPLXVJ2I/AAAAAAAAAM4/F7Q6YAQbrkY/s1600-h/091116_minimossgarden_3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_9oCvnRQKziE/SwCYPLXVJ2I/AAAAAAAAAM4/F7Q6YAQbrkY/s320/091116_minimossgarden_3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5404486939360700258" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Voilà, reste à voir comment le temps fera son office, et si l'expérience s'avère concluante je pourrai semer de la verdure miniature un peu partout.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-905180257240418851?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/905180257240418851/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/11/premiere-tentative-de-jardinage.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/905180257240418851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/905180257240418851'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/11/premiere-tentative-de-jardinage.html' title='Première tentative de jardinage miniature'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9oCvnRQKziE/SwCX2J8eKfI/AAAAAAAAAMg/1RqjRs2vNYk/s72-c/091116_minimossgarden_0.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-2534422653709840472</id><published>2009-11-01T23:02:00.002+01:00</published><updated>2009-11-01T23:06:30.183+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humour'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><title type='text'>Un peu de mathématiques d'amateur qui ne se prend pas au sérieux...</title><content type='html'>Un illustre collègue adepte de l'adjectif "outrant" et moi-même avons décidé que la somme d'un entier et de son carré serait un nombre "outrant", ce qu"on peut presque-formaliser:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;n + n^2 , où n est un entier positif&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Qu'on peut exprimer comme le produit de deux entier consécutifs:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;n(n + 1)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Les premiers nombres outrants sont 0, 2, 6, 12, 20, 30, 42, 56, 72, 90, 110, 132, 156, 182, 210, 240, 272, 306, 342, 380, 420, 462, 506, 552, 600, 650...&lt;br /&gt;&lt;br /&gt;On appelle "puissance outrante" le nombre outrant de base n, 5 à la puissance outrante vaut 30. On note la puissance outrante par un exposant O (la lettre, pas le chiffre), comme dans 11^O = 132.&lt;br /&gt;&lt;br /&gt;En fait en cherchant un peu, ces braves petiots n'ont aucune propriété amusante, si ce n'est que 42 en fait partie (puisque c'est 6 à la puissance outrante), ce qui est un fait qui a été accueilli avec beaucoup de joie puisque l'outrant compagnon de mathématiques du dimanche est presque aussi fan de l'humour d'H2G2 que moi-même. 42 est un nombre outrant, et ça c'est vraiment outrant!&lt;br /&gt;&lt;br /&gt;L'avantage est aussi qu'un nombre outrant n'est pas fonction des précédents, ce qui facilite la tâche quand pour l'une ou l'autre outrante raison on a besoin de nombres outrants quelconques éventuellement très grands. De la même manière, si on veut obtenir le plus petit nombre outrant qui soit supérieur à un nombre donné, il suffit d'élever sa racine à la puissance outrante. Pratique.&lt;br /&gt;&lt;br /&gt;Allez, plus sérieusement, le produit de deux entiers consécutifs a été déjà baptisé et ausculté. On appelle ces nombres les "nombres oblongs", "nombres proniques", ou encore "nombre hétéroméciques". Pourquoi oblong? Parce qu'exprimés figurativement ça donne quelque chose comme ceci:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;**&lt;br /&gt;&lt;br /&gt;***&lt;br /&gt;***&lt;br /&gt;&lt;br /&gt;****&lt;br /&gt;****&lt;br /&gt;****&lt;br /&gt;&lt;br /&gt;*****&lt;br /&gt;*****&lt;br /&gt;*****&lt;br /&gt;*****&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Un certain John Conway en a parlé en long et en large, d'ailleurs. Oui, le même John Conway que le jeu de la vie.&lt;br /&gt;&lt;br /&gt;Je sais, ça ne sert à rien, c'est d'ailleurs pour ça que c'est indispensable.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-2534422653709840472?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/2534422653709840472/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/11/un-peu-de-mathematiques-damateur-qui-ne.html#comment-form' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2534422653709840472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2534422653709840472'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/11/un-peu-de-mathematiques-damateur-qui-ne.html' title='Un peu de mathématiques d&apos;amateur qui ne se prend pas au sérieux...'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-2142237539551655970</id><published>2009-08-29T02:00:00.001+02:00</published><updated>2009-08-29T11:58:35.511+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='statistiques'/><category scheme='http://www.blogger.com/atom/ns#' term='musique'/><category scheme='http://www.blogger.com/atom/ns#' term='lastfm'/><category scheme='http://www.blogger.com/atom/ns#' term='ma vie.com'/><title type='text'>Deux ans de statistiques LastFM</title><content type='html'>Ah tiens, ça fait deux ans aujourd'hui. Deux ans que je suis inscrit à LastFM et que son brave petit scrobbler collecte avec patience et méthode mes habitudes musicales. Enfin presque, il manquait jusqu'il y a peu tout ce que j'écoute sur mon iPod, puisque le scrobbling d'iPod n'était pas exactement au point.&lt;br /&gt;&lt;br /&gt;Bref...&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Pour ceux qui ne connaissent pas encore LastFM, le principe est plutôt simple. Les utilisateurs laissent un logiciel/plug-in collecter des données statistiques sur les morceaux de musique qu'ils écoutent et envoient tout ça sur le site pour se constituer un profil de mélomane. Sur base de ce profil et de folksonomie, le système établit des corrélations de style entre différents artistes; au final ça lui permêt de conseiller à l'utilisateur des découvertes musicales qui devraient lui plaire (et croyez-moi c'est la partie impressionnante, ils se trompent rarement) et lui présenter d'autres utilisateurs aux goûts similaires.&lt;br /&gt;&lt;br /&gt;Evidemment, plus on écoute, plus les statistiques sont parlantes, et plus les déductions sont fiables. Avant 500 titres écoutés le système n'essaie même pas de proposer quoi que ce soit, d'ailleurs. Par contre quand on dépasse les 10000 titres il devient d'un précision presque effrayante.&lt;br /&gt;&lt;br /&gt;Je me suis inscrit à LastFM le 28 août 2007. Depuis cette date j'ai écouté 37058 titres de 1196 artistes différents et s'il fallait résumer mes goûts à quelques étiquettes elles seraient "industrial, electronic, rock, metal et ebm", amusant pour quelqu'un qu'on appelle "le métalleux" quand même ;). Pas si simplement métalleux que ça finalement, l'homme en noir.&lt;br /&gt;&lt;br /&gt;D'ailleurs quand on classe les artistes par nombre d'écoutes ça devient encore plus amusant. En partant du plus écouté ça donne:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Amon Tobin - 819 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Nine Inch Nails - 808 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Metallica - 736 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Combichrist - 547 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The Chemical Brothers - 544 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Johnny Cash - 529 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Suzanne Vega - 510 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Punish Yourself - 483 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Caliban - 464 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;System of a Down - 432 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Lofofora - 412 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Converge - 382 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Heaven Shall Burn - 378 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Tori Amos - 365 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;65daysofstatic - 354 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Walls of Jericho - 344 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Slipknot - 316 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Baroness - 297 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Alchemik Babylon Beats - 285 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The Cinematic Orchestra - 284 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Ultra Vomit - 269 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Depeche Mode - 267 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;As I Lay Dying - 264 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The Faint - 257 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;VNV Nation - 255 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Creedence Clearwater Revival - 245 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Cat Power - 243 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The Cure - 242 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Tom Waits - 230 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Aerosmith - 224 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;IAMX - 214 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Autechre - 211 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Korn - 210 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Tamtrum - 207 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The Dillinger Escape Plan - 202 écoutes&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Peter Pan Speedrock - 201 écoutes&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Soyons arbitraires et disons qu'au-délà ce n'est plus forcément représentatit, mais on y croise entre autres Renan Luce, Kings of Convenience, Motörhead, Spiritual Beggars, Björk, Nick Cave, Portishead, Leonard Cohen, Crass, Oi Polloi, Jeff Buckley, P!nk, Neil Young, Birdy Nam Nam, Popa Chubby, Mark Knopfler, Einstürzende Neubauten, Elle Fitzgerald, Zenzile et Anthrax ... j'ose m'autoriser à dire que j'ai des goûts variés ;)&lt;br /&gt;&lt;br /&gt;Allez, je ferai un état des lieux dans un an alors. En attendant les très curieux peuvent aller &lt;a href="http://www.lastfm.fr/user/levraivirus1984"&gt;par ici&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Music!&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-2142237539551655970?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/2142237539551655970/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/08/deux-ans-de-statistiques-lastfm.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2142237539551655970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2142237539551655970'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/08/deux-ans-de-statistiques-lastfm.html' title='Deux ans de statistiques LastFM'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-2351464926080436148</id><published>2009-08-24T22:02:00.013+02:00</published><updated>2009-08-24T22:12:39.816+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diy'/><category scheme='http://www.blogger.com/atom/ns#' term='guitare'/><title type='text'>Réparation d'un jack de guitare</title><content type='html'>J'avais il y a quelques temps racheté du matériel (ampli, V-Amp, câbles) à un ami généreux qui préférait confier tout ça à mes mains débutantes plutôt que de le laisser prendre la poussière. Remy, si tu me lis, grand merci à toi ;-) Mais bon, dans le tout il y avait un câble jack qui souffrait de quelques petits faux contacts qui étaient assez désagréables (si vous n'avez pas encore entendu le son d'un contact qui se refait, amplifié... ça vaut le détour). Donc une intervention était de mise.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9oCvnRQKziE/SpLyWbOVmSI/AAAAAAAAAKU/kVwVjvcDAlU/s1600-h/090813-diy-00.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_9oCvnRQKziE/SpLyWbOVmSI/AAAAAAAAAKU/kVwVjvcDAlU/s320/090813-diy-00.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5373623772485359906" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;C'est le genre d'intervention qui peut faire peur quand on ne sait pas par où chercher, et qui est souvent facturé scandaleusement cher en magasin de musique. En fait le cas extrêmement fréquent c'est qu'à forcé de manipuler le câble sans délicatesse le fil s'arrache du jack. Vérification faite, d'un côté tout va pour le mieux dans le meilleur des mondes:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9oCvnRQKziE/SpLyffo5xCI/AAAAAAAAAKc/52_HacwSLOo/s1600-h/090813-diy-01.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_9oCvnRQKziE/SpLyffo5xCI/AAAAAAAAAKc/52_HacwSLOo/s320/090813-diy-01.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5373623928289346594" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;... mais de l'autre les soupçons sont confirmés (et le petit isolant supplémentaire me laisse supposer qu'il n'en est pas à sa première réparation):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9oCvnRQKziE/SpLyq2pBWXI/AAAAAAAAAKk/KjM8pacb_O8/s1600-h/090813-diy-02.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_9oCvnRQKziE/SpLyq2pBWXI/AAAAAAAAAKk/KjM8pacb_O8/s320/090813-diy-02.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5373624123442420082" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Allons-y alors, d'abord dénuder un peu du câble, pour pouvoir dénuder un peu du fil allant à la pointe et ainsi en avoir assez à nu pour le ressouder:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9oCvnRQKziE/SpLy4glvo1I/AAAAAAAAAKs/qJBFFXJxhe4/s1600-h/090813-diy-03.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_9oCvnRQKziE/SpLy4glvo1I/AAAAAAAAAKs/qJBFFXJxhe4/s320/090813-diy-03.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5373624358041264978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ce faisant je remarque que l'isolant a cassé, un point de colle salvateur remettra le morceau tombé (qu'on voit à l'arrière-plan près de la pince):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9oCvnRQKziE/SpLzHaPmrvI/AAAAAAAAAK0/1Ws4cs1l5qQ/s1600-h/090813-diy-04.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_9oCvnRQKziE/SpLzHaPmrvI/AAAAAAAAAK0/1Ws4cs1l5qQ/s320/090813-diy-04.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5373624614035828466" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Paré à retirer l'ancienne soudure (oui madame, à la pompe, oui je suis un bourrin):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9oCvnRQKziE/SpLzPDJm7GI/AAAAAAAAAK8/3qptlcaUc4I/s1600-h/090813-diy-05.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_9oCvnRQKziE/SpLzPDJm7GI/AAAAAAAAAK8/3qptlcaUc4I/s320/090813-diy-05.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5373624745275616354" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;C'est-y-pas propre ça madame?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9oCvnRQKziE/SpLzXDnxzwI/AAAAAAAAALE/7ZyUoDmGddY/s1600-h/090813-diy-06.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_9oCvnRQKziE/SpLzXDnxzwI/AAAAAAAAALE/7ZyUoDmGddY/s320/090813-diy-06.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5373624882841112322" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Le fil entré dans son petit trou, prêt à être ressoudé:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9oCvnRQKziE/SpLzjSTE8SI/AAAAAAAAALM/JuNa-JyJweQ/s1600-h/090813-diy-07.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_9oCvnRQKziE/SpLzjSTE8SI/AAAAAAAAALM/JuNa-JyJweQ/s320/090813-diy-07.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5373625092939247906" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;... et soudé:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9oCvnRQKziE/SpLzp02cQtI/AAAAAAAAALU/JSY-HTBahoQ/s1600-h/090813-diy-08.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_9oCvnRQKziE/SpLzp02cQtI/AAAAAAAAALU/JSY-HTBahoQ/s320/090813-diy-08.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5373625205293597394" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On referme le tout, oui il y a un sens bande de brutes:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9oCvnRQKziE/SpLzxVEbRRI/AAAAAAAAALc/T_LDGT6V53o/s1600-h/090813-diy-09.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_9oCvnRQKziE/SpLzxVEbRRI/AAAAAAAAALc/T_LDGT6V53o/s320/090813-diy-09.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5373625334201271570" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Et voilà, ready to rock!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9oCvnRQKziE/SpLz48ZbDwI/AAAAAAAAALk/RZs9glbOOVs/s1600-h/090813-diy-10.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_9oCvnRQKziE/SpLz48ZbDwI/AAAAAAAAALk/RZs9glbOOVs/s320/090813-diy-10.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5373625465017405186" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;L'opération aura duré quelque chose comme un quart d'heure sans se presser. Et avec ça j'ai cinq mètres de liberté au lieu de deux. Ça valait la peine donc ;-)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-2351464926080436148?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/2351464926080436148/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/08/reparation-dun-jack-de-guitare.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2351464926080436148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2351464926080436148'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/08/reparation-dun-jack-de-guitare.html' title='Réparation d&apos;un jack de guitare'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9oCvnRQKziE/SpLyWbOVmSI/AAAAAAAAAKU/kVwVjvcDAlU/s72-c/090813-diy-00.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-2096685979563305939</id><published>2009-07-03T14:02:00.003+02:00</published><updated>2009-07-07T09:52:05.320+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: solution au problème 24, en Python</title><content type='html'>On commence les deux mois d'été par le suivant des problèmes eulériens, à savoir le Problème 24. Sachant ce qu'est une permutation, on précise qu'on veut obtenir les permutations d'une suite de nombres dans l'ordre lexicographique (ce qui revient à la relation d'ordre du plus petit au plus grand), et on demande quelle est la 1000000ème permutation de la liste  0, 1, 2, 3, 4, 5, 6, 7, 8, 9.&lt;br /&gt;&lt;br /&gt;L'algorithme est plutôt évident, et j'utilise ici le copain &lt;code&gt;yield&lt;/code&gt; qui me permet d'avoir un générateur itérable plutôt de devoir générer toutes les permutations avant d'en prendre la millionnième.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/python&lt;br /&gt;&lt;br /&gt;# 2009/07/03 - euler024.py&lt;br /&gt;# Solution au Probleme 24 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=24&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def permutations_gen(string):&lt;br /&gt;    if (len(string) == 1):&lt;br /&gt;        yield string&lt;br /&gt;    else:&lt;br /&gt;        for i in range(len(string)):&lt;br /&gt;            for subperm in permutations_gen(string[:i] + string[i+1:]):&lt;br /&gt;                yield string[i] + subperm&lt;br /&gt;&lt;br /&gt;def euler24(string, num):&lt;br /&gt;    cnt = 0&lt;br /&gt;    for perm in permutations_gen(string):&lt;br /&gt;        cnt += 1&lt;br /&gt;        if cnt == num:&lt;br /&gt;            return perm&lt;br /&gt;&lt;br /&gt;print euler24("0123456789", 1000000)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-2096685979563305939?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/2096685979563305939/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/07/project-euler-solution-au-probleme-24.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2096685979563305939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2096685979563305939'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/07/project-euler-solution-au-probleme-24.html' title='Project Euler: solution au problème 24, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-9134774698096554709</id><published>2009-06-26T16:47:00.003+02:00</published><updated>2009-07-07T09:52:20.645+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: solution au problème 28, en Python</title><content type='html'>Ça faisait longtemps que je n'avais pas gratifié mon blog d'un des si particulièrement passionnants problèmes de Project Euler. Il était grand temps d'y remédier, donc voici une solution au &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=28"&gt;problème 28&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;L'idée est de remplir une grille carrée de nombres, de dimension impaire, qui est remplie des entiers successifs en spirale partant du centre et allant vers la droite et le bas. Aga? En gros, ayant ce genre de chose:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;21 22 23 24 25&lt;br /&gt;20  7  8  9 10&lt;br /&gt;19  6  1  2 11&lt;br /&gt;18  5  4  3 12&lt;br /&gt;17 16 15 14 13&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;La somme des éléments de deux diagonales de ce carré de dimension 5 vaut 101. Que vaut la somme pour un carré de dimension 1001?&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Je vous avais présenté mon pote Récursion?&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! / usr/bin/python&lt;br /&gt;&lt;br /&gt;# 2009/06/26 - euler028.py&lt;br /&gt;# Solution au Probleme 28 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=28&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def sum_of_diagonals(dimension):&lt;br /&gt;    if (dimension == 1):&lt;br /&gt;        return 1&lt;br /&gt;    else:&lt;br /&gt;        corner_tr = dimension ** 2&lt;br /&gt;        corner_tl = corner_tr - dimension + 1&lt;br /&gt;        corner_bl = corner_tl - dimension + 1&lt;br /&gt;        corner_br = corner_bl - dimension + 1&lt;br /&gt;        corner_sum = corner_tr + corner_tl + corner_bl + corner_br&lt;br /&gt;        return corner_sum + sum_of_diagonals(dimension - 2)&lt;br /&gt;&lt;br /&gt;print sum_of_diagonals(1001)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-9134774698096554709?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/9134774698096554709/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/06/project-euler-solution-au-probleme-28.html#comment-form' title='4 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/9134774698096554709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/9134774698096554709'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/06/project-euler-solution-au-probleme-28.html' title='Project Euler: solution au problème 28, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-2093434148429485683</id><published>2009-06-24T10:07:00.004+02:00</published><updated>2009-07-07T09:58:55.198+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><category scheme='http://www.blogger.com/atom/ns#' term='codechef'/><title type='text'>Codechef: Petit déjeuner de l'autre côté du miroir</title><content type='html'>&lt;a href="http://codechef.com/"&gt;The Codechef&lt;/a&gt;, le concours de programmation organisé par Directi, propose depuis peu deux problèmes par jour &lt;a href="http://twitter.com/codechef"&gt;via Twitter&lt;/a&gt;. Ce matin, le problème est de compter le nombre d'entiers inférieurs à 1000 qui, quand on les ajoute à leur image miroir, forment un entier qui n'est composé que de chiffres impairs.&lt;br /&gt;&lt;br /&gt;Exemple simple:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;...&lt;br /&gt;20 + 02 = 22 NON&lt;br /&gt;21 + 12 = 33 OUI&lt;br /&gt;22 + 22 = 44 NON&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Et comme d'habitude, j'ai sorti l'ami Python, celui qui nous veut du bien.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/python&lt;br /&gt;# Codechef Twitter Daily 2009/06/24&lt;br /&gt;# How many numbers below 1000 which when added with their respective mirror images result in a number with entirely odd digits?&lt;br /&gt;# 2009/06/24 - Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def reverse_number(num):&lt;br /&gt;    return int(str(num)[::-1])&lt;br /&gt;&lt;br /&gt;def is_all_odds(num):&lt;br /&gt;    for digit in str(num):&lt;br /&gt;        if (int(digit) % 2 == 0):&lt;br /&gt;            return False&lt;br /&gt;    return True&lt;br /&gt;&lt;br /&gt;def count_mirrors(max):&lt;br /&gt;    n_mirrors = 0&lt;br /&gt;    for num in range(1, max):&lt;br /&gt;        if is_all_odds(num + reverse_number(num)):&lt;br /&gt;           n_mirrors += 1&lt;br /&gt;    return n_mirrors&lt;br /&gt;&lt;br /&gt;print count_mirrors(1000)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-2093434148429485683?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/2093434148429485683/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/06/codechef-petit-dejeuner-de-lautre-cote.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2093434148429485683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2093434148429485683'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/06/codechef-petit-dejeuner-de-lautre-cote.html' title='Codechef: Petit déjeuner de l&apos;autre côté du miroir'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-2543279165267317109</id><published>2009-06-16T17:58:00.002+02:00</published><updated>2009-06-16T18:13:41.259+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='diy'/><category scheme='http://www.blogger.com/atom/ns#' term='ma vie.com'/><title type='text'>Tiens j'avais oublié ça...</title><content type='html'>Il est un fait établi qu'il m'arrive souvent de perdre de vue quelque chose tant mes occupations et projets sont nombreux et variés. Il est également un fait établi qu'il m'arrive dans ma distraction d'effectuer du nettoyage par le vide et de le regretter après, bien que ça ne porte pas à conséquences (sinon il y aurait une copie de sauvegarde, c'est évident).&lt;br /&gt;&lt;br /&gt;Ainsi, dans mon tout premier post sur le présent blog, je donnais un petit teaser d'un projet personnel qui approchait de la fin et que je m'apprêtais à vous dévoiler. J'avais juste montré ceci:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://2.bp.blogspot.com/_9oCvnRQKziE/SPyqoZFCSEI/AAAAAAAAADs/bUq3WRNfEFw/s400/081020-teaser.jpg" alt="Teaser" id="BLOGGER_PHOTO_ID_5259266075765393474" border="0" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Et, comme un distrait que je suis, non content d'avoir oublié de donner suite à cette promesse je me suis permis d'éradiquer par un bon vieux &lt;code&gt;rm&lt;/code&gt; des familles le répertoire où je conservais les photos des différentes étapes de la réalisation dudit projet, qui s'étalait sur quelques mois de temps libre trop sporadique.&lt;br /&gt;&lt;br /&gt;Bon tant pis, vous n'aurez droit qu'au produit fini alors:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9oCvnRQKziE/SjfEVZmgUXI/AAAAAAAAAJY/5JiPu1Wdzys/s1600-h/tablefinie.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_9oCvnRQKziE/SjfEVZmgUXI/AAAAAAAAAJY/5JiPu1Wdzys/s320/tablefinie.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5347958954454438258" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-2543279165267317109?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/2543279165267317109/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/06/tiens-javais-oublie-ca.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2543279165267317109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2543279165267317109'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/06/tiens-javais-oublie-ca.html' title='Tiens j&apos;avais oublié ça...'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_9oCvnRQKziE/SPyqoZFCSEI/AAAAAAAAADs/bUq3WRNfEFw/s72-c/081020-teaser.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-3814181207680208929</id><published>2009-05-28T11:31:00.003+02:00</published><updated>2009-07-07T09:59:22.997+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><category scheme='http://www.blogger.com/atom/ns#' term='jeux'/><title type='text'>Mastermind, a little more refined...</title><content type='html'>J'avais posté ici &lt;a href="http://blog.virus1984.com/2009/01/mastermind-quick-and-dirty-as-it-gets.html"&gt;un petit jeu de Mastermind&lt;/a&gt;, un furieux premier jet né d'un film trop peu intéressant à la TV et d'une envie de coder "quelque chose". D'une manière ou d'une autre ça valait la peine de faire quelque chose d'un peu plus peaufiné un jour.&lt;br /&gt;&lt;br /&gt;Voici qui est un peu mieux. Toujours une interface textuelle sans fioritures, mais le jeu est paramétrable (voir le menu options) et offre le mode de jeu classique et le mode de jeu facile qu'implémentait ma version "quick and dirty".&lt;br /&gt;&lt;br /&gt;Au niveau du code c'est du plus propre sans pour autant être de l'objet-pour-faire-de-l'objet. Hack away, have fun!&lt;br /&gt;&lt;br /&gt;Ah oui, pour que ce soit un peu plus lisible il n'y a pas de contrôle aux entrées clavier. Si on tape n'importe quoi ça plante de façon insultante, soyez prévenu :)&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# Game of Mastermind, with some niceties&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Import&lt;br /&gt;from random import randint&lt;br /&gt;&lt;br /&gt;# Gameplay constants&lt;br /&gt;CODE_LENGTH = 4   # Length of the code (1-16)&lt;br /&gt;CODE_COLORS = 10  # Number of different colors in the code (2-10)&lt;br /&gt;MAX_GUESSES = 5   # Max number of guesses to find the correct code (1-50)&lt;br /&gt;SHOW_MENU = True  # Show main menu before playing a first game&lt;br /&gt;EASY_MODE = True  # Braindead mode&lt;br /&gt;&lt;br /&gt;# String constants&lt;br /&gt;STR_GUESS_PROMPT = 'Guess'&lt;br /&gt;STR_WHITE_PEG = 'o'&lt;br /&gt;STR_BLACK_PEG = 'x'&lt;br /&gt;STR_EMPTY_PEG = '_'&lt;br /&gt;STR_OUTCOME_WIN = 'Won!'&lt;br /&gt;STR_OUTCOME_LOSS = 'Lost!'&lt;br /&gt;STR_OUTCOME_REVEAL = 'The secret code was: '&lt;br /&gt;STR_HELP = """&lt;br /&gt;{codelength} digits long code, each between 0 and {codecolors} included, you have a maximum of {maxguesses} guesses to find it.&lt;br /&gt;    {whitepeg} : right digit, right position&lt;br /&gt;    {blackpeg} : right digit, wrong position&lt;br /&gt;    {emptypeg} : wrong digit&lt;br /&gt;"""&lt;br /&gt;STR_OPT_CODELENGTH = 'Number of digits in code (min 1 max 16): '&lt;br /&gt;STR_OPT_CODECOLORS = 'Number of possible digits in code (min 2 max 10): '&lt;br /&gt;STR_OPT_MAXGUESSES = 'Maximum number of guesses before giving up (min 1 max 50): '&lt;br /&gt;STR_OPT_SHOWMENU = 'Show main menu on program startup? (False/True): '&lt;br /&gt;STR_OPT_EASYMODE = 'Play in easy mode? (False/True): '&lt;br /&gt;STR_MENU_MAIN  = """&lt;br /&gt;----------------&lt;br /&gt;-- Mastermind --&lt;br /&gt;----------------&lt;br /&gt;   A)bout&lt;br /&gt;   O)ptions&lt;br /&gt;   P)lay&lt;br /&gt;   Q)uit&lt;br /&gt;"""&lt;br /&gt;STR_MENU_MAINPROMPT = "Choice: "&lt;br /&gt;STR_MENU_OPTIONS     = """&lt;br /&gt;------------------&lt;br /&gt;-- Game Options --&lt;br /&gt;------------------&lt;br /&gt;"""&lt;br /&gt;STR_ABOUT = """&lt;br /&gt;----------------------&lt;br /&gt;-- About Mastermind --&lt;br /&gt;&lt;br /&gt;A simple and time-honored game, brought to your console using Python.&lt;br /&gt;&lt;br /&gt;2009 - Jean Karim Bockstael - jkb@virus1984.com&lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# And now, let the fun begin!&lt;br /&gt;# (__)&lt;br /&gt;# ( @@&lt;br /&gt;# /\_| MOOH!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Create a code of set length and number of colors, as a list of ints&lt;br /&gt;def set_secret_code():&lt;br /&gt;    tmp_code = []&lt;br /&gt;    for i in range(0, CODE_LENGTH):&lt;br /&gt;        tmp_code.append(randint(0, CODE_COLORS - 1))&lt;br /&gt;    return tmp_code&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Read a code from the user&lt;br /&gt;def get_guess_code():&lt;br /&gt;    tmp_guess = []&lt;br /&gt;    padding_spaces = ''&lt;br /&gt;    if (len(STR_GUESS_PROMPT) &amp;lt; CODE_LENGTH):&lt;br /&gt;        padding_spaces = " " * (CODE_LENGTH - len(STR_GUESS_PROMPT))&lt;br /&gt;    guess_prompt = STR_GUESS_PROMPT + padding_spaces + " : "&lt;br /&gt;    str_guess = raw_input(guess_prompt)&lt;br /&gt;    for i in range(0, CODE_LENGTH):&lt;br /&gt;        tmp_guess.append(int(str_guess[i]))&lt;br /&gt;    return tmp_guess&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Print a help message&lt;br /&gt;def print_help():&lt;br /&gt;    print STR_HELP.format(codelength=CODE_LENGTH, codecolors=(CODE_COLORS-1), \&lt;br /&gt;      maxguesses=MAX_GUESSES, whitepeg=STR_WHITE_PEG, blackpeg=STR_BLACK_PEG, \&lt;br /&gt;      emptypeg=STR_EMPTY_PEG)&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;# Returns a code formatted for printing&lt;br /&gt;def format_code(code):&lt;br /&gt;    formatted_code = ''&lt;br /&gt;    for i in range(0, CODE_LENGTH):&lt;br /&gt;        formatted_code += str(code[i])&lt;br /&gt;    return formatted_code&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Print a hint based on the player's guess&lt;br /&gt;def print_hint(secret_code, guess_code):&lt;br /&gt;    hint = ''&lt;br /&gt;    if (EASY_MODE):&lt;br /&gt;        for i in range(0, CODE_LENGTH):&lt;br /&gt;            if (guess_code[i] == secret_code[i]):&lt;br /&gt;                hint += STR_WHITE_PEG&lt;br /&gt;            elif (guess_code[i] in secret_code):&lt;br /&gt;                hint += STR_BLACK_PEG&lt;br /&gt;            else:&lt;br /&gt;                hint += STR_EMPTY_PEG&lt;br /&gt;    else: # Badass mode&lt;br /&gt;        white_pegs = 0&lt;br /&gt;        black_pegs = 0&lt;br /&gt;        dupes = [False] * CODE_LENGTH&lt;br /&gt;        for i in range(0, CODE_LENGTH):&lt;br /&gt;            if (guess_code[i] == secret_code[i]):&lt;br /&gt;                white_pegs += 1&lt;br /&gt;                dupes[i] = True&lt;br /&gt;            else:&lt;br /&gt;                for j in range(0, CODE_LENGTH):&lt;br /&gt;                    if (secret_code[j] == guess_code[i] and not dupes[j]):&lt;br /&gt;                        black_pegs += 1&lt;br /&gt;        if (white_pegs != 0):&lt;br /&gt;            hint += str(white_pegs) + ' ' + STR_WHITE_PEG + ' '&lt;br /&gt;        if (black_pegs != 0):&lt;br /&gt;            hint += str(black_pegs) + ' ' + STR_BLACK_PEG&lt;br /&gt;        if (white_pegs == 0 and black_pegs == 0):&lt;br /&gt;            hint += STR_EMPTY_PEG&lt;br /&gt;    padding_spaces = ''&lt;br /&gt;    if (CODE_LENGTH &amp;lt; len(STR_GUESS_PROMPT)):&lt;br /&gt;        padding_spaces = " " * (len(STR_GUESS_PROMPT) - CODE_LENGTH)&lt;br /&gt;    print format_code(guess_code), padding_spaces + ':', hint&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Print the game outcome&lt;br /&gt;def print_outcome(code_found, secret_code):&lt;br /&gt;    if (code_found):&lt;br /&gt;        print STR_OUTCOME_WIN&lt;br /&gt;    else:&lt;br /&gt;        print STR_OUTCOME_LOSS&lt;br /&gt;        print STR_OUTCOME_REVEAL, format_code(secret_code)&lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;# Play a game of Mastermind&lt;br /&gt;def play_game():&lt;br /&gt;    print_help()&lt;br /&gt;    secret_code = set_secret_code()&lt;br /&gt;    guess_num = 0&lt;br /&gt;    code_found = False&lt;br /&gt;    while (guess_num &amp;lt; MAX_GUESSES):&lt;br /&gt;        guess_code = get_guess_code()&lt;br /&gt;        guess_num += 1&lt;br /&gt;        code_found = (guess_code == secret_code)&lt;br /&gt;        if (code_found):&lt;br /&gt;            break       # Avoid printing a hint if the code is found&lt;br /&gt;        print_hint(secret_code, guess_code)&lt;br /&gt;    print_outcome(code_found, secret_code)&lt;br /&gt;        &lt;br /&gt;    &lt;br /&gt;# Options menu&lt;br /&gt;def menu_options():&lt;br /&gt;    global CODE_LENGTH&lt;br /&gt;    global CODE_COLORS&lt;br /&gt;    global MAX_GUESSES&lt;br /&gt;    global SHOW_MENU&lt;br /&gt;    global EASY_MODE&lt;br /&gt;    print STR_MENU_OPTIONS&lt;br /&gt;    print STR_OPT_CODELENGTH&lt;br /&gt;    CODE_LENGTH = int(input("[" + str(CODE_LENGTH) + "] "))&lt;br /&gt;    print STR_OPT_CODECOLORS&lt;br /&gt;    CODE_COLORS = int(input("[" + str(CODE_COLORS) + "] "))&lt;br /&gt;    print STR_OPT_MAXGUESSES&lt;br /&gt;    MAX_GUESSES = int(input("[" + str(MAX_GUESSES) + "] "))&lt;br /&gt;    print STR_OPT_SHOWMENU&lt;br /&gt;    SHOW_MENU = input("[" + str(SHOW_MENU) + "] ")&lt;br /&gt;    print STR_OPT_EASYMODE&lt;br /&gt;    EASY_MODE = input("[" + str(EASY_MODE) + "] ")&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;# Main menu&lt;br /&gt;def menu_main():&lt;br /&gt;    menu_main_choices = { "A" : show_about,&lt;br /&gt;                          "O" : menu_options,&lt;br /&gt;                          "P" : play_game,&lt;br /&gt;                          "Q" : None }&lt;br /&gt;    usr_choice = ''&lt;br /&gt;    while (True):&lt;br /&gt;        print STR_MENU_MAIN&lt;br /&gt;        while (not usr_choice in menu_main_choices):&lt;br /&gt;            usr_choice = raw_input(STR_MENU_MAINPROMPT)&lt;br /&gt;        if (usr_choice == 'Q'):&lt;br /&gt;            return None&lt;br /&gt;        else:&lt;br /&gt;            menu_main_choices[usr_choice]()&lt;br /&gt;            usr_choice = ''&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;# Show "about" screen&lt;br /&gt;def show_about():&lt;br /&gt;    print STR_ABOUT&lt;br /&gt;    raw_input()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Main&lt;br /&gt;if (SHOW_MENU):&lt;br /&gt;    menu_main()&lt;br /&gt;else:&lt;br /&gt;    play_game()&lt;br /&gt;&lt;br /&gt;# End&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-3814181207680208929?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/3814181207680208929/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/05/mastermind-little-more-refined.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/3814181207680208929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/3814181207680208929'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/05/mastermind-little-more-refined.html' title='Mastermind, a little more refined...'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-4493805705365730223</id><published>2009-05-14T18:50:00.000+02:00</published><updated>2009-05-14T19:31:36.846+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><category scheme='http://www.blogger.com/atom/ns#' term='musique'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><title type='text'>"I know the pieces fit"</title><content type='html'>Houlà ça fait un furieux bail que je n'ai rien posté ici, on va finir par croire que j'ai vraiment une vie hyperactive de jeune cadre dynamique, ou que je me suis fait emporter par H1N1, au choix. Il est temps d'y remédier! Et histoire de varier les plaisirs je vais parler musique et mathématiques (légères, ne pas stresser), plus particulièrement de Tool.&lt;br /&gt;&lt;br /&gt;Il y a quelques jours a surgi sur &lt;a href="http://www.reddit.com/r/math/comments/8gfuo/the_fibonacci_sequence_in_tools_lateralus/"&gt;Reddit&lt;/a&gt; un lien vers &lt;a href="http://www.youtube.com/watch?v=wS7CZIJVxFY"&gt;une vidéo&lt;/a&gt; d'un fan de Tool montrant les curiosités mathématiques de leur morceau "Lateralus" extrait de l'album du même nom. La vidéo en question ne date pas d'hier et avait même été diggée quelques fois, mais le morceau est une pièce d'exception et il est toujours intéressant d'en découvrir les particularités.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Tool est un de ces groupes un peu monstrueux parce que chaque élément est une montagne de talent et de créativité à lui seul, mais qu'en plus une fois mis ensemble une curieuse alchimie fait que le groupe est supérieur à la somme de ses membres. En presque vingt ans d'activité ils ont sorti 4 albums (en 1993, 1996, 2001 et 2006), chacun étant clairement réfléchi, mûri et peaufiné pour atteindre un degré de perfection presque monstrueux. Leur chef-d'oeuvre incontesté reste à ce jour l'album &lt;i&gt;Lateralus&lt;/i&gt;, sorti en 2001, catapulé en première place des ventes US dès sa sortie, et vainqueur d'un Grammy Award, et album de l'année selon Kerrang!, rien que ça...&lt;br /&gt;&lt;br /&gt;La chanson &lt;i&gt;Lateralus&lt;/i&gt;, 9 minutes et 24 secondes de bonheur, se fait un peu plus remarquer que le reste. La chanson parle de la quête de connaissance, de la libération de l'esprit sur le corps (on entendait déjà "This body holding me reminds me of my own mortality" sur &lt;i&gt;Parabola&lt;/i&gt;) et culmine en la répétition de "Spiral out, keep going...". Pas grand-chose, mais si on est attentif aux pauses qui sont mises dans le chant du premier couplets, on observe ceci:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Black&lt;br /&gt;then&lt;br /&gt;white are&lt;br /&gt;all I see&lt;br /&gt;in my infancy.&lt;br /&gt;Red and yellow then came to be,&lt;br /&gt;reaching out to me.&lt;br /&gt;Lets me see&lt;br /&gt;&lt;br /&gt;As below, so above and beyond, I imagine.&lt;br /&gt;Drawn beyond the lines of reason.&lt;br /&gt;Push the envelope.&lt;br /&gt;Watch it bend.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Soit en syllabes: 1, 1, 2, 3, 5, 8, 5, 3 puis 13, 8, 5, 3.&lt;br /&gt;&lt;br /&gt;Après le refrain on reprend le même couplet mais avec un morceau qui manquait, et qui rend la structure nettement plus évidente:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Black&lt;br /&gt;then&lt;br /&gt;white are&lt;br /&gt;all I see&lt;br /&gt;in my infancy.&lt;br /&gt;Red and yellow then came to be,&lt;br /&gt;reaching out to me.&lt;br /&gt;Lets me see&lt;br /&gt;&lt;br /&gt;There is&lt;br /&gt;so&lt;br /&gt;much&lt;br /&gt;more and&lt;br /&gt;beckons me&lt;br /&gt;to look through to these&lt;br /&gt;infinite possibilities.&lt;br /&gt;&lt;br /&gt;As below, so above and beyond, I imagine.&lt;br /&gt;Drawn beyond the lines of reason.&lt;br /&gt;Push the envelope.&lt;br /&gt;Watch it bend.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Soit 1, 1, 2, 3, 5, 8, 5, 3, 2, 1, 1, 2, 3, 5, 8, 13, 8, 5, 3. Autrement dit, la suite de Fibonnaci dans le sens croissant puis décroissant sur ses premiers termes, deux fois. Ce qui, au vu du thème de la chanson et de la mentalité de son auteur, n'est absolument pas à attribuer au hasard. Un autre détail amusant? Le chant commence après 97 secondes de musique, soit après 1,618 minutes, 1,618 est le nombre d'or.&lt;br /&gt;&lt;br /&gt;Waw.&lt;br /&gt;&lt;br /&gt;Le refrain est sur une base rythmique de 9/8, puis 8/8, puis 7/8. 987 est un des termes de la suite de Fibonacci, mais le batteur Danny Carey a démenti que ce soit intentionnel, bien qu'il soit fasciné par les questions de numérologies et des géométries et que cela se ressente très nettement dans la complexité de son jeu.&lt;br /&gt;&lt;br /&gt;L'album comporte 13 pistes, le terme de la série de Fibonnaci le plus grand du jeu rythmique de la plage titulaire. Une rumeur voulait que les pistes de l'album ne soient pas dans le "bon" ordre, et à cette question un fan a répondu en proposant un ordre de lecture différent et étonnament agréable. Son idée est que &lt;i&gt;Parabol&lt;/i&gt; est un prélude à &lt;i&gt;Parabola&lt;/i&gt; et sont respectivement 6ème et 7èmes pistes, donc au milieu du disque. Son arrangement commence par 6 et 7, puis continue par paires de nombres dont la somme vaut 13, le premier étant d'abord décroissant, puis croissant. Soit 6 et 7, 5 et 8, 4 et 9, 13, 1 et 12, 2 et 11, 3 et 10. L'ordre 6, 7, 5, 8, 4, 9, 13, 1, 12, 2, 11, 3, 10, baptisé &lt;i&gt;The Holy Gift&lt;/i&gt; par son auteur, est effectivement troublant tellement il "coule" bien, mais il présente un petit hic: Tool joue toujours les morceaux &lt;i&gt;Disposition&lt;/i&gt;, &lt;i&gt;Reflection&lt;/i&gt;, et &lt;i&gt;Triad&lt;/i&gt; ensemble et dans cet ordre, qui est l'ordre dans lequel ils apparaissent sur &lt;i&gt;Lateralus&lt;/i&gt;, aux positions 10, 11, et 12. &lt;i&gt;The Holy Gift&lt;/i&gt; casse ce triptique abruptement, ce qui peut laisser supposer que s'il existe un ordre parfait ce n'est pas celui-ci.&lt;br /&gt;&lt;br /&gt;C'est tout de même troublant.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-4493805705365730223?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/4493805705365730223/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/05/i-know-pieces-fit.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/4493805705365730223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/4493805705365730223'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/05/i-know-pieces-fit.html' title='&quot;I know the pieces fit&quot;'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-694372776303887183</id><published>2009-04-16T21:10:00.004+02:00</published><updated>2009-07-07T09:59:43.453+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Exercices de Michel Couprie: solutions aux séries 1 et 2, en Python</title><content type='html'>Eh oui, c'est la semaine de congé, du coup j'ai un peu levé le pied en matières informatiques. Mais pour ne pas laisser les choses en désuétude, voici quelque chose que j'avais fait avant le début du congé, partagé avec quelques favorisés, et qui pourrait être utile à d'autres.&lt;br /&gt;&lt;br /&gt;Quand on veut apprendre à programmer, ou qu'on veut se faire la main sur un langage en particulier, on apprécie d'avoir à disposition des petits problèmes d'algorithmique de difficulté et de complexité croissantes. Pour ma part, quand je m'ennuie j'aime beaucoup avoir un problème que je peux résoudre en moins d'une heure, une sorte de "one-shot" pour se changer les idées.&lt;br /&gt;&lt;br /&gt;En fouillant un peu j'ai trouvé &lt;a href="http://www.esiee.fr/~coupriem/Exos/exos/exos.html"&gt;cette liste de problèmes&lt;/a&gt;, proposé par Michel Couprie. ces problèmes (34 en tout) sont classés par difficulté croissante en quatre paliers. Voici mes solutions pour les problèmes des deux premiers paliers (les deux suivants suivront si je m'ennuie ce soir).&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;# Solutions aux exercices proposes par Michel Couprie a l'adresse:&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/exos/exos.html&lt;br /&gt;#&lt;br /&gt;# Il peut y avoir d'autres approches, evidemment, je ne fournis celles-ci qu'a&lt;br /&gt;# titre d'exemples.&lt;br /&gt;# 2009/04/08, 2009-04-09 - Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# DIFFICULTE 1&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 01 - Factorielle&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/fact&lt;br /&gt;&lt;br /&gt;def factorielle_iterative(n):&lt;br /&gt;    res = 1&lt;br /&gt;    while (n &gt; 1):&lt;br /&gt;        res *= n&lt;br /&gt;        n -= 1&lt;br /&gt;    return res&lt;br /&gt;    &lt;br /&gt;def factorielle_recursive(n):&lt;br /&gt;    if n &amp;lt; 2:&lt;br /&gt;        return 1&lt;br /&gt;    else:&lt;br /&gt;        return n * factorielle_recursive(n - 1)&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 02 - Inversion d'un tableau&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/inverse&lt;br /&gt;&lt;br /&gt;def inversion_tableau_iterative(tab):&lt;br /&gt;    tmp = []&lt;br /&gt;    if len(tab) &amp;lt; 2:&lt;br /&gt;        return tab&lt;br /&gt;    for i in (len(tab), 0, -1):&lt;br /&gt;        tmp.append(tab[i - 1])&lt;br /&gt;    return tmp&lt;br /&gt;&lt;br /&gt;def inversion_tableau_recursive(tab):&lt;br /&gt;    if len(tab) &amp;lt; 2:&lt;br /&gt;        return tab&lt;br /&gt;    else:&lt;br /&gt;        return inversion_tableau_recursive(tab[1:]) + [tab[0]]&lt;br /&gt;&lt;br /&gt;def inversion_tableau_pythonienne(tab):&lt;br /&gt;    return tab[-1::-1]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 03 - Minimum et maximum sur un tableau en une seule passe&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/minmax&lt;br /&gt;&lt;br /&gt;def min_et_max(tab):&lt;br /&gt;    if len(tab) &amp;lt; 1:&lt;br /&gt;        return {}&lt;br /&gt;    res = {'min' : tab[0], 'max' : tab[0]}&lt;br /&gt;    for i in range(1, len(tab)):&lt;br /&gt;        if (tab[i] &amp;lt; res['min']):&lt;br /&gt;            res['min'] = tab[i]&lt;br /&gt;        if (tab[i] &gt; res['max']):&lt;br /&gt;            res['max'] = tab[i]&lt;br /&gt;    return res&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 04 - Palindrome ou non, en ignorant les espaces&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/palindrome&lt;br /&gt;&lt;br /&gt;def est_palindrome(texte):&lt;br /&gt;    if len(texte) &amp;lt; 2:&lt;br /&gt;        return True&lt;br /&gt;    tmp = texte.replace(' ', '')&lt;br /&gt;    return (tmp == tmp[-1::-1])&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 05 - Solution d'un polynome par Horner&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/polynome&lt;br /&gt;&lt;br /&gt;def solution_horner(poly, value):&lt;br /&gt;    # avec poly de la forme [coeff, ...] sans vide, poids fort au debut&lt;br /&gt;    # donc on note explicitement les coefficiens nuls&lt;br /&gt;    result = poly[0]&lt;br /&gt;    for i in range(1, len(poly)):&lt;br /&gt;        result *= value&lt;br /&gt;        result += poly[i]&lt;br /&gt;    return result&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 06 - Estimation de Pi&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/calculpi&lt;br /&gt;&lt;br /&gt;from random import random&lt;br /&gt;from math import sqrt&lt;br /&gt;def estimation_pi(nb_points):&lt;br /&gt;    def radius(x_coord, y_coord):&lt;br /&gt;        return sqrt(x_coord ** 2 + y_coord ** 2)&lt;br /&gt;    cnt = 0.0&lt;br /&gt;    for i in range(0, nb_points):&lt;br /&gt;        if radius(random(), random()) &amp;lt; 1:&lt;br /&gt;            cnt += 1&lt;br /&gt;    return cnt / nb_points * 4&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 07 - Suite "cube de chiffres du terme precedent"&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/cubes&lt;br /&gt;&lt;br /&gt;def suite_cube_chiffres(depart):&lt;br /&gt;    def somme_cubes_chiffres(nombre):&lt;br /&gt;        tmp = str(nombre)&lt;br /&gt;        res = 0&lt;br /&gt;        for i in range(0, len(tmp)):&lt;br /&gt;            res += int(tmp[i]) ** 3&lt;br /&gt;        return res&lt;br /&gt;    if (depart % 3 != 0) or (depart &amp;lt; 0):&lt;br /&gt;        return "Le premier element doit etre un multiple positif de 3."&lt;br /&gt;    res = [depart]&lt;br /&gt;    while res[-1] != somme_cubes_chiffres(res[-1]):&lt;br /&gt;        res.append(somme_cubes_chiffres(res[-1]))&lt;br /&gt;    return res[-1]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 08 - Crible d'Eratosthene&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/eratos&lt;br /&gt;&lt;br /&gt;def crible_eratosthene(limite):&lt;br /&gt;    res_bool = [False, False]&lt;br /&gt;    for i in range(2, limite + 1):&lt;br /&gt;        res_bool.append(True)&lt;br /&gt;    for i in range(2, limite + 1):&lt;br /&gt;        for j in range(2, i / 2 + 1):&lt;br /&gt;            if (i % j == 0) and (i / j != 1):&lt;br /&gt;                res_bool[i] = False&lt;br /&gt;    res_num = []&lt;br /&gt;    for i in range(2, limite + 1):&lt;br /&gt;        if res_bool[i]:&lt;br /&gt;            res_num.append(i)&lt;br /&gt;    return res_num&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 09 - Test de la primalite d'un entier&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/premier&lt;br /&gt;&lt;br /&gt;def est_premier(nombre):&lt;br /&gt;    if (nombre &amp;lt; 2):&lt;br /&gt;        return False&lt;br /&gt;    premiers = crible_erathosthene(nombre / 2 + 1)&lt;br /&gt;    for i in premiers:&lt;br /&gt;        if (nombre % i == 0):&lt;br /&gt;            return False&lt;br /&gt;    return True&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 10 - Produit scalaire de deux vecteurs&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/prodscal&lt;br /&gt;&lt;br /&gt;def produit_scalaire(vec1, vec2):&lt;br /&gt;    if (len(vec1) != len(vec2)) or \&lt;br /&gt;        (len(vec1) &amp;lt; 1) or \&lt;br /&gt;        (len(vec2) &amp;lt; 1):&lt;br /&gt;        return "Arguments incorrects"&lt;br /&gt;    tmp = 0&lt;br /&gt;    for i in range(0, len(vec1)):&lt;br /&gt;        tmp += vec1[i] * vec2[i]&lt;br /&gt;    return tmp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 11 - Puissance N d'un nombre, en effectuant moins de N-1 multiplications&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/puissance&lt;br /&gt;&lt;br /&gt;def puissance(base, expo):&lt;br /&gt;    if (expo &amp;lt; 0):&lt;br /&gt;        return "L'exposant doit etre positif ou nul"&lt;br /&gt;    tmp = 1&lt;br /&gt;    while (expo &gt; 1):&lt;br /&gt;        tmp *= (base * base)&lt;br /&gt;        expo -= 2&lt;br /&gt;    if (expo == 1):&lt;br /&gt;        tmp *= base&lt;br /&gt;    return tmp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 12 - Calcul de la racine carree&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/raccar&lt;br /&gt;   &lt;br /&gt;def racine_carree(nbr, precision):&lt;br /&gt;    # Estimation a la louche &lt;br /&gt;    rac = 0&lt;br /&gt;    while (nbr &gt; rac ** 2):&lt;br /&gt;        rac += 1&lt;br /&gt;    if (nbr == rac ** 2):&lt;br /&gt;        return rac&lt;br /&gt;    # Affinement&lt;br /&gt;    for i in range(0, precision):&lt;br /&gt;        rac = (rac + nbr / rac) / 2.0&lt;br /&gt;    return rac&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 13 - Calcul de la racine cubique&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/raccube&lt;br /&gt;&lt;br /&gt;def racine_cubique(nbr, precision):&lt;br /&gt;    # Estimation a la louche &lt;br /&gt;    rac = 0&lt;br /&gt;    while (nbr &gt; rac ** 3):&lt;br /&gt;        rac += 1&lt;br /&gt;    if (nbr == rac ** 3):&lt;br /&gt;        return rac&lt;br /&gt;    # Affinement&lt;br /&gt;    for i in range(0, precision):&lt;br /&gt;        rac = (2 * rac + nbr / (rac ** 2)) / 3.0&lt;br /&gt;    return rac&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 14 - Recherche sequentielle sur un tableau&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/rechseq&lt;br /&gt;# Meme chose que l'exercice 03&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 15 - Fonction sin(x)&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/sinus&lt;br /&gt;&lt;br /&gt;def sinus(x, precision):&lt;br /&gt;    def factorielle(n):&lt;br /&gt;        return factorielle_iterative(n)&lt;br /&gt;    result = 0.0&lt;br /&gt;    for n in range(0, precision):&lt;br /&gt;        result += ((-1) ** n) * ((x ** (2 * n + 1)) / (factorielle(2 * n + 1)))&lt;br /&gt;    return result&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 16 - Symetrie d'une matrice&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/symetrique&lt;br /&gt;&lt;br /&gt;def est_symetrique(matrice):&lt;br /&gt;    if (len(matrice) != len(matrice[0])):&lt;br /&gt;        return False # Une matrice doit etre carree pour etre symetrique&lt;br /&gt;    for i in range(0, len(matrice)):&lt;br /&gt;        for j in range(0, i):&lt;br /&gt;            if matrice[i][j] != matrice[j][i]:&lt;br /&gt;                return False&lt;br /&gt;    return True&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 17 - Affichage du triangle de Pascal&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/trpascal&lt;br /&gt;&lt;br /&gt;def triangle_de_pascal(rangees):&lt;br /&gt;    print "1"&lt;br /&gt;    print "1 1"&lt;br /&gt;    prevline = [1, 1]&lt;br /&gt;    for i in range(3, rangees + 1):&lt;br /&gt;        thisline = [1]&lt;br /&gt;        for j in range(1, i - 1):&lt;br /&gt;            thisline.append(prevline[j] + prevline[j - 1])      &lt;br /&gt;        thisline.append(1)&lt;br /&gt;        for j in range(0, i - 1):&lt;br /&gt;            print str(thisline[j]) + " ",&lt;br /&gt;        print str(thisline[-1])&lt;br /&gt;        prevline = thisline&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# DIFFICULTE 2&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 18 - Determiner si deux chaines sont anagrammes&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/anagrame&lt;br /&gt;&lt;br /&gt;def sont_anagrammes(chaine1, chaine2):&lt;br /&gt;    chaine1 = chaine1.strip(" ,.;:?!'\"-_").lower()&lt;br /&gt;    chaine2 = chaine2.strip(" ,.;:?!'\"-_").lower()&lt;br /&gt;    return (list(chaine1).sort() == list(chaine2).sort())&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 19 - Convolution&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/convolution&lt;br /&gt;&lt;br /&gt;def convolution(tabA, tabH):&lt;br /&gt;    # A de taille 100x100, H de taille 7x7&lt;br /&gt;    tabB = [[0] * 100] * 100&lt;br /&gt;    for i in range(0, 100):&lt;br /&gt;        for j in range(0, 100):&lt;br /&gt;            if ((i in range(0, 3) or i in range(97, 100)) or \&lt;br /&gt;                (j in range(0, 3) or j in range(97, 100))):&lt;br /&gt;                tabB[i][j] = tabA[i][j]&lt;br /&gt;            else: # i,j in (4, 97)&lt;br /&gt;                for m in range(0, 7):&lt;br /&gt;                    for n in range(0, 7):&lt;br /&gt;                        tabB[i][j] += tabA[i + m - 3][j + n - 3] * tabH[m][n]&lt;br /&gt;    return tabB&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 20 - Fusion de deux tableaux tries&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/fusion&lt;br /&gt;&lt;br /&gt;def fusion_tableaux_tries(tab1, tab2):&lt;br /&gt;    cur1 = 0&lt;br /&gt;    cur2 = 0&lt;br /&gt;    tab3 = []&lt;br /&gt;    while (cur1 &amp;lt; len(tab1)) and (cur2 &amp;lt; len(tab1)):&lt;br /&gt;        if tab1[cur1] &amp;lt; tab2[cur2]:&lt;br /&gt;            tab3.append(tab1[cur1])&lt;br /&gt;            cur1 += 1&lt;br /&gt;        else:&lt;br /&gt;            tab3.append(tab2[cur2])&lt;br /&gt;            cur2 +=1&lt;br /&gt;    # Un des deux tableaux a ete entierement copie, reste a vider l'autre&lt;br /&gt;    while (cur1 &amp;lt; len(tab1)):&lt;br /&gt;        tab3.append(tab1[cur1])&lt;br /&gt;        cur1 += 1&lt;br /&gt;    while (cur2 &amp;lt; len(tab2)):&lt;br /&gt;        tab3.append(tab2[cur2])&lt;br /&gt;        cur2 += 1   &lt;br /&gt;    return tab3&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 21 - Conjecture Hongroise (note: on l'appelle aussi "probleme de Collatz")&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/hongrois&lt;br /&gt;&lt;br /&gt;def hongroise(depart):&lt;br /&gt;    if (depart == 1):&lt;br /&gt;        print "1 4 2 1 4 2 ..."&lt;br /&gt;    else:&lt;br /&gt;        print str(depart),&lt;br /&gt;        if (depart % 2 == 0):&lt;br /&gt;            hongroise(depart / 2)&lt;br /&gt;        else:&lt;br /&gt;            hongroise(3 * depart + 1)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 22 - Regroupement des valeurs paires et impaires&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/pairimpair&lt;br /&gt;&lt;br /&gt;def paires_impaires(tab):&lt;br /&gt;    res = []&lt;br /&gt;    for i in range(0, len(tab)):&lt;br /&gt;        if (tab[i] % 2 == 0):&lt;br /&gt;            res.append(tab[i])&lt;br /&gt;    for i in range(0, len(tab)):&lt;br /&gt;        if (tab[i] % 2 != 0):&lt;br /&gt;            res.append(tab[i])&lt;br /&gt;    return res&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 23 - Afficher les nombres parfaits compris entre 1 et N&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/parfaits&lt;br /&gt;&lt;br /&gt;def nombres_parfaits(limite):&lt;br /&gt;    res = []&lt;br /&gt;    for nb in range(1, limite + 1):&lt;br /&gt;        sommediv = 0&lt;br /&gt;        for di in range(1, nb / 2 + 1):&lt;br /&gt;            if (nb % di == 0):&lt;br /&gt;                sommediv += di&lt;br /&gt;        if (sommediv == nb):&lt;br /&gt;            res.append(nb)&lt;br /&gt;    return res&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 24 - Determiner la periode d'un signal digital&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/periode&lt;br /&gt;&lt;br /&gt;def periode_signal(tab):&lt;br /&gt;    per = 0&lt;br /&gt;    fini = False&lt;br /&gt;    while (not fini) and (per &amp;lt; len(tab) - 1):&lt;br /&gt;        per +=1&lt;br /&gt;        # Verification de cette hypothese&lt;br /&gt;        for cur in range(0, per):&lt;br /&gt;            fini = (tab[cur] == tab[cur + per])&lt;br /&gt;    if (fini):&lt;br /&gt;        return per&lt;br /&gt;    else:&lt;br /&gt;        return 0&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 25 - Plus grand plateau dans le graphique d'une fonction monotone&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/plateau&lt;br /&gt;&lt;br /&gt;def plus_grand_plateau(tab):&lt;br /&gt;    plat_max = 1&lt;br /&gt;    plat_tmp = 0&lt;br /&gt;    for i in range(1, len(tab)):&lt;br /&gt;        if tab[i] == tab[i - 1]:&lt;br /&gt;            plat_tmp += 1&lt;br /&gt;        else:&lt;br /&gt;            plat_tmp = 1&lt;br /&gt;        if plat_tmp &gt; plat_max:&lt;br /&gt;            plat_max = plat_tmp&lt;br /&gt;    return plat_max&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 26 - Calcul de la racine carree entiere d'un entier&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/racent&lt;br /&gt;&lt;br /&gt;def racine_carree_entiere(nbr):&lt;br /&gt;    rac = 0&lt;br /&gt;    while (nbr &gt; rac ** 2):&lt;br /&gt;        rac += 1&lt;br /&gt;    if (nbr == rac ** 2):&lt;br /&gt;        return rac&lt;br /&gt;    else:&lt;br /&gt;        return rac - 1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 27 - Conversion Romain-arabe&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/romains&lt;br /&gt;&lt;br /&gt;def romain_vers_arabe(romannumber):&lt;br /&gt;    romandigits = { 'I': 1, 'V': 5, 'X': 10, 'L': 50 }&lt;br /&gt;    number = 0&lt;br /&gt;    for i in range(1, len(romannumber)):&lt;br /&gt;        if (romandigits[romannumber[i]] &gt; romandigits[romannumber[i - 1]]):&lt;br /&gt;            number -= romandigits[romannumber[i - 1]]&lt;br /&gt;        else:&lt;br /&gt;            number += romandigits[romannumber[i - 1]]&lt;br /&gt;    number += romandigits[romannumber[-1]]&lt;br /&gt;    return digit&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#------------------------------------------------------------------------------&lt;br /&gt;# 28 - Transcodage octal-decimal&lt;br /&gt;# http://www.esiee.fr/~coupriem/Exos/Enonces/transcodage&lt;br /&gt;&lt;br /&gt;def octal_vers_decimal(octnum):&lt;br /&gt;    number = 0&lt;br /&gt;    octalnumber = str(octnum)&lt;br /&gt;    for i in range(0, len(octalnumber)):&lt;br /&gt;        number += int(octalnumber[i]) * (8 ** (len(octalnumber) - i - 1))&lt;br /&gt;    return number&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-694372776303887183?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/694372776303887183/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/04/exercices-de-michel-couprie-solutions.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/694372776303887183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/694372776303887183'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/04/exercices-de-michel-couprie-solutions.html' title='Exercices de Michel Couprie: solutions aux séries 1 et 2, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-59138628750265393</id><published>2009-04-06T14:46:00.003+02:00</published><updated>2009-07-07T09:59:59.475+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: solution au problème 23, en Python</title><content type='html'>Un dernier pour aujourd'hui, vu que je ne serai sûrement pas vraiment généreux en code cette semaine, ni la semaine prochaine. Disons que je prends un peu d'avance.&lt;br /&gt;&lt;br /&gt;Le &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=23"&gt;problème 23&lt;/a&gt; est une question de nombres abondants. Connaissant la somme des diviseurs propres d'un nombre, on dit que ce nombre est déficient si cette somme est inférieure à lui-même (c'est le cas du nombre 10), parfait si cette somme lui est égale (28 l'est), abondant si elle est supérieure à lui-même (12 est abondant).&lt;br /&gt;&lt;br /&gt;Il est un fait établi que tous les nombres supérieurs à 28123 peuvent être écrits comme la somme de deux nombre abondants. Les entiers qui ne sont pas exprimables comme somme de deux abondants forment donc un ensemble fini. On en demande la somme.&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/04/06 - euler023.py&lt;br /&gt;# Solution au Probleme 23 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=23&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def getproperdivisors(num):&lt;br /&gt;    res = []&lt;br /&gt;    for i in range(1, num / 2 + 1):&lt;br /&gt;        if (num % i == 0):&lt;br /&gt;            res.append(i)&lt;br /&gt;    return res&lt;br /&gt;&lt;br /&gt;def sumofproperdivisors(num):&lt;br /&gt;    return sum(getproperdivisors(num))&lt;br /&gt;    &lt;br /&gt;def isabundant(num):&lt;br /&gt;    return (sumofproperdivisors(num) &gt; num)&lt;br /&gt;&lt;br /&gt;def getabundantnumbers(lim):&lt;br /&gt;    res = []&lt;br /&gt;    for i in range(1, lim + 1):&lt;br /&gt;        if isabundant(i):&lt;br /&gt;            res.append(i)&lt;br /&gt;    return res&lt;br /&gt;&lt;br /&gt;def issumofabundants(num, abundants):&lt;br /&gt;    res = False&lt;br /&gt;    for i in abundants:&lt;br /&gt;        if ((num - i) in abundants):&lt;br /&gt;            res = True&lt;br /&gt;            break&lt;br /&gt;    return res&lt;br /&gt;&lt;br /&gt;def euler23(lim):&lt;br /&gt;    abundants = getabundantnumbers(lim)&lt;br /&gt;    res = []&lt;br /&gt;    for i in range(1, lim + 1):&lt;br /&gt;        if not (issumofabundants(i, abundants)):&lt;br /&gt;            res.append(i)&lt;br /&gt;    return sum(res)&lt;br /&gt;&lt;br /&gt;print euler23(28123)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-59138628750265393?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/59138628750265393/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/04/project-euler-solution-au-probleme-23.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/59138628750265393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/59138628750265393'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/04/project-euler-solution-au-probleme-23.html' title='Project Euler: solution au problème 23, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-6488055840534390618</id><published>2009-04-06T11:22:00.003+02:00</published><updated>2009-07-07T10:00:16.038+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: solution au problème 22, en Python</title><content type='html'>Premier post du mois d'avril tiens, d'une certaine manière il était temps, nous sommes déjà le six! D'ici à ce qu'on dise que je laisse mon blog en désuétude, il n'y a qu'un pas!&lt;br /&gt;&lt;br /&gt;Je continue dans les joyeusetés de Project Euler, avec le &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=22"&gt;problème 22&lt;/a&gt;. L'idée est assez amusante, à savoir qu'on définit le "score" d'un mot comme la somme de ses lettres (avec A = 1, B = 2, ...), multiplié par la position de ce mot dans une liste. La liste en question est une liste de plus de 5000 prénoms, qu'on doit d'abord classer par ordre alphabétique. But: obtenir la somme des scores de tous ces noms, une fois triés.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/04/06 - euler022.py&lt;br /&gt;# Solution au Probleme 22 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=22&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;import re&lt;br /&gt;&lt;br /&gt;letters = { 'A' : 1,&lt;br /&gt;            'B' : 2,&lt;br /&gt;            'C' : 3,&lt;br /&gt;            'D' : 4,&lt;br /&gt;            'E' : 5,&lt;br /&gt;            'F' : 6,&lt;br /&gt;            'G' : 7,&lt;br /&gt;            'H' : 8,&lt;br /&gt;            'I' : 9,&lt;br /&gt;            'J' : 10,&lt;br /&gt;            'K' : 11,&lt;br /&gt;            'L' : 12,&lt;br /&gt;            'M' : 13,&lt;br /&gt;            'N' : 14,&lt;br /&gt;            'O' : 15,&lt;br /&gt;            'P' : 16,&lt;br /&gt;            'Q' : 17,&lt;br /&gt;            'R' : 18,&lt;br /&gt;            'S' : 19,&lt;br /&gt;            'T' : 20,&lt;br /&gt;            'U' : 21,&lt;br /&gt;            'V' : 22,&lt;br /&gt;            'W' : 23,&lt;br /&gt;            'X' : 24,&lt;br /&gt;            'Y' : 25,&lt;br /&gt;            'Z' : 26 }&lt;br /&gt;&lt;br /&gt;def filetolist(filename):&lt;br /&gt;    f = open(filename)&lt;br /&gt;    inp = f.readline()&lt;br /&gt;    names = re.split('\W+',inp)&lt;br /&gt;    f.close()&lt;br /&gt;    return names[1:-1]&lt;br /&gt;&lt;br /&gt;def letterscore(letter):&lt;br /&gt;    return letters[letter]&lt;br /&gt;&lt;br /&gt;def namescore(name):&lt;br /&gt;    score = 0&lt;br /&gt;    for i in range(0, len(name)):&lt;br /&gt;        score += letterscore(name[i])&lt;br /&gt;    return score&lt;br /&gt;&lt;br /&gt;def euler22(filename):&lt;br /&gt;    names = sorted(filetolist(filename))&lt;br /&gt;    scoresum = 0&lt;br /&gt;    for i in range(0, len(names)):&lt;br /&gt;        scoresum += (i + 1) * namescore(names[i])&lt;br /&gt;    return scoresum&lt;br /&gt;&lt;br /&gt;print euler22("names.txt")&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-6488055840534390618?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/6488055840534390618/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/04/project-euler-solution-au-probleme-22.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6488055840534390618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6488055840534390618'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/04/project-euler-solution-au-probleme-22.html' title='Project Euler: solution au problème 22, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-789909221769909602</id><published>2009-03-31T10:10:00.000+02:00</published><updated>2009-03-31T10:15:40.930+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jkb.log'/><title type='text'>Quelques chiffres...</title><content type='html'>La semaine dernière, le présent blog a franchi le cap des 1000 visites. J'avoue, ça fait tout chose, puisque je pensais être anecdotique au-delà de l'imagination humaine. Finalement il semble que mon blog est plus populaire que je ne l'aurais cru.&lt;br /&gt;&lt;br /&gt;Quelques chiffre donc, pour les curieux...&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;JKB.log a été ouvert &lt;a href="http://blog.virus1984.com/2008/10/et-voil.html"&gt;le 20 octobre 2008&lt;/a&gt;, un système de statistiques (Google Analytics) a été mis en place le 27 du même mois. Les données qui suivent portent donc sur la période du 27 octobre 2008 au 27 mars 2009, soit 5 mois d'activité.&lt;br /&gt;&lt;br /&gt;En cinq mois, j'ai commis 65 posts, ce qui fait un poil plus de 3 par semaine en moyenne; une plutôt bonne performance, puisque je m'interdis un peu les posts niais qui n'ont absolument aucun contenu et qui rangeraient JKB.log dans le même sac que les skyblogs de tous poils qui sont soit une liste de liens vers des vidéos mille fois vues, soit des collections de gags éculés, ou images de cartes postales bon marché accompagnées de poésie au moins aussi bon marché. Ici il y a du contenu original, du contenu qui n'est pertinent qu'à un certain sous-ensemble des internautes, mais un contenu original tout de même.&lt;br /&gt;&lt;br /&gt;Les visiteurs ont été au nombre de 718, pour 1067 visites qui ont consisté en 2189 pageviews. Sur une visite d'une durée moyenne de 2 minutes 30, un visiteur a demandé 2 pages. Je pense qu'on peut en déduire sans trop d'audace que la première est la page d'index, la deuxième la page complète d'un post donné. Le post le plus populaire est &lt;a href="http://blog.virus1984.com/2008/12/comment-devenir-un-hacker.html"&gt;celui qui annonce la mise en ligne de ma traduction de "How to become a hacker"&lt;/a&gt; d'Eric S. Raymond, post demandé 117 fois, le deuxième (85 visites) est ma &lt;a href="http://blog.virus1984.com/2008/11/project-euler-solution-au-problme-6-en.html"&gt;solution au problème n°6 de Project Euler&lt;/a&gt;, implémentée en C; le troisième (47 visites) mon petit mot sur &lt;a href="http://blog.virus1984.com/2008/11/de-la-censure-la-vole-sur-msn.html"&gt;la censure en temps réel sur le service MSN Messenger&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;J'avoue être assez touché de voir que mes visiteurs ne correspondent pas exactement aux données démographiques générales. A savoir qu'il est un fait établi que le navigateur le plus populaire au monde est Internet Explorer, or seuls 19,31% de mes visiteurs l'utilisent; 66,54% d'entre eux sont venus aux commandes de Firefox. De la même manière, Windows est l'écrasant dominant, mais ne fait subir son joug qu'à 50,52% de mes visiteurs; 37,11% d'entre eux utilisent Mac OS, 11,81% utilisent Linux.&lt;br /&gt;&lt;br /&gt;13,31% des visiteurs sont venus directement (la coupable est sûrement ma mailsig), 38,80% sont venus par un lien sur un autre site (un gros merci à &lt;a href="http://www.sterpin.net/"&gt;André Sterpin&lt;/a&gt;, qui est mon plus généreux donateurs de visites, le deuxième étant mon &lt;a href="http://twitter.com/virus1984"&gt;profil Twitter&lt;/a&gt;), le reste (soit 47,89%) provient de moteurs de recherche.&lt;br /&gt;&lt;br /&gt;Il est donc intéressant de jeter un oeil aux critères de recherche qui les ont envoyés ici. En tête, avec 49 visites, "Jean Karim Bockstael", ça tombe bien, c'est moi! D'ailleurs je constate avec joie qu'une recherche Google sur mon nom donne pour premiers résultats mon &lt;a href="http://twitter.com/virus1984"&gt;profil Twitter&lt;/a&gt;, mon &lt;a href="http://www.facebook.com/people/Jean-Karim-Bockstael/1267867091"&gt;profil Facebook&lt;/a&gt;, mon &lt;a href="http://blog.virus1984.com/"&gt;blog&lt;/a&gt;, et mon &lt;a href="http://users.skynet.be/virus1984/virus_world/"&gt;site personnel&lt;/a&gt;. En matière de publicité personnelle je m'en tire plutôt bien. Ça aide de ne pas avoir d'homonyme.&lt;br /&gt;&lt;br /&gt;Après ceux qui me cherchent viennent ceux qui cherchent de l'aide concernant &lt;a href="http://projecteuler.net/"&gt;Project Euler&lt;/a&gt;. La recherche "project euler" est en deuxième position et à l'origine de 42 visites. Plus bas dans la liste se trouvent une quantité folle de recherche mentionnant les mots "project euler" et un numéro de problème ou un nom de langage particulier. Ici aussi il s'agit de visiteurs contents, puisqu'effectivement je parle beaucoup du Project Euler et qu'effectivement je fournis &lt;a href="http://blog.virus1984.com/search/label/project%20euler"&gt;des solutions à certains de ses problèmes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;De la même manière, celui qui cherchait "litanie peur herbert" a trouvé &lt;a href="http://blog.virus1984.com/2009/02/litanie-contre-la-peur.html"&gt;son bonheur en deux langues&lt;/a&gt;. Par contre celui qui cherchait à se renseigner sur les "problemes de mue chez les python" aura vite compris que je ne parle pas de ce genre de &lt;a href="http://blog.virus1984.com/search/label/code%20%28python%29"&gt;python&lt;/a&gt;. Il faudra que les deux qui cherchaient "comment devenir gros" et celui qui cherchait "comment devenir poilu" m'explique le fond de leur question et les raisons profondes derrière elle, ma curiosité est piquée.&lt;br /&gt;&lt;br /&gt;Curieusement, j'attire les pyromanes aussi, 5 voulaient "bouter le feu", un voulait "bouter au feu", un "bouter du feu", et un vraisemblable acquéreur de nouvelle casserole se demandait "tous feux sauf induction ca veut dire quoi". Le &lt;a href="http://blog.virus1984.com/2008/10/howto-bouter-le-feu-sa-cuisine.html"&gt;post coupable est ici&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;J'avoue, ça m'a bien amusé. En route pour les 5 prochains mois d'activité, maintenant. Et merci à toutes et tous, c'est vraiment gratifiant de savoir que ce qu'on écrit est lu.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-789909221769909602?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/789909221769909602/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/03/quelques-chiffres.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/789909221769909602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/789909221769909602'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/03/quelques-chiffres.html' title='Quelques chiffres...'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-7849818680515654607</id><published>2009-03-30T14:20:00.003+02:00</published><updated>2009-07-07T10:00:32.536+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: solution au problème 21, en Python</title><content type='html'>Dans l'enchaînement, tant que mon mal de crâne ne m'empêche pas trop de réfléchir et que mon mal de doigt ne m'empêche pas trop de taper, la solution au problème suivant qu'il me reste à résoudre: le &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=21"&gt;problème 21&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;On parle ici de nombres amicaux. Des nombres amicaux sont des nombres dont l'un est la somme des diviseurs propres de l'autre. Encore une bizarrerie mathématique amusante.&lt;br /&gt;&lt;br /&gt;Problème: calculer la somme de tous les nombres amicaux inférieurs à 10000.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/03/30 - euler021.py&lt;br /&gt;# Solution au Probleme 21 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=21&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def sumofproperdivisors(n):&lt;br /&gt;    s = 0&lt;br /&gt;    for i in range (1, n / 2 + 1):&lt;br /&gt;        if (n % i == 0):&lt;br /&gt;            s += i&lt;br /&gt;    return s&lt;br /&gt;    &lt;br /&gt;def euler21(maxnum):&lt;br /&gt;    s = 0&lt;br /&gt;    for i in range(1, maxnum):&lt;br /&gt;        j = sumofproperdivisors(i)&lt;br /&gt;        k = sumofproperdivisors(j)&lt;br /&gt;        if k == i and k != j:&lt;br /&gt;            s += j&lt;br /&gt;    return s&lt;br /&gt;    &lt;br /&gt;print euler21(10000)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-7849818680515654607?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/7849818680515654607/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/03/project-euler-solution-au-probleme-21.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/7849818680515654607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/7849818680515654607'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/03/project-euler-solution-au-probleme-21.html' title='Project Euler: solution au problème 21, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-1556974600103659510</id><published>2009-03-30T13:43:00.003+02:00</published><updated>2009-07-07T10:00:47.015+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: solution au problème 19, en Python</title><content type='html'>On dira ce qu'on voudra, finalement résoudre les problèmes dans le désordre ça fait quand même un peu négligé; et les résoudre en commençant par les plus faciles ça fait un peu tire-au-flanc. Donc je reprends dans l'ordre là où j'avais arrêté: au &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=19"&gt;problème 19&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;La question est simple: combien de 1er du mois étaient un dimanche, pendant le vingtième siècle?&lt;br /&gt;&lt;br /&gt;La solution est simple, si on a le bon sens de laisser les complications de calcul de date aux librairies bien faites. Ricanez, mais un bon programmeur doit savoir ne pas réinventer la roue, non? :-)&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/03/30 - euler019.py&lt;br /&gt;# Solution au Probleme 19 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=19&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;from datetime import *&lt;br /&gt;&lt;br /&gt;def euler19(beginyear, endyear):&lt;br /&gt;    count = 0&lt;br /&gt;    for year in range(beginyear, endyear + 1):&lt;br /&gt;        for month in range (1, 13):&lt;br /&gt;            if date(year, month, 1).weekday() == 6:&lt;br /&gt;                count += 1&lt;br /&gt;    return count&lt;br /&gt;    &lt;br /&gt;print euler19(1901, 2000)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-1556974600103659510?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/1556974600103659510/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/03/project-euler-solution-au-probleme-19.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1556974600103659510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1556974600103659510'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/03/project-euler-solution-au-probleme-19.html' title='Project Euler: solution au problème 19, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-9080388477943884709</id><published>2009-03-29T23:56:00.001+02:00</published><updated>2009-07-07T10:01:01.839+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: solution au problème 48, en Python</title><content type='html'>Effectivement, quand on demande à avoir la liste des problèmes par ordre croissant de difficulté, on remarque vite que certains sont d'une brutalité basique à la limite du criminel. Ajouté à un langage s'en sortant très bien avec les grands nombres et un processeur vieillissant mais pas tout à fait obsolète, et vive la force brute!&lt;br /&gt;&lt;br /&gt;Le problème 48 demande les dix derniers chiffres de la somme des 1000 premiers entiers élevés à leur propre puissance, soit:&lt;br /&gt;&lt;code&gt;1^1 + 2^2 + 3^3 + ... + 1000^1000&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Résultat en une demi-seconde...&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/03/29 - euler048.py&lt;br /&gt;# Solution au Probleme 48 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=48&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;def euler48(n):&lt;br /&gt;    sum = 0&lt;br /&gt;    for i in range(1, n + 1):&lt;br /&gt;        sum = sum + (i ** i)&lt;br /&gt;    return str(sum)[-10:]&lt;br /&gt;&lt;br /&gt;print euler48(1000)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-9080388477943884709?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/9080388477943884709/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/03/project-euler-solution-au-probleme-48.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/9080388477943884709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/9080388477943884709'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/03/project-euler-solution-au-probleme-48.html' title='Project Euler: solution au problème 48, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-7294635657808035567</id><published>2009-03-26T11:47:00.006+01:00</published><updated>2009-07-07T10:01:15.899+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: solution au problème 25, en Python</title><content type='html'>Pas bu de café ce matin, donc je me réserve les problèmes réputés plus simples, histoire d'avoir quand même la satisfaction d'avancer. Quand on voit du PHP toute la matinée on a forcément envie de souffler un peu, c'est compréhensible ;)&lt;br /&gt;&lt;br /&gt;Le &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=25"&gt;problème 25&lt;/a&gt; ressort notre ami Fibonacci et sa suite mondialement connue:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Fibo(1) = 1&lt;br /&gt;Fibo(2) = 1&lt;br /&gt;Fibo(n) = Fibo(n-1) + Fibo(n-2)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Le problème étant de trouver &lt;code&gt;n&lt;/code&gt; tel que &lt;code&gt;Fibo(n)&lt;/code&gt; soit un nombre de 1000 chiffre. A la grosse moulinette donc, mais c'est terriblement rapide quand même.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/03/26 - euler025.py&lt;br /&gt;# Solution au Probleme 25 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=25&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;def euler25(num):&lt;br /&gt;    fibo1 = 1&lt;br /&gt;    fibo2 = 1&lt;br /&gt;    rank = 2&lt;br /&gt;    while (len(str(fibo2)) &lt; num):&lt;br /&gt;        fibo1, fibo2 = fibo2, fibo1 + fibo2&lt;br /&gt;        rank += 1&lt;br /&gt;    return rank&lt;br /&gt;    &lt;br /&gt;print euler25(1000)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-7294635657808035567?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/7294635657808035567/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/03/project-euler-solution-au-probleme-25.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/7294635657808035567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/7294635657808035567'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/03/project-euler-solution-au-probleme-25.html' title='Project Euler: solution au problème 25, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-6639953410935676942</id><published>2009-03-25T21:04:00.006+01:00</published><updated>2009-07-07T10:01:28.191+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: solution au problème 20, en Python</title><content type='html'>Tiens du code pour &lt;a href="http://projecteuler.net/"&gt;Project Euler&lt;/a&gt;, ça faisait un petit temps non?&lt;br /&gt;&lt;br /&gt;Le &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=19"&gt;problème 19&lt;/a&gt; ne m'attirait pas des masses, avec ses histoires de calendrier (j'ai une espèce de hantise primaire des problèmes de calcul de date) du coup je suis passé directement au &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=20"&gt;problème 20&lt;/a&gt;. Parce que je le peux.&lt;br /&gt;&lt;br /&gt;Ce problème a une sale tête de punition disciplinaire de prof de maths désabusé. Effrayant et sans solution "maline" ou "élégante", il faut sortir la grosse artillerie, pas le choix.&lt;br /&gt;&lt;br /&gt;Tout le monde se souvient de la fonction factorielle? Celle qu'on note &lt;code&gt;N!&lt;/code&gt;. Celle-là même:&lt;br /&gt;&lt;code&gt;fact(n) = n*(n-1)*(n-2)*(n-3)*...*3*2*1&lt;/code&gt;&lt;br /&gt;Genre elle est la victime idéale du premier contact avec la récursivité:&lt;br /&gt;&lt;code&gt;fact(n) = n*fact(n-1) avec fact(0) = 1&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Mais là n'est pas tout à fait la question. L'objectif de ce problème est de fournir la somme des chiffres du nombre 100! sans étouffer au passage. Pour les curieux, 100! est un nombre de 158 chiffres. Rien que ça.&lt;br /&gt;&lt;br /&gt;Dieu merci, Python s'en sort très bien avec les grands nombres.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/03/25 - euler020.py&lt;br /&gt;# Solution au Probleme 20 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=20&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;from math import factorial&lt;br /&gt;&lt;br /&gt;def euler20(n):&lt;br /&gt;    num = str(factorial(n))&lt;br /&gt;    sum = 0&lt;br /&gt;    for i in range(0, len(num)):&lt;br /&gt;        sum = sum + int(num[i])&lt;br /&gt;    return sum&lt;br /&gt;&lt;br /&gt;print euler20(100)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-6639953410935676942?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/6639953410935676942/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/03/project-euler-solution-au-probleme-20.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6639953410935676942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6639953410935676942'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/03/project-euler-solution-au-probleme-20.html' title='Project Euler: solution au problème 20, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-615241551107981847</id><published>2009-03-24T10:33:00.005+01:00</published><updated>2009-07-07T10:01:42.429+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code (php)'/><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-sa'/><category scheme='http://www.blogger.com/atom/ns#' term='outil'/><category scheme='http://www.blogger.com/atom/ns#' term='hack'/><title type='text'>Un interprète PHP, en PHP</title><content type='html'>Pour l'instant je pars à la découverte du PHP. Découvrir un nouveau langage implique de beaucoup "jouer" avec, de tester des petites choses, d'exécuter pas mal de "one-liners". Oui mais quand ces "one-liners", pour bien faire, doivent être dans du markup correct et être exécutés par un serveur, on se retrouve vite à faire beaucoup d'aller-retours entre l'éditeur et le navigateur.&lt;br /&gt;&lt;br /&gt;Donc j'ai fait un interprète PHP, en PHP, qui se présente sous la forme d'un &lt;code&gt;textarea&lt;/code&gt; dans lequel entrer son code source, et d'un bouton exécutant le code entré. Le résultat de l'exécution est affiché au-dessus du &lt;code&gt;textarea&lt;/code&gt; qui reprend le code exécuté, ce qui permet de s'amuser sans devoir taper à nouveau tout le code.&lt;br /&gt;&lt;br /&gt;Disons que ça peut servir...&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"&lt;br /&gt; "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;br /&gt;&amp;lt;head&gt;&lt;br /&gt;    &amp;lt;title&gt;Interprete PHP&amp;lt;/title&gt;&lt;br /&gt;    &amp;lt;meta http-equiv="Content-Type" content="text/html;charset=utf-8" /&gt;&lt;br /&gt;&amp;lt;/head&gt;&lt;br /&gt;&amp;lt;body&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;if (!isset($_POST["submit"])) {&lt;br /&gt;    // COMMANDE&lt;br /&gt;    $code = "Entrez du code PHP ici";&lt;br /&gt;    }&lt;br /&gt;else {&lt;br /&gt;    // RESULTAT&lt;br /&gt;    $code = $_POST["code"];&lt;br /&gt;    $code = ereg_replace('[\]["]','"',$code);&lt;br /&gt;    $code = ereg_replace("[\][']","'",$code);&lt;br /&gt;    echo eval($code);&lt;br /&gt;    }&lt;br /&gt;print '&amp;lt;form action="./interprete.php" method="post"&gt;';&lt;br /&gt;print '&amp;lt;p&gt;';&lt;br /&gt;print '&amp;lt;textarea name="code" rows="25" cols="80"&gt;' . $code . '&amp;lt;/textarea&gt;&amp;lt;br /&gt;';&lt;br /&gt;print '&amp;lt;input type="submit" name="submit" value="Executer" /&gt;';&lt;br /&gt;print '&amp;lt;/p&gt;';&lt;br /&gt;print '&amp;lt;/form&gt;';&lt;br /&gt;?&gt;&lt;br /&gt;&amp;lt;/body&gt;&lt;br /&gt;&amp;lt;/html&gt;&lt;br /&gt;&amp;lt;!-- 2009-03-24 Jean Karim Bockstael - license CC-BY-SA --&gt; &lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Dans une page XHTML valide, parce que c'est quand même plus sympa :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-615241551107981847?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/615241551107981847/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/03/un-interprete-php-en-php.html#comment-form' title='4 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/615241551107981847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/615241551107981847'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/03/un-interprete-php-en-php.html' title='Un interprète PHP, en PHP'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-8358514607050779659</id><published>2009-03-17T21:53:00.002+01:00</published><updated>2009-03-17T22:10:57.272+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photo'/><category scheme='http://www.blogger.com/atom/ns#' term='gandhi'/><category scheme='http://www.blogger.com/atom/ns#' term='citation'/><title type='text'>Les messages des poubelles</title><content type='html'>Vu sur une poubelle, quai Van Beneden à Liège, en face de l'Aquarium, pour ceux qui connaissent:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9oCvnRQKziE/ScAP3V281cI/AAAAAAAAAI4/omeGew-bPMM/s1600-h/100_2953-01.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_9oCvnRQKziE/ScAP3V281cI/AAAAAAAAAI4/omeGew-bPMM/s320/100_2953-01.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5314265003732030914" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;A vrai dire la citation est un peu inexacte, elle devrait être "nous devons être le changement que nous désirons voir dans le monde". Le Mahatma a en fait été cité par Arun Gandhi, qui disait (en anglais, du coup) "we need to be the change we wish to see in the world".&lt;br /&gt;&lt;br /&gt;Il est au passage assez amusant de voir combien de sagesses populaires sont attribuées à Gandhi. Quand elles ne sont pas attribuées à John Lennon.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-8358514607050779659?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/8358514607050779659/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/03/les-messages-des-poubelles.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/8358514607050779659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/8358514607050779659'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/03/les-messages-des-poubelles.html' title='Les messages des poubelles'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_9oCvnRQKziE/ScAP3V281cI/AAAAAAAAAI4/omeGew-bPMM/s72-c/100_2953-01.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-4078741478358295576</id><published>2009-03-11T21:35:00.007+01:00</published><updated>2009-03-11T22:01:54.145+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='path finder'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='hack'/><title type='text'>Changer l'icône de barre de menu de Path Finder 4</title><content type='html'>C'est vrai, je n'ai pas souvent tendance à parler de Mac-itude et des considérations sur l'harmonie de la GUI qui vont avec chaque fan de Mac. Mais une fois n'est pas coutume, ça faisait longtemps que je n'avais pas fait de personnalisation qui implique d'un peu plus soulever le capot, c'est donc l'occasion de partager un petit hack de moins de cinq minutes qui peut être utile à d'autres.&lt;br /&gt;&lt;br /&gt;La victime: &lt;a href="http://www.cocoatech.com/"&gt;Path Finder&lt;/a&gt;, version 4 (Tiger oblige), ou plus exactement l'icône qu'il place dans la barre de menu globale.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;J'aime beaucoup Path Finder, c'est vraiment un exemple à suivre en matière de logiciel bien fait. Mais un petit détail m'agace. On reproche souvent à Apple d'avoir cassé sa propre règle en matière d'icônes de barre de menu (silhouette monochrome presque noire) en ajoutant l'icône Spotlight dans un bleu on ne peut plus visible. Je trouve que c'est cohérent avec le menu-pomme qui est du même bleu. Par contre quand une application fait ça, ça casse l'harmonie:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9oCvnRQKziE/SbglS_4xwaI/AAAAAAAAAIA/7ayQ6l5ANew/s1600-h/0-menubar-before.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 325px; height: 22px;" src="http://3.bp.blogspot.com/_9oCvnRQKziE/SbglS_4xwaI/AAAAAAAAAIA/7ayQ6l5ANew/s400/0-menubar-before.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5312036768800948642" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Du coup, je me dis qu'il faudrait remplacer cette icône par une plus adaptée. Un petit tour dans &lt;code&gt;Path Finder.app/Contents/Resources/&lt;/code&gt; et je trouve &lt;code&gt;smallPathFinder.tiff&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9oCvnRQKziE/Sbglds9b5xI/AAAAAAAAAII/sweSh0aOT-U/s1600-h/1-original.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 21px; height: 21px;" src="http://4.bp.blogspot.com/_9oCvnRQKziE/Sbglds9b5xI/AAAAAAAAAII/sweSh0aOT-U/s400/1-original.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5312036952698775314" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Image en couleur, 21 pixels de côté, avec couche alpha. OK. Google image à la rescousse, puisque c'est pour mon usage personnel, et je dégotte ceci:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9oCvnRQKziE/SbgltiWRWiI/AAAAAAAAAIQ/KESq1UFOlDE/s1600-h/2-scavenged.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 46px; height: 48px;" src="http://2.bp.blogspot.com/_9oCvnRQKziE/SbgltiWRWiI/AAAAAAAAAIQ/KESq1UFOlDE/s400/2-scavenged.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5312037224728058402" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On gonfle un peu le contraste, on change un brin l'orientation:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9oCvnRQKziE/SbgltzFRYQI/AAAAAAAAAIY/x8yo3U_28WU/s1600-h/3-rotate%2Bcontrast.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 43px; height: 43px;" src="http://3.bp.blogspot.com/_9oCvnRQKziE/SbgltzFRYQI/AAAAAAAAAIY/x8yo3U_28WU/s400/3-rotate%2Bcontrast.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5312037229220159746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La même chose en inversé, puisque ce sera une couche alpha, et redimensionné:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9oCvnRQKziE/Sbglt7ButsI/AAAAAAAAAIg/ApXPbBCmz5c/s1600-h/5-redim.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 19px; height: 19px;" src="http://4.bp.blogspot.com/_9oCvnRQKziE/Sbglt7ButsI/AAAAAAAAAIg/ApXPbBCmz5c/s400/5-redim.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5312037231352788674" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Je la met en place dans &lt;code&gt;smallPathFinder.tiff&lt;/code&gt;, qu'en passant je remplis d'un monochrome &lt;code&gt;#303030&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9oCvnRQKziE/Sbglt9j-8pI/AAAAAAAAAIo/vuSJtqB4Lls/s1600-h/6-newicon.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 206px; height: 303px;" src="http://4.bp.blogspot.com/_9oCvnRQKziE/Sbglt9j-8pI/AAAAAAAAAIo/vuSJtqB4Lls/s400/6-newicon.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5312037232033329810" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Et une fois l'application relancée, joie, bonheur, harmonie:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9oCvnRQKziE/Sbglt6gUT9I/AAAAAAAAAIw/dBWXegE6t-Q/s1600-h/7-menubar-after.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 325px; height: 22px;" src="http://2.bp.blogspot.com/_9oCvnRQKziE/Sbglt6gUT9I/AAAAAAAAAIw/dBWXegE6t-Q/s400/7-menubar-after.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5312037231212646354" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Voilà, vite fait, bien fait :)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-4078741478358295576?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/4078741478358295576/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/03/changer-licone-de-barre-de-menu-de-path.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/4078741478358295576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/4078741478358295576'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/03/changer-licone-de-barre-de-menu-de-path.html' title='Changer l&apos;icône de barre de menu de Path Finder 4'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9oCvnRQKziE/SbglS_4xwaI/AAAAAAAAAIA/7ayQ6l5ANew/s72-c/0-menubar-before.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-7106288490845530270</id><published>2009-03-02T16:39:00.004+01:00</published><updated>2009-07-07T10:02:12.517+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><category scheme='http://www.blogger.com/atom/ns#' term='codechef'/><title type='text'>CodeChef: Solution au problème A4 du concours de mars 2009</title><content type='html'>Tiens, le premier concours &lt;a href="http://www.codechef.com/"&gt;CodeChef&lt;/a&gt; a commencé hier, et se déroule pendant deux semaines. Une occasion pour les programmeurs de tous poils de mesurer leur ardeur algorithmique et de se mesurer les uns aux autres.&lt;br /&gt;&lt;br /&gt;Mouais.&lt;br /&gt;&lt;br /&gt;Toujours est-il que ce sont des problèmes amusants à résoudre, donc autant le faire. Le problème A4, "&lt;a href="http://www.codechef.com/MARCH09/problems/A4/"&gt;The Rise and Fall of Power&lt;/a&gt;", avait été retiré du concours pour une obscure raison technique; le voici revenu mais l'exigence en temps d'exécution a fait échouer ma solution.&lt;br /&gt;&lt;br /&gt;Je peux donc vous en faire profiter sans troubler le bon déroulement du concours ;-)&lt;br /&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/03/02 - codechef-0903-A4.py&lt;br /&gt;# Solution au Probleme A4 du concours Codechef de mars 2009&lt;br /&gt;# http://www.codechef.com/MARCH09/problems/A4/&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def parseline(raw):&lt;br /&gt;    i = 0&lt;br /&gt;    while raw[i] != ' ':&lt;br /&gt;        i = i + 1&lt;br /&gt;    return int(raw[0:i]), int(raw[i+1:])&lt;br /&gt;&lt;br /&gt;numberofcases = input()&lt;br /&gt;for i in range(0, numberofcases):&lt;br /&gt;    n, k = parseline(raw_input())&lt;br /&gt;    num = str(n**n)&lt;br /&gt;    print num[:k], num[-k:]&lt;br /&gt;    &lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;En plus à ce tarif-là vous avez droit à mon moche parser pas du tout bâclé.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-7106288490845530270?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/7106288490845530270/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/03/codechef-solution-au-probleme-a4-du.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/7106288490845530270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/7106288490845530270'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/03/codechef-solution-au-probleme-a4-du.html' title='CodeChef: Solution au problème A4 du concours de mars 2009'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-4945942256213901617</id><published>2009-02-27T16:30:00.004+01:00</published><updated>2009-07-07T10:02:29.222+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spoj'/><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><category scheme='http://www.blogger.com/atom/ns#' term='codechef'/><category scheme='http://www.blogger.com/atom/ns#' term='wtf'/><title type='text'>CodeChef/SPOJ: un doute m'habite (problème "ORDERS")</title><content type='html'>Comme je le disais hier, afin de me libérer un peu la tête des considérations mathématiques un peu trop empreintes de considérations sur les grands ensembles, je me distrais plutôt du côté des problèmes de SPOJ/CodeChef, qui ont un aspect plus "vraie vie" plutôt amusant. Oui bon, je me suis pas mal distrait du côté d'&lt;a href="http://www.openttd.org/en/"&gt;OpenTTD&lt;/a&gt;, mais ceci est une autre histoire, comme disait le fabricant de sacs.&lt;br /&gt;&lt;br /&gt;Dans la catégorie des entraînements "difficiles" (comme "à l'heure à laquelle je tape ceci, la seule solution correcte proposée à ce problème-ci vient d'un certain 'Directi Admin', mais on voit beaucoup de propositions rejetées chaque minute"), on trouve le problème "&lt;a href="http://www.codechef.com/problems/ORDERS/"&gt;ORDERS&lt;/a&gt;", ou "&lt;a href="http://www.codechef.com/problems/ORDERS/"&gt;Ordering the Soldiers&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;Le problème est sympa, est pourrait se résumer par: sachant quels ont été les déplacements effectués au cours d'un tri, comment retrouver quelle était la situation initiale?&lt;br /&gt;&lt;br /&gt;J'ai donc concocté une solution qui me semblait sympathique, en Python parce que ce langage m'est sympathique. Je la teste sur les exemples donnés, je constate qu'elle fonctionne effectivement comme prévu, je la propose en ligne, et là bardaf! NZEC! Comme "non-zero exit code". Comme "pendant l'exécution, une exception a été soulevée".&lt;br /&gt;&lt;br /&gt;Et là j'avoue que je reste pantois, parce que j'ai beau lire et relire mon code, je ne vois absolument pas où ça pourrait échouer.&lt;br /&gt;&lt;br /&gt;Quelqu'un a une idée?&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/02/27 - spoj0227.py&lt;br /&gt;# Solution au Probleme 227 de SPOJ&lt;br /&gt;# http://www.spoj.pl/problems/ORDERS/&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def swap(ary,idx1,idx2):&lt;br /&gt;    tmp = ary[idx1]&lt;br /&gt;    ary[idx1] = ary[idx2]&lt;br /&gt;    ary[idx2] = tmp&lt;br /&gt;&lt;br /&gt;def mkranks(size):&lt;br /&gt;    tmp = []&lt;br /&gt;    for i in range(1, size + 1):&lt;br /&gt;        tmp = tmp + [i]&lt;br /&gt;    return tmp&lt;br /&gt;&lt;br /&gt;def permutations(ordered, movements):&lt;br /&gt;    size = len(ordered)&lt;br /&gt;    for i in range(1, size): # The leftmost one never moves&lt;br /&gt;        for j in range(0, int(movements[i])):&lt;br /&gt;            swap(ordered, i-j, i-j-1)&lt;br /&gt;    return ordered&lt;br /&gt;    &lt;br /&gt;numberofcases = input()&lt;br /&gt;for i in range(0, numberofcases):&lt;br /&gt;    sizeofcase = input()&lt;br /&gt;    tmp = raw_input()&lt;br /&gt;    movements = ""&lt;br /&gt;    for i in range(0, len(tmp)):&lt;br /&gt;        if i % 2 != 1:&lt;br /&gt;            movements = movements + tmp[i]&lt;br /&gt;    ordered = mkranks(sizeofcase)&lt;br /&gt;    ordered = permutations(ordered, movements)&lt;br /&gt;    output = ""&lt;br /&gt;    for i in range(0, sizeofcase - 1):&lt;br /&gt;        output = output + str(ordered[i]) + " "&lt;br /&gt;    output = output + str(ordered[sizeofcase - 1])&lt;br /&gt;    print output&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-4945942256213901617?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/4945942256213901617/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/02/codechefspoj-un-doute-mhabite-probleme.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/4945942256213901617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/4945942256213901617'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/02/codechefspoj-un-doute-mhabite-probleme.html' title='CodeChef/SPOJ: un doute m&apos;habite (problème &quot;ORDERS&quot;)'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-5879803110449121966</id><published>2009-02-26T15:35:00.005+01:00</published><updated>2009-07-07T10:02:43.822+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spoj'/><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><category scheme='http://www.blogger.com/atom/ns#' term='codechef'/><title type='text'>CodeChef/SPOJ: solution au problème "ONP", en Python</title><content type='html'>Pour changer un peu des considérations mathématiques qui sous-tendent les problèmes de &lt;a href="http://projecteuler.net/"&gt;Project Euler&lt;/a&gt;, je m'attaque à ceux qui sont proposés chez &lt;a href="http://www.spoj.pl"&gt;Sphere Online Judge&lt;/a&gt;, dont certains sont repris tels quels chez &lt;a href="http://www.codechef.com/"&gt;CodeChef&lt;/a&gt; (la système de vérification de CodeChef est celui de SPOJ).&lt;br /&gt;&lt;br /&gt;Je vous épargne le "TEST", intitulé &lt;a href="http://www.codechef.com/problems/TEST/"&gt;"Life, the Universe and Everything"&lt;/a&gt;, qui est un écho jusqu'à atteindre le sacro-saint quarante-deux.&lt;br /&gt;&lt;br /&gt;Par contre "ONP", ou "Transform the Expression", énoncé &lt;a href="http://www.codechef.com/problems/ONP/"&gt;ici&lt;/a&gt; et &lt;a href="http://www.spoj.pl/problems/ONP/"&gt;là&lt;/a&gt;, est un peu plus intéressant puisqu'il s'agit de transformer une expression arithmétique en notation infixe en la même expression mais en notation postfixe.&lt;br /&gt;&lt;br /&gt;Mon programme est une implémentation du &lt;a href="http://en.wikipedia.org/wiki/Shunting_yard_algorithm"&gt;Shunting Yard Algorithm&lt;/a&gt;, du vénérable &lt;a href="http://en.wikipedia.org/wiki/Edsger_Dijkstra"&gt;Edsger Dijkstra&lt;/a&gt;.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/02/26 - spoj0004.py&lt;br /&gt;# Solution au Probleme 4 de SPOJ&lt;br /&gt;# http://www.spoj.pl/problems/ONP/&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;operators = {   '+' : 0,&lt;br /&gt;                '-' : 0,&lt;br /&gt;                '*' : 1,&lt;br /&gt;                '/' : 1,&lt;br /&gt;                '^' : 2, }&lt;br /&gt;                &lt;br /&gt;def infixtorpn(infixexp):&lt;br /&gt;    rpnexp = ""&lt;br /&gt;    opstack = []&lt;br /&gt;    for i in range(0, (len(infixexp) - 1)):&lt;br /&gt;        token = infixexp[i]&lt;br /&gt;        # Operands&lt;br /&gt;        if token &gt;= 'a' and token &lt;= 'z':&lt;br /&gt;            rpnexp = rpnexp + token&lt;br /&gt;            continue&lt;br /&gt;        # Operators&lt;br /&gt;        if token in operators:&lt;br /&gt;            while len(opstack) &gt; 0 and \&lt;br /&gt;            opstack[-1] in operators and \&lt;br /&gt;            operators[opstack[-1]] &gt; operators[token]:&lt;br /&gt;                rpnexp = rpnexp + opstack.pop()&lt;br /&gt;            opstack.append(token)&lt;br /&gt;            continue&lt;br /&gt;        # Parenthesis&lt;br /&gt;        if token == '(':&lt;br /&gt;            opstack.append(token)&lt;br /&gt;            continue&lt;br /&gt;        if token == ')':&lt;br /&gt;            while opstack[-1] != '(':&lt;br /&gt;                rpnexp = rpnexp + opstack.pop()&lt;br /&gt;            opstack.pop()&lt;br /&gt;            continue&lt;br /&gt;    # Pop remaining operators into output&lt;br /&gt;    while len(opstack) &gt; 0 and opstack[-1] != '(':&lt;br /&gt;        rpnexp = rpnexp + opstack.pop()&lt;br /&gt;    return rpnexp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Number of test cases&lt;br /&gt;testcases = input()&lt;br /&gt;# Process each testcase&lt;br /&gt;for testcase in range(0, testcases):&lt;br /&gt;    print infixtorpn(raw_input())&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-5879803110449121966?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/5879803110449121966/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/02/codechefspoj-solution-au-probleme-onp.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/5879803110449121966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/5879803110449121966'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/02/codechefspoj-solution-au-probleme-onp.html' title='CodeChef/SPOJ: solution au problème &quot;ONP&quot;, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-2152294439840058262</id><published>2009-02-26T10:00:00.005+01:00</published><updated>2009-07-07T10:02:57.368+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: solution au problème 18, en Python</title><content type='html'>Le &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=18"&gt;problème 18&lt;/a&gt; est un peu traître par son exemple. &lt;br /&gt;&lt;br /&gt;En effet, la question est de déterminer quelle est la somme maximale qu'on peut obtenir en parcourant un triangle d'entiers positifs au départ de sa pointe et en ne se déplaçant que vers les 2 entiers situés "sous" celui où on se trouve.&lt;br /&gt;&lt;br /&gt;Une approche gloutonne fonctionne bien sur l'exemple fourni; en se déplaçant à chaque étape vers le plus grand des suivants, on obtient bien la somme maximale de 23 dans le triangle suivant:&lt;br /&gt;&lt;center&gt;&lt;code&gt;&lt;br /&gt;3&lt;br /&gt;7 5&lt;br /&gt;2 4 6&lt;br /&gt;8 5 9 3&lt;br /&gt;&lt;/code&gt;&lt;/center&gt;&lt;br /&gt;Malheureusement, cette approche gloutonne n'est pas la bonne, et ne fonctionne pas sur les données du problème.&lt;br /&gt;&lt;center&gt;&lt;code&gt;&lt;br /&gt;75&lt;br /&gt;95 64&lt;br /&gt;17 47 82&lt;br /&gt;18 35 87 10&lt;br /&gt;20 04 82 47 65&lt;br /&gt;19 01 23 75 03 34&lt;br /&gt;88 02 77 73 07 63 67&lt;br /&gt;99 65 04 28 06 16 70 92&lt;br /&gt;41 41 26 56 83 40 80 70 33&lt;br /&gt;41 48 72 33 47 32 37 16 94 29&lt;br /&gt;53 71 44 65 25 43 91 52 97 51 14&lt;br /&gt;70 11 33 28 77 73 17 78 39 68 17 57&lt;br /&gt;91 71 52 38 17 14 91 43 58 50 27 29 48&lt;br /&gt;63 66 04 68 89 53 67 30 73 16 69 87 40 31&lt;br /&gt;04 62 98 27 23 09 70 98 73 93 38 53 60 04 23&lt;br /&gt;&lt;/code&gt;&lt;/center&gt;&lt;br /&gt;J'ai donc opté pour une solution récursive exhaustive, qui est viable étant donnée la petite taille du problème, mais ne le sera pas pour le &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=67"&gt;problème 67&lt;/a&gt;. C'est le matin.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/02/26 - euler018.py&lt;br /&gt;# Solution au Probleme 18 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=18&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def recsum(tri,row,col):&lt;br /&gt;    if row &amp;lt; len(tri) - 1:&lt;br /&gt;        return tri[row][col] + max(recsum(tri,row+1,col),recsum(tri,row+1,col+1))&lt;br /&gt;    else:&lt;br /&gt;        return tri[row][col]&lt;br /&gt;    &lt;br /&gt;def euler18(triangle):&lt;br /&gt;    return recsum(triangle,0,0)&lt;br /&gt;&lt;br /&gt;tri = \&lt;br /&gt;[[75],&lt;br /&gt;[95,64],&lt;br /&gt;[17,47,82],&lt;br /&gt;[18,35,87,10],&lt;br /&gt;[20,4,82,47,65],&lt;br /&gt;[19,1,23,75,3,34],&lt;br /&gt;[88,2,77,73,7,63,67],&lt;br /&gt;[99,65,4,28,6,16,70,92],&lt;br /&gt;[41,41,26,56,83,40,80,70,33],&lt;br /&gt;[41,48,72,33,47,32,37,16,94,29],&lt;br /&gt;[53,71,44,65,25,43,91,52,97,51,14],&lt;br /&gt;[70,11,33,28,77,73,17,78,39,68,17,57],&lt;br /&gt;[91,71,52,38,17,14,91,43,58,50,27,29,48],&lt;br /&gt;[63,66,4,68,89,53,67,30,73,16,69,87,40,31],&lt;br /&gt;[4,62,98,27,23,9,70,98,73,93,38,53,60,4,23]]&lt;br /&gt;&lt;br /&gt;print euler18(tri)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-2152294439840058262?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/2152294439840058262/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/02/project-euler-solution-au-probleme-18.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2152294439840058262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2152294439840058262'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/02/project-euler-solution-au-probleme-18.html' title='Project Euler: solution au problème 18, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-3059502490444692558</id><published>2009-02-25T23:35:00.003+01:00</published><updated>2009-07-07T10:03:14.746+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: solution au problème 17, en Python</title><content type='html'>Le &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=17"&gt;problème 17&lt;/a&gt; est de la catégorie "bête et méchant à priori, mais qui se fait se gratter la tête avec vigueur pour obtenir une solution un peu élégante". Il s'agit de calculer le nombre de caractères que représente l'énumération de tous les nombres de 1 à 1000 en toutes lettres, en anglais, en ignorant les espaces et les traits d'union.&lt;br /&gt;&lt;br /&gt;Distrayant :-)&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/02/25 - euler017.py&lt;br /&gt;# Solution au Probleme 17 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=17&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;numbers = {&lt;br /&gt;    0:  "",&lt;br /&gt;    1:  "one",&lt;br /&gt;    2:  "two",&lt;br /&gt;    3:  "three",&lt;br /&gt;    4:  "four",&lt;br /&gt;    5:  "five",&lt;br /&gt;    6:  "six",&lt;br /&gt;    7:  "seven",&lt;br /&gt;    8:  "eight",&lt;br /&gt;    9:  "nine",&lt;br /&gt;    10: "ten",&lt;br /&gt;    11: "eleven",&lt;br /&gt;    12: "twelve",&lt;br /&gt;    13: "thirteen",&lt;br /&gt;    14: "fourteen",&lt;br /&gt;    15: "fifteen",&lt;br /&gt;    16: "sixteen",&lt;br /&gt;    17: "seventeen",&lt;br /&gt;    18: "eighteen",&lt;br /&gt;    19: "nineteen",&lt;br /&gt;    20: "twenty",&lt;br /&gt;    30: "thirty",&lt;br /&gt;    40: "forty",&lt;br /&gt;    50: "fifty",&lt;br /&gt;    60: "sixty",&lt;br /&gt;    70: "seventy",&lt;br /&gt;    80: "eighty",&lt;br /&gt;    90: "ninety",&lt;br /&gt;    100: "hundred",&lt;br /&gt;    1000: "thousand"&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;def spellout(num):&lt;br /&gt;    if num &amp;lt; 21:&lt;br /&gt;        return numbers[num]&lt;br /&gt;    if num &amp;lt; 100:&lt;br /&gt;        return numbers[num - (num % 10)] + numbers[num % 10]&lt;br /&gt;    if num &amp;lt; 1000:&lt;br /&gt;        if num % 100 == 0:&lt;br /&gt;            return numbers[(num - (num % 100)) / 100] + numbers[100]&lt;br /&gt;        else:&lt;br /&gt;            return spellout(num - (num % 100)) + "and" + spellout(num % 100)&lt;br /&gt;    if num == 1000:&lt;br /&gt;        return numbers[1] + numbers[1000]&lt;br /&gt;&lt;br /&gt;def euler17(num):&lt;br /&gt;    sum = 0&lt;br /&gt;    for i in range(1, num+1):&lt;br /&gt;        sum = sum + len(spellout(i))&lt;br /&gt;    return sum&lt;br /&gt;   &lt;br /&gt;print euler17(1000)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-3059502490444692558?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/3059502490444692558/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/02/project-euler-solution-au-probleme-17.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/3059502490444692558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/3059502490444692558'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/02/project-euler-solution-au-probleme-17.html' title='Project Euler: solution au problème 17, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-3408586450655300291</id><published>2009-02-25T21:10:00.002+01:00</published><updated>2009-02-25T21:13:26.545+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humour'/><category scheme='http://www.blogger.com/atom/ns#' term='blogs'/><title type='text'>The Geek Creed</title><content type='html'>Déniché sur &lt;a href="http://swedishcampground.com/this-is-my-compiler"&gt;Swedish Campground&lt;/a&gt;, The Geek Creed, sur le rythme du Marine Creed rendu célèbre par &lt;a href="http://www.youtube.com/watch?v=Ar0_um--LDQ"&gt;Full Metal Jacket&lt;/a&gt;. Du plein bonheur.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;This is my compiler.&lt;br /&gt;There are many like it, but this one is MINE.&lt;br /&gt;My compiler is my best friend. It is my life.&lt;br /&gt;I must master it as I must master my life.&lt;br /&gt;My compiler without me is useless. Without my compiler, I am useless.&lt;br /&gt;I must run my compiler true.&lt;br /&gt;I must run faster than my bug who is trying to kill me.&lt;br /&gt;I must squash him before he squashes me. I will...&lt;br /&gt;My compiler and myself know that what counts in war is not the warnings we squash,&lt;br /&gt;the builds we create, nor the optimisations we make.&lt;br /&gt;We know it is the build errors fixed that count. We will fix...&lt;br /&gt;My compiler is human, even as I, because it is my life.&lt;br /&gt;Thus, I will learn it as a brother.&lt;br /&gt;I will learn its weaknesses, its strengths, its output, its code,&lt;br /&gt;its quirks, and its errors.&lt;br /&gt;I will ever guard it against the ravages of virii and disk failures.&lt;br /&gt;I will keep my compiler clean and ready, even as I am clean and ready.&lt;br /&gt;We will become part of each other. We will...&lt;br /&gt;Before Assembler I swear this creed.&lt;br /&gt;My compiler and myself are the defenders of good code.&lt;br /&gt;We are the masters of our bugs.&lt;br /&gt;We are the saviors of our code.&lt;br /&gt;So be it, until code is compiling and there are no bugs, but compiled code.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Ben quoi?&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-3408586450655300291?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/3408586450655300291/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/02/geek-creed.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/3408586450655300291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/3408586450655300291'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/02/geek-creed.html' title='The Geek Creed'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-8066368205649004092</id><published>2009-02-25T00:11:00.006+01:00</published><updated>2009-07-07T10:05:12.861+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: solution au problème 16, en Python</title><content type='html'>Le &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=16"&gt;problème 16&lt;/a&gt; est un petit coquin, qui ressort le joker récurrent des problèmes de Project Euler: la très grande dimension du problème. En soi la question est bête comme chou: il s'agit de calculer la somme des chiffres d'une nombre.&lt;br /&gt;&lt;br /&gt;Facile! On voit d'elle-même sortir la boucle du genre:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;tant que nombre &gt; base:&lt;br /&gt;    somme = somme + nombre mod base&lt;br /&gt;    nombre = nombre div base&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;D'ailleurs j'ai commencé par implémenter cet algorithme somme toute fort naturel. Je le teste sur l'exemple (2^15), il fonctionne bien, je l'applique au problème demandé. Et bardaf.&lt;br /&gt;&lt;br /&gt;Faut dire que ce qu'on demande c'est de donner la somme des chiffres du nombre 2^1000. Pour ceux qui n'auraient pas suivi, 2^1000 est un grand nombre. Genre grand. Genre 302 chiffres. Genre les types de base s'étranglent un peu face à ce genre de grandes valeurs.&lt;br /&gt;&lt;br /&gt;Donc il va falloir opérer de façon plus "école primaire", chiffre par chiffre.&lt;br /&gt;&lt;br /&gt;En partant de ce principe-là:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;2^n = 2 * 2^n-1&lt;br /&gt;    = 2 * 2 * 2^n-2&lt;br /&gt;    = 2 * 2 * 2 * 2^n-3&lt;br /&gt;    = ...&lt;br /&gt;    = 2 * 2 * ... * 2 * 2&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;C'est bien la définition d'un exposant non?&lt;br /&gt;&lt;br /&gt;Et:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;2^n = 2^n-1 + 2^n-1&lt;br /&gt;    = (2^n-2 + 2^n-2) + (2^n-2 + 2^n-2)&lt;br /&gt;    = ...&lt;br /&gt;    = 2 + 2 + 2 + ... + 2 + 2 + 2&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Donc mon algorithme commence par calculer 2^1000 par doubles successifs en partant de 2^1, en n'effectuant que des sommes, en gardant les chiffres dans une liste pour ne pas souffrir des problèmes de dimension; puis effectue le plus naïvement possible la somme de ces chiffres.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/02/24 - euler016.py&lt;br /&gt;# Solution au Probleme 16 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=16&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def sumofdigits(num):&lt;br /&gt;    sum = 0&lt;br /&gt;    for i in range(0, len(num)):&lt;br /&gt;        sum = sum + num[i]&lt;br /&gt;    return sum&lt;br /&gt;&lt;br /&gt;def doubleof(num):&lt;br /&gt;    sum = []&lt;br /&gt;    carry = 0&lt;br /&gt;    for i in range(len(num) - 1, -1, -1):&lt;br /&gt;        tmp = (num[i] * 2) + carry&lt;br /&gt;        lastdigit = tmp % 10&lt;br /&gt;        carry = (tmp - lastdigit) / 10&lt;br /&gt;        sum = [lastdigit] + sum&lt;br /&gt;    if carry != 0:&lt;br /&gt;        sum = [carry] + sum&lt;br /&gt;    return sum&lt;br /&gt;&lt;br /&gt;def euler16(expo):&lt;br /&gt;    bignum = [2]&lt;br /&gt;    for i in range(1, expo):&lt;br /&gt;        bignum = doubleof(bignum)&lt;br /&gt;    return sumofdigits(bignum)&lt;br /&gt;    &lt;br /&gt;print euler16(1000)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Et un joli résultat en 3 secondes!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-8066368205649004092?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/8066368205649004092/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/02/project-euler-solution-au-probleme-16.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/8066368205649004092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/8066368205649004092'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/02/project-euler-solution-au-probleme-16.html' title='Project Euler: solution au problème 16, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-4816603770535858411</id><published>2009-02-23T10:51:00.002+01:00</published><updated>2009-02-23T10:56:42.237+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='citation'/><category scheme='http://www.blogger.com/atom/ns#' term='dune'/><category scheme='http://www.blogger.com/atom/ns#' term='ma vie.com'/><title type='text'>Litanie contre la peur</title><content type='html'>&lt;blockquote&gt;&lt;br /&gt;Je ne connaîtrai pas la peur, car la peur tue l'esprit. La peur est la petite mort qui conduit à l'oblitération totale. J'affronterai ma peur. Je lui permettrai de passer sur moi, au travers de moi. Et lorsqu'elle sera passée, je tournerai mon œil intérieur sur son chemin. Et là où elle sera passée, il n'y aura plus rien. Rien que moi.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Je dévore ces temps-ci la saga de Dune (oui, le même Dune que le film de David Lynch ou que le jeu d'aventure/stratégie). C'est assez impressionnant de voir la quantité de sagesses qu'Herbert y distille, mais l'une des plus marquantes est bien cette litanie contre la peur, du Bene Gesserit.&lt;br /&gt;&lt;br /&gt;Allez, en anglais dans le texte:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path. Where the fear has gone there will be nothing. Only I will remain.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Pour ceux qui n'auraient pas encore lu Dune, faites-le. C'est sans doute l'ouvrage de science-fiction qui accorde le plus de place à la spiritualité et le moins à la science. De la science-fiction pour ceux qui n'aiment pas la science-fiction.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-4816603770535858411?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/4816603770535858411/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/02/litanie-contre-la-peur.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/4816603770535858411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/4816603770535858411'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/02/litanie-contre-la-peur.html' title='Litanie contre la peur'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-9060390887984670369</id><published>2009-02-20T14:52:00.004+01:00</published><updated>2009-07-07T10:05:23.098+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: solution au problème 15, en Python</title><content type='html'>Dans l'enchaînement, ou presque, une solution au &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=15"&gt;problème 15&lt;/a&gt;. Le problème 15 est un peu effrayant puisqu'il a un énoncé du genre qui déroute à priori, à savoir "Il y a 6 chemins (sans retour en arrière) pour aller du coin supérieur gauche au coin inférieur droit dans une grille de 2x2; combien y a-t-il de chemins dans une grille de 20x20?".&lt;br /&gt;&lt;br /&gt;Ouch.&lt;br /&gt;&lt;br /&gt;Papier, crayon...&lt;br /&gt;&lt;br /&gt;Sur une grille de dimension 1, il y a 2 chemins possibles.&lt;br /&gt;Sur une grille de dimension 2, il y a 6 chemins possibles.&lt;br /&gt;Sur une grille de dimension 3, il y a 20 chemins possibles.&lt;br /&gt;Sur une grille de dimension 4, il y a 70 chemins possibles (non je ne les ai pas énumérés sur papier ceux-là).&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Ces valeurs ne sont forcément pas innocentes. Plus précisément, ce sont les valeurs centrales du &lt;a href="http://fr.wikipedia.org/wiki/Triangle_de_pascal"&gt;triangle de Pascal&lt;/a&gt;, pour les lignes où "valeur centrale" a un sens.&lt;br /&gt;&lt;br /&gt;Mon algorithme se base là-dessus.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/02/20 - euler015.py&lt;br /&gt;# Solution au Probleme 15 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=15&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def pascaltrirow(row):&lt;br /&gt;    if row == 1:&lt;br /&gt;        return [1]&lt;br /&gt;    else:&lt;br /&gt;        upper = pascaltrirow(row - 1)&lt;br /&gt;        current = [1]&lt;br /&gt;        for i in range(1, len(upper)):&lt;br /&gt;            current.append(upper[i] + upper[i - 1])&lt;br /&gt;        current.append(1)&lt;br /&gt;        return current&lt;br /&gt;&lt;br /&gt;def pascaltricell(row, col):&lt;br /&gt;    currow = pascaltrirow(row)&lt;br /&gt;    return currow[col - 1]&lt;br /&gt;        &lt;br /&gt;def euler15(size):&lt;br /&gt;    centralvalue = pascaltricell((size * 2) + 1, size + 1)&lt;br /&gt;    return centralvalue&lt;br /&gt;&lt;br /&gt;print euler15(20)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-9060390887984670369?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/9060390887984670369/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/02/project-euler-solution-au-probleme-15.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/9060390887984670369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/9060390887984670369'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/02/project-euler-solution-au-probleme-15.html' title='Project Euler: solution au problème 15, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-6320132291404361013</id><published>2009-02-20T13:13:00.006+01:00</published><updated>2009-07-07T10:05:32.384+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: solution au problème 14, en Python</title><content type='html'>Rien de tel pour bien digérer, que de digérer des nombres. Le &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=14"&gt;problème 14&lt;/a&gt; joue avec ce qu'on appelle souvent la "&lt;a href="http://fr.wikipedia.org/wiki/Conjecture_de_Syracuse"&gt;suite de Syracuse&lt;/a&gt;". Cette suite est simple: partant d'un entier strictement positif, on progresse ainsi:&lt;br /&gt;- si l'entier est pair, on le divise par deux&lt;br /&gt;- si l'entier est impair, on le multiplie par trois et on ajoute 1 au résultat&lt;br /&gt;&lt;br /&gt;Il est supposé mais pas prouvé que quel que soit l'entier de départ, cette suite atteint toujours 1 (puis boucle infiniment: 1, 4, 2, 1, ...). Le nombre de pas avant d'atteindre cette limite peut être très grand. Ici on cherche le nombre entier inférieur à un million donnant lieu à la plus longue suite de Syracuse.&lt;br /&gt;&lt;br /&gt;... suite de 525 éléments, mine de rien ...&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/02/20 - euler014.py&lt;br /&gt;# Solution au Probleme 14 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=14&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def collatznext(num):&lt;br /&gt;    if (num % 2 == 0):&lt;br /&gt;        return num / 2&lt;br /&gt;    else:&lt;br /&gt;        return (3 * num) + 1&lt;br /&gt;        &lt;br /&gt;def collatzlength(start):&lt;br /&gt;    length = 2 # En comptant le seed et le 1 final&lt;br /&gt;    next = collatznext(start)&lt;br /&gt;    while next != 1:&lt;br /&gt;        length = length + 1&lt;br /&gt;        next = collatznext(next)&lt;br /&gt;    return length&lt;br /&gt;    &lt;br /&gt;def euler14(limit):&lt;br /&gt;    maxlength = 0&lt;br /&gt;    maxseed = 0&lt;br /&gt;    for i in range (1, limit):&lt;br /&gt;        thislength = collatzlength(i)&lt;br /&gt;        if thislength &gt; maxlength:&lt;br /&gt;            maxlength = thislength&lt;br /&gt;            maxseed = i&lt;br /&gt;    return maxseed&lt;br /&gt;&lt;br /&gt;print euler14(1000000)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-6320132291404361013?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/6320132291404361013/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/02/project-euler-solution-au-probleme-14.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6320132291404361013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6320132291404361013'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/02/project-euler-solution-au-probleme-14.html' title='Project Euler: solution au problème 14, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-8130486217239054300</id><published>2009-02-20T09:49:00.003+01:00</published><updated>2009-07-07T10:05:41.168+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: solution au problème 13, en Python</title><content type='html'>On continue dans la joie et l'allégresse avec un de ces problèmes qui nous ramènent illico en école primaire. Le &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=13"&gt;problème 13&lt;/a&gt; nous demande d'effectuer la somme de 100 nombres de 50 chiffres chacun, et de renvoyer les dix premiers chiffres de cette somme.&lt;br /&gt;&lt;br /&gt;La bonne vieille addition à l'ancienne, donc!&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/02/20 - euler013.py&lt;br /&gt;# Solution au Probleme 13 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=13&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def inputparser(raw):&lt;br /&gt;    intsarray = []&lt;br /&gt;    for i in range(0, 100):&lt;br /&gt;        tmp = []&lt;br /&gt;        for j in range(0, 50):&lt;br /&gt;            tmp.append(int(raw[i][j]))&lt;br /&gt;        intsarray.append(tmp)&lt;br /&gt;    return intsarray&lt;br /&gt;    &lt;br /&gt;def euler13(array):&lt;br /&gt;    carry = 0&lt;br /&gt;    totalsum = []&lt;br /&gt;    for col in range(49, -1, -1):&lt;br /&gt;        colsum = 0&lt;br /&gt;        for lin in range(0, 100):&lt;br /&gt;            colsum = colsum + array[lin][col]&lt;br /&gt;        colsum = colsum + carry&lt;br /&gt;        lastdigit = colsum % 10&lt;br /&gt;        carry = (colsum - lastdigit) / 10&lt;br /&gt;        totalsum.insert(0, lastdigit)&lt;br /&gt;    totalsum.insert(0, carry)&lt;br /&gt;    # Petit tour de passe-passe&lt;br /&gt;    firstten = ''&lt;br /&gt;    for i in range(0, 10):&lt;br /&gt;        firstten = firstten + str(totalsum[i])&lt;br /&gt;    firstten = int(firstten[0:10])&lt;br /&gt;    return firstten&lt;br /&gt;&lt;br /&gt;# Donnees du probleme, flemme de faire un vrai parser&lt;br /&gt;rawints = [&lt;br /&gt;'37107287533902102798797998220837590246510135740250',&lt;br /&gt;'46376937677490009712648124896970078050417018260538',&lt;br /&gt;'74324986199524741059474233309513058123726617309629',&lt;br /&gt;'91942213363574161572522430563301811072406154908250',&lt;br /&gt;'23067588207539346171171980310421047513778063246676',&lt;br /&gt;'89261670696623633820136378418383684178734361726757',&lt;br /&gt;'28112879812849979408065481931592621691275889832738',&lt;br /&gt;'44274228917432520321923589422876796487670272189318',&lt;br /&gt;'47451445736001306439091167216856844588711603153276',&lt;br /&gt;'70386486105843025439939619828917593665686757934951',&lt;br /&gt;'62176457141856560629502157223196586755079324193331',&lt;br /&gt;'64906352462741904929101432445813822663347944758178',&lt;br /&gt;'92575867718337217661963751590579239728245598838407',&lt;br /&gt;'58203565325359399008402633568948830189458628227828',&lt;br /&gt;'80181199384826282014278194139940567587151170094390',&lt;br /&gt;'35398664372827112653829987240784473053190104293586',&lt;br /&gt;'86515506006295864861532075273371959191420517255829',&lt;br /&gt;'71693888707715466499115593487603532921714970056938',&lt;br /&gt;'54370070576826684624621495650076471787294438377604',&lt;br /&gt;'53282654108756828443191190634694037855217779295145',&lt;br /&gt;'36123272525000296071075082563815656710885258350721',&lt;br /&gt;'45876576172410976447339110607218265236877223636045',&lt;br /&gt;'17423706905851860660448207621209813287860733969412',&lt;br /&gt;'81142660418086830619328460811191061556940512689692',&lt;br /&gt;'51934325451728388641918047049293215058642563049483',&lt;br /&gt;'62467221648435076201727918039944693004732956340691',&lt;br /&gt;'15732444386908125794514089057706229429197107928209',&lt;br /&gt;'55037687525678773091862540744969844508330393682126',&lt;br /&gt;'18336384825330154686196124348767681297534375946515',&lt;br /&gt;'80386287592878490201521685554828717201219257766954',&lt;br /&gt;'78182833757993103614740356856449095527097864797581',&lt;br /&gt;'16726320100436897842553539920931837441497806860984',&lt;br /&gt;'48403098129077791799088218795327364475675590848030',&lt;br /&gt;'87086987551392711854517078544161852424320693150332',&lt;br /&gt;'59959406895756536782107074926966537676326235447210',&lt;br /&gt;'69793950679652694742597709739166693763042633987085',&lt;br /&gt;'41052684708299085211399427365734116182760315001271',&lt;br /&gt;'65378607361501080857009149939512557028198746004375',&lt;br /&gt;'35829035317434717326932123578154982629742552737307',&lt;br /&gt;'94953759765105305946966067683156574377167401875275',&lt;br /&gt;'88902802571733229619176668713819931811048770190271',&lt;br /&gt;'25267680276078003013678680992525463401061632866526',&lt;br /&gt;'36270218540497705585629946580636237993140746255962',&lt;br /&gt;'24074486908231174977792365466257246923322810917141',&lt;br /&gt;'91430288197103288597806669760892938638285025333403',&lt;br /&gt;'34413065578016127815921815005561868836468420090470',&lt;br /&gt;'23053081172816430487623791969842487255036638784583',&lt;br /&gt;'11487696932154902810424020138335124462181441773470',&lt;br /&gt;'63783299490636259666498587618221225225512486764533',&lt;br /&gt;'67720186971698544312419572409913959008952310058822',&lt;br /&gt;'95548255300263520781532296796249481641953868218774',&lt;br /&gt;'76085327132285723110424803456124867697064507995236',&lt;br /&gt;'37774242535411291684276865538926205024910326572967',&lt;br /&gt;'23701913275725675285653248258265463092207058596522',&lt;br /&gt;'29798860272258331913126375147341994889534765745501',&lt;br /&gt;'18495701454879288984856827726077713721403798879715',&lt;br /&gt;'38298203783031473527721580348144513491373226651381',&lt;br /&gt;'34829543829199918180278916522431027392251122869539',&lt;br /&gt;'40957953066405232632538044100059654939159879593635',&lt;br /&gt;'29746152185502371307642255121183693803580388584903',&lt;br /&gt;'41698116222072977186158236678424689157993532961922',&lt;br /&gt;'62467957194401269043877107275048102390895523597457',&lt;br /&gt;'23189706772547915061505504953922979530901129967519',&lt;br /&gt;'86188088225875314529584099251203829009407770775672',&lt;br /&gt;'11306739708304724483816533873502340845647058077308',&lt;br /&gt;'82959174767140363198008187129011875491310547126581',&lt;br /&gt;'97623331044818386269515456334926366572897563400500',&lt;br /&gt;'42846280183517070527831839425882145521227251250327',&lt;br /&gt;'55121603546981200581762165212827652751691296897789',&lt;br /&gt;'32238195734329339946437501907836945765883352399886',&lt;br /&gt;'75506164965184775180738168837861091527357929701337',&lt;br /&gt;'62177842752192623401942399639168044983993173312731',&lt;br /&gt;'32924185707147349566916674687634660915035914677504',&lt;br /&gt;'99518671430235219628894890102423325116913619626622',&lt;br /&gt;'73267460800591547471830798392868535206946944540724',&lt;br /&gt;'76841822524674417161514036427982273348055556214818',&lt;br /&gt;'97142617910342598647204516893989422179826088076852',&lt;br /&gt;'87783646182799346313767754307809363333018982642090',&lt;br /&gt;'10848802521674670883215120185883543223812876952786',&lt;br /&gt;'71329612474782464538636993009049310363619763878039',&lt;br /&gt;'62184073572399794223406235393808339651327408011116',&lt;br /&gt;'66627891981488087797941876876144230030984490851411',&lt;br /&gt;'60661826293682836764744779239180335110989069790714',&lt;br /&gt;'85786944089552990653640447425576083659976645795096',&lt;br /&gt;'66024396409905389607120198219976047599490197230297',&lt;br /&gt;'64913982680032973156037120041377903785566085089252',&lt;br /&gt;'16730939319872750275468906903707539413042652315011',&lt;br /&gt;'94809377245048795150954100921645863754710598436791',&lt;br /&gt;'78639167021187492431995700641917969777599028300699',&lt;br /&gt;'15368713711936614952811305876380278410754449733078',&lt;br /&gt;'40789923115535562561142322423255033685442488917353',&lt;br /&gt;'44889911501440648020369068063960672322193204149535',&lt;br /&gt;'41503128880339536053299340368006977710650566631954',&lt;br /&gt;'81234880673210146739058568557934581403627822703280',&lt;br /&gt;'82616570773948327592232845941706525094512325230608',&lt;br /&gt;'22918802058777319719839450180888072429661980811197',&lt;br /&gt;'77158542502016545090413245809786882778948721859617',&lt;br /&gt;'72107838435069186155435662884062257473692284509516',&lt;br /&gt;'20849603980134001723930671666823555245252804609722',&lt;br /&gt;'53503534226472524250874054075591789781264330331690'&lt;br /&gt;]&lt;br /&gt;&lt;br /&gt;print euler13(inputparser(rawints))&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-8130486217239054300?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/8130486217239054300/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/02/project-euler-solution-au-probleme-13.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/8130486217239054300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/8130486217239054300'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/02/project-euler-solution-au-probleme-13.html' title='Project Euler: solution au problème 13, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-65918344446943445</id><published>2009-02-19T16:17:00.004+01:00</published><updated>2009-07-07T10:05:50.897+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: solution au problème 11, en Python</title><content type='html'>Je trouvais que ça faisait un peu désordre d'avoir passé outre le problème 11, attiré par le coté plus "élégant" du problème 12. Une fois posté une solution élégante au problème 12, il me restait à combler ce trou en proposant une solution au &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=11"&gt;problème 11&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Bon, par contre elle n'est pas de la plus grande des élégances, mais étant donné la nature du problème j'ai du mal à entrevoir comment rendre ça plus "clever". Et puis bon, 41 millisecondes pour donner le bon résultat, on va pas non plus tortiller...&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/02/19 - euler011.py&lt;br /&gt;# Solution au Probleme 11 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=11&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def euler11(grid):&lt;br /&gt;    maxprod = 0&lt;br /&gt;    temp = 0&lt;br /&gt;    # Lignes&lt;br /&gt;    for i in range(0, 20):&lt;br /&gt;        for j in range(0, 16):&lt;br /&gt;            temp = grid[i][j]*grid[i][j+1]*grid[i][j+2]*grid[i][j+3]&lt;br /&gt;            if temp &gt; maxprod:&lt;br /&gt;                maxprod = temp&lt;br /&gt;    # Colonnes&lt;br /&gt;    for j in range(0, 20):&lt;br /&gt;        for i in range(0, 16):&lt;br /&gt;            temp = grid[i][j]*grid[i+1][j]*grid[i+2][j]*grid[i+3][j]&lt;br /&gt;            if temp &gt; maxprod:&lt;br /&gt;                maxprod = temp&lt;br /&gt;    # Diagonales NO-SE&lt;br /&gt;    for i in range(0, 16):&lt;br /&gt;        for j in range(0, 16):&lt;br /&gt;            temp = grid[i][j]*grid[i+1][j+1]*grid[i+2][j+2]*grid[i+3][j+3]&lt;br /&gt;            if temp &gt; maxprod:&lt;br /&gt;                maxprod = temp&lt;br /&gt;    # Diagonales SO-NE&lt;br /&gt;    for i in range(3,20):&lt;br /&gt;        for j in range(0,16):&lt;br /&gt;            temp = grid[i][j]*grid[i-1][j+1]*grid[i-2][j+2]*grid[i-3][j+3]&lt;br /&gt;            if temp &gt; maxprod:&lt;br /&gt;                maxprod = temp&lt;br /&gt;    return maxprod&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# Les donnees du probleme, pour s'epargner un parse&lt;br /&gt;# On a donc numbergrid[ligne, colonne]&lt;br /&gt;# Pour ligne et colonne de 0 a 19 inclus&lt;br /&gt;numbergrid = [&lt;br /&gt;[ 8, 2,22,97,38,15, 0,40, 0,75, 4, 5, 7,78,52,12,50,77,91, 8],&lt;br /&gt;[49,49,99,40,17,81,18,57,60,87,17,40,98,43,69,48, 4,56,62, 0],&lt;br /&gt;[81,49,31,73,55,79,14,29,93,71,40,67,53,88,30, 3,49,13,36,65],&lt;br /&gt;[52,70,95,23, 4,60,11,42,69,24,68,56, 1,32,56,71,37, 2,36,91],&lt;br /&gt;[22,31,16,71,51,67,63,89,41,92,36,54,22,40,40,28,66,33,13,80],&lt;br /&gt;[24,47,32,60,99, 3,45, 2,44,75,33,53,78,36,84,20,35,17,12,50],&lt;br /&gt;[32,98,81,28,64,23,67,10,26,38,40,67,59,54,70,66,18,38,64,70],&lt;br /&gt;[67,26,20,68, 2,62,12,20,95,63,94,39,63, 8,40,91,66,49,94,21],&lt;br /&gt;[24,55,58, 5,66,73,99,26,97,17,78,78,96,83,14,88,34,89,63,72],&lt;br /&gt;[21,36,23, 9,75, 0,76,44,20,45,35,14, 0,61,33,97,34,31,33,95],&lt;br /&gt;[78,17,53,28,22,75,31,67,15,94, 3,80, 4,62,16,14, 9,53,56,92],&lt;br /&gt;[16,39, 5,42,96,35,31,47,55,58,88,24, 0,17,54,24,36,29,85,57],&lt;br /&gt;[86,56, 0,48,35,71,89, 7, 5,44,44,37,44,60,21,58,51,54,17,58],&lt;br /&gt;[19,80,81,68, 5,94,47,69,28,73,92,13,86,52,17,77, 4,89,55,40],&lt;br /&gt;[04,52, 8,83,97,35,99,16, 7,97,57,32,16,26,26,79,33,27,98,66],&lt;br /&gt;[88,36,68,87,57,62,20,72, 3,46,33,67,46,55,12,32,63,93,53,69],&lt;br /&gt;[04,42,16,73,38,25,39,11,24,94,72,18, 8,46,29,32,40,62,76,36],&lt;br /&gt;[20,69,36,41,72,30,23,88,34,62,99,69,82,67,59,85,74, 4,36,16],&lt;br /&gt;[20,73,35,29,78,31,90, 1,74,31,49,71,48,86,81,16,23,57, 5,54],&lt;br /&gt;[01,70,54,71,83,51,54,69,16,92,33,48,61,43,52, 1,89,19,67,48]&lt;br /&gt;]&lt;br /&gt;&lt;br /&gt;print euler11(numbergrid)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-65918344446943445?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/65918344446943445/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/02/project-euler-solution-au-probleme-11.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/65918344446943445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/65918344446943445'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/02/project-euler-solution-au-probleme-11.html' title='Project Euler: solution au problème 11, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-6235994282367337622</id><published>2009-02-19T10:58:00.004+01:00</published><updated>2009-07-07T10:05:58.308+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: meilleure solution au problème 12, en Python</title><content type='html'>J'avais posté lundi &lt;a href="http://blog.virus1984.com/2009/02/project-euler-solution-au-probleme-12.html"&gt;une solution très "premier jet"&lt;/a&gt; et absolument brutale pour le &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=12"&gt;problème 12&lt;/a&gt; de Project Euler. Evidemment, ceux qui auraient essayé d'exécuter ce programme auront remarqué à quel point le force brute mène à des temps d'exécution gigantesques. En tout cas d'un ordre de grandeur beaucoup trop loin de la "règle de la minute" pour être honnête.&lt;br /&gt;&lt;br /&gt;Mais j'avais promis de faire plus propre plus tard, donc chose promise chose due.&lt;br /&gt;&lt;br /&gt;L'idée ici se base sur une propriété amusante, c'est que si D(n) est le nombre total de diviseurs d'un naturel (1 et lui-même compris, bien sûr), alors D(n) = (a1 + 1) + (a2 + 2) + ... où les a1 a2... sont les exposants des facteurs premiers de n. Pratique.&lt;br /&gt;&lt;br /&gt;Donc ce programme-ci, après avoir établi une liste de nombre premier assez grande compte tenu de la taille du problème (évaluation à la louche, j'avoue), va chercher pour chaque candidat le nombre de ses diviseurs en utilisant la propriété énoncée ci-dessus. Et ça va nettement plus vite, puisqu'on passe de plusieurs heures de calcul à... 35 secondes.&lt;br /&gt;&lt;br /&gt;Encore une belle leçon sur l'utilité de trouver un algorithme plus performant que le premier jet.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/02/19 - euler012-2.py&lt;br /&gt;# Meilleure solution au Probleme 12 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=12&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def trianglenumber(n):&lt;br /&gt;    return (n * (n - 1) / 2)&lt;br /&gt;&lt;br /&gt;def numberofdivisors(n, primes):&lt;br /&gt;    # Recherche des facteurs premiers de n&lt;br /&gt;    factors = []&lt;br /&gt;    i = 0&lt;br /&gt;    while i &amp;lt; len(primes) and primes[i] &amp;lt;= n / 2:&lt;br /&gt;        if n % primes[i] == 0:&lt;br /&gt;            factors.append(primes[i])&lt;br /&gt;        i = i + 1&lt;br /&gt;    # Pour chaque facteur premier, recherche de son exposant&lt;br /&gt;    exponents =[]&lt;br /&gt;    for i in range(0, len(factors)):&lt;br /&gt;        exponent = 0;&lt;br /&gt;        while n % factors[i] == 0:&lt;br /&gt;            exponent = exponent + 1&lt;br /&gt;            n = n / factors[i]&lt;br /&gt;        exponents.append(exponent)&lt;br /&gt;    # Calcul du nombre total de diviseurs&lt;br /&gt;    cnt = 1&lt;br /&gt;    for i in range(0, len(exponents)):&lt;br /&gt;        cnt = cnt * (exponents[i] + 1)&lt;br /&gt;    return cnt&lt;br /&gt;&lt;br /&gt;def getfirstprimes(n):&lt;br /&gt;    primes = [2]&lt;br /&gt;    count = 1&lt;br /&gt;    cand = 3&lt;br /&gt;    while count &amp;lt; n:&lt;br /&gt;        i = 0&lt;br /&gt;        while i &amp;lt; len(primes):&lt;br /&gt;            if cand % primes[i] == 0:&lt;br /&gt;                break&lt;br /&gt;            i = i + 1&lt;br /&gt;        if i == len(primes):&lt;br /&gt;            primes.append(cand)&lt;br /&gt;            count = count + 1&lt;br /&gt;        cand = cand + 2&lt;br /&gt;    return primes&lt;br /&gt;    &lt;br /&gt;def euler12(n):&lt;br /&gt;    primes = getfirstprimes(n * 10) # Largement assez&lt;br /&gt;    rank = 1&lt;br /&gt;    tri = trianglenumber(rank)&lt;br /&gt;    while numberofdivisors(tri, primes) &amp;lt;= n:&lt;br /&gt;        rank = rank + 1&lt;br /&gt;        tri = trianglenumber(rank)&lt;br /&gt;    return tri&lt;br /&gt;    &lt;br /&gt;print euler12(500)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-6235994282367337622?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/6235994282367337622/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/02/project-euler-meilleure-solution-au.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6235994282367337622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6235994282367337622'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/02/project-euler-meilleure-solution-au.html' title='Project Euler: meilleure solution au problème 12, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-6344053358554822524</id><published>2009-02-16T22:53:00.004+01:00</published><updated>2009-02-16T22:58:05.423+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photo'/><category scheme='http://www.blogger.com/atom/ns#' term='humour'/><category scheme='http://www.blogger.com/atom/ns#' term='ma vie.com'/><title type='text'>Conduisez l'originale.</title><content type='html'>Croisé tout à l'heure dans les rues de Liège.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9oCvnRQKziE/SZnhRjWAhYI/AAAAAAAAAHw/9eeCp1Yvm7I/s1600-h/100_283301.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 320px;" src="http://2.bp.blogspot.com/_9oCvnRQKziE/SZnhRjWAhYI/AAAAAAAAAHw/9eeCp1Yvm7I/s320/100_283301.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5303517727867045250" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Voici un conducteur fidèle aux racines et fier de l'être. Cela dit, je ne peux que l'approuver, autant les Mini de nouvelle génération n'ont plus grand-chose de "mini", autant la sienne avait une touche, un style, un caractère bien à elle. Etant du genre "miniature" moi-même je me verrais bien fier propriétaire d'un de ces vénérables vétérans indémodables :-)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-6344053358554822524?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/6344053358554822524/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/02/conduisez-loriginale.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6344053358554822524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6344053358554822524'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/02/conduisez-loriginale.html' title='Conduisez l&apos;originale.'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_9oCvnRQKziE/SZnhRjWAhYI/AAAAAAAAAHw/9eeCp1Yvm7I/s72-c/100_283301.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-3321401211015518935</id><published>2009-02-16T21:27:00.005+01:00</published><updated>2009-07-07T10:06:05.746+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: Solution au problème 12, en Python</title><content type='html'>Oui, je propose une solution au &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=12"&gt;problème 12&lt;/a&gt; avant d'en proposer une au problème 11. Il était un brin plus "joli" dans le sens où la solution que je propose ici est du type bien brutal, mais compact.&lt;br /&gt;&lt;br /&gt;Attention quand même, c'est de l'algorithme brutalement systématique, donc très lent. Loin au-delà de la minute sacrée, mais correct. Je concocterai une version plus rapide à mes heures perdues (Arnaud si tu me lis, maintenant tu sauras ce que je fais si tu vois du Python au lieu de voir du Java sur mon écran).&lt;br /&gt;&lt;br /&gt;And now for the gory part...&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/02/13 - euler012.py&lt;br /&gt;# Solution au Probleme 12 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=12&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def trianglenumber(n):&lt;br /&gt;    return (n * (n - 1) / 2)&lt;br /&gt;&lt;br /&gt;def numberofdivisors(n):&lt;br /&gt;    cnt = 1&lt;br /&gt;    for i in range (1, n / 2 + 1):&lt;br /&gt;        if n % i == 0:&lt;br /&gt;            cnt = cnt + 1&lt;br /&gt;    return cnt&lt;br /&gt;    &lt;br /&gt;def euler12(n):&lt;br /&gt;    rank = 1&lt;br /&gt;    tri = trianglenumber(rank)&lt;br /&gt;    while numberofdivisors(tri) &amp;lt;= n:&lt;br /&gt;        rank = rank + 1&lt;br /&gt;        tri = trianglenumber(rank)&lt;br /&gt;    return tri&lt;br /&gt;    &lt;br /&gt;print euler12(500)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Le lecteur attentif remarquera que ça date d'avant le week-end...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-3321401211015518935?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/3321401211015518935/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/02/project-euler-solution-au-probleme-12.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/3321401211015518935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/3321401211015518935'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/02/project-euler-solution-au-probleme-12.html' title='Project Euler: Solution au problème 12, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-4105346931737398599</id><published>2009-02-09T21:01:00.004+01:00</published><updated>2009-02-09T21:07:58.070+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gibson'/><category scheme='http://www.blogger.com/atom/ns#' term='humeur'/><category scheme='http://www.blogger.com/atom/ns#' term='man at work'/><category scheme='http://www.blogger.com/atom/ns#' term='ma vie.com'/><title type='text'>HOWTO travailler avec le sourire</title><content type='html'>Il y en a qu'une journée de travail terrifie, il y en a qu'une journée de travail face à un ordinateur peut encore plus terrifier. Et j'en connais beaucoup qui seraient à la frange de l'infarctus si je leur disais ce que je fais et sur quoi je le fais.&lt;br /&gt;&lt;br /&gt;Mais j'ai mon petit truc à moi pour garder le sourire, un peu à la manière d'Homer.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9oCvnRQKziE/SZCMI2JRe4I/AAAAAAAAAHo/kz-94QcSlbs/s1600-h/100_2798-01.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_9oCvnRQKziE/SZCMI2JRe4I/AAAAAAAAAHo/kz-94QcSlbs/s320/100_2798-01.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5300890845016324994" /&gt;&lt;/a&gt;&lt;br /&gt;Pour les curieux, c'est une croisée braque d'un peu moins d'un an qui devrait répondre au nom de Gibson mais se voit attribuer tellement de surnoms qu'elle ne sait plus vraiment à quoi s'en tenir. En fond d'un bureau Gnome, sous Ubuntu, dans VirtualBox, qui est lancé dans une unique fenêtre Ratpoison, sur une machine hôte Debian. Ouf!&lt;br /&gt;&lt;br /&gt;De quoi reprendre de la bonne humeur en un clin d'oeil :-)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-4105346931737398599?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/4105346931737398599/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/02/howto-travailler-avec-le-sourire.html#comment-form' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/4105346931737398599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/4105346931737398599'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/02/howto-travailler-avec-le-sourire.html' title='HOWTO travailler avec le sourire'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9oCvnRQKziE/SZCMI2JRe4I/AAAAAAAAAHo/kz-94QcSlbs/s72-c/100_2798-01.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-5368790237088765528</id><published>2009-01-29T20:14:00.004+01:00</published><updated>2009-01-29T20:27:51.425+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='paul boutin'/><category scheme='http://www.blogger.com/atom/ns#' term='journalisme'/><category scheme='http://www.blogger.com/atom/ns#' term='humeur'/><category scheme='http://www.blogger.com/atom/ns#' term='joel spolsky'/><title type='text'>Paul Boutin ou l'art de ne pas vérifier ses sources</title><content type='html'>J'ai &lt;a href="http://blog.virus1984.com/2008/12/les-blogs-dtrns-par-twitter.html"&gt;déjà mentionné&lt;/a&gt; une bourde de Paul Boutin, journaliste pour Wired, auparavant. Voilà qu'il revient en force, puisque cette fois-ci son billet est essentiellement constitué d'une citation qu'il attribue à quelqu'un qui n'en est pas l'auteur!&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Il faut croire que l'ami Boutin aime à ce point les jolis titres qu'il se rue sur le clavier sans chercher à comprendre où à vérifier. Dans &lt;a href="http://www.thestandard.com/news/2009/01/28/google-apps-customers-say-domains-arent-being-renewed"&gt;un billet&lt;/a&gt; sur le blog &lt;i&gt;The Industry Standard&lt;/i&gt;, il relaie une plainte d'un client de Google Apps qui malgré son paiement n'a pas vu son domaine renouvelé (et on peut facilement comprendre que ça le froisse). &lt;br /&gt;&lt;br /&gt;Cette plainte, il l'attribue à Joel Spolsky, très connu pour son blog &lt;a href="http://www.thestandard.com/news/2009/01/28/google-apps-customers-say-domains-arent-being-renewed"&gt;Joel on Software&lt;/a&gt; où il dispense ses idées et conseils en matière de développement logiciel et surtout sur les arcanes économiques qui tournent autour. Joel Spolsky est accessoirement le fondateur de Fog Creek Software, dont les employés bénéficient à mon sens du plus merveilleux environnement de travail dont puisse rêver un programmeur, et les attentifs auront remarqué qu'il est l'un des cerveaux imaginatifs derrière Stack Overflow. Une figure, donc.&lt;br /&gt;&lt;br /&gt;Quel est le problème alors? Tout simplement que cette plainte à l'égard de Google n'a pas été formulée par Joel Spolsky, mais par &lt;a href="http://discuss.joelonsoftware.com/default.asp?biz.5.730915.0"&gt;un internaute anonyme sur le forum&lt;/a&gt; attaché à &lt;i&gt;Joel on Software&lt;/i&gt;. Ça se remarqué facilement au fait que ladite plainte n'est pas signée, et que Joel commente plus bas en signant ses commentaires.&lt;br /&gt;&lt;br /&gt;Oups.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-5368790237088765528?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/5368790237088765528/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/01/paul-boutin-ou-lart-de-ne-pas-verifier.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/5368790237088765528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/5368790237088765528'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/01/paul-boutin-ou-lart-de-ne-pas-verifier.html' title='Paul Boutin ou l&apos;art de ne pas vérifier ses sources'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-6697732573613936952</id><published>2009-01-21T19:00:00.004+01:00</published><updated>2009-07-07T10:06:14.461+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><category scheme='http://www.blogger.com/atom/ns#' term='jouet'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><title type='text'>Fibonacci en petits points</title><content type='html'>Allez un petit cracker de code Python parce que c'est croustillant et bon et que ça ne fait pas trop grossir. Une visualisation des premiers termes de la suite de Fibonacci, jusqu'à la largeur d'affichage que vous voulez, dans les caractères que vous voulez.&lt;br /&gt;&lt;br /&gt;Inutile donc indispensable.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/01/21 - fibodot.py&lt;br /&gt;# Visualisation de la suite de Fibonacci&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def fibodot(n, c):&lt;br /&gt;    a = 0&lt;br /&gt;    b = 1&lt;br /&gt;    while b &amp;lt; n :&lt;br /&gt;        print b * c&lt;br /&gt;        a, b = b, a + b&lt;br /&gt;        &lt;br /&gt;fibodot(80, '.')&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-6697732573613936952?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/6697732573613936952/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/01/fibonacci-en-petits-points.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6697732573613936952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6697732573613936952'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/01/fibonacci-en-petits-points.html' title='Fibonacci en petits points'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-9200332476776933970</id><published>2009-01-19T15:27:00.004+01:00</published><updated>2009-01-19T15:36:32.800+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dessin'/><category scheme='http://www.blogger.com/atom/ns#' term='ma vie.com'/><title type='text'>Tranche ronde de vie</title><content type='html'>Oui j'étais relativement occupé. Ou peu motivé. Ou les deux. Sale combinaison dont se moque le temps qui continue de tourner les pages du calendrier toutes les 24 heures.&lt;br /&gt;&lt;br /&gt;Pas de code neuf à se mettre sous la dent, et je ne vais pas parler de la santé de Steve Jobs. J'ai promis.&lt;br /&gt;&lt;br /&gt;Et la tranche ronde de vie? Petit curieux va!&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;La voici. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9oCvnRQKziE/SXSPrGs4OMI/AAAAAAAAAHg/orBZMVc1xKw/s1600-h/100_2776.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_9oCvnRQKziE/SXSPrGs4OMI/AAAAAAAAAHg/orBZMVc1xKw/s320/100_2776.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5293013432763168962" /&gt;&lt;/a&gt;&lt;br /&gt;Exécutée du bout d'un ongle belge sur un tapis de souris suédois mais néanmoins usé, pris entre un ordinateur californien fabriqué en asie également ayant vu passer le poids des ans, et une souris à la mine plus réjouie mais au kilométrage non moins certain contrairement à son origine, le tout baigné par la dérive musicale d'un britannique qui se sait indien.&lt;br /&gt;&lt;br /&gt;Ça me donne envie de relire Adams tiens.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-9200332476776933970?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/9200332476776933970/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/01/tranche-ronde-de-vie.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/9200332476776933970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/9200332476776933970'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/01/tranche-ronde-de-vie.html' title='Tranche ronde de vie'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9oCvnRQKziE/SXSPrGs4OMI/AAAAAAAAAHg/orBZMVc1xKw/s72-c/100_2776.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-2765095833664382743</id><published>2009-01-08T01:34:00.003+01:00</published><updated>2009-07-07T10:06:26.206+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><category scheme='http://www.blogger.com/atom/ns#' term='jeux'/><title type='text'>Mastermind, quick and dirty as it gets.</title><content type='html'>Hop, en vitesse le temps que l'eau chauffe pour un thé, un petit jeu de quasi-Mastermind pondu d'un seul trait en Python. Le principe est le même que celui du jeu original, mais avec un gameplay un peu adapté: le code est composé de 4 chiffres entre 0 et 9 inclus, on dispose de 5 essais pour le trouver. A chaque essai le jeu donne un indice pour raffiner l'essai suivant: un "o" pour un bon chiffre à la bonne place, un "x" pour un bon chiffre à la mauvaise place, un "_" pour un mauvais chiffre. Nettement plus sympathique que le "vrai" Mastermind, pour ça qu'on a beaucoup moins d'essais :)&lt;br /&gt;&lt;br /&gt;Pas de vérification, on suppose que l'utilisateur sait ce qu'il fait.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/01/08 - mastermind-0.py&lt;br /&gt;# Jeu de Mastermind, premier jet&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;from random import randint&lt;br /&gt;&lt;br /&gt;print """Code de 4 chiffres, entre 0 et 9 inclus, a trouver en 5 essais max.&lt;br /&gt;  o : bon chiffre, bonne place&lt;br /&gt;  x : bon chiffre, mauvaise place&lt;br /&gt;  _ : mauvais chiffre&lt;br /&gt;"""&lt;br /&gt;code = ''&lt;br /&gt;for i in range(0,4):&lt;br /&gt;    code = code + str(randint(0,9))&lt;br /&gt;trycode = ''&lt;br /&gt;trynum = 0&lt;br /&gt;while trynum &amp;lt; 5:&lt;br /&gt;    trynum = trynum + 1&lt;br /&gt;    trycode = raw_input('Essai: ')&lt;br /&gt;    hint = ''&lt;br /&gt;    for i in range(0,4):&lt;br /&gt;        if trycode[i] == code[i]:&lt;br /&gt;            hint = hint + 'o'&lt;br /&gt;        elif code.find(trycode[i]) != -1:&lt;br /&gt;            hint = hint + 'x'&lt;br /&gt;        else:&lt;br /&gt;            hint = hint + '_'&lt;br /&gt;    if hint == 'oooo':&lt;br /&gt;        break&lt;br /&gt;    print trycode, ':', hint&lt;br /&gt;if hint == 'oooo':&lt;br /&gt;    print "Gagne!"&lt;br /&gt;else:&lt;br /&gt;    print "Perdu! Le code etait:", code&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-2765095833664382743?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/2765095833664382743/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/01/mastermind-quick-and-dirty-as-it-gets.html#comment-form' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2765095833664382743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2765095833664382743'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/01/mastermind-quick-and-dirty-as-it-gets.html' title='Mastermind, quick and dirty as it gets.'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-6443610898469261647</id><published>2009-01-07T21:05:00.004+01:00</published><updated>2009-07-07T10:06:35.379+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: Solution au problème 10, en Python</title><content type='html'>Dixième de sa catégorie, un problème de recherche de nombres premiers. Algorithmiquement simple, mais lourd en calculs. Voici donc une solution au &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=10"&gt;problème 10&lt;/a&gt; en Python.&lt;br /&gt;&lt;br /&gt;Et je pense que je vais laisser Project Euler de coté quelques jours et m'atteler à un "vrai" programme qui fasse autre chose que chauffer mon CPU.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/01/07 - euler010.py&lt;br /&gt;# Solution au Probleme 10 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=10&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def euler10(n):&lt;br /&gt;    primes = [2]&lt;br /&gt;    cand = 3&lt;br /&gt;    while cand &amp;lt; n:&lt;br /&gt;        i = 0&lt;br /&gt;        while i &amp;lt; len(primes):&lt;br /&gt;            if cand % primes[i] == 0:&lt;br /&gt;                break&lt;br /&gt;            i = i + 1&lt;br /&gt;        if i == len(primes):&lt;br /&gt;            primes.append(cand)&lt;br /&gt;        cand = cand + 2&lt;br /&gt;    sum = 0&lt;br /&gt;    for i in range(0, len(primes)):&lt;br /&gt;        sum = sum + primes[i]&lt;br /&gt;    return sum&lt;br /&gt;&lt;br /&gt;print euler10(2000000)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-6443610898469261647?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/6443610898469261647/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/01/project-euler-solution-au-problme-10-en.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6443610898469261647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6443610898469261647'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/01/project-euler-solution-au-problme-10-en.html' title='Project Euler: Solution au problème 10, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-8194958330537814701</id><published>2009-01-07T00:24:00.010+01:00</published><updated>2009-07-07T10:06:44.884+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: Solution au problème 9, en Python</title><content type='html'>Oui, de fait, c'est une solution brute-force à un problème qui mériterait sûrement une approche plus élégante. Mais bon. Des fois on a envie de sortir la bombe au napalm pour tuer une mouche. Solution en Python au &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=9"&gt;problème 9&lt;/a&gt;.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/01/07 - euler009.py&lt;br /&gt;# Solution au Probleme 9 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=9&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def euler9(n):&lt;br /&gt;    for a in range(1, n):&lt;br /&gt;        for b in range(a, n):&lt;br /&gt;            for c in range(b, n):&lt;br /&gt;                if a + b + c == n:&lt;br /&gt;                    if a ** 2 + b ** 2 == c ** 2:&lt;br /&gt;                        return a * b * c&lt;br /&gt;&lt;br /&gt;print euler9(1000)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-8194958330537814701?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/8194958330537814701/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/01/project-euler-solution-au-problme-9-en.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/8194958330537814701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/8194958330537814701'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/01/project-euler-solution-au-problme-9-en.html' title='Project Euler: Solution au problème 9, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-8067986015999177456</id><published>2009-01-06T22:12:00.004+01:00</published><updated>2009-07-07T10:06:52.166+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: Solution au problème 8, en Python</title><content type='html'>Plutôt que de me goinfrer de frangipane, je me remets aux problèmes de Project Euler. C'est au tour du &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=8"&gt;problème 8&lt;/a&gt; d'avoir droit à son traitement en Python. Relativement trivial, du coup j'ai concocté une solution un peu trop flexible pour être honnête :)&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/01/06 - euler008.py&lt;br /&gt;# Solution au Probleme 8 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=8&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def euler8(s, n):&lt;br /&gt;    biggest = 0&lt;br /&gt;    for i in range(n - 1, len(s)):&lt;br /&gt;        prod = 1&lt;br /&gt;        for j in range(0, n):&lt;br /&gt;            prod = prod * int(s[i - j])&lt;br /&gt;        if prod &gt; biggest:&lt;br /&gt;            biggest = prod&lt;br /&gt;    return biggest&lt;br /&gt;&lt;br /&gt;print euler8('73167176531330624919225119674426574742355349194934969835203127745\&lt;br /&gt;0632623957831801698480186947885184385861560789112949495459501737958331952853208\&lt;br /&gt;8055111254069874715852386305071569329096329522744304355766896648950445244523161\&lt;br /&gt;7318564030987111217223831136222989342338030813533627661428280644448664523874930\&lt;br /&gt;3589072962904915604407723907138105158593079608667017242712188399879790879227492\&lt;br /&gt;1901699720888093776657273330010533678812202354218097512545405947522435258490771\&lt;br /&gt;1670556013604839586446706324415722155397536978179778461740649551492908625693219\&lt;br /&gt;7846862248283972241375657056057490261407972968652414535100474821663704844031998\&lt;br /&gt;9000889524345065854122758866688116427171479924442928230863465674813919123162824\&lt;br /&gt;5861786645835912456652947654568284891288314260769004224219022671055626321111109\&lt;br /&gt;3705442175069416589604080719840385096245544436298123098787992724428490918884580\&lt;br /&gt;1561660979191338754992005240636899125607176060588611646710940507754100225698315\&lt;br /&gt;520005593572972571636269561882670428252483600823257530420752963450', 5)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-8067986015999177456?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/8067986015999177456/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/01/project-euler-solution-au-problme-8-en.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/8067986015999177456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/8067986015999177456'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/01/project-euler-solution-au-problme-8-en.html' title='Project Euler: Solution au problème 8, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-8917175171995810419</id><published>2009-01-05T10:35:00.004+01:00</published><updated>2009-01-05T10:39:36.346+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photo'/><category scheme='http://www.blogger.com/atom/ns#' term='ma vie.com'/><title type='text'>Dashing in the snow...</title><content type='html'>Il a neigé cette nuit, enfin je crois...&lt;br /&gt;&lt;br /&gt;Version actuelle d'une vue &lt;a href="http://blog.virus1984.com/2008/11/une-tentative-en-hdr.html"&gt;que vous avez déjà vue&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9oCvnRQKziE/SWHU3sGHDjI/AAAAAAAAAHA/RU-AVXtmqpA/s1600-h/090105-neige.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_9oCvnRQKziE/SWHU3sGHDjI/AAAAAAAAAHA/RU-AVXtmqpA/s200/090105-neige.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5287741490704354866" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Bon par contre c'est moins chouette pour ce qui est de prendre la route. Mais il en faudra plus pour m'arrêter.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-8917175171995810419?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/8917175171995810419/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/01/dashing-in-snow.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/8917175171995810419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/8917175171995810419'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/01/dashing-in-snow.html' title='Dashing in the snow...'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9oCvnRQKziE/SWHU3sGHDjI/AAAAAAAAAHA/RU-AVXtmqpA/s72-c/090105-neige.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-5175960057047070994</id><published>2009-01-05T00:35:00.003+01:00</published><updated>2009-07-07T10:07:02.028+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: Solution au problème 7, en Python</title><content type='html'>Maintenant il est minuit passé, et j'avoue j'ai passé "un peu" de temps sur Slashdot en attendant le résultat... qui finalement a pris 1 minute 56 à sortir. Oups. Enfin bref, voici une solution au &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=7"&gt;problème 7&lt;/a&gt;, en Python encore.&lt;br /&gt;&lt;br /&gt;D'ailleurs ce langage commence à me plaire...&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/01/05 - euler007.py&lt;br /&gt;# Solution au Probleme 7 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=7&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def euler7(n):&lt;br /&gt;    primes = [2]&lt;br /&gt;    count = 1&lt;br /&gt;    cand = 3&lt;br /&gt;    while count &amp;lt; n:&lt;br /&gt;        i = 0&lt;br /&gt;        while i &amp;lt; len(primes):&lt;br /&gt;            if cand % primes[i] == 0:&lt;br /&gt;                break&lt;br /&gt;            i = i + 1&lt;br /&gt;        if i == len(primes):&lt;br /&gt;            primes.append(cand)&lt;br /&gt;            count = count + 1&lt;br /&gt;        cand = cand + 2&lt;br /&gt;    return primes[-1]&lt;br /&gt;&lt;br /&gt;print euler7(10001)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-5175960057047070994?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/5175960057047070994/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/01/project-euler-solution-au-problme-7-en.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/5175960057047070994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/5175960057047070994'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/01/project-euler-solution-au-problme-7-en.html' title='Project Euler: Solution au problème 7, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-7391270542984205929</id><published>2009-01-04T23:39:00.003+01:00</published><updated>2009-07-07T10:07:10.310+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: Solution au problème 6, en Python</title><content type='html'>Finalement il n'est pas encore minuit, et j'ai déjà un programme qui est solution du &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=6"&gt;problème 6&lt;/a&gt; qui est plutôt trivial, je vous l'accorde.&lt;br /&gt;&lt;br /&gt;Ce qui veut donc dire que j'ai un équivalent Python pour les six programmes C proposés précédemment.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/01/04 - euler006.py&lt;br /&gt;# Solution au Probleme 6 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=6&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def euler6(n):&lt;br /&gt;    sum_of_squares = 0&lt;br /&gt;    square_of_sum = 0&lt;br /&gt;    for i in range(1, n + 1):&lt;br /&gt;        sum_of_squares = sum_of_squares + i ** 2&lt;br /&gt;    for i in range(1, n + 1):&lt;br /&gt;        square_of_sum = square_of_sum + i&lt;br /&gt;    square_of_sum = square_of_sum ** 2&lt;br /&gt;    return abs(sum_of_squares - square_of_sum)&lt;br /&gt;    &lt;br /&gt;print euler6(100)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-7391270542984205929?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/7391270542984205929/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/01/project-euler-solution-au-problme-6-en.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/7391270542984205929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/7391270542984205929'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/01/project-euler-solution-au-problme-6-en.html' title='Project Euler: Solution au problème 6, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-5830168047837089999</id><published>2009-01-04T23:20:00.003+01:00</published><updated>2009-07-07T10:07:19.860+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: Solution au problème 5, en Python</title><content type='html'>Allez, un dernier avant de passer à minuit, comme ça on dira que j'en ai fait cinq aujourd'hui. Une (double) solution au &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=5"&gt;problème 5&lt;/a&gt;, en Python.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/01/04 - euler005.py&lt;br /&gt;# Solution au Probleme 5 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=5&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def euler5_brute(n):&lt;br /&gt;    scm = n + 1&lt;br /&gt;    while True:&lt;br /&gt;        scm = scm + 1&lt;br /&gt;        for i in range(1, n + 1):&lt;br /&gt;            if scm % i != 0:&lt;br /&gt;                break&lt;br /&gt;        if i == n:&lt;br /&gt;            return scm&lt;br /&gt;            &lt;br /&gt;def euler5_nice(n):&lt;br /&gt;    base = range(1, n+1)&lt;br /&gt;    work = range(1, n+1)&lt;br /&gt;    done = False&lt;br /&gt;    while done == False:&lt;br /&gt;        smallest = min(work)&lt;br /&gt;        for i in range(0, n):&lt;br /&gt;            if work[i] == smallest:&lt;br /&gt;                work[i] = work[i] + base[i]&lt;br /&gt;        done = min(work) == max(work)&lt;br /&gt;    return work[0]&lt;br /&gt;&lt;br /&gt;def euler5(n):&lt;br /&gt;    return euler5_nice(n)&lt;br /&gt;    &lt;br /&gt;print euler5(20)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-5830168047837089999?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/5830168047837089999/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/01/project-euler-solution-au-problme-5-en.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/5830168047837089999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/5830168047837089999'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/01/project-euler-solution-au-problme-5-en.html' title='Project Euler: Solution au problème 5, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-4305066313329124831</id><published>2009-01-04T19:25:00.004+01:00</published><updated>2009-07-07T10:07:27.991+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: Solution au problème 4, en Python</title><content type='html'>Avant de me faire un petit quelque chose à manger, un peu de code en apéritif. Ma solution au &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=4"&gt;problème 4&lt;/a&gt;, toujours en Python puisque c'est quand même le but de la manoeuvre. Dix minutes de code, y compris les essais dans l'interpréteur pour les arguments de "range", sept secondes d'exécution. Pas exactement une perte de temps.&lt;br /&gt;&lt;br /&gt;Le tout en un brin plus générique que dans ma version C, puisqu'on peut spécifier la dimension du problème. Je vais continuer dans cette approche, les énoncés sont souvent exprimés en donnant la solution d'une dimension et demandant la solution d'une autre dimension; en procédant assez génériquement j'ai plus de facilité à valider l'algorithme.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/01/04 - euler4.py&lt;br /&gt;# Solution au Probleme 4 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=4&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def is_palindrome(n):&lt;br /&gt;    normal = repr(n)&lt;br /&gt;    reverse = ''&lt;br /&gt;    i = len(normal)&lt;br /&gt;    while i &gt; 0:&lt;br /&gt;        i = i - 1&lt;br /&gt;        reverse = reverse + normal[i]&lt;br /&gt;    return normal == reverse&lt;br /&gt;    &lt;br /&gt;def euler4(n):&lt;br /&gt;    lower = 10 ** (n - 1)&lt;br /&gt;    higher = 10 ** n&lt;br /&gt;    largest = 0&lt;br /&gt;    for i in range(lower, higher):&lt;br /&gt;        for j in range(i, higher):&lt;br /&gt;            product = i * j&lt;br /&gt;            if is_palindrome(product):&lt;br /&gt;                if product &gt; largest:&lt;br /&gt;                    largest = product&lt;br /&gt;    return largest&lt;br /&gt;&lt;br /&gt;print euler4(3)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-4305066313329124831?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/4305066313329124831/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/01/project-euler-solution-au-problme-4-en.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/4305066313329124831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/4305066313329124831'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/01/project-euler-solution-au-problme-4-en.html' title='Project Euler: Solution au problème 4, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-2451608752971153657</id><published>2009-01-04T13:40:00.003+01:00</published><updated>2009-07-07T10:07:35.387+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: Solution au problème 3, en Python</title><content type='html'>Toujours dans la lancée, une solution au &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=3"&gt;problème 3&lt;/a&gt;, en Python. D'ailleurs avec un algorithme infiniment plus performant que ma version C tiens. Comme quoi c'est pas du temps perdu de revenir sur sa copie. On y gagne en humilité :-)&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/01/04 - euler3.py&lt;br /&gt;# Solution au Probleme 3 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=3&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def euler3(n):&lt;br /&gt;        factors = []&lt;br /&gt;        cand = 2&lt;br /&gt;        while cand ** 2 &amp;lt;= n:&lt;br /&gt;            if n % cand == 0:&lt;br /&gt;                factors.append(cand)&lt;br /&gt;                n = n / cand&lt;br /&gt;            else:&lt;br /&gt;                cand = cand + 1&lt;br /&gt;        if n != 1:&lt;br /&gt;            factors.append(n)&lt;br /&gt;        if factors == []:&lt;br /&gt;            return 1&lt;br /&gt;        else:&lt;br /&gt;            return factors[len(factors)-1]&lt;br /&gt;&lt;br /&gt;print euler3(600851475143)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-2451608752971153657?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/2451608752971153657/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/01/project-euler-solution-au-problme-3-en.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2451608752971153657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2451608752971153657'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/01/project-euler-solution-au-problme-3-en.html' title='Project Euler: Solution au problème 3, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-2869932161008008105</id><published>2009-01-04T13:38:00.004+01:00</published><updated>2009-07-07T10:07:44.629+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: Solution au problème 2, en Python</title><content type='html'>Vais pas m'arrêter en si bon chemin. Hop, &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=2"&gt;problème 2&lt;/a&gt;, encore en Python.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/01/04 - euler2.py&lt;br /&gt;# Solution au Probleme 2 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=2&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def euler2(max):&lt;br /&gt;    sum = 0&lt;br /&gt;    a, b = 1, 1&lt;br /&gt;    while b &amp;lt; max:&lt;br /&gt;        a, b = b, a + b&lt;br /&gt;        if b % 2 == 0:&lt;br /&gt;            sum = sum + b&lt;br /&gt;    return sum&lt;br /&gt;&lt;br /&gt;print euler2(4000000)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-2869932161008008105?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/2869932161008008105/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/01/project-euler-solution-au-problme-2-en.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2869932161008008105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2869932161008008105'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/01/project-euler-solution-au-problme-2-en.html' title='Project Euler: Solution au problème 2, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-2194715341307951111</id><published>2009-01-04T13:34:00.003+01:00</published><updated>2009-07-07T10:07:51.618+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (python)'/><title type='text'>Project Euler: Solution au problème 1, en Python</title><content type='html'>Pour un blog de geek, ça manque fameusement de code à grignoter au petit déjeuner, hein? Que voulez-vous, j'ai une vie. Cela dit, je me mets timidement au Python, sous la pression populaire et en autodidacte sinon c'est pas marrant. L'occasion de revisiter les problèmes du Project Euler, en repartant de zéro.&lt;br /&gt;&lt;br /&gt;Enfin de 1, puisqu'ils sont numérotés à partir de 1.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;#! /usr/bin/env python&lt;br /&gt;&lt;br /&gt;# 2009/01/04 - euler1.py&lt;br /&gt;# Solution au Probleme 1 de Project Euler&lt;br /&gt;# http://projecteuler.net/index.php?section=problems&amp;id=1&lt;br /&gt;# Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt;&lt;br /&gt;def euler1(max):&lt;br /&gt;    sum = 0&lt;br /&gt;    n = 0&lt;br /&gt;    while n &amp;lt; max:&lt;br /&gt;        if n % 3 == 0 or n % 5 == 0:&lt;br /&gt;            sum = sum + n&lt;br /&gt;        n = n + 1&lt;br /&gt;    return sum&lt;br /&gt;&lt;br /&gt;print euler1(1000)&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-2194715341307951111?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/2194715341307951111/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/01/project-euler-solution-au-problme-1-en.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2194715341307951111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2194715341307951111'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/01/project-euler-solution-au-problme-1-en.html' title='Project Euler: Solution au problème 1, en Python'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-1919936865924576650</id><published>2009-01-01T15:19:00.002+01:00</published><updated>2009-01-01T15:29:18.856+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zune'/><category scheme='http://www.blogger.com/atom/ns#' term='wtf'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='code (c)'/><title type='text'>Le bug du 31/12/2008, disponible uniquement sur Zune 30.</title><content type='html'>L'année commence en rigolades pour beaucoup, parce qu'elle s'est mal terminée pour les propriétaires de baladeurs Zune 30Go. En effet, ce modèle du baladeur de Microsoft a subi un bien curieux bug qui a rendu inopérant chaque exemplaire le 31 décembre 2008.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Les curieux se sont évidemment jetés sur le code source du firmware de l'animal, lequel est rendu disponible via Freescale. Plus précisément, une lecture de la &lt;a href="http://pastie.org/349916"&gt;gestion de l'horloge&lt;/a&gt; révèle la perle suivante:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;while (days &gt; 365)&lt;br /&gt;    {&lt;br /&gt;        if (IsLeapYear(year))&lt;br /&gt;        {&lt;br /&gt;            if (days &gt; 366)&lt;br /&gt;            {&lt;br /&gt;                days -= 366;&lt;br /&gt;                year += 1;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;            days -= 365;&lt;br /&gt;            year += 1;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Pour ceux qui ne lisent pas couramment le C, un petit mot d'explication s'impose. Le 31 décembre 2008 est le 366 jour de l'année, 2008 étant bissextile. Cas prévu par le code ici présent, qui prévoit que si on dépasse le 365 jour de l'année il faut passer à l'année suivante si c'est une année normale, de même si on dépasse le 366ème jour d'une année bissextile. Et si on est précisément dans le 366ème jour d'une année bissextile? Oh zut...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-1919936865924576650?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/1919936865924576650/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2009/01/le-bug-du-31122008-disponible.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1919936865924576650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1919936865924576650'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2009/01/le-bug-du-31122008-disponible.html' title='Le bug du 31/12/2008, disponible uniquement sur Zune 30.'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-1659494617990573029</id><published>2008-12-26T03:06:00.003+01:00</published><updated>2008-12-26T03:09:39.102+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac-advocacy'/><category scheme='http://www.blogger.com/atom/ns#' term='humeur'/><category scheme='http://www.blogger.com/atom/ns#' term='helios'/><category scheme='http://www.blogger.com/atom/ns#' term='foss-advocacy'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>De la bonne manière de donner mauvaise presse à la cause qu'on défend.</title><content type='html'>Le 11 décembre je postais via Twitter le commentaire suivant: " "There is no such thing as free software." Et c'est un enseignant qui dit ça :( " traduisant en une ligne ma tristesse de voir qu'une trentaine d'années de libre n'ont pas encore réussi à entrer dans les moeurs et les mentalités. On m'a demandé d'où ça venait, du coup j'avais un peu été chatouillé par l'idée d'en parler sur mon blog.&lt;br /&gt;&lt;br /&gt;Mais voilà, le sujet méritait sûrement d'être un tant soit peut développé pour ne pas faire que répéter, mais j'avais la flemme de m'y mettre le jour même et un agenda chargé ensuite. Enfin voilà, joyeux Noël, je m'y suis enfin collé vraiment, espérons que le résultat soit à la hauteur...&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Au commencement était Ken Starks, connu également sous le pseudonyme "helios". Ken Starks est de ceux qu'on appelle les "FOSS-Advocates", ces passionnés qui accordent une grande partie de leur temps à la promotion du concept et des réalisations des logiciels libres; ils se sentent souvent investi d'une telle mission d'évangélisation qu'ils font preuve d'un acharnement à coté duquel les témoins de Jéhovah paraissent timides et réservés.&lt;br /&gt;&lt;br /&gt;Il se trouve que Ken Starks est l'un des fondateurs d'un association dont le but est de fournir aux écoles et aux écoliers des ordinateurs reconditionnés équipés de système d'exploitation et de logiciels libres, afin de donner à un plus grand nombre accès à un outil informatique à coût réduit. Noble cause! Le projet est question est baptisé "HeliOS", on peut ricaner sur le coté peu modeste de donner son pseudonyme à un projet collectif, mais là n'est pas la question. &lt;br /&gt;&lt;br /&gt;Une des activités de HeliOS est de distribuer des CD-ROMs pleins à craquer de logiciels libres, des CD-ROMs de distributions Linux, bref du bon "free software" dans les deux sens de "free". Et voilà donc qu'un juvénile enthousiaste se présente en classe avec son ordinateur portable sous Linux et quelques CDs d'HeliOS, voulant partager sa découverte à ses camarades. L'enseignante voit l'attroupement, vient s'informer de la situation, voit un enfant qui distribue des CDs, fait un back-flip de panique, confisque le tout et en réfère immédiatement à la hiérarchie. Il y a sûrement piratage ou propagation de malware!&lt;br /&gt;&lt;br /&gt;Le concerné a quand même pu s'expliquer, explique qu'il s'agit de CDs d'installation de Linux, que c'est du "free software", qu'il l'a obtenu via le projet HeliOS d'un certain Ken Starks. Il y aurait une organisation complète qui distribue à des enfants innocents des logiciels douteux? Une intervention est de mise.&lt;br /&gt;&lt;br /&gt;Et voilà que Karen &amp;mdash; l'enseignante en question &amp;mdash; entreprend d'envoyer un e-mail poli mais ferme à ce Ken Starks dont elle doute franchement que les activités soient bien légales et à qui elle juge important de rappeler qu'il est néfaste de répandre des idées fausses dans l'esprit des enfants. Entre autres, l'idée que des logiciels soient gratuits ou libres. De ses propres termes &lt;i&gt;"aucun logiciel est gratuit, et propager cette fausse idée est néfaste"&lt;/i&gt; et elle précise &lt;i&gt;"qu'elle admire ses efforts pour fournir des ordinateurs aux gens défavorisés, mais y mettre Linux bride nos enfants"&lt;/i&gt;; et de préciser que Microsoft serait sûrement disposé à fournir des copies d'anciennes versions de Windows qui rendraient enfin les ordinateurs fournis par HeliOS vraiment utiles.&lt;br /&gt;&lt;br /&gt;Un adulte aurait soupiré un bon coup, pris un café, réfléchi calmement à son argumentaire, puis écrit un réponse encyclopédique pour informer de manière toute aussi polie mais ferme que Karen se trompe, l'informer de l'existence des systèmes d'exploitation et des logiciels libres, de leur état d'avancement, du fait qu'actuellement Linux et les logiciels libres sont globalement assez à maturité pour remplacer de façon viable Windows sur une machine personnelle... vous voyez le genre. C'est long à écrire, mais en fin de compte on a la satisfaction d'avoir informé quelqu'un.&lt;br /&gt;&lt;br /&gt;Un adulte furieux aurait sûrement choisi de défouler sa rage sur un objet inerte, ou d'appliquer la technique du mail furieux qu'on n'envoie jamais mais qui aura contenu tout ce qu'on avait d'odieux à dire. Ça ne fait pas avancer le schmilblick, mais au moins on garde sa contenance.&lt;br /&gt;&lt;br /&gt;Au lieu de ça, Ken Starks a préféré verser sa colère dans &lt;a href="http://linuxlock.blogspot.com/2008/12/linux-stop-holding-our-kids-back.html"&gt;un post rageur&lt;/a&gt; sur son blog, à la suite d'une copieuse citation de l'e-mail qu'il venait de recevoir. Le genre de post dans lequel transparaît clairement le rictus de satisfaction sadique de son auteur qui se délecte de rouler sa victime dans un goudron virtuel avant de le jeter aux plumes numériques. Le tout est maintenu par un fil rouge qui fleure bon la théorie du complot, selon lequel Microsoft finance la NEA, ce qui explique pourquoi les enseignants sont formés à (et obligés de) matraquer le marketing Microsoft à leurs élèves... le tout dans un vocabulaire qui fait presque peur: Linux est utilisé pour &lt;i&gt;"libérer"&lt;/i&gt; les gens de l'emprise Microsoft et de ses &lt;i&gt;"bindwares"&lt;/i&gt;, Karen n'a aucune idée de &lt;i&gt;"l'esclavage"&lt;/i&gt; dans lequel elle travaille et ne devrait pas &lt;i&gt;"mettre aux fers ses élèves dans la même prison qu'elle"&lt;/i&gt;. En même temps, publié sur un blog dont le sous-titre est &lt;i&gt;"Linux is to computing what freedom is to mankind...and then there's Microsoft"&lt;/i&gt;, on ne doit pas s'attendre à un autre ton.&lt;br /&gt;&lt;br /&gt;Hop, publié. Fin de l'histoire. Ou pas...&lt;br /&gt;&lt;br /&gt;Si c'était le blog discret d'un quelconque quidam, personne n'en saurait rien (à l'exception de la poignée de lecteur dudit quidam). Mais c'est Ken Starks, ou plutôt c'est HeliOS. Et un des lecteurs a mentionné l'affaire. Sur Slashdot.&lt;br /&gt;&lt;br /&gt;Pour ceux qui auraient vécu dans une grotte pendant les dix dernières années, Slashdot est un site d'actualité IT/high-tech/science/... des trucs de geeks. Au détail près que Slashdot brasse plusieurs millions de visiteurs par mois. Donc une horde de centaines de milliers de geeks se sont rués sur ce plutôt modeste blog, et une anecdote parmi tant d'autres est vite devenue affaire d'état. Au point que la pauvre Karen s'est vue publiquement insulter par des milliers de fanatiques furieux, et que Ken Starks a eu droit à un coup de fil d'une enseignante au bord de la crise de nerfs.&lt;br /&gt;&lt;br /&gt;La suite ne s'est pas fait attendre longtemps. Starks a donné suite dans &lt;a href="http://linuxlock.blogspot.com/2008/12/character-assasinations-aint-us.html"&gt;un second post&lt;/a&gt; à l'affaire, pour nuancer son propos, et surtout informer la communauté des entretiens qu'il a eu avec Karen depuis lors. Il s'y excuse en confusions telles qu'on en viendrait vite à se demander s'il est vraiment sincère. Ceci dit, il a au moins le mérite de revenir sur ses propos à fort poids émotionnel. Ce n'est pas le cas des commentaires qu'une grande partie des vagues de visiteurs ont laissé derrière eux.&lt;br /&gt;&lt;br /&gt;Il faut voir comment l'affaire a été perçue. Dans "la communauté" des développeurs et utilisateurs de logiciels libres, une première tendance a été de faire écho en masse aux propos de Starks, en les amplifiant à la puissance mille. C'est un peu l'effet Slashdot aussi, l'un dit "c'est gênant", le second enchaîne "c'est dérangeant", le troisième "c'est scandaleux", et on arrive vite à "passez-la par les armes sur la place du marché!!". Si vous n'avez jamais vu un lynchage virtuel prendre place, lisez les commentaires du premier post, c'est assez édifiant.&lt;br /&gt;&lt;br /&gt;L'autre tendance, c'est justement celle qui m'a secoué. Effectivement, voir l'ignorance dont Karen fait preuve peut agacer (mais peut-on lui en tenir rigueur?). Par contre voir la haine déployée par ceux qui se disent être de fervents promoteurs du libre donne des nausées. En tout cas ça ne donne pas du tout envie d'être associé à pareil haineux. C'est gênant. C'est toujours gênant d'adhérer à un courant de pensée et de voir que ceux qui se placent comme porte-paroles de ce courant installent un climat de haine qui est fortement amplifié par ceux qui adhèrent audit courant. On en vient à douter de son appartenance au mouvement.&lt;br /&gt;&lt;br /&gt;Et encore, ça c'est pour ceux qui sont plus ou moins au courant du sujet, qui sont donc soit choqués qu'on ne connaisse pas Linux (ou le libre en général), soit choqués qu'on agresse ainsi ceux qui ne sont pas au courant. Mais pour ceux qui sont totalement étrangers au libre et ses implications philosophico/propagandistes la chose est un peu incompréhensible. Comment comprendre une telle tempête dans un verre d'eau? Pourquoi faire une telle polémique sur ce qui est finalement un événement anecdotique due à une incompréhension? Pourquoi une telle manifestation de haine?&lt;br /&gt;&lt;br /&gt;Finalement, ces barbus qui vantent les mérites de cet animal bizarre qu'est l'open-source, qui sont-ils? Ils semblent être un brin autistes, un peu reclus, un peu monomaniaques à tendance zélote. En tout cas sur ce coup-ci ils s'avèrent avoir l'ouverture d'esprit d'un protozoaire, et des réactions qu'on attendrait d'un adolescent au sang chaud souffrant de quelques problèmes d'identité.&lt;br /&gt;&lt;br /&gt;C'est pas vraiment bon pour l'image tout ça. Nous avons des developpeurs passionnés qui, il faut le reconnaître, fournissent beaucoup d'efforts pour mettre au point des logiciels qui tiennent la route (et Dieu sait que ce n'est pas une tâche aisée). Nous avons des utilisateurs de plus en plus nombreux qui sont autant de sources d'inspiration et des testeurs "grandeur nature". Nous avons des promoteurs passionnés qui consacrent un temps considérable à simplement faire connaître le libre et ses avantages. Là où se situe le problème, c'est que sur Internet, tout le monde à la même voix. Finalement ce ne sont pas les plus réfléchis qui sont les plus visibles, mais souvent les plus acharnés, les plus fanatiques, les rageux purs et durs qui n'hésiteront pas à consacrer des heures entières à émettre des flots d'insultes quitte à ridiculiser la communauté qu'ils défendent.&lt;br /&gt;&lt;br /&gt;Pour eux, Microsoft est le mal, l'Empire, le coté obscur, le Mordor, la Waffen SS, tout ce qui est intrinsèquement "méchant".  Il faut dire que Microsoft est dans les faits un pionnier du concept de logiciel propriétaire et de la commercialisation de logiciels. Leur travail a été tellement efficace qu'ils se retrouvent actuellement en position de quasi-monopole. Or, Microsoft est une société capitalisée en bourse, qui a donc le devoir de garantir des revenus sans cesse croissants à ses actionnaires. Pas besoin d'être docteur en économie pour comprendre qu'en situation de monopole on ne peut pas agrandir son marché, le seul moyen qu'on a de garantir des ventes futures est de s'asurer que le client d'aujourd'hui sera client demain; ce qui revient à s'assurer qu'on dispose d'un moyen de forcer le client d'aujourd'hui à racheter demain ce qu'il a déjà. D'où les versions de Windows et d'Office incompatibles entre elles, l'obsolescence planifiée, les formats fermés... autant de pratiques commerciales qui provoquent des spasmes de colère à tous ceux qui ont l'intime conviction que le logiciel est quelque chose qui doit circuler librement pour évoluer au plus vite et au mieux. Quand on est un fervent du libre, Microsoft incarne l'opposé des valeurs qu'on véhicule. D'où une certaine méfiance à son égard, qui tourne chez beaucoup en haine viscerale plutôt infantile.&lt;br /&gt;&lt;br /&gt;Cette haine s'accompagne souvent d'une mauvaise foi typique. Microsoft est le mal dont tout ce qui en émane est maléfique, et tous ceux qui y travaillent sont des suppôts du démon. Sous-entendre de près ou de loin qu'un produit Microsoft puisse être valable, c'est se placer du coté obscur de la Force (raisonnement binaire typique "vous êtes soit avec nous, soit contre nous"). Par extension, les utilisateurs des produits Microsoft sont autant de pions à la solde de la Bête; et puis tant qu'on y est, les autres producteurs de logiciels propriétaires méritent la roue, le fouet, et le bûcher également. Antagonie systématique, et théories du complot.&lt;br /&gt;&lt;br /&gt;Il faut dire que le jeu en vaut la chandelle. Vous ne pouvez pas comprendre, pauvres idiots zombifiés par Microsoft que vous êtes! Le logiciel libre est la solution à la faim dans le monde, aux guerres, au chômage, à l'illetrisme, aux épidémies, ... C'est *la* voie. Ceux qui l'ont compris sont des sortes d'élus, une espèce d'élite qui peut de ce fait regarder de haut les moutons et autres zombies à la soldes du propriétaire. Bande d'idiots.&lt;br /&gt;&lt;br /&gt;Le plus triste, c'est que cette attitude infantile n'est pas l'apanage d'adolescents prépubères.&lt;br /&gt;&lt;br /&gt;Il y a de celà un certain temps déjà, un certain Eric Steven Raymond a reçu un e-mail venant d'un recruteur qui défrichait un peu le terrain pour son client. Le client, c'est Microsoft, justement. Le potentiel, c'est "ESR". Là où ça coince, c'est qu'Eric Raymond est très fier de dire à tout représentant de Microsoft "I'm your worst nightmare" en guise de présentation. Pourtant, il est l'auteur de "La cathédrale et le bazar", mainteneneur du Jargon File, ... et il est dans sa cinquantaine. Plus grave: il se place lui-même comme porte-parole de la communauté, plus précisément de l'initiative Open-Source, dont il se place comme net fondateur. Ça ne l'empêche pas de verser dans &lt;a href="http://esr.ibiblio.org/index.php?p=208"&gt;une verve tout aussi peu recommandable&lt;/a&gt;, qui fait d'abord sourire, puis attriste quand on prend conscience que ces insultes sont proférées au nom d'une communauté entière et à l'égard de quelqu'un qui finalement n'avait rien fait de mal.&lt;br /&gt;&lt;br /&gt;Triste...&lt;br /&gt;&lt;br /&gt;Un autre domaine d'évangélisation informatique où ces dérives s'expriment, c'est la promotion de la "culture Macintosh". Apple a toujours fourni des efforts pour donner à ses produits une forte empreinte d'élégance artistique et les placer comme très "in" et réservés à une élite de connaisseurs.&lt;br /&gt;&lt;br /&gt;De ce fait, les Mac-advocates sont de la même trempe que les Linux-advocates, mais avec une couche d'élégance en plus. En anglais on appelle ça des "art-fags". Vous savez, ces types en col roulé faussement mal rasés, plus cool que vous, qui traînent toujours et font des choses que vous ne pourriez pas comprendre. D'ailleurs ils utilisent un ordinateur supérieur. Le leur est beau. Le votre est moche. Vous êtes inférieur.&lt;br /&gt;&lt;br /&gt;Même genre de passion aveugle pour leur cause, qui est ici une marque; même genre de haine aveugle pour "l'ennemi" Microsoft, même genre d'antagonisation systématique, même genre de débilisation des utilisateurs de Windows... et au final même apparence d'adolescent attardé au cerveau lessivé qui n'est pas capable d'argumenter au-delà d'une liste de slogans.&lt;br /&gt;&lt;br /&gt;Pourquoi je parle de ça? Parce que je suis un Mac-advocate. J'ai toujours utilisé un Macintosh, j'ai toujours beaucoup aimé utiliser mon Mac, j'ai toujours voulu faire profiter de mon entourage des bienfaits d'Apple tout en me préservant autant que possible des horreurs de Microsoft. J'ai eu cette attitude de passionné aveugle, haineux, qu'on ne peut pas raisonner et qui se réfugiait derrière des arguments du type "la commande Eteindre est dans le menu Démarrer, haha lol!". Oui, j'avoue.&lt;br /&gt;&lt;br /&gt;Mais j'avais 15 ans.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-1659494617990573029?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/1659494617990573029/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/12/de-la-bonne-manire-de-donner-mauvaise.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1659494617990573029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1659494617990573029'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/12/de-la-bonne-manire-de-donner-mauvaise.html' title='De la bonne manière de donner mauvaise presse à la cause qu&apos;on défend.'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-7407413630645646688</id><published>2008-12-10T21:38:00.005+01:00</published><updated>2008-12-10T21:46:44.329+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photo hdr'/><category scheme='http://www.blogger.com/atom/ns#' term='photo'/><category scheme='http://www.blogger.com/atom/ns#' term='photo panoramique'/><title type='text'>Retrouvailles photographiques</title><content type='html'>Ce qui est bon quand on est quelques heures hors-lignes mais avec sa machine principale quand même, c'est que pour une fois on prend le temps de retourner les trefonds de son disque dur à la recherche de ce qui y traîne depuis des éternités et mériterait peut-être d'être dépoussiéré. Par exemple, ces quelques photos, qui n'ont jamais été mises en ligne mais devaient l'être...&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;En l'occurrence, des prises de vues destinées à devenir HDR mais qui ne l'étaient pas encore. Donc les prises de vues datent de février de cette année, la version HDR date de tout à l'heure:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9oCvnRQKziE/SUApr_DVvRI/AAAAAAAAAGQ/2GE0tCnyySE/s1600-h/hdr-080127-1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 152px;" src="http://3.bp.blogspot.com/_9oCvnRQKziE/SUApr_DVvRI/AAAAAAAAAGQ/2GE0tCnyySE/s200/hdr-080127-1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5278264598914776338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9oCvnRQKziE/SUApzhCnl-I/AAAAAAAAAGY/zTP5gIfq44Q/s1600-h/hdr-080127-2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 149px;" src="http://4.bp.blogspot.com/_9oCvnRQKziE/SUApzhCnl-I/AAAAAAAAAGY/zTP5gIfq44Q/s200/hdr-080127-2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5278264728297641954" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Et ce panorama improvisé, pris en lumière naturelle dans mon jardin, en juin. Pas de HDR ici, et déjà le coté improvisé et la légère brise se voient dans les feuillages, alors la même chose avec cinq fois plus de prises de vues ce serait folklorique! 360°&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9oCvnRQKziE/SUAqfhn_Q4I/AAAAAAAAAGg/rHnGdm3IDZs/s1600-h/pano-080610-360.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 40px;" src="http://4.bp.blogspot.com/_9oCvnRQKziE/SUAqfhn_Q4I/AAAAAAAAAGg/rHnGdm3IDZs/s200/pano-080610-360.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5278265484368626562" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Voilà, pour les curieux :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-7407413630645646688?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/7407413630645646688/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/12/retrouvailles-photographiques.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/7407413630645646688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/7407413630645646688'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/12/retrouvailles-photographiques.html' title='Retrouvailles photographiques'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9oCvnRQKziE/SUApr_DVvRI/AAAAAAAAAGQ/2GE0tCnyySE/s72-c/hdr-080127-1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-5432791159367036145</id><published>2008-12-09T22:23:00.000+01:00</published><updated>2008-12-09T22:26:01.675+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humeur'/><category scheme='http://www.blogger.com/atom/ns#' term='wtf'/><title type='text'>"Proud to be black y'all! Get Blackbird"</title><content type='html'>C'est pas tous les jours que l'enseigne sobre et posée qu'est &lt;a href="http://arstechnica.com/index.ars"&gt;Ars Technica&lt;/a&gt; parle de quelque chose de communautaire dans ses pages; ou du moins de "communautaire" comme dans "problème communautaire" pas comme dans "communauté open-source". Et pourtant ils l'ont fait, c'est dire si la chose est de taille. Et c'est chose, c'est un monstre nommé &lt;i&gt;Blackbird&lt;/i&gt;.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Blackbird, en deux mots, c'est un navigateur web basé sur Firefox (oui, un de plus...) qui a la particularité d'être "un navigateur pour la communauté Afro-Américaine" comme le précise &lt;a href="http://www.blackbirdhome.com/"&gt;son site&lt;/a&gt;. Aïe. Comme un noeud dans l'estomac. Un navigateur pour blacks? C'est ça le délire?&lt;br /&gt;&lt;br /&gt;Le Dr Frankenstein à l'origine de ce monstre est une entreprise "fondée par des entrepreneurs Afro-américains", 40A Inc. Ah. Trois jeunes entrepreneurs qui se sont bien grattés la tête sur l'Obamamania, ou qui n'avaient plus que leur couleur de peau comme source d'idée géniale? Ça sent mauvais.&lt;br /&gt;&lt;br /&gt;D'ailleurs, c'est quoi au juste un "navigateur pour communauté Afro-Américaine"? Ou plus politiquement-correct: que fait Blackbird que ne fait pas Firefox? Pas tant que ça au vu des features vantées:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Black Search [sic]: un Google Search filtré pour faire remonter les résultats venant de sites "Afro-Americains". Noir ou blanc on saigne tous le même HTML, non?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Black News Ticker: un bandeau d'actualités sous la barre d'outils, qui fait défiler des titres qui pour une raison qui m'échappe devrait être particulièrement intéressant si on est noir de peau.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Black Bookmarks: une collection de liens jugés pertinents par 40A Inc. Fubu et Black Panthers?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Blackbird TV: genre YouTube mais que avec des clips de 50 Cents&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Social Bookmarking: un gros "share" accompagné du "most shared" qui va avec, liant tous les utilisateurs du navigateur&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Email manager: un mail-checker dans la barre d'outils&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Social Network Manager: ça c'est la fonction floue, on dirait une intégration de concepts à la Flock&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Bon plus on gratte dedans plus c'est une saleté commerciale. Trois gars se mettent autour d'une table et se demandes ce qui vend bien ces temps-ci, donc parlent réseaux sociaux, articulent ça avec un argument de vente indiscutable (surtout maintenant) et emballent le tout. Et le but profond? Parce qu'on me fera pas avaler que le vrai but c'est de "rassembler la communauté" ou que sais-je encore... &lt;i&gt;"Blackbird is free for you because it is supported by advertising and sponsorships. You don't pay to use Blackbird. "&lt;/i&gt; OK, ça devient limpide. L'objectif c'est de caser un maximum de publicité et de diriger l'utilisateur vers des sites partenaires (d'où la réécriture des résultats de recherche), le tout en garantissant aux annonceurs que le public est bien ciblé: ce ne sont que des noirs et fiers de l'être, avec peut-être une légère tendance ségrégationniste.&lt;br /&gt;&lt;br /&gt;Ben oui, forcément, ça fleure la ségrégation auto-infligée ça quand même. Le navigateur pour noirs déjà, bientôt le système d'exploitation pour noirs? Le constructeur de PC pour noir? Le téléphone portable pour noir? La marque de vêtements? Les galeries marchandes? Les bus? Les toilettes? Les écoles? &lt;i&gt;I had a nightmare, apartheid was back?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Eh ben on n'est pas sortis de l'auberge! Déjà que les élans communautaires sont rarement positifs et mènent surtout à un sale climat de séparation et de haine raciale, mais si en plus des vautours mercantiles surfent sur cette vague...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-5432791159367036145?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/5432791159367036145/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/12/proud-to-be-black-yall-get-blackbird.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/5432791159367036145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/5432791159367036145'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/12/proud-to-be-black-yall-get-blackbird.html' title='&quot;Proud to be black y&apos;all! Get Blackbird&quot;'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-6794504595111413599</id><published>2008-12-08T00:40:00.005+01:00</published><updated>2008-12-08T06:39:18.376+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogs'/><category scheme='http://www.blogger.com/atom/ns#' term='wired'/><category scheme='http://www.blogger.com/atom/ns#' term='humeur'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>Les blogs détrônés par Twitter</title><content type='html'>Ça choque hein? Toute personne qui aura croisé des blogs et le système Twitter aura conscience de la profonde différence entre les deux. Le blog est à Twitter ce que le courrier de cinq pages est au SMS. Evident. Pas pour Paul Boutin.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Paul Boutin est un des auteurs qui se fait publier dans le magazine Wired. Wired c'est un peu la concrétisation de la bulle dot-com de 1997-1998, à l'époque ce magazine l'était vraiment &amp;mdash; branché &amp;mdash; mais il faut bien avouer que depuis la qualité de cette publication est en déclin constant. Prenez un magazine qui se targue d'être visionnaire et d'avoir l'autorité de dire ce qui est "in" et ce qui est "out", équipez-le d'auteurs qui n'ont pas plus d'humilité ni de sens du recul, vous obtenez quelque chose où le pire côtoie de près le meilleurs. Paul Boutin est bien dans le moule; il a signé de très bons articles, mais son dernier en date est au mieux très drôle.&lt;br /&gt;&lt;br /&gt;Il se trouve que le bougre ne vivant pas tout à fait dans une grotte perdue au milieu du désert de Gobi, il a fini par découvrir que ce qui caractérise Internet ces cinq dernières années c'est bien la multiplications de sites à vocation "sociale". Flickr, YouTube, Facebook, Twitter. Personne ne l'a pas remarqué.&lt;br /&gt;&lt;br /&gt;Donc voilà que l'ami Boutin, jaugeant l'importance de ces sites et leur indéniable succès auprès des foules, se sent d'humeur à prédire la mort imminente de tout ce qui ressemble de près ou de loin à un blog. Evidemment. Selon ses propres termes, il y a quatre ans un blog était une idée brillante et novatrice, aujourd'hui ce n'est plus la peine. Pourquoi? Parce que le concept de "blog" a été adopté par des professionnels et que donc on voit fleurir partout des blogs qui sont rédigés par des équipes de rédacteurs pondants jusqu'à plusieurs dizaines de posts par jour. De ce fait, un particulier ne peut pas tenir face à ça en terme de productivité, donc de visibilité, de popularité.&lt;br /&gt;&lt;br /&gt;Conclusion: autant consacrer son énergie à poster ses photos sur Flickr, remplir son profil Facebook et n'utiliser plus que Twitter pour s'exprimer. Ça ou prendre la peine de rédiger des posts soignés qui seront de toute façon écrasés parce qu'ils ne font pas le poids face à des blogs professionnels... et puis en plus sur les blogs il y a les trolls. Sur Twitter on peut pas répondre. Ah si? Dommage, on dirait qu'il n'a pas fait ses devoirs...&lt;br /&gt;&lt;br /&gt;Ainsi, pour lui, la blogosphère (oui, j'ai dit "blogosphère", fouettez-moi) toute entière peut se remplacer d'elle-même par un florilège de petits messages de 140 caractères maximum (tiens, c'est encore plus court qu'un SMS en fait). Pourquoi peut-il bien dire ça?&lt;br /&gt;&lt;br /&gt;Première possibilité: c'est de la pure provocation, l'idée est de pondre un article écœurant pour qu'il soit cité partout, générer une horde de pageviews et se faire un peu remarquer des pontes de Wired. Mouais. D'un coté ça colle au raisonnement qui mesure l'intérêt d'une démarche à la hauteur qu'elle obtient dans les recherches Google.&lt;br /&gt;&lt;br /&gt;Deuxième possibilité: il y croit vraiment, et donc pour lui tout blogger ne rédige et publie que pour attirer à lui un maximum de visiteurs; évidemment pour générer des profits publicitaires parce que c'est bien connu: tout ce qu'on fait sur Internet on le fait pour le pognon facile!  Forcément, vu comme ça, si les pageviews sont détournées par des mastodontes professionnels, c'est pas la peine.&lt;br /&gt;&lt;br /&gt;En tout cas ça suppose que les blogs ne sont pas là pour exprimer une opinion, mais pour attirer des visiteurs. Tout le monde est bien d'accord sur le fait que des photos du chien de tante Irma c'est moins vendeur que des seins nus de jeune fille épanouie... mais alors pourquoi vois-je tant de Mirza et si peu de nichons? Ah, on me souffle dans mon oreillette que finalement il semblerait que ce qui attire les gens vers les outils de blogging c'est justement la facilité d'exprimer à ses proches et aux autres son ressenti, son vécu, son opinion, ou simplement partager ses découvertes. Ah ben du coup c'est limpide, je comprends mieux pourquoi la grande majorité des blogs de particuliers sont un mélange d'albums photos, de billets d'humeur qui sentent le journal intime, et des liens vers l'une ou l'autre vidéo rigolote. "Tiens c'est pas mal ça" entraîne "j'ai envie d'en parler à mes amis", qui entraîne "je vais le mettre sur mon blog". Ça se tient.&lt;br /&gt;&lt;br /&gt;Finalement ce qui est très amusant avec le raisonnement de Paul Boutin, c'est qu'à le lire on dirait qu'il est en ligne depuis moins de cinq ans. Il a peut-être perdu de vue que longtemps avant le Web il y avait les fichiers &lt;i&gt;.plan&lt;/i&gt; et &lt;i&gt;.project&lt;/i&gt; qu'on plaçait dans son répertoire d'utilisateur pour que les autres puissent les voir via &lt;i&gt;finger&lt;/i&gt;. Il a peut-être déjà oublié que pendant longtemps des pages Web servant à informer le public de ce sur quoi on travaille étaient justement nommées ".plan" (les joueurs n'auront pas oublié le .plan de John Carmack par exemple). Quand le Web s'est popularisé, chacun y allait de sa "home page" sur laquelle on croisait le plus souvent la photo de l'auteur, de sa femme, de ses enfants, de son chien, et un petit compte-rendu de son dernier voyage. On a parlé longtemps de "online diaries" avant que le terme "weblog" n'ait fait son apparition. Avouez quand même que quand on n'est pas un "technique" dans l'âme, c'est plus simple d'utiliser Blogger, TypePad, ou (gloups!) Skyblog que de plonger dans le code, uploader ça chez son hébergeur, et répéter l'opération à chaque mise à jour. &lt;br /&gt;&lt;br /&gt;D'où le succès des blogs "clé en main" de ces dernières années, qui amène dans la blogosphère des millions de gens, lesquels évidemment rendent nettement plus anonymes les pionniers des premiers âges. Et quand un de ces pionniers ferme son blog, Boutin en fait un phénomène de société et prédit la mort de tous les blogs.&lt;br /&gt;&lt;br /&gt;Oui mais non! Ne mélangeons pas tout. Flickr est une galerie de photos; Facebook sert à garder le contact avec des gens et à retrouver ceux qu'on a perdu de vue; Twitter a pour vocation les notifications brèves et ponctuelles qui ne mériteraient vraiment pas un post complet. Aucun de ces services ne peut remplacer vraiment un "vrai" blog, qui est avant toute chose un lieu où publier des réflexions propres qu'on prend la peine de développer; et les soumettre à des commentaires de visiteurs qu'on espère amener un débat constructif.&lt;br /&gt;&lt;br /&gt;Les blogs ne se comparent pas à leur popularité. La popularité ne fait pas la qualité. Être lu ne rend pas pertinent. On ne démarre pas un blog pour y coller un compte AdSense. On ne fait pas ça pour le fric. &lt;br /&gt;&lt;br /&gt;Mais ça, certains ne peuvent pas le comprendre; faudrait le leur dire en 140 caractères peut-être...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-6794504595111413599?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/6794504595111413599/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/12/les-blogs-dtrns-par-twitter.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6794504595111413599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6794504595111413599'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/12/les-blogs-dtrns-par-twitter.html' title='Les blogs détrônés par Twitter'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-5084989679048025567</id><published>2008-12-03T22:57:00.003+01:00</published><updated>2008-12-04T00:31:21.401+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hacker'/><category scheme='http://www.blogger.com/atom/ns#' term='traduction'/><title type='text'>Comment devenir un hacker</title><content type='html'>Ma première traduction de l'anglais au français, d'une dimension un tant soit peu consistante, est enfin en ligne. "&lt;a href="http://catb.org/~esr/faqs/hacker-howto.html"&gt;How To Become A Hacker&lt;/a&gt;" a son "&lt;a href="http://users.skynet.be/virus1984/hacker-howto-fr.html"&gt;Comment devenir un hacker&lt;/a&gt;".&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Pour ceux qui ne le connaissent pas, Eric Steven Raymond est l'auteur de "La Cathédrale et le Bazar" qui reste l'ouvrage de référence en matière de vulgarisation du mouvement open-source; il est également connu pour être le maintenant de "The Jargon File", pas moins. Une sommité dans la culture hacker, qui a publié pendant les douze dernières années un HOWTO assez particulier et unique en son genre. Beaucoup de traductions en existent, j'ai constaté une fois la mienne finie que des traductions françaises obsolètes existent, mais ne sont pas mentionnées dans l'original. Certaines ne mentionnent pas la version d'origine ou la date de traduction, beaucoup ne prennent même pas la peine de mentionner l'auteur original! C'est du propre...&lt;br /&gt;&lt;br /&gt;Un petit mot de clarification: on parle ici de "hacker" au sens Bill Joy, Linus Torvalds, Larry Wall, ... pas de "cracker" au sens Kevin Mitnick et autres douteux.&lt;br /&gt;&lt;br /&gt;Je vous invite à lire &lt;a href="http://users.skynet.be/virus1984/hacker-howto-fr.html"&gt;mon modeste travail&lt;/a&gt; et à me donner votre avis, afin que je puisse le perfectionner et qu'il s'approche de la qualité de l'original.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-5084989679048025567?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/5084989679048025567/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/12/comment-devenir-un-hacker.html#comment-form' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/5084989679048025567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/5084989679048025567'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/12/comment-devenir-un-hacker.html' title='Comment devenir un hacker'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-2584459477597642096</id><published>2008-11-29T13:21:00.003+01:00</published><updated>2008-11-29T13:25:22.580+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photo hdr'/><category scheme='http://www.blogger.com/atom/ns#' term='photo'/><category scheme='http://www.blogger.com/atom/ns#' term='photo panoramique'/><title type='text'>Une tentative panoramique en HDR</title><content type='html'>En fait, j'avais oublié, en même temps j'ai pris un panorama "presque 180°" de la même vue, qui a été passé la moulinette HDR aussi.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;On sent quand même le coté improvisé, il y a pas mal d'artefacts visibles, mais vivez chez moi et vous verrez ce que c'est de prendre vingt-cinq vues sans qu'une voiture de passage de n'y soit visible :)&lt;br /&gt;&lt;br /&gt;Enfin le résultat est quand même sympathique...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_9oCvnRQKziE/STE0YEb3PnI/AAAAAAAAAGI/8qijJZb_PBA/s1600-h/081127-Panorama.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 48px;" src="http://3.bp.blogspot.com/_9oCvnRQKziE/STE0YEb3PnI/AAAAAAAAAGI/8qijJZb_PBA/s200/081127-Panorama.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5274054226739674738" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-2584459477597642096?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/2584459477597642096/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/11/une-tentative-panoramique-en-hdr.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2584459477597642096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2584459477597642096'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/11/une-tentative-panoramique-en-hdr.html' title='Une tentative panoramique en HDR'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_9oCvnRQKziE/STE0YEb3PnI/AAAAAAAAAGI/8qijJZb_PBA/s72-c/081127-Panorama.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-6477682280015867125</id><published>2008-11-28T20:30:00.005+01:00</published><updated>2008-11-28T20:46:40.571+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photo hdr'/><category scheme='http://www.blogger.com/atom/ns#' term='photo'/><title type='text'>Une tentative en HDR</title><content type='html'>Hier le soleil perçait de façon plutôt jolie, du coup je me suis dit "tiens, voilà une occasion de faire quelques balbutiements en photo HDR histoire de voir ce que ça donne". Donc je ne me suis pas vraiment pris la tête et j'ai pris ce qui passait par la fenêtre.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Forcément, la portée artistique de la chose peut laisser sur sa faim... mais là n'est pas le propos. Pour les curieux, l'appareil est un compact Kodak M853, le logiciel est Photomatix Pro, j'ai pris 5 vues (-2 EV, -1 EV, 0 EV, +1 EV et +2 EV).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9oCvnRQKziE/STBJm6OzOAI/AAAAAAAAAFo/wbdtKFGmiYo/s1600-h/Set1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_9oCvnRQKziE/STBJm6OzOAI/AAAAAAAAAFo/wbdtKFGmiYo/s200/Set1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5273796096466040834" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_9oCvnRQKziE/STBJxhMbaGI/AAAAAAAAAFw/vQPKpnF-4-Y/s1600-h/Set2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_9oCvnRQKziE/STBJxhMbaGI/AAAAAAAAAFw/vQPKpnF-4-Y/s200/Set2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5273796278723766370" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Et pour se faire une idée, les mêmes à 0 EV:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9oCvnRQKziE/STBKMjQdDPI/AAAAAAAAAF4/svnvhsWsQKI/s1600-h/100_2562-01.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_9oCvnRQKziE/STBKMjQdDPI/AAAAAAAAAF4/svnvhsWsQKI/s200/100_2562-01.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5273796743133990130" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9oCvnRQKziE/STBKYdS1sdI/AAAAAAAAAGA/lNm1s88XSC8/s1600-h/100_2567-01.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_9oCvnRQKziE/STBKYdS1sdI/AAAAAAAAAGA/lNm1s88XSC8/s200/100_2567-01.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5273796947691811282" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A explorer...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-6477682280015867125?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/6477682280015867125/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/11/une-tentative-en-hdr.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6477682280015867125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6477682280015867125'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/11/une-tentative-en-hdr.html' title='Une tentative en HDR'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9oCvnRQKziE/STBJm6OzOAI/AAAAAAAAAFo/wbdtKFGmiYo/s72-c/Set1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-8377601960438757604</id><published>2008-11-25T21:11:00.001+01:00</published><updated>2008-11-25T21:13:20.184+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='msn'/><category scheme='http://www.blogger.com/atom/ns#' term='censure'/><category scheme='http://www.blogger.com/atom/ns#' term='wtf'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>De la censure à la volée sur MSN</title><content type='html'>Hier j'étais en grande conversation sur MSN (oui MSN, avec le client officier Microsoft Messenger, j'assume pleinement... c'est surtout que je me vois mal migrer tous mes amis vers Jabber, et les forcer ainsi à migrer leurs amis à eux et ainsi de suite...). Mon interlocuteur en vient à demander assistance pour l'installation d'un client BitTorrent. Simple, me dis-je, je vais lui faire télécharger et installer Vuze.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Je lui envoie donc un lien vers &lt;a href="http://azureus.sourceforge.net/download.php"&gt;http://azureus.sourceforge.net/download.php&lt;/a&gt; mais je reçois instantanément un message d'erreur me disant que mon message n'a pas été délivré. Qu'importe, copier, coller, je renvoie. Erreur. Je renvoie. Erreur. M'enfin? Pas de problème web, donc ma connexion est vivante, donc je delog et relog MSN, je renvoie... erreur! J'explique que j'ai des soucis... pas d'erreur. Alors là ça devient un peu paranormal. Essais effectués, il est évident que quand mon message contient le lien il ne passe pas, alors que tout autre message passe. Microsoft n'aimerait-il pas qu'on parle de Vuze? Non, trop spécifique, ce serait quand même paranoïaque.&lt;br /&gt;&lt;br /&gt;En fait, après vérifications curieuses, Microsoft n'aime pas la partie "download.php" du lien en question. Là ça devient vraiment intéressant!&lt;br /&gt;&lt;br /&gt;Après recherches, je ne suis pas le seul à avoir constaté ce genre de choses, au point que les portes-paroles du service MSN ont avoue qu'il y a un filtrage actif des messages au contenu dangereux, et qu'on s'en tire bien avec un message d'erreur parce qu'au départ ce filtrage était totalement silencieux. Sympa.&lt;br /&gt;&lt;br /&gt;L'idée est que quand on maintient le service de messagerie instantané par défaut dont le client est installé d'office sur tout exemplaire de son système d'exploitation à la sécurité légendairement gruyèresque, ledit service devient très vite vecteur de toutes sortes de saloperies déguisant dans d'innocent messages des liens somme toute innocents d'aspect mais menant vers l'enfer comme seuls les utilisateurs de Windows peuvent le connaître. En gros, certains noms de fichiers ou URLs sont symptomatiques de malwares variés utilisant la plateforme MSN pour se propager. Donc dans la logique microsoftienne, au lieu de corriger la plateforme on va filtrer les noms de fichiers et URLs douteux.&lt;br /&gt;&lt;br /&gt;Et c'est super marrant! La liste des noms de fichiers concernés est colossale, et les URLs concernés sont aussi amusants à parcourir... parce que sont concernés en particulier tout URL finissant en "gallery.php" ou "download.php". Donc une quantité colossale de pages de téléchargement ou de galeries innocentes se retrouvent ainsi interdites d'être citées via MSN. Délirant! Bien sûr Microsoft sait que les Gros Méchants Pirates™ qui veulent faire exploser tout PC du globe ne savent pas configurer un serveur web pour implémenter une simple redirection, ou plus simplement ne pas donner le suffixe ".php" à leur coupable code, ou encore plus simplement passer l'URL à une moulinette du type &lt;a href="http://tinyurl.com/"&gt;TinyURL&lt;/a&gt; qui le camouflera totalement... Les clochards qui dorment sur les bancs sont une nuisance? Supprimez les bancs!&lt;br /&gt;&lt;br /&gt;Bon ceci dit, si TinyURL est trop loin, ne perdez pas de vue qu'on parle de Microsoft, les esprits simples étant simples à tromper il vous suffit de remplacer un caractère de l'URL par sa valeur ASCII, par exemple passer de "download.php" à "d%6Fnload.php" et ça passe.&lt;br /&gt;&lt;br /&gt;A titre d'amusement, les interdits comportent entre autres:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;.scr&lt;/li&gt;&lt;br /&gt;&lt;li&gt;.info (sans dec' ! un TLD entier est exclu)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;mypictures*.zip&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Et &lt;a href="http://www.allocinit.net/blog/msn-blocked-phrases/"&gt;j'en passe beaucoup&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Tiens... pas de suffixe ".asp" ou ".aspx" dans les URLs-de-Satan... comme c'est étrange.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-8377601960438757604?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/8377601960438757604/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/11/de-la-censure-la-vole-sur-msn.html#comment-form' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/8377601960438757604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/8377601960438757604'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/11/de-la-censure-la-vole-sur-msn.html' title='De la censure à la volée sur MSN'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-4514539184876018783</id><published>2008-11-19T18:26:00.002+01:00</published><updated>2008-11-19T19:29:31.566+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='warcraft 3'/><category scheme='http://www.blogger.com/atom/ns#' term='musique'/><category scheme='http://www.blogger.com/atom/ns#' term='bd'/><category scheme='http://www.blogger.com/atom/ns#' term='diy'/><category scheme='http://www.blogger.com/atom/ns#' term='ma vie.com'/><title type='text'>Tant de choses...</title><content type='html'>Eh oui, ça fait plus d'une semaine que je n'ai rien posté, mais un éventuel attentif aura remarqué que je tweete encore des choses et d'autres. En bref et en simple, j'ai été assez occupé pour ne pas prendre le temps de rédiger un post digne de ce nom. Mais pour ne pas laisser le blog en désuétude, voici une mise à jour de choses et d'autres en vrac.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Bon ben en vrac...&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;Le projet dont je postais un petit teaser il y a de cela un mois avance plutôt bien étant donné son caractère pénible et long, les statuts "Phase 3:: xx%" c'est à ce sujet et j'en suis donc à la moitié de ladite phase 3, ce qui fait plaisir. Oui je garde le suspense, j'aime assez ça :)&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;Je me suis fait le plaisir de terminer la campagne de Warcraft III: Reign of Chaos. The Frozen Throne suivra, puis sûrement une exhumation de projets de mappings et d'add-ons à ce très pratique et confortable moteur. On dira ce qu'on voudra, mais les Warcafts sont des jeux de grande qualité!&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;Je me régale les zygomatiques en relisant des vieux strips des &lt;a href="http://comics.com/peanuts?Page=1"&gt;Peanuts&lt;/a&gt; aujourd'hui, ça ne perd pas de sa saveur avec l'âge au moins. Vive l'humour de qualité.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;Les oreilles quant à elles se régalent aussi ces temps-ci, que ce soit de la superbe compilation "Nightmare Revisited" ou de sons aussi divers et variés que les albums "Iconoclast" de Heaven Shall Burn, "Black Horse" de Nickelback, l'intégralité des albums studios d'Aerosmith, les indétrônables Creedence Clearwater Revival, ou des joyeusetés plus punky comme Oi Polloi, The Business, UK Subs...&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;En gros c'est ça, et une fois n'est pas coutume je parle de mon quotidien :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-4514539184876018783?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/4514539184876018783/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/11/tant-de-choses.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/4514539184876018783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/4514539184876018783'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/11/tant-de-choses.html' title='Tant de choses...'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-5317566697971803351</id><published>2008-11-11T10:51:00.001+01:00</published><updated>2009-07-07T10:08:08.626+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (c)'/><title type='text'>Project Euler: Solution au problème 6, en C</title><content type='html'>A l'heure où j'écris ceci, il y a en tout 216 problèmes dans la liste de Project Euler, ça demande un peu de productivité pour en trouver une solution avant que d'autres n'apparaissent. Dans l'immédiat voici une solution au &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=6"&gt;problème 6&lt;/a&gt;, sixième sur deux cents seize...&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;/* 2008/11/09 - euler6.c&lt;br /&gt; * Solution au Probleme 6 de Project Euler&lt;br /&gt; * http://projecteuler.net/index.php?section=problems&amp;id=6&lt;br /&gt; * Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt; */&lt;br /&gt; &lt;br /&gt;#include &amp;lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;int euler6(int range) {&lt;br /&gt;  unsigned int squaresum=0;&lt;br /&gt;  unsigned int sumsquare=0;&lt;br /&gt;  int i;&lt;br /&gt;  for (i=1; i&amp;lt;=range; i++) {&lt;br /&gt;    squaresum+=(i*i);&lt;br /&gt;    }&lt;br /&gt;  for (i=1; i&amp;lt;=range; i++) {&lt;br /&gt;    sumsquare+=i;&lt;br /&gt;  }&lt;br /&gt;  sumsquare*=sumsquare;&lt;br /&gt;  return (int)sumsquare-squaresum;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;int main(int argc, char** argv) {&lt;br /&gt;  printf("%i\n",euler6(100));&lt;br /&gt;  return 0;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-5317566697971803351?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/5317566697971803351/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/11/project-euler-solution-au-problme-6-en.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/5317566697971803351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/5317566697971803351'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/11/project-euler-solution-au-problme-6-en.html' title='Project Euler: Solution au problème 6, en C'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-4363131621375354338</id><published>2008-11-10T00:02:00.001+01:00</published><updated>2009-07-07T10:08:15.096+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (c)'/><title type='text'>Project Euler: Solution au problème 5, en C</title><content type='html'>Dans l'enchaînement, une solution au &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=5"&gt;problème 5&lt;/a&gt;, toujours en C. Attention, l'énoncé est particulièrement du type "on compte sur la vitesse d'exécution de l'ordinateur" et l'algorithme que j'ai vomi est particulièrement brutal et non-optimisé.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;/* 2008/11/09 - euler5.c&lt;br /&gt; * Solution au Probleme 5 de Project Euler&lt;br /&gt; * http://projecteuler.net/index.php?section=problems&amp;id=5&lt;br /&gt; * Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt; */&lt;br /&gt; &lt;br /&gt;#include &amp;lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;int euler5(int range) {&lt;br /&gt;  int smallest=2520;&lt;br /&gt;  int i;&lt;br /&gt;  while (smallest++) {&lt;br /&gt;    for (i=2; i&amp;lt;range+1; i++) {&lt;br /&gt;      if ((smallest % i) != 0) {&lt;br /&gt;        break;&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    if (i==range+1) {&lt;br /&gt;      return smallest;&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;int main(int arc, char** argv) {&lt;br /&gt;  printf("%i\n",euler5(20));&lt;br /&gt;  return 0;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-4363131621375354338?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/4363131621375354338/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/11/project-euler-solution-au-problme-5-en.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/4363131621375354338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/4363131621375354338'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/11/project-euler-solution-au-problme-5-en.html' title='Project Euler: Solution au problème 5, en C'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-2575674534394723295</id><published>2008-11-09T13:06:00.003+01:00</published><updated>2009-07-07T10:08:22.170+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (c)'/><title type='text'>Project Euler: Solution au problème 4, en C</title><content type='html'>Tiens ça fait une semaine sans code, pas bien!&lt;br /&gt;&lt;br /&gt;On va dire que j'avais une semaine chargée d'occupations d'ordre sérieux, et qu'un divertissement de geek n'avait pas exactement sa place dans mon agenda. Oui, ça fait crédible, disons ça. Enfin, toujours est-il que voici une solution au &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=4"&gt;problème 4&lt;/a&gt; du Project Euler, en C toujours parce que le C c'est le bien.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;/* 2008/11/09 - euler4.c&lt;br /&gt; * Solution au Probleme 4 de Project Euler&lt;br /&gt; * http://projecteuler.net/index.php?section=problems&amp;id=4&lt;br /&gt; * Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt; */&lt;br /&gt; &lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;#include &lt;math.h&gt;&lt;br /&gt;&lt;br /&gt;int ispalindrome(int n) {&lt;br /&gt;  int len = n &lt; 100000 ? 5 : 6;&lt;br /&gt;  while (len &gt; 1 ) {&lt;br /&gt;    if ((n / (int)pow(10.0,(float)--len)) != (n % 10)) {&lt;br /&gt;      return 0;&lt;br /&gt;      }&lt;br /&gt;    n = (n % (int)pow(10.0,(float)len--)) / 10;&lt;br /&gt;    }&lt;br /&gt;  return 1;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;int euler4() {&lt;br /&gt;  int x,y;&lt;br /&gt;  int product;&lt;br /&gt;  int biggest=0;&lt;br /&gt;  for (x=100; x&amp;lt;999; x++) {&lt;br /&gt;    for (y=x; y&amp;lt;999; y++) {&lt;br /&gt;      product=x*y;&lt;br /&gt;      if (ispalindrome(product)) {&lt;br /&gt;        biggest = (product &gt; biggest) ? product : biggest;&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  return biggest;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;int main(int argc, char** argv) {&lt;br /&gt;  printf("%i\n",euler4());&lt;br /&gt;  return 0;&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;C'est presque élégant d'ailleurs...&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-2575674534394723295?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/2575674534394723295/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/11/project-euler-solution-au-problme-4-en.html#comment-form' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2575674534394723295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2575674534394723295'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/11/project-euler-solution-au-problme-4-en.html' title='Project Euler: Solution au problème 4, en C'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-950398988097620166</id><published>2008-11-06T00:44:00.006+01:00</published><updated>2008-11-06T00:52:29.503+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photo'/><category scheme='http://www.blogger.com/atom/ns#' term='humour'/><category scheme='http://www.blogger.com/atom/ns#' term='physique'/><title type='text'>Le paradoxe du piéton de Schrödinger</title><content type='html'>Tout le monde connaît, au moins de nom, le paradoxe dit du "chat de Schrödinger". En bref et pour épargner les neurones d'avant-café, c'est une illustration des bizarreries de la physique quantique au moyen d'un chat mort-vivant (comme "mort et vivant", pas comme "it's just a thriller night"), en gros la mise du chat dépendant de la désintégration d'une particule, et la particule pouvant être à la fois désintégrée ou non, le chat est à la fois vivant et mort tant qu'on a pas fixé son état en l'observant. Ça s'applique aussi aux piétons.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Le dispositif est du même type que celui du chat de notre malicieux Schrödinger: soit un piéton dont le déplacement au travers d'un passage &lt;i&gt;ad hoc&lt;/i&gt; est régi par l'état d'un feu lui indiquant s'il peut ou non franchir la chaussée. Si le feu est à la fois rouge et vert, le piéton est à la fois sur le trottoir et sur la route, donc il est à la fois en sécurité et en train de se faire écraser par un bus TEC (dont il est un fait établi que le chauffeur ne freine pas même en présence d'un piéton sur sa route), à la fois vivant et mort. Le piéton est donc un piéton de Schrödinger.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_9oCvnRQKziE/SRIxIC1AOBI/AAAAAAAAAFg/0RRask50a-Y/s1600-h/081106-Feu-Schrodinger.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 150px; height: 200px;" src="http://1.bp.blogspot.com/_9oCvnRQKziE/SRIxIC1AOBI/AAAAAAAAAFg/0RRask50a-Y/s200/081106-Feu-Schrodinger.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5265324928617429010" /&gt;&lt;/a&gt;&lt;br /&gt;Le phénomène peut être observé à l'œil nu à proximité de la Place du 20 Aout, à Liège.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-950398988097620166?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/950398988097620166/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/11/le-paradoxe-du-piton-de-schrdinger.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/950398988097620166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/950398988097620166'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/11/le-paradoxe-du-piton-de-schrdinger.html' title='Le paradoxe du piéton de Schrödinger'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_9oCvnRQKziE/SRIxIC1AOBI/AAAAAAAAAFg/0RRask50a-Y/s72-c/081106-Feu-Schrodinger.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-1574729487559013007</id><published>2008-11-04T06:57:00.002+01:00</published><updated>2009-07-07T10:08:29.813+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (c)'/><title type='text'>Project Euler: Solution au problème 3, en C</title><content type='html'>Toujours dans la série des problèmes du Project Euler, voici ma solution au &lt;a&gt;problème 3&lt;/a&gt;, en C toujours, mais qui m'embête un peu parce que je sors du contexte ANSI/ISO C en utilisant une librairie GNU pour la manipulation de nombre atrocement grand.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;D'ailleurs au passage, n'ayant pas d'expérience en manipulation de &lt;i&gt;big-integers&lt;/i&gt;, je suis preneur de toute sagesse sur le sujet.&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;/* 2008/11/01 - euler3.c&lt;br /&gt; * Solution au Probleme 3 de Project Euler&lt;br /&gt; * http://projecteuler.net/index.php?section=problems&amp;id=3&lt;br /&gt; * Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt; */&lt;br /&gt; &lt;br /&gt;#include &amp;lt;stdio.h&gt;&lt;br /&gt;#include &amp;lt;imath.h&gt;&lt;br /&gt;#define MAXPRIMES 200000&lt;br /&gt;&lt;br /&gt;int findprimes(int primes[], unsigned long long maxvalue) {&lt;br /&gt;  primes[0]=2; /* le premier premier */&lt;br /&gt;  int numfound=1;&lt;br /&gt;  int i,j;&lt;br /&gt;  int pri; /* pri=0 si divisible */&lt;br /&gt;  for (i=3; i&amp;lt;maxvalue; i+=2) {&lt;br /&gt;    pri=1; /* jusqu'a preuve du contraire */&lt;br /&gt;    for (j=0; j&amp;lt;numfound; j++) {&lt;br /&gt;      if ((i%primes[j])==0) {&lt;br /&gt;        pri=0;&lt;br /&gt;        break;&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;     if (pri) {&lt;br /&gt;       primes[numfound++]=i;&lt;br /&gt;       }&lt;br /&gt;    }&lt;br /&gt;  return numfound;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;int euler3(unsigned long long n) {&lt;br /&gt;  int foundprimes[MAXPRIMES];&lt;br /&gt;  int numfound=findprimes(foundprimes,lsqrt64(n));&lt;br /&gt;  int i;&lt;br /&gt;  for (i=numfound; i&gt;=0; i--) {&lt;br /&gt;    if ((n%foundprimes[i])==0) {&lt;br /&gt;      break;&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  return i==-1 ? i : foundprimes[i];&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;int main(int argc, char** argv) {&lt;br /&gt;  printf("%i\n",euler3(600851475143ull)); /* Y'a pas encore plus grand? */&lt;br /&gt;  return 0;&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-1574729487559013007?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/1574729487559013007/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/11/pe-solution-au-problme-3-en-c.html#comment-form' title='4 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1574729487559013007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1574729487559013007'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/11/pe-solution-au-problme-3-en-c.html' title='Project Euler: Solution au problème 3, en C'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-3053011478990016612</id><published>2008-11-03T07:14:00.002+01:00</published><updated>2009-07-07T10:08:36.343+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (c)'/><title type='text'>Project Euler: Solution au problème 2, en C</title><content type='html'>Le problème 1 était un sympathique mise en bouche, voici ma solution au &lt;a href="http://projecteuler.net/index.php?section=problems&amp;id=2"&gt;problème 2&lt;/a&gt;, en C.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;J'y tente même un brin d'optimisation, puisque je ne garde en mémoire que maximum 3 termes de la suite de Fibonacci à un moment donné :)&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;/* 2008/11/01 - euler2.c&lt;br /&gt; * Solution au Probleme 2 de Project Euler&lt;br /&gt; * http://projecteuler.net/index.php?section=problems&amp;id=2&lt;br /&gt; * Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt; */&lt;br /&gt; &lt;br /&gt;#include &amp;lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;int euler2(int n) {&lt;br /&gt;  int sum=0;&lt;br /&gt;  int fib1=0;&lt;br /&gt;  int fib2=1;&lt;br /&gt;  int fib3;&lt;br /&gt;  while (fib2&amp;lt;n) {&lt;br /&gt;    if ((fib2%2)==0) {&lt;br /&gt;      sum+=fib2;&lt;br /&gt;      }&lt;br /&gt;    fib3=fib1+fib2;&lt;br /&gt;    fib1=fib2;&lt;br /&gt;    fib2=fib3;&lt;br /&gt;    }&lt;br /&gt;  return sum;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;int main(int argc, char** argv) {&lt;br /&gt;  printf("%i\n",euler2(4000000));&lt;br /&gt;  return 0;&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-3053011478990016612?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/3053011478990016612/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/11/pe-solution-au-problme-2-en-c.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/3053011478990016612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/3053011478990016612'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/11/pe-solution-au-problme-2-en-c.html' title='Project Euler: Solution au problème 2, en C'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-6343708060698187903</id><published>2008-11-02T08:25:00.004+01:00</published><updated>2009-07-07T10:08:43.125+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='project euler'/><category scheme='http://www.blogger.com/atom/ns#' term='code (c)'/><title type='text'>Project Euler: Solution au problème 1, en C</title><content type='html'>Pour ceux qui ne le connaissent pas encore, le &lt;a href="http://projecteuler.net/"&gt; Project Euler&lt;/a&gt; est un projet lancé par Colin Hughes initialement sur &lt;a href="http://mathschallenge.net/"&gt;MathsChallenge.net&lt;/a&gt; en 2001, mais qui depuis a tellement grandi qu'il est un site à part entière.&lt;br /&gt;&lt;br /&gt;L'idée est sympathique, il s'agit d'une série de problèmes de mathématiques qui sont conçus pour etre résolus à l'aide d'un programme, et présentés par ordre croissant de difficulté.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Bien sur, pour chaque problème il y a plusieurs manières d'atteindre la solution, selon le critère de perfection choisi, et plusieurs implémentations en plusieurs langages. Voici ma solution au &lt;a href="http://projecteuler.net/index.php?section=problems&amp;amp;id=1"&gt;Problème 1&lt;/a&gt;, en C:&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;pre&gt;&lt;br /&gt;/* 2008/11/01 - euler1.c&lt;br /&gt; * Solution au Probleme 1 de Project Euler&lt;br /&gt; * http://projecteuler.net/index.php?section=problems&amp;id=1&lt;br /&gt; * Jean Karim Bockstael - jkb@jkbockstael.be&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;#include &amp;lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;int euler1(int n) {&lt;br /&gt;  int sum=0;&lt;br /&gt;  int i;&lt;br /&gt;  for (i=3; i&amp;lt;n; i++) { /* 1 et 2 sont hors-probleme */&lt;br /&gt;    if (((i%3)==0) || ((i%5)==0)) {&lt;br /&gt;      sum+=i;&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  return sum;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;int main(int argc, char** argv) {&lt;br /&gt;  printf("%i\n",euler1(1000));&lt;br /&gt;  return 0;&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-6343708060698187903?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/6343708060698187903/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/11/pe-solution-au-problme-1-en-c.html#comment-form' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6343708060698187903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6343708060698187903'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/11/pe-solution-au-problme-1-en-c.html' title='Project Euler: Solution au problème 1, en C'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-6885610559963338796</id><published>2008-11-01T08:25:00.002+01:00</published><updated>2008-11-01T08:34:43.362+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><title type='text'>CC-by-nc</title><content type='html'>Un titre cryptique ça attire le regard. Pourtant celui-ci dit tout. Le contenu de ce blog est, sauf mention contraire, la propriété de son auteur, lequel se réserve tous les droits qui vont avec. Évidemment, quand on demande poliment, l'auteur peut céder une partie de ces droits au cas-par-cas.&lt;br /&gt;&lt;br /&gt;Mais voilà, l'auteur se met à publier du code source, qu'il aimerait voir utile à d'autres; pour plus d'efficacité ledit code doit être explicitement libéré de certains droits afin d'être utilisable immédiatement. Donc les posts qui sont taggés "cc-by-nc" voient leur contenu mis à disposition sous licence "Creative Commons: Attribution, Non-Commercial".&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Un mot d'explication en gros: les licences Creative Commons sont un moyen efficace de publier ce que l'on veut (pourvu qu'on en soit l'auteur, évidemment) en gardant certain ou tous les droits, mais en gardant quand même une couverture légale complète. Certains me diront "oui mais c'est du code, balance-ça sous GPL!" et j'y oppose que la GPL impose de redistribuer tout dérivé également sous GPL; ce qui est en directe contradiction avec un usage académique, puisque le plus souvent les travaux académiques deviennent propriété de l'académie en question. Une CC-by-nc est donc plus souple: tout ce que je demande c'est qu'on me cite pour mon travail, et qu'on ne fasse pas d'argent sur mon travail sans m'en demander l'autorisation au préalable.&lt;br /&gt;&lt;br /&gt;Pour éviter de peupler mes posts de petits badges mignons, c'est le système de tagging du blog qui servira d'indication. Tout ce qui est sous license &lt;i&gt;Creative Commons Attribution Non-Commercial&lt;/i&gt; est pourvu du tag "cc-by-nc", je procéderai de façon similaire si d'autres parties sont sous d'autres licences.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-6885610559963338796?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/6885610559963338796/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/11/cc-by-nc.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6885610559963338796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/6885610559963338796'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/11/cc-by-nc.html' title='CC-by-nc'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-7948785299175036887</id><published>2008-11-01T07:48:00.003+01:00</published><updated>2008-11-01T08:35:17.777+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='rot13'/><category scheme='http://www.blogger.com/atom/ns#' term='code (c)'/><title type='text'>Rot13 en C</title><content type='html'>La série continue, cette fois-ci avec une implémentation portable en ANSI/ISO C, pondue avant le premier café. Ce n'est pas la plus rapide ou la plus compacte, mais elle me semble assez élégante et portable pour être montrée. Et je ne pouvais pas le pas le faire en C, faut un minimum de savoir-vivre quand même...&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;/* Rot13 en ISO/ANSI C&lt;br /&gt; * Cette fonction convertit le caractere qu'on lui passe&lt;br /&gt; */&lt;br /&gt; &lt;br /&gt;int rot13(int c) {&lt;br /&gt;  if (c &gt;= 'A' &amp;&amp; c &lt;= 'Z') {&lt;br /&gt;    return ((c+13)%('Z'+1))+'A'&lt;br /&gt;    }&lt;br /&gt;  else if (c &gt;='a' &amp;&amp; c &lt;= 'z') {&lt;br /&gt;    return ((c+13)%('z'+1))+'a'&lt;br /&gt;    }&lt;br /&gt;  else {&lt;br /&gt;    return c&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;On ne me contredira plus si je dis "je fais du C au petit déjeuner".&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-7948785299175036887?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/7948785299175036887/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/11/rot13-en-c.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/7948785299175036887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/7948785299175036887'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/11/rot13-en-c.html' title='Rot13 en C'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-1496658099895641751</id><published>2008-10-31T13:43:00.003+01:00</published><updated>2008-10-31T13:52:06.872+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ma vie.com'/><title type='text'>HOWTO: Bouter le feu à sa cuisine</title><content type='html'>Pour tous ceux qui voudraient faire une arnaque à l'assurance, ou simplement ceux qui devraient profiter de la distraction des autres pour se remettre à un peu plus de prudence: une recette d'incendie.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;La préparation est simple:&lt;br /&gt;&lt;list&gt;&lt;br /&gt;&lt;li&gt;Avoir envie de se mitonner un quelque chose de chaud.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Constater l'encombrement du plan de travail.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Faire de la place en posant une planche à pain sur une plaque de cuisson.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Poser sur la plaque voisine une poele qu'on désire faire chauffer.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Se tromper de bouton.&lt;/li&gt;&lt;br /&gt;&lt;/list&gt;&lt;br /&gt;Ma plaque est vitrocéramique, mais je pense que ça peut fonctionner avec n'importe quel type de plaque de cuisson, sauf à induction. Le résultat sera sûrement plus rapide avec une cuisinière à gaz. En tout cas, les flammes qui se déclenchent dès qu'on prend la planche en main sont du plus bel effet :)&lt;br /&gt;&lt;br /&gt;C'est du propre hein?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_9oCvnRQKziE/SQr_K9FijiI/AAAAAAAAAFY/LLVlUINNqMg/s1600-h/100_2206-01.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_9oCvnRQKziE/SQr_K9FijiI/AAAAAAAAAFY/LLVlUINNqMg/s200/100_2206-01.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5263299678197419554" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;les enfants, n'essayez pas ça chez vous...&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-1496658099895641751?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/1496658099895641751/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/10/howto-bouter-le-feu-sa-cuisine.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1496658099895641751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/1496658099895641751'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/10/howto-bouter-le-feu-sa-cuisine.html' title='HOWTO: Bouter le feu à sa cuisine'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_9oCvnRQKziE/SQr_K9FijiI/AAAAAAAAAFY/LLVlUINNqMg/s72-c/100_2206-01.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-7512009540770332353</id><published>2008-10-30T06:40:00.000+01:00</published><updated>2008-11-01T08:35:17.778+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='rot13'/><category scheme='http://www.blogger.com/atom/ns#' term='code (bash)'/><title type='text'>Rot13 en Bash</title><content type='html'>Deuxième de la série, pour les "un peu plus geeks" ou simplement ceux qui n'utilisant pas Mac OS n'en ont absolument rien à faire de l'AppleScript: une implémentation en Bash.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Extraite de mon &lt;code&gt;.bashrc&lt;/code&gt; parce que je le vaux bien:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;rot13 () { # Peut etre utilise comme filtre ou commande&lt;br /&gt;  if [ $# -eq 0 ] ; then&lt;br /&gt;    tr '[a-m][n-z][A-M][N-Z]' '[n-z][a-m][N-Z][A-M]'&lt;br /&gt;  else&lt;br /&gt;    echo $* | tr '[a-m][n-z][A-M][N-Z]' '[n-z][a-m][N-Z][A-M]'&lt;br /&gt;  fi&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;La suite au prochain épisode... et pour que ça aille plus vite, s'il y a des volontaires pour proposer des implémentations dans d'autres langages, je suis preneur!&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-7512009540770332353?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/7512009540770332353/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/10/rot13-en-bash.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/7512009540770332353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/7512009540770332353'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/10/rot13-en-bash.html' title='Rot13 en Bash'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8957427119997194894.post-2210472272696030726</id><published>2008-10-29T06:47:00.002+01:00</published><updated>2008-11-01T08:35:17.778+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cc-by-nc'/><category scheme='http://www.blogger.com/atom/ns#' term='rot13'/><category scheme='http://www.blogger.com/atom/ns#' term='code (applescript)'/><title type='text'>Rot13 en AppleScript</title><content type='html'>La page de Jay Kominek sur le sujet n'étant pas mise à jour depuis 2004, je commence ma collection d'implémentations du Rot13 par la contribution que je lui avais envoyé, en pur AppleScript. Pour ceux qui ne savent pas ce qu'est le Rot13, c'est simplement le Chiffre de César, avec un décalage de 13 lettres pour être soi-même sa propre fonction inverse. Elegant et omniprésent.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;En AppleScript donc (avec très longues lignes):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;(* Rot13 in pure AppleScript&lt;br /&gt; * 2006-08-10 - waw, pas d'hier!&lt;br /&gt; * Jean Karim Bockstael&lt;br /&gt; *)&lt;br /&gt;on rot13(inputString)&lt;br /&gt; set lowercaseChars to "abcdefghijklmnopqrstuvwxyz"&lt;br /&gt; set uppercaseChars to "ABCDEFGHIJKLMNOPQRSTUVWXYZ"&lt;br /&gt; set tempOutput to ""&lt;br /&gt; considering case&lt;br /&gt;  repeat with theChar in inputString&lt;br /&gt;   if ((offset of theChar in uppercaseChars) is not 0) then&lt;br /&gt;    try&lt;br /&gt;     set tempOutput to tempOutput &amp; (character ((((offset of theChar in uppercaseChars) + 13) mod 26) + 0) in uppercaseChars)&lt;br /&gt;    on error&lt;br /&gt;     set tempOutput to tempOutput &amp; "Z"&lt;br /&gt;    end try&lt;br /&gt;   else if ((offset of theChar in lowercaseChars) is not 0) then&lt;br /&gt;    try&lt;br /&gt;     set tempOutput to tempOutput &amp; (character ((((offset of theChar in lowercaseChars) + 13) mod 26) + 0) in lowercaseChars)&lt;br /&gt;    on error&lt;br /&gt;     set tempOutput to tempOutput &amp; "z"&lt;br /&gt;    end try&lt;br /&gt;   else&lt;br /&gt;    set tempOutput to tempOutput &amp; theChar&lt;br /&gt;   end if&lt;br /&gt;  end repeat&lt;br /&gt; end considering&lt;br /&gt;end rot13&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Premier d'une longue série, je l'éspère :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8957427119997194894-2210472272696030726?l=blog.jkbockstael.be' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.jkbockstael.be/feeds/2210472272696030726/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://blog.jkbockstael.be/2008/10/rot13-en-applescript.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2210472272696030726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8957427119997194894/posts/default/2210472272696030726'/><link rel='alternate' type='text/html' href='http://blog.jkbockstael.be/2008/10/rot13-en-applescript.html' title='Rot13 en AppleScript'/><author><name>JKB</name><uri>http://www.blogger.com/profile/14128397040730646560</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_9oCvnRQKziE/SxgHQUZ11II/AAAAAAAAANg/hx7DDJpoDB0/S220/2009-05-01.jpg'/></author><thr:total>0</thr:total></entry></feed>
