diff --git a/sucker-punch-propaganda/README-fr.org b/sucker-punch-propaganda/README-fr.org new file mode 100644 index 0000000..43d75e5 --- /dev/null +++ b/sucker-punch-propaganda/README-fr.org @@ -0,0 +1,148 @@ +#+TITLE: Pourquoi Clojure ? +#+AUTHOR: +#+DATE: <2012-02-29 Wed 19:30> +#+OPTIONS: toc:nil +* Hypothèse de Sapir Whorf +(Encore) un langage de plus ? + - certains langages permettent d'écrire de meilleurs programmes + - certains langages permettent aussi de devenir de meilleurs + programmeurs ! +* Immédiatement productif … +grâce à une interopérabilité parfaite avec Java ! + - Possibilité de créer/utiliser n'importe quelle classe/interface ? + - Mêmes type primitifs types (y compris java.lang.String) +Résolution du problème de bootstrapping entre la communauté +d'utilisateurs et les bibliothèques disponibles (qui nous a empêché de +profiter des résultats de la recherche en langages de programmation +pendant des décennies !) +* Un language simple + - Simple :: ≠ facile + - Combattre la complexité incidente :: Il n'y a pas à se glorifier de + maîtriser des outils inutilement complexes ! (Les développeurs + en java comprennent cela très bien à propos du C++ ☺) + +* Orienté Object ‽ + - type + - identité + - état + - noms d'attributs → values + - mutabilité + - (single) dynamic dispatching + - espace de nommage +Clojure a *tout* cela, /à la carte/. + +Boîte à outils > couteau suisse +* Comportements par défaut pertinents + - immutabilité : Programmation Orientée Valeur (transients disponibles + mais les structures de données persistantes sont extrêmement efficaces) + - typage dynamique (possibilité d'annotation de type) + - binding lexical (binding dynamic disponible) + - static dispatching (dynamic dispatching (single / multiple) disponible) + - structures ouvertes : dictionnaires sur des symboles (structures + fermées disponibles) +* Excellentes primitives pour SMP +*Immutabilité !* + - vars :: mutabilité isolée à chaque thread + - agents :: mutations asynchrones dans une queue + - synchronisation inter-threads :: mutations atomiques + - sur un /atoms/ + - dans des transactions sur de multiples /refs/ +* Une syntaxe très simple ☺ +"Au fait, c'est un LISP" +[[file:lisp-angry-meme.png]] +* Ne paniquez pas ! +Pas forcément /facile/ au premier abord, mais : + - pas de () pour les paires lorsque la syntaxe le permet + - le code est une structure de données (liste), mais la plupart des + structures de données ne sont pas des listes : + - [vector] + - {map} + - #{set} + - Il y a des IDE (e.g. emacs) pour nous aider ! + - écriture (electric parenthesis) + - lecture (rainbow parenthesis) + - e.g. ≠ i.e. ☺ +* M-x emacs-ftw +[[file:clojure-in-emacs.png]] +* Plug-in Eclipse +[[file:sc-ccw.png]] +* La (vraie !) Metaprogrammation + - David Wheeler :: "Tous les problèmes d'informatique peuvent être + résolus en ajoutant un niveau d'indirection." + - Moi :: "Tout tâche pénible peut et doit être automatisée." + - Moi (encore!) :: "La programmation ne devrait jamais être pénible !" + +Donc on devrait être capable d'automatiser de la programmation ! +Pour que ce soit /facile/, il *faut* la /simplicité/ syntaxique du +code comme structure de données (et je suis un utilisateur de +[[http://www.boost.org/doc/libs/1_49_0/libs/mpl/doc/index.html][Boost::mpl]] !). + +[ [[http://blog.fogus.me/2011/11/15/the-macronomicon-slides/][Macronomicon by M.Fogus]]] + +* Conclusion +Plateforme parfaite pour : + - Puristes :: vous pouvez ajouter des monades avec les macros ! + - Adeptes de la productivité à tous crins :: réutilisation de + toutes les bibliothèques / frameworks Java ! + - Chefs de projets frileux :: c'est juste des jars parmi d'autres ! + +Tous les effets de bord ne sont pas néfastes : en apprenant ce +langage, vous découvrirez aussi de nouveaux concepts. Vous aurez aussi +une meilleure compréhension de ce que vous connaissez déjà (e.g.POO, +état, temps, valeur, hamacs,…) + +* TL;DL + - Ne craignez/rejetez pas l'inconnu/étrange + - Apprenez et amusez-vous ! + +"+d’autres ne pourront jamais se résoudre à passer des fonctions en +paramètres d’autres fonctions dans une forêt de parenthèses+" ☹ + + +J'ai évité les LISP pendant 10 ans : +"I was blind, now I can see. +Rich made a believer out of me !" ☺ + + +* [Web|Bib]liographie + + - Présentations (slides / vidéos) + - Are We There Yet ? *← indispensable !* + - [[http://www.wiki.jvmlangsummit.com/images/a/ab/HickeyJVMSummit2009.pdf][slides]] + - [[http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey][video]] + - [[https://blip.tv/clojure/hammock-driven-development-4475586][Hammock Driven Development]] + - [[http://www.infoq.com/presentations/Simple-Made-Easy][Simple Made Easy]] + - … + - Livres + - [[http://joyofclojure.com/][The Joy of Clojure]] + - [[http://www.manning.com/rathore/][Clojure in Action]] + - [[http://www.clojurebook.com/][Clojure Programming]] + - … + +* Bonus track : snippets +#+begin_src clojure export: code +(def fizzbuzz +"lazy seq of fizzbuzz" + (lazy-seq (map #(let [s (str (if (= 0 (rem % 3)) "Fizz") + (if (= 0 (rem % 5)) "Buzz"))] + (if (empty? s) % s)) + (iterate inc 1)))) +#+end_src + - user> (take 16 fizzbuzz) :: (1 2 "Fizz" 4 "Buzz" "Fizz" 7 8 "Fizz" + "Buzz" 11 "Fizz" 13 14 "FizzBuzz" 16) +#+begin_src clojure export: code +(def fib-seq + "lazy seq of Fibonacci numbers" + (lazy-cat [0 1] (map + (rest fib-seq) fib-seq))) +#+end_src + - user> (take 16 fib-seq) :: (0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610) +* TODO Hands-on ! + - [[http://tryclj.com/][try clojure !]] + - [[https://gist.github.com/1951396][code snippets]] + - [[http://www.cljbin.com/paste/4f564497e4b00708a069359e][fibonacci seq 1]] + - [[http://www.cljbin.com/paste/4f5644e4e4b00708a069359f][fibonacci seq 2]] + - [[http://www.cljbin.com/paste/4f564571e4b00708a06935a0][fizzbuzz]] + - [[http://www.cljbin.com/paste/4f564644e4b00708a06935a1][fizzbuzzzapp]] + - [[http://www.cljbin.com/paste/4f564754e4b00708a06935a3][menu]] + +Souvenez-vous : un IDE vous aidera *beaucoup* pour les () ! diff --git a/sucker-punch-propaganda/README.org b/sucker-punch-propaganda/README.org new file mode 100644 index 0000000..2550ef4 --- /dev/null +++ b/sucker-punch-propaganda/README.org @@ -0,0 +1,139 @@ +#+TITLE: Why Clojure ? +#+AUTHOR: +#+OPTIONS: toc:nil +* Sapir Whorf hypothesis +(Yet) Another language ? + - some languages make better programs + - some also make better programmers ! +* Low barrier to productivity … +thx to perfect Java interoperability ! + - Can use/create any java object + - Same primitive types (incl. java.lang.String) +Solves the chicken-egg problem (libraries, users base) that have been +keeping us with C for decades despite all the good work in academia. +* A Simple Language + - Simple :: ≠ easy + - Fighting incidental complexity :: There is no pride to have in + mastering needlessly complex tools (java programmers understand + this very well when talking about C++ ☺). + +* Object Oriented ‽ + - type + - identity + - state + - attribute names → values + - mutability + - (single) dynamic dispatching + - namespace +Clojure has it *all*, /à la carte/. + +Toolbox > swiss army knife +* Sane defaults + - immutability : Value Oriented Programming (transients available but + the persistent data structures are extremely efficient) + - dynamic typing (type annotations also available) + - lexical binding (dynamic binding also available) + - static dispatching (dynamic dispatching available, single or + multiple) + - open structures as maps of interned strings (closed struct available) +* Practical SMP primitives + - vars :: thread local writes + - agents :: queued asynch writes + - inter-threads synch :: atomic writes + - on single /atoms/ + - transactions on multiple /refs/ +* Very Simple Syntax ☺ +"Oh, btw, it's a LISP" +[[file:lisp-angry-meme.png]] +* Don't panic ! +Not necessarily /easy/ at first but : + - syntactic grouping of pairs without () + - code is data (list), but most data structures are not lists : + - [vector] + - {map} + - #{set} + - IDE (e.g. emacs) to the rescue ! + - help writing (electric parenthesis) + - help reading (rainbow parenthesis) + - e.g. ≠ i.e. ☺ +* M-x emacs-ftw +[[file:clojure-in-emacs.png]] +* Eclipse plug-in +[[file:sc-ccw.png]] +* Metaprogramming done right + - David Wheeler :: "All problems in computer science can be solved by + another level of indirection". + - Myself :: "Any boring (part of a) task can and should be automated away" + - Myself again :: "Programming should be fun !" + +Hence you should be able to automate boring parts of programming ! +To make it /easy/, you *need* the /simple/ syntax of code as data structure. +(disclosure: I'm a [[http://www.boost.org/doc/libs/1_49_0/libs/mpl/doc/index.html][Boost::mpl]] user !) +[ [[http://blog.fogus.me/2011/11/15/the-macronomicon-slides/][Macronomicon by M.Fogus]]] + + +* Conclusion +Perfect Plateform for : + - Pompous Purists :: you can add your monads with macros ! + - Productivity Pirates™ :: you can reuse all the java libs/frameworks ! + - Painful PHBs :: it's all jars to you, JarJar ! + +Not all side effects are evil : by learning this language, you'll also +learn concepts form the great minds behind it. You will also get a +better understanding of concepts you already (think you) know +(e.g. OOP, state, time, value, hammocks…). + +* TL;DL + - Don't fear/dismiss the unknown + - Learn things and have fun ! (I know you will ☺) + +"+others will never resolve on passing higher order functions in +forests of parenthesis+" ☹ + + +I avoided LISP for 10 years : +"I was blind, now I can see. +Rich made a believer out of me !" ☺ + +* [Web|Bib]liography + + - Talks (slides / videos) + - Are We There Yet ? *← Must See !* + - [[http://www.wiki.jvmlangsummit.com/images/a/ab/HickeyJVMSummit2009.pdf][slides]] + - [[http://www.infoq.com/presentations/Are-We-There-Yet-Rich-Hickey][video]] + - [[https://blip.tv/clojure/hammock-driven-development-4475586][Hammock Driven Development]] + - [[http://www.infoq.com/presentations/Simple-Made-Easy][Simple Made Easy]] + - … + - Books + - [[http://joyofclojure.com/][The Joy of Clojure]] + - [[http://www.manning.com/rathore/][Clojure in Action]] + - [[http://www.clojurebook.com/][Clojure Programming]] + - … +* Bonus track : snippets +#+begin_src clojure export: code +(def fizzbuzz +"lazy seq of fizzbuzz" + (lazy-seq (map #(let [s (str (if (= 0 (rem % 3)) "Fizz") + (if (= 0 (rem % 5)) "Buzz"))] + (if (empty? s) % s)) + (iterate inc 1)))) +#+end_src + - user> (take 16 fizzbuzz) :: (1 2 "Fizz" 4 "Buzz" "Fizz" 7 8 "Fizz" + "Buzz" 11 "Fizz" 13 14 "FizzBuzz" 16) +#+begin_src clojure export: code +(def fib-seq + "lazy seq of Fibonacci numbers" + (lazy-cat [0 1] (map + (rest fib-seq) fib-seq))) +#+end_src + - user> (take 16 fib-seq) :: (0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610) + +* TODO Hands-on ! + - [[http://tryclj.com/][try clojure !]] + - [[https://gist.github.com/1951396][code snippets]] + - [[http://www.cljbin.com/paste/4f564497e4b00708a069359e][fibonacci seq 1]] + - [[http://www.cljbin.com/paste/4f5644e4e4b00708a069359f][fibonacci seq 2]] + - [[http://www.cljbin.com/paste/4f564571e4b00708a06935a0][fizzbuzz]] + - [[http://www.cljbin.com/paste/4f564644e4b00708a06935a1][fizzbuzzzapp]] + - [[http://www.cljbin.com/paste/4f564754e4b00708a06935a3][menu]] + +Remember : a proper IDE will help *a lot* you with the () ! diff --git a/sucker-punch-propaganda/clojure-in-emacs.png b/sucker-punch-propaganda/clojure-in-emacs.png new file mode 100644 index 0000000..13634ae Binary files /dev/null and b/sucker-punch-propaganda/clojure-in-emacs.png differ diff --git a/sucker-punch-propaganda/lisp-angry-meme.png b/sucker-punch-propaganda/lisp-angry-meme.png new file mode 100644 index 0000000..be3677c Binary files /dev/null and b/sucker-punch-propaganda/lisp-angry-meme.png differ diff --git a/sucker-punch-propaganda/org-export-as-s5.el b/sucker-punch-propaganda/org-export-as-s5.el new file mode 100644 index 0000000..2a0c1e4 --- /dev/null +++ b/sucker-punch-propaganda/org-export-as-s5.el @@ -0,0 +1,81 @@ +(defvar org-s5-theme "default") + +(defvar org-s5-title-string-fmt "