Exercice SICP 1.10
J’ai terminé la lecture du premier chapitre de SICP et j’ai commencé à m’attaquer aux exercices qui se sont entassés au fur et à mesure de ma progression. Initialement, je pensais les faire directement durant ma lecture mais ma flemme ajoutée à mon envie d’avancer dans la lecture du bouquin m’y ont découragé. L’avantage de devoir revenir maintenant sur les exercices c’est que j’ai la possibilité de revoir - par la pratique cette fois-ci - les concepts que j’ai passivement lu dans le livre. A mon avis celà devrait graver d’autant mieux la matière dans mon esprit…. Soit mais bon maintenant le titre de ce billet n’attendait ni plus ni moins la solution de l’exercice 1.10! Donc nous y voilà, je mets ici ma solution parce qu’elle m’a pris pas mal de ligne à l’expliquer et je ne veux pas trop poluer ma page dédiée aux exercices de SICP… Cet exercice propose de prédire le résultat de la fonction d’Ackermann (générateur de grands nombres très rapide grâce à la récursivité) au vu de certains paramètres donnés. La fonction d’Ackermann est fournie par le livre:
(define (A x y)
(cond ( (= y 0) 0)
( (= x 0) (* 2 y))
( (= y 1) 2)
(else (A (- x 1) (A x (- y 1))))))
Mon objectif a été de résoudre qu’un seul des trois exercices proposés:
(A 2 4)
(A 1 (A 2 3))
(A 2 3) = 16
(A 1 (A 2 2))
(A 2 2) = 4
(A 1 (A 2 1))
(A 1 2)
(A 1 2)
(A 0 (A 1 1))
(A 0 2)
4
(A 1 4) = 16
(A 0 (A 1 3))
(A 1 3)
(A 0 (A 1 2))
(A 0 4) = 8
(A 1 16) = 2 ^16 = 65536
En espérant être assez clair, j’ai procédé la fonction en suivant l ‘applicative-order pour ne pas finir avec une ligne immense mais plutôt remplacer chaque appel de fonction avec la valeur calculée. Ce qui finalement nous amène à (A 1 16). A ce moment-là, j’aurais pu continuer le processing jusque trouver la solution mais on peut constater une abstraction lorsque la fonction d’Ackerman est appelée suivant le motif (A 1 n):
- (A 1 2) = 4
- (A 1 3) = 8
- (A 1 4) = 16
Autrement dit, (A 1 n) = 2 ^ n et donc (A 1 16) = 2 ^ 16 = 65536. Trouver ce motif permet en plus de répondre à la 2ème partie de la question:
(define (f n) (A 0 n)) = 2*n
(define (g n) (A 1 n)) = 2^n
(define (h n) (A 2 n)) = 2 ^ 2 ^ 2 ... n fois
La dernière se retrouve également dans la preuve de (A 2 4):
-
(A 2 3) = 16 = 2 ^ 2 ^ 2
-
(A 2 2) = 4 = 2 ^ 2
-
(A 2 1) = 2 = 2 ^ 1 (cas spécial dans la fonction)
Si ce genre d’exercices vous intéressent, je ne peux que vous conseiller la lecture de SICP!
order_evaluation#Applicative_order
Critique de livre: Getting Things Done de David Allen
Waow ça claque! Ce livre, c’est juste une merveille! A lire absolument, qui que vous soyez! Au premier coup d’œil on pourrait penser qu’il est plutôt destiné à une audience de managers et autres cadres mais croyez-moi, loin s’en faut! Il est destiné à toutes personnes qui a des projets. Et un projet c’est quoi? Simplement un ensemble d’actions destiné à atteindre un objectif prédéfini…. Or qui n’a pas d’objectif même tout petit petit? PERSONNE!
Nous abordons tous différemment la gestion de nos petits projets mais si vous avez déjà eu des réflexions du genre “ce serait tellement bien que j’arrive à…” ou encore “je devrais faire ça…. ah quand j’aurai le temps” la suite peut vous intéresser….
Vider sa tête
L’une des premières étapes qui ressort du livre et sur laquelle David Allen insiste beaucoup c’est de faire une liste exhaustive de TOUS les projets actuels. Cela va des courses pour la semaine à l’achat d’une maison en passant par les projets professionnels actuels. Passer par cette étape et la faire jusqu’au bout permettra de se vider la tête et de pouvoir se focaliser entièrement sur les tâches à faire. Mais comment être sûr d’avoir tous listé? GTD répond:
When nothing else shows up as a reminder in your mind.
Il est donc bien de s’arrêter et de prendre le temps de faire cette liste le plus consciencieusement possible. Le problème c’est que souvent quand on a une idée ou un rappel en tête, on a rien pour notifier ce rappel. D’où ce conseil:
Keep good writing tools around all the time so you never have any unconscious resistance to thinking due to not having anything to capture it with.
L’idée est là: ne plus avoir une seule trace de résistance inconsciente dans la tête. Lister tous ses projets et définir la prochaine action concrète à faire sur chacun d’eux. Voilà peut-être la meilleure façon d’améliorer significativement sa productivité.
Avoir un objectif clair
Ça parait évident mais l’auteur va très loin en conseillant de le faire de manière très concrète. Je m’explique en deux points. Premièrement, il faut vraiment définir ce qu’il faut produire. Quel est le but de ce projet? Dans l’idéal, à quoi ressemblerait la réalisation de mon projet? Telles sont des questions qui peuvent vraiment aider à définir cet objectif.
Everything you experience as incomplete must have a reference point for “complete”.
Deuxièmement, il faudrait définir un objectif à très court terme. Pour dire vrai l’objectif de la toute prochaine action. Cet objectif doit être très concret; c’est une** action physique qui doit se voir** (téléphoner un tel, écrire ce mail, programmer cet algorithme). De ce fait, en définissant une action concrète pour chacun des projets en cours, jamais plus vous ne devriez vous sentir comme un moustique…
I am rather like a mosquito in a nudist camp; I know what I want to do, but I don’t know where to begin. - Stephen Bayne
Blague mise à part, c’est la formule magique pour améliorer sa capacité de concentration et son sens des priorités.
Conclusion
C’est une véritable méthodologie qui a été mise au point ici par David Allen et je n’ai fait que mettre en avant 2 étapes qui m’ont semblées importantes mais croyez-moi, ce livre est une mine d’or. Si vous avez l’envie de réaliser vos projets et mener une vie moins stressante tout en étant plus productive, ce livre est fait pour vous. Mais comme je le disais, il est utile à tout le monde, lisez-le, lisez-le, lisez-le! Pour aller plus loin: http://www.thesimpledollar.com/2007/05/06/review-getting-things-done/ (en anglais)
Traitement de fichiers PDF en python et un client satisfait
Si vous lisez ce blog, vous savez que j’aime bien Java et Flex. Mais lorsqu’on a besoin de faire des traitements typiquement automatisés et accédant au système ou ne demandant aucune interaction graphique avec l’utilisateur ces langages ne sont certainement pas les mieux adaptés. Je ne vais pas m’étendre sur cette assertion maintenant… Ca pourrait faire le sujet d’un autre billet tiens… Mon choix personnel du moment pour ce type d’action porte sur Python. ((Python is a dynamic object-oriented programming language that can be used for many kinds of software development. - www.python.org)) Le but ici n’est pas de défendre les atouts de Python. Ceux-ci sont déjà largement reconnus par les développeurs. Le nombre de projets open-source l’atteste tout comme le classement TIOBE évoqué il y a quelques temps. Récemment j’ai eu la joie de faire un petit développement en freelancing ayant pour but un simple traitement de fichiers PDF. Python a une nouvelle fois pleinement répondu à mes attentes. Ce que j’aime principalement lorsque je développe en Python c’est sa simplicité et de ce fait la rapidité de développement associée, le nombre de librairies disponibles ou encore un code naturellement facile à lire. Pour ce projet, le workflow était le suivant:
-
Lister tous les fichiers PDF du dossier courant
-
Parser chaque fichier et récupérer le texte le plus haut dans la première page
-
Enregistrer le fichier avec cette valeur
Très simple en apparence. Mais c’est sans compter sur le fait que les fichiers PDF ont une structure disons pas très naturelle. J’ai donc du passer un certain temps à comprendre cette structure. Pour ce faire j’ai utilisé la libraire PDFMiner codée par Yusuke Shinyama qui a fait un excellent boulot en l’occurence. Après avoir atteint ces 3 objectifs j’ai simplement du me pencher sur les possibilités de python à compiler le tout en exécutable Mac… Et là c’est stackoverflow qui m’a aidé… py2app m’a permis de compiler le tout et hop le tour est joué! Sur ce, l’expérience python m’a une fois de plus convaincu mais qu’est-ce qu’en a pensé mon client? Aussi clair qu’un code Python:
Test réussi! C’est parfait. Je vous remercie beaucoup de l’excellente collaboration.
Ca fait toujours plaisir :D
Critique de livre: Toute l'histoire du monde
J’ai été carrément scotché par le résumé fait au dos du livre:
Il y a un siècle, ceux qui savaient lire savaient aussi se situer dans l’espace et dans le temps. Il n’en est plus ainsi. Les Français, et d’ailleurs tous les Occidentaux, sont devenus, pour la plupart, des hommes sans passé, des " immémorants “. Notre modernité fabrique, hélas, davantage de consommateurs-zappeurs interchangeables que de citoyens responsables, désireux de comprendre et de construire. Est-il possible de déchiffrer l’actualité sans références historiques ? Comment situer, par exemple, les guerres d’Irak sans avoir entendu parler de la Mésopotamie ? On voit tout, tout de suite, en direct, mais on ne comprend rien. D’où l’idée simple, ambitieuse et modeste à la fois, d’écrire un livre assez court qui soit un récit de l’histoire du monde, fermement chronologique, pour tous ceux qui souhaitent " s’y retrouver " et situer leur destin personnel dans la grande histoire collective de l’espèce humaine.
Après percution donc j’ai acheté ce livre et été rapidement séduit par le récit. On navigue au travers de l’histoire humaine du début jusqu’à maintenant. Ou comment avoir une rapide vision globale de notre monde… J’ai assez aimé; bien qu’à force c’est tout de même triste de constater que l’une des seule choses communes à tous les hommes, c’est l’envie de dominer son prochain… Pour finir par des guerres, génocides, dictatures, etc. Triste monde! Heureusement les auteurs n’oublient tout de même pas de relever le génie de certains personnages marquants (Ératosthène, Bouddha, Platon, Archimède, Voltaire, Mozart et j’en passe); ca fait quand meme du bien de se rappeler que l’homme est capable de bonnes choses. Bref, je recommande ce livre à tous ceux qui ont envie de faire un lien rapide entre les différentes puissances mondiales qui se sont succédées et comment d’un point de vue politique le monde à évolué pour en arriver là où nous sommes.
Apprentissage de Flex
Alors que j’ai bien de la peine à avancer ma progression en ce qui concerne SICP (la pile d’exercices est effrayante, j’ai stoppé la lecture du bouquin..), j’ai commencé mon apprentissage de Flex. Par chance je suis bien plus sérieux de coté-là. Allez savoir pourquoi… Enfin bref, je ne veux pas lâcher SICP ça c’est sûr (la lecture en est très instructive) mais comme j’aime à le faire, j’ai commencé à reporter ce que j’apprends sur Flex dans un document que je mets à disposition de qui voudra (en ~anglais). Je le mets à jour à mesure de mon avancement, n’hésitez donc pas à le consulter régulièrement. Ce sont des notes en vrac mais qui peuvent être utiles pour tout nouvel arrivant sur Flex, enfin je l’espère! Quelques resources à ceux qui voudraient également se lancer dans cette aventure:
- La série LFFS sur InsideRIA
- Flex in a Week conçu par Adobe
Et bien sûr comme toujours, je suis preneur de tout conseils ou suggestions dans cet apprentissage.
Stackoverflow en version publique
L’info cours sur la toile: l’ouverture d’une nouvelle plateforme programming Q&A complètement ouverte et gratuite. Cette nouvelle plateforme a pour nom stackoverflow et a été initiée par (non des moindres) les auteurs des blogs Coding Horror et Joel on Software, j’ai nommé Jeff Atwood et Joel Spolsky. Ce genre de plateforme tient son existence principalement à la communauté qui la suit. Dès lors j’espère vraiment que soutient il y aura et que le genre de “souci” que Joel décrit dans son billet disparaîtra bel et bien, autrement dit, dès qu’une question se profile… Je ne tape non plus google.com (avec ses inconvénients lors de questions précises..) mais plutôt stackoverflow.com! L’idée est très bonne et les initiateurs sont des gars très talentueux, on peut donc se dire qu’on est entre de bonnes mains et que si espoir il devait y avoir, on est en tout cas bien parti pour que ça prenne bonne forme.

A ma première impression, je vois un design épuré, une navigation conviviale et rapide. Je vois également que les auteurs s’impliquent au niveau du contenu de la plateforme et ca c’est plutôt pas mal… Il ne reste donc plus qu’à voir comment va réagir la communauté et si l’engouement passé, un réel groupement de développeurs va venir enrichir le contenu de ce:
synthesize aspects of Wikis, Blogs, Forums, and Digg/Reddit in a way that is somewhat original
On croise les doigts!
Netbeans et PHP
Non je n’ai toujours pas jeté un oeil au support PHP (ni python d’ailleurs) proposé par Netbeans. Et pourtant j’encourageais à le faire il y a peu…. Bref c’est pas grave, une séance de rattrapage est proposée par les éditeurs de Netbeans TV avec ce screencast:
En moins de 10 minutes, on y aborde l’intégration d’un projet PHP (wordpress) couplée à la gestion de sa base de données (MySQL) mais aussi du debugging et la traditionnelle completion syntaxique. Ca vaut vraiment le coup de le visionner en plus accompagné par un accent indien toujours aussi sympa!
Merck Serono, 1er retour d'expérience
Cela fait maintenant quelques mois que je suis en mission chez Merck Serono et comme à l’accoutumée, changement d’environnement de travail, gain d’expérience! Si je voulais faire une petite rétro perspective, je pourrais dire que j’en ai surtout appris au niveau de l’organisation de **mon **travail. Et sous ce rapport j’aime assez ce qu’a dit Ralph Waldo Emerson:
L’ancêtre de chaque action est une réflexion.
C’est si facilement dit; et pourtant ce n’est que depuis mon passage chez Merck que je me rends compte combien il est important au début de chaque journée de réfléchir à ce qu’il y a à faire (surtout dans l’environnement de travail ici). La réflexion sera dans la majorité des cas triviale mais d’une importance majeure! Ici (département de recherche informatique chez Merck Genève) il y a peu d’organisation et plusieurs petits projets (principalement en maintenance pour ma part). Bien souvent chacun mène le sien comme il l’entend et il n’y a ni de specs, ni un planning, ni rien (!). Il y a bien un chef de projet qui supervise le tout mais nous sommes en quelques sorte chacun notre propre chef de projet… On aime ou pas. Pour ma part il faut dire que je suis assez surpris que dans une entreprise de cette envergure il y ait autant de liberté. Quand on a l’habitude d’être cadré un minimum on peut facilement se sentir perdu ou rapidement démotivé. Ça a été un peu mon cas, le temps de s’adapter. Car c’est vrai cela peut paraître génial d’avoir autant de largeur mais ne pas avoir d’objectif défini ni un temps imparti peut rapidement amener à un sentiment de lassitude. Je me suis alors rendu compte de mon devoir de prendre les choses en main.
Réflexion avant d’agir
La première chose que je fais maintenant en arrivant à mon bureau est de dresser la liste des tâches à effectuer durant la journée en mentionnant également la première action concrète pour y arriver ainsi qu’un temps imparti. Cela peut parraître rien du tout mais en attendant cela me cadre bien mieux mon travail! Dans un environnement de projet normal ce genre de choses sont imposées par le chef de projet, mais lorsque cela ne se fait pas, il **faut **se l’imposer. Dans mon cas en tout cas c’est vraiment important. Chaque expérience permet d’en apprendre un peu plus. Ici, en plus d’en apprendre au niveau technique, je suis content d’avoir eu la possibilité de m’améliorer dans mon organisation et de m’être adapté à mon environnement de travail.
Les atouts de Flex selon Ward
Une interview très intéressante à lire si vous vous intéressez au développement Flex mais que vous ne savez pas trop quels en sont les avantages. James Ward répond au CEO d’EffectiveUI en mentionnant par exemple deux cas d’utilisations en entreprise. Il met également en avant les résultats d’une étude en cours d’élaboration par les gaillards d’Adobe : 30% de temps de gagné en choisissant Flex! Certainement à prendre avec des pincettes. MAIS! Oui mais.. Quelques lignes plus haut, Ward explique que le temps perdu à débugger de l’AJAX, on le récupère directement sur Flex puisque le framework gère lui-même les communications client/serveur. Or… Le temps de débuggage quantifié est égal à… 30%! Vous en avez marre de débugger de l’AJAX? Il serait peut-être temps de jeter un oeil à Flex…
Thinking in Flex!
Toujours dans l’actualité Flex, le blog Code moi un mouton nous apprend une bonne nouvelle:
Scoop: James Ward et Bruce Eckel (l’auteur de Thinking in Java) préparent un livre de 120 pages qui s’adresse à tous les développeurs qui souhaitent apprendre Flex. Ca sent le best-seller…
Pour ceux qui ont parcouru Thinking in Java (j’ai pu faire mes débuts avec cet excellent bouquin) et qui souhaite en apprendre un peu plus sur Flex, je sens que ca va être le point de départ idéal! Je me réjouis! Et pour finir en beauté avec le monde Flash/Flex (du moins avec ce post), voici le dernier clip de Radiohead réalisé en flash et ce sans caméra(!): Quelques explications ici et ici.
Wiihab
La console made in Japan est utilisée afin de traiter certaines affections et est recommandée à certains patients! Encore une fois, comment lier l’utile et l’agréable!