Just a save point
This commit is contained in:
parent
ffe1c79e1e
commit
76c4f5824d
14 changed files with 304 additions and 945 deletions
BIN
Cisco.org.gpg
BIN
Cisco.org.gpg
Binary file not shown.
17
TODO.org
17
TODO.org
|
@ -3,13 +3,20 @@
|
||||||
#+ARCHIVE: archives/TODO.archive.org::
|
#+ARCHIVE: archives/TODO.archive.org::
|
||||||
#+TODO: TODO(t) IN-PROGRESS(p) HOLD(h@/!) WAITING(w@/!) | DONE(d) CANCELED(c@/!)
|
#+TODO: TODO(t) IN-PROGRESS(p) HOLD(h@/!) WAITING(w@/!) | DONE(d) CANCELED(c@/!)
|
||||||
#+COLUMNS: %TODO %3PRIORITY %40ITEM(Task) %17Effort(Estimated Effort){:} %CLOCKSUM %8TAGS(TAG)
|
#+COLUMNS: %TODO %3PRIORITY %40ITEM(Task) %17Effort(Estimated Effort){:} %CLOCKSUM %8TAGS(TAG)
|
||||||
|
|
||||||
* COLUMNS is SPC o c
|
* COLUMNS is SPC o c
|
||||||
** Agenda
|
** Agenda
|
||||||
*** DONE Appeler RDV dentaire
|
*** DONE finir le dyndns https://www.davd.io/build-your-own-dynamic-dns-in-5-minutes/
|
||||||
CLOSED: [2019-07-15 Mon 16:15] DEADLINE: <2019-06-10 Mon>
|
CLOSED: [2019-09-03 Tue 12:54] DEADLINE: <2019-09-03 Tue>
|
||||||
*** DONE Create self private emacs package/spacemacs layer
|
Le port 8080 est utilisé dans docker apparemment.
|
||||||
CLOSED: [2019-07-31 Wed 14:27] DEADLINE: <2019-08-10 Sat>
|
*** DONE Amadeus :film:
|
||||||
|
CLOSED: [2019-09-04 Wed 07:42] DEADLINE: <2019-09-03 Tue>
|
||||||
|
[2019-09-03 Tue 12:55]
|
||||||
|
*** DONE Coraline :film:
|
||||||
|
CLOSED: [2019-09-04 Wed 07:42] DEADLINE: <2019-09-03 Tue>
|
||||||
|
[2019-09-03 Tue 12:57]
|
||||||
|
*** DONE Evil Dead :film:
|
||||||
|
CLOSED: [2019-09-04 Wed 07:42] DEADLINE: <2019-09-03 Tue>
|
||||||
|
[2019-09-03 Tue 12:58]
|
||||||
** Personal Projects :dev:
|
** Personal Projects :dev:
|
||||||
*** Redbot [0%]
|
*** Redbot [0%]
|
||||||
**** TODO [#B] User Management :hs:
|
**** TODO [#B] User Management :hs:
|
||||||
|
|
Binary file not shown.
|
@ -1,890 +0,0 @@
|
||||||
#+Title: Introduction à la Programmation Fonctionnelle avec Haskell
|
|
||||||
#+Author: Yann Esposito
|
|
||||||
#+Date: <2018-03-15 Thu>
|
|
||||||
|
|
||||||
*** main :: IO ()
|
|
||||||
|
|
||||||
#+BEGIN_SRC
|
|
||||||
████████████████████████████████████████████████████████████████████████████████████
|
|
||||||
█ █
|
|
||||||
█ Initialiser l'env de dev █
|
|
||||||
█ █
|
|
||||||
████████████████████████████████████████████████████████████████████████████████████
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
Install **stack**:
|
|
||||||
|
|
||||||
#+BEGIN_SRC bash
|
|
||||||
curl -sSL https://get.haskellstack.org/ | sh
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
Install **nix**:
|
|
||||||
|
|
||||||
#+BEGIN_SRC bash
|
|
||||||
curl https://nixos.org/nix/install | sh
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
** Programmation Fonctionnelle?
|
|
||||||
*** Von Neumann Architecture (1945)
|
|
||||||
|
|
||||||
#+BEGIN_SRC
|
|
||||||
+--------------------------------+
|
|
||||||
| +----------------------------+ |
|
|
||||||
| | central processing unit | |
|
|
||||||
| | +------------------------+ | |
|
|
||||||
| | | Control Unit | | |
|
|
||||||
+------+ | | +------------------------+ | | +--------+
|
|
||||||
|input +---> | +------------------------+ | +--> output |
|
|
||||||
+------+ | | | Arithmetic/Logic Unit | | | +--------+
|
|
||||||
| | +------------------------+ | |
|
|
||||||
| +-------+---^----------------+ |
|
|
||||||
| | | |
|
|
||||||
| +-------v---+----------------+ |
|
|
||||||
| | Memory Unit | |
|
|
||||||
| +----------------------------+ |
|
|
||||||
+--------------------------------+
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
made with http://asciiflow.com
|
|
||||||
|
|
||||||
*** Von Neumann vs Church
|
|
||||||
|
|
||||||
- programmer à partir de la machine (Von Neumann)
|
|
||||||
+ tire vers l'optimisation
|
|
||||||
+ mots de bits, caches, détails de bas niveau
|
|
||||||
+ actions séquentielles
|
|
||||||
+ *1 siècle d'expérience*
|
|
||||||
|
|
||||||
. . .
|
|
||||||
|
|
||||||
- programmer comme manipulation de symbole (Alonzo Church)
|
|
||||||
+ tire vers l'abstraction
|
|
||||||
+ plus proche des représentations mathématiques
|
|
||||||
+ ordre d'évaluation non imposé
|
|
||||||
+ *4000 ans d'expérience*
|
|
||||||
|
|
||||||
*** Histoire
|
|
||||||
|
|
||||||
- λ-Calculus, Alonzo Church & Rosser 1936
|
|
||||||
- Foundation, explicit side effect no implicit state
|
|
||||||
|
|
||||||
. . .
|
|
||||||
|
|
||||||
- LISP (McCarthy 1960)
|
|
||||||
- Garbage collection, higher order functions, dynamic typing
|
|
||||||
|
|
||||||
. . .
|
|
||||||
|
|
||||||
- ML (1969-80)
|
|
||||||
- Static typing, Algebraic Datatypes, Pattern matching
|
|
||||||
|
|
||||||
. . .
|
|
||||||
|
|
||||||
- Miranda (1986) → Haskell (1992‥)
|
|
||||||
- Lazy evaluation, pure
|
|
||||||
|
|
||||||
** Pourquoi Haskell?
|
|
||||||
*** Simplicité par l'abstraction
|
|
||||||
|
|
||||||
*=/!\= SIMPLICITÉ ≠ FACILITÉ =/!\=*
|
|
||||||
|
|
||||||
- mémoire (garbage collection)
|
|
||||||
- ordre d'évaluation (non strict / lazy)
|
|
||||||
- effets de bords (pur)
|
|
||||||
- manipulation de code (referential transparency)
|
|
||||||
|
|
||||||
. . .
|
|
||||||
|
|
||||||
Simplicité: Probablement le meilleur indicateur de réussite de projet.
|
|
||||||
|
|
||||||
*** Production Ready™
|
|
||||||
|
|
||||||
- rapide
|
|
||||||
- équivalent à Java (~ x2 du C)
|
|
||||||
- parfois plus rapide que C
|
|
||||||
- bien plus rapide que python et ruby
|
|
||||||
. . .
|
|
||||||
- communauté solide
|
|
||||||
- 3k comptes sur Haskellers
|
|
||||||
- >30k sur reddit /(35k rust, 45k go, 50k nodejs, 4k ocaml, 13k clojure)/
|
|
||||||
- libs >12k sur hackage
|
|
||||||
. . .
|
|
||||||
- entreprises
|
|
||||||
- Facebook (fighting spam, HAXL, ...)
|
|
||||||
- beaucoup de startups, finance en général
|
|
||||||
. . .
|
|
||||||
- milieu académique
|
|
||||||
- fondations mathématiques
|
|
||||||
- fortes influences des chercheurs
|
|
||||||
- tire le langage vers le haut
|
|
||||||
|
|
||||||
*** Tooling
|
|
||||||
|
|
||||||
- compilateur (GHC)
|
|
||||||
- gestion de projets ; cabal, stack, hpack, etc...
|
|
||||||
- IDE / hlint ; rapidité des erreurs en cours de frappe
|
|
||||||
- frameworks hors catégorie (servant, yesod)
|
|
||||||
- ecosystèmes très matures et inovant
|
|
||||||
- Elm (⇒ frontend)
|
|
||||||
- Purescript (⇒ frontend)
|
|
||||||
- GHCJS (⇒ frontend)
|
|
||||||
- Idris (types dépendants)
|
|
||||||
- Hackett (typed LISP avec macros)
|
|
||||||
- Eta (⇒ JVM)
|
|
||||||
|
|
||||||
*** Qualité
|
|
||||||
|
|
||||||
#+BEGIN_QUOTE
|
|
||||||
/Si ça compile alors il probable que ça marche/
|
|
||||||
#+END_QUOTE
|
|
||||||
. . .
|
|
||||||
- tests unitaires :
|
|
||||||
chercher quelques erreurs manuellements
|
|
||||||
. . .
|
|
||||||
- /test génératifs/ :
|
|
||||||
chercher des erreurs sur beaucoups de cas générés aléatoirements
|
|
||||||
& aide pour trouver l'erreur sur l'objet le plus simple
|
|
||||||
. . .
|
|
||||||
- /finite state machine generative testing/ :
|
|
||||||
chercher des erreurs sur le déroulement des actions
|
|
||||||
entre différents agents indépendants
|
|
||||||
. . .
|
|
||||||
- *preuves*:
|
|
||||||
chercher des erreur sur *TOUTES* les entrées possibles
|
|
||||||
possible à l'aide du système de typage
|
|
||||||
|
|
||||||
* Premiers Pas en Haskell
|
|
||||||
*** DON'T PANIC
|
|
||||||
|
|
||||||
#+BEGIN_SRC
|
|
||||||
██████╗ ██████╗ ███╗ ██╗████████╗ ██████╗ █████╗ ███╗ ██╗██╗ ██████╗██╗
|
|
||||||
██╔══██╗██╔═══██╗████╗ ██║╚══██╔══╝ ██╔══██╗██╔══██╗████╗ ██║██║██╔════╝██║
|
|
||||||
██║ ██║██║ ██║██╔██╗ ██║ ██║ ██████╔╝███████║██╔██╗ ██║██║██║ ██║
|
|
||||||
██║ ██║██║ ██║██║╚██╗██║ ██║ ██╔═══╝ ██╔══██║██║╚██╗██║██║██║ ╚═╝
|
|
||||||
██████╔╝╚██████╔╝██║ ╚████║ ██║ ██║ ██║ ██║██║ ╚████║██║╚██████╗██╗
|
|
||||||
╚═════╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═════╝╚═╝
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
- Haskell peut être difficile à vraiment maîtriser
|
|
||||||
- Trois languages en un:
|
|
||||||
- Fonctionnel
|
|
||||||
- Imperatif
|
|
||||||
- Types
|
|
||||||
- Polymorphisme:
|
|
||||||
- contexte souvent semi-implicite change le comportement du code.
|
|
||||||
|
|
||||||
*** Fichier de script isolé
|
|
||||||
|
|
||||||
Avec Stack: https://haskellstack.org
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
#!/usr/bin/env stack
|
|
||||||
{- stack script
|
|
||||||
--resolver lts-12.10
|
|
||||||
--install-ghc
|
|
||||||
--package protolude
|
|
||||||
-}
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
Avec Nix: https://nixos.org/nix/
|
|
||||||
|
|
||||||
#+BEGIN_SRC shell
|
|
||||||
#! /usr/bin/env nix-shell
|
|
||||||
#! nix-shell -i runghc
|
|
||||||
#! nix-shell -p "ghc.withPackages (ps: [ ps.protolude ])"
|
|
||||||
#! nix-shell -I nixpkgs="https://github.com/NixOS/nixpkgs/archive/18.09-beta.tar.gz"
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
*** Hello World! (1/3)
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
-- hello.hs
|
|
||||||
main :: IO ()
|
|
||||||
main = putStrLn "Hello World!"
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
#+BEGIN_SRC
|
|
||||||
> chmod +x hello.hs
|
|
||||||
> ./hello.hs
|
|
||||||
Hello World!
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
#+BEGIN_SRC
|
|
||||||
> stack ghc -- hello.hs
|
|
||||||
> ./hello
|
|
||||||
Hello World!
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
*** Hello World! (2/3)
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
main :: IO ()
|
|
||||||
main = putStrLn "Hello World!"
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
- ~::~ de type ;
|
|
||||||
- le type de ~main~ est ~IO ()~.
|
|
||||||
- ~=~ égalité (la vrai, on peut interchanger ce qu'il y a des deux cotés) ;
|
|
||||||
- le type de ~putStrLn~ est ~String -> IO ()~ ;
|
|
||||||
- application de fonction =f x= pas =f(x)=, pas de parenthèse nécessaire ;
|
|
||||||
|
|
||||||
*** Hello World! (3/3)
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
main :: IO ()
|
|
||||||
main = putStrLn "Hello World!"
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
- Le type ~IO a~ signifie: C'est une description d'une procédure qui quand elle
|
|
||||||
est évaluée peut faire des actions d'IO qui retournera une valeur de type ~a~ ;
|
|
||||||
- ~main~ est le nom du point d'entrée du programme ;
|
|
||||||
- Haskell runtime va chercher pour ~main~ et l'exécute.
|
|
||||||
|
|
||||||
** What is your name?
|
|
||||||
*** What is your name? (1/2)
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
main :: IO ()
|
|
||||||
main = do
|
|
||||||
putStrLn "Hello! What is your name?"
|
|
||||||
name <- getLine
|
|
||||||
let output = "Nice to meet you, " ++ name ++ "!"
|
|
||||||
putStrLn output
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
. . .
|
|
||||||
|
|
||||||
- l'indentation est importante !
|
|
||||||
- ~do~ commence une syntaxe spéciale qui permet de séquencer des actions ~IO~ ;
|
|
||||||
- le type de ~getLine~ est ~IO String~ ;
|
|
||||||
- ~IO String~ signifie: Ceci est la description d'une procédure qui lorsqu'elle
|
|
||||||
est évaluée peut faire des actions IO et retourne une valeur de type ~String~.
|
|
||||||
|
|
||||||
*** What is your name? (2/2)
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
main :: IO ()
|
|
||||||
main = do
|
|
||||||
putStrLn "Hello! What is your name?"
|
|
||||||
name <- getLine
|
|
||||||
let output = "Nice to meet you, " ++ name ++ "!"
|
|
||||||
putStrLn output
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
- le type de ~getLine~ est ~IO String~
|
|
||||||
- le type de ~name~ est ~String~
|
|
||||||
- ~<-~ est une syntaxe spéciale qui n'apparait que dans la notation ~do~
|
|
||||||
- ~<-~ signifie: évalue la procédure et attache la valeur renvoyée dans le nom
|
|
||||||
à gauche de ~<-~
|
|
||||||
- ~let <name> = <expr>~ signifie que ~name~ est interchangeable avec ~expr~ pour
|
|
||||||
le reste du bloc ~do~.
|
|
||||||
- dans un bloc ~do~, ~let~ n'a pas besoin d'être accompagné par ~in~ à la fin.
|
|
||||||
|
|
||||||
** Erreurs classiques
|
|
||||||
*** Erreur classique #1
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
main :: IO ()
|
|
||||||
main = do
|
|
||||||
putStrLn "Hello! What is your name?"
|
|
||||||
let output = "Nice to meet you, " ++ getLine ++ "!"
|
|
||||||
putStrLn output
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
#+BEGIN_SRC
|
|
||||||
/Users/yaesposi/.deft/pres-haskell/name.hs:6:40: warning: [-Wdeferred-type-errors]
|
|
||||||
• Couldn't match expected type ‘[Char]’
|
|
||||||
with actual type ‘IO String’
|
|
||||||
• In the first argument of ‘(++)’, namely ‘getLine’
|
|
||||||
In the second argument of ‘(++)’, namely ‘getLine ++ "!"’
|
|
||||||
In the expression: "Nice to meet you, " ++ getLine ++ "!"
|
|
||||||
|
|
|
||||||
6 | let output = "Nice to meet you, " ++ getLine ++ "!"
|
|
||||||
| ^^^^^^^
|
|
||||||
Ok, one module loaded.
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
*** Erreur classique #1
|
|
||||||
|
|
||||||
- ~String~ est ~[Char]~
|
|
||||||
- Haskell n'arrive pas à faire matcher le type ~String~ avec ~IO String~.
|
|
||||||
- ~IO a~ et ~a~ sont différents
|
|
||||||
|
|
||||||
*** Erreur classique #2
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
main :: IO ()
|
|
||||||
main = do
|
|
||||||
putStrLn "Hello! What is your name?"
|
|
||||||
name <- getLine
|
|
||||||
putStrLn "Nice to meet you, " ++ name ++ "!"
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
#+BEGIN_SRC
|
|
||||||
/Users/yaesposi/.deft/pres-haskell/name.hs:7:3: warning: [-Wdeferred-type-errors]
|
|
||||||
• Couldn't match expected type ‘[Char]’ with actual type ‘IO ()’
|
|
||||||
• In the first argument of ‘(++)’, namely
|
|
||||||
‘putStrLn "Nice to meet you, "’
|
|
||||||
In a stmt of a 'do' block:
|
|
||||||
putStrLn "Nice to meet you, " ++ name ++ "!"
|
|
||||||
In the expression:
|
|
||||||
do putStrLn "Hello! What is your name?"
|
|
||||||
name <- getLine
|
|
||||||
putStrLn "Nice to meet you, " ++ name ++ "!"
|
|
||||||
|
|
|
||||||
7 | putStrLn "Nice to meet you, " ++ name ++ "!"
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
*** Erreur classique #2 (fix)
|
|
||||||
|
|
||||||
- Des parenthèses sont nécessaires
|
|
||||||
- L'application de fonction se fait de gauche à droite
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
main :: IO ()
|
|
||||||
main = do
|
|
||||||
putStrLn "Hello! What is your name?"
|
|
||||||
name <- getLine
|
|
||||||
putStrLn ("Nice to meet you, " ++ name ++ "!")
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
* Concepts avec exemples
|
|
||||||
*** Concepts
|
|
||||||
- /style déclaratif & récursif/
|
|
||||||
- /immutabilité/
|
|
||||||
- /pureté/ (par défaut)
|
|
||||||
- /evaluation paraisseuse/ (par défaut)
|
|
||||||
- /ADT & typage polymorphique/
|
|
||||||
|
|
||||||
*** /Style déclaratif & récursif/
|
|
||||||
|
|
||||||
#+BEGIN_SRC python
|
|
||||||
>>> x=0
|
|
||||||
... for i in range(1,11):
|
|
||||||
... tmp = i*i
|
|
||||||
... if tmp%2 == 0:
|
|
||||||
... x += tmp
|
|
||||||
>>> x
|
|
||||||
220
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
-- (.) composition (de droite à gauche)
|
|
||||||
Prelude> sum . filter even . map (^2) $ [1..10]
|
|
||||||
220
|
|
||||||
Prelude> :set -XNoImplicitPrelude
|
|
||||||
Prelude> import Protolude
|
|
||||||
-- (&) flipped fn application (de gauche à droite)
|
|
||||||
Protolude> [1..10] & map (^2) & filter even & sum
|
|
||||||
220
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
*** /Style déclaratif & récursif/
|
|
||||||
|
|
||||||
#+BEGIN_SRC python
|
|
||||||
>>> x=0
|
|
||||||
... for i in range(1,11):
|
|
||||||
... j = i*3
|
|
||||||
... tmp = j*j
|
|
||||||
... if tmp%2 == 0:
|
|
||||||
... x += tmp
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
Prelude> sum . filter even . map (^2) . map (*3) $ [1..10]
|
|
||||||
Protolude> [1..10] & map (*3) & map (^2) & filter even & sum
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
*** /Style déclaratif & récursif/
|
|
||||||
|
|
||||||
- Contrairement aux languages impératifs la récursion n'est généralement pas chère.
|
|
||||||
- tail recursive function, mais aussi à l'aide de la lazyness
|
|
||||||
|
|
||||||
*** /Imutabilité/
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
-- | explicit recursivity
|
|
||||||
incrementAllEvenNumbers :: [Int] -> [Int]
|
|
||||||
incrementAllEvenNumbers (x:xs) = y:incrementAllEvenNumbers xs
|
|
||||||
where y = if even x then x+1 else x
|
|
||||||
|
|
||||||
-- | better with use of higher order functions
|
|
||||||
incrementAllEvenNumbers' :: [Int] -> [Int]
|
|
||||||
incrementAllEvenNumbers' ls = map incrementIfEven ls
|
|
||||||
where
|
|
||||||
incrementIfEven :: Int -> Int
|
|
||||||
incrementIfEven x = if even x then x+1 else x
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
*** /Pureté/: Function vs Procedure/Subroutines
|
|
||||||
|
|
||||||
- Une /fonction/ n'a pas d'effet de bord
|
|
||||||
- Une /Procedure/ ou /subroutine/ but engendrer des effets de bords lors de son
|
|
||||||
évaluation
|
|
||||||
|
|
||||||
*** /Pureté/: Function vs Procedure/Subroutines (exemple)
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
dist :: Double -> Double -> Double
|
|
||||||
dist x y = sqrt (x**2 + y**2)
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
getName :: IO String
|
|
||||||
getName = readLine
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
- *IO a* ⇒ *IMPUR* ; effets de bords hors evaluation :
|
|
||||||
- lire un fichier ;
|
|
||||||
- écrire sur le terminal ;
|
|
||||||
- changer la valeur d'une variable en RAM est impur.
|
|
||||||
|
|
||||||
*** /Pureté/: Gain, paralellisation gratuite
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
import Foreign.Lib (f)
|
|
||||||
-- f :: Int -> Int
|
|
||||||
-- f = ???
|
|
||||||
|
|
||||||
foo = sum results
|
|
||||||
where results = map f [1..100]
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
. . .
|
|
||||||
|
|
||||||
*~pmap~ FTW!!!!! Assurance d'avoir le même résultat avec 32 cœurs*
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
import Foreign.Lib (f)
|
|
||||||
-- f :: Int -> Int
|
|
||||||
-- f = ???
|
|
||||||
|
|
||||||
foo = sum results
|
|
||||||
where results = pmap f [1..100]
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
*** /Pureté/: Structures de données immuable
|
|
||||||
|
|
||||||
Purely functional data structures,
|
|
||||||
/Chris Okasaki/
|
|
||||||
|
|
||||||
Thèse en 1996, et un livre.
|
|
||||||
|
|
||||||
Opérations sur les listes, tableaux, arbres
|
|
||||||
de complexité amortie equivalent ou proche
|
|
||||||
(pire des cas facteur log(n))
|
|
||||||
de celle des structures de données muables.
|
|
||||||
|
|
||||||
*** /Évaluation parraisseuse/: Stratégies d'évaluations
|
|
||||||
|
|
||||||
=(h (f a) (g b))= peut s'évaluer:
|
|
||||||
|
|
||||||
- =a= → =(f a)= → =b= → =(g b)= → =(h (f a) (g b))=
|
|
||||||
- =b= → =a= → =(g b)= → =(f a)= → =(h (f a) (g b))=
|
|
||||||
- =a= et =b= en parallèle puis =(f a)= et =(g b)= en parallèle et finallement
|
|
||||||
=(h (f a) (g b))=
|
|
||||||
- =h= → =(f a)= seulement si nécessaire et puis =(g b)= seulement si nécessaire
|
|
||||||
|
|
||||||
Par exemple: =(def h (λx.λy.(+ x x)))= il n'est pas nécessaire d'évaluer =y=,
|
|
||||||
dans notre cas =(g b)=
|
|
||||||
|
|
||||||
*** /Évaluation parraisseuse/: Exemple
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
quickSort [] = []
|
|
||||||
quickSort (x:xs) = quickSort (filter (<x) xs)
|
|
||||||
++ [x]
|
|
||||||
++ quickSort (filter (>=x) xs)
|
|
||||||
|
|
||||||
minimum list = head (quickSort list)
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
Un appel à ~minimum longList~ ne vas pas ordonner toute la liste.
|
|
||||||
Le travail s'arrêtera dès que le premier élément de la liste ordonnée sera trouvé.
|
|
||||||
|
|
||||||
~take k (quickSort list)~ est en ~O(n + k log k)~ où ~n = length list~.
|
|
||||||
Alors qu'avec une évaluation stricte: ~O(n log n)~.
|
|
||||||
|
|
||||||
*** /Évaluation parraisseuse/: Structures de données infinies (zip)
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
zip :: [a] -> [b] -> [(a,b)]
|
|
||||||
zip [] _ = []
|
|
||||||
zip _ [] = []
|
|
||||||
zip (x:xs) (y:ys) = (x,y):zip xs ys
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
zip [1..] ['a','b','c']
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
s'arrête et renvoie :
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
[(1,'a'), (2,'b'), (3, 'c')]
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
*** /Évaluation parraisseuse/: Structures de données infinies (2)
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
Prelude> zipWith (+) [0,1,2,3] [10,100,1000]
|
|
||||||
[10,101,1002]
|
|
||||||
Prelude> take 3 [1,2,3,4,5,6,7,8,9]
|
|
||||||
[1,2,3]
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
Prelude> fib = 0:1:(zipWith (+) fib (tail fib))
|
|
||||||
Prelude> take 10 fib
|
|
||||||
[0,1,1,2,3,5,8,13,21,34]
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
*** /ADT & Typage polymorphique/
|
|
||||||
|
|
||||||
Algebraic Data Types.
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
data Void = Void Void -- 0 valeur possible!
|
|
||||||
data Unit = () -- 1 seule valeur possible
|
|
||||||
|
|
||||||
data Product x y = P x y
|
|
||||||
data Sum x y = S1 x | S2 y
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
Soit ~#x~ le nombre de valeurs possibles pour le type ~x~
|
|
||||||
alors:
|
|
||||||
|
|
||||||
- ~#(Product x y) = #x * #y~
|
|
||||||
- ~#(Sum x y) = #x + #y~
|
|
||||||
|
|
||||||
*** /ADT & Typage polymorphique/: Inférence de type
|
|
||||||
|
|
||||||
À partir de :
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
zip [] _ = []
|
|
||||||
zip _ [] = []
|
|
||||||
zip (x:xs) (y:ys) = (x,y):zip xs ys
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
le compilateur peut déduire:
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
zip :: [a] -> [b] -> [(a,b)]
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
** Composabilité
|
|
||||||
*** Composabilité vs Modularité
|
|
||||||
|
|
||||||
Modularité: soit un ~a~ et un ~b~, je peux faire un ~c~.
|
|
||||||
ex: x un graphique, y une barre de menu => une page
|
|
||||||
~let page = mkPage ( graphique, menu )~
|
|
||||||
|
|
||||||
Composabilité: soit deux ~a~ je peux faire un autre ~a~.
|
|
||||||
ex: x un widget, y un widget => un widget
|
|
||||||
~let page = x <+> y~
|
|
||||||
|
|
||||||
Gain d'abstraction, moindre coût.
|
|
||||||
|
|
||||||
*Hypothèses fortes sur les ~a~*
|
|
||||||
|
|
||||||
*** Exemples
|
|
||||||
|
|
||||||
- *Semi-groupes* 〈+〉
|
|
||||||
- *Monoides* 〈0,+〉
|
|
||||||
|
|
||||||
- *Catégories* 〈obj(C),hom(C),∘〉
|
|
||||||
- Foncteurs ~fmap~ (~(<$>)~)
|
|
||||||
- Foncteurs Applicatifs ~ap~ (~(<*>)~)
|
|
||||||
- Monades ~join~
|
|
||||||
- Traversables ~map~
|
|
||||||
- Foldables ~reduce~
|
|
||||||
|
|
||||||
* Catégories de bugs évités avec Haskell
|
|
||||||
|
|
||||||
*** Real Productions Bugs™
|
|
||||||
|
|
||||||
Bug vu des dizaines de fois en prod malgré:
|
|
||||||
|
|
||||||
1. specifications fonctionnelles
|
|
||||||
2. spécifications techniques
|
|
||||||
3. tests unitaires
|
|
||||||
4. 3 envs, dev, recette/staging/pre-prod, prod
|
|
||||||
5. Équipe de QA qui teste en recette
|
|
||||||
|
|
||||||
Solutions simples.
|
|
||||||
|
|
||||||
*** **Null Pointer Exception**: Erreur classique (1)
|
|
||||||
|
|
||||||
Au début du projet :
|
|
||||||
|
|
||||||
#+BEGIN_SRC javascript
|
|
||||||
int foo( x ) {
|
|
||||||
return x + 1;
|
|
||||||
}
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
*** **Null Pointer Exception**: Erreur classique (2)
|
|
||||||
|
|
||||||
Après quelques semaines/mois/années :
|
|
||||||
|
|
||||||
#+BEGIN_SRC javascript
|
|
||||||
import do_shit_1 from "foreign-module";
|
|
||||||
int foo( x ) {
|
|
||||||
...
|
|
||||||
var y = do_shit_1(x);
|
|
||||||
...
|
|
||||||
return do_shit_20(y)
|
|
||||||
}
|
|
||||||
...
|
|
||||||
var val = foo(26/2334 - Math.sqrt(2));
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
. . .
|
|
||||||
|
|
||||||
#+BEGIN_SRC
|
|
||||||
███████ █████ ███ ███ ███ ███ ███ ███ ███ ███ ███
|
|
||||||
███ ██ ███ ███ ███ ███ ████ ████ ███ ███ ███ ███ ███
|
|
||||||
███ ██ ███ ███ ███ ███ █████ █████ ███ ███ ███ ███ ███
|
|
||||||
███████ ███ ███ ███ ███ ███ █████ ███ ███ ███ ███ ███ ███
|
|
||||||
███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
|
|
||||||
███ ███ ███ ███ ███ ███ ███ █ ███ █ █ █ █ █
|
|
||||||
███ ███ ███ ███ ███ ███ ███ ███
|
|
||||||
███████ █████ █████ ███ ███ ███ ███ ███ ███ ███
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
| *Null Pointer Exception*
|
|
||||||
|
|
||||||
*** Null Pointer Exception: Data type ~Maybe~
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
data Maybe a = Just a | Nothing
|
|
||||||
...
|
|
||||||
foo :: Maybe a
|
|
||||||
...
|
|
||||||
myFunc x = let t = foo x in
|
|
||||||
case t of
|
|
||||||
Just someValue -> doThingsWith someValue
|
|
||||||
Nothing -> doThingWhenNothingIsReturned
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
Le compilateur oblige à tenir compte des cas particuliers!
|
|
||||||
Impossible d'oublier.
|
|
||||||
|
|
||||||
*** Null Pointer Exception: Etat
|
|
||||||
|
|
||||||
- Rendre impossibe de fabriquer un état qui devrait être impossible d'avoir.
|
|
||||||
- Pour aller plus loin voir, FRP, CQRS/ES, Elm-architecture, etc...
|
|
||||||
|
|
||||||
*** Erreur due à une typo
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
data Foo x = LongNameWithPossibleError x
|
|
||||||
...
|
|
||||||
foo (LongNameWithPosibleError x) = ...
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
*Erreur à la compilation*:
|
|
||||||
Le nom d'un champ n'est pas une string
|
|
||||||
(voir les objets JSON).
|
|
||||||
|
|
||||||
*** Echange de parameters
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
data Personne = Personne { uid :: Int, age :: Int }
|
|
||||||
foo :: Int -> Int -> Personne -- ??? uid ou age?
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
newtype UID = UID Int deriving (Eq)
|
|
||||||
data Personne = Personne { uid :: UID, age :: Int }
|
|
||||||
foo :: UDI -> Int -> Personne -- Impossible de confondre
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
*** Changement intempestif d'un Etat Global
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
foo :: GlobalState -> x
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
*~foo~ ne peut pas changer =GlobalState=*
|
|
||||||
|
|
||||||
* Organisation du Code
|
|
||||||
*** Grands Concepts
|
|
||||||
|
|
||||||
Procedure vs Functions:
|
|
||||||
|
|
||||||
| Gestion d'une configuration globale |
|
|
||||||
| Gestion d'un état global |
|
|
||||||
| Gestion des Erreurs |
|
|
||||||
| Gestion des IO |
|
|
||||||
|
|
||||||
*** Monades
|
|
||||||
|
|
||||||
Pour chacun de ces /problèmes/ il existe une monade:
|
|
||||||
|
|
||||||
| Gestion d'une configuration globale | ~Reader~ |
|
|
||||||
| Gestion d'un état global | ~State~ |
|
|
||||||
| Gestion des Erreurs | ~Either~ |
|
|
||||||
| Gestion des IO | ~IO~ |
|
|
||||||
|
|
||||||
*** Effets
|
|
||||||
|
|
||||||
Gestion de plusieurs Effets dans la même fonction:
|
|
||||||
|
|
||||||
- MTL
|
|
||||||
- Free Monad
|
|
||||||
- Freer Monad
|
|
||||||
|
|
||||||
Idée: donner à certaines sous-fonction accès à une partie des effets seulement.
|
|
||||||
|
|
||||||
Par exemple:
|
|
||||||
- limiter une fonction à la lecture de la DB mais pas l'écriture.
|
|
||||||
- limiter l'écriture à une seule table
|
|
||||||
- interdire l'écriture de logs
|
|
||||||
- interdire l'écriture sur le disque dur
|
|
||||||
- etc...
|
|
||||||
|
|
||||||
*** Exemple dans un code réel (1)
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
-- | ConsumerBot type, the main monad in which the bot code is written with.
|
|
||||||
-- Provide config, state, logs and IO
|
|
||||||
type ConsumerBot m a =
|
|
||||||
( MonadState ConsumerState m
|
|
||||||
, MonadReader ConsumerConf m
|
|
||||||
, MonadLog (WithSeverity Doc) m
|
|
||||||
, MonadBaseControl IO m
|
|
||||||
, MonadSleep m
|
|
||||||
, MonadPubSub m
|
|
||||||
, MonadIO m
|
|
||||||
) => m a
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
*** Exemple dans un code réel (2)
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
bot :: Manager
|
|
||||||
-> RotatingLog
|
|
||||||
-> Chan RedditComment
|
|
||||||
-> TVar RedbotConfs
|
|
||||||
-> Severity
|
|
||||||
-> IO ()
|
|
||||||
bot manager rotLog pubsub redbots minSeverity = do
|
|
||||||
TC.setDefaultPersist TC.filePersist
|
|
||||||
let conf = ConsumerConf
|
|
||||||
{ rhconf = RedditHttpConf { _connMgr = manager }
|
|
||||||
, commentStream = pubsub
|
|
||||||
}
|
|
||||||
void $ autobot
|
|
||||||
& flip runReaderT conf
|
|
||||||
& flip runStateT (initState redbots)
|
|
||||||
& flip runLoggingT (renderLog minSeverity rotLog)
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
|
|
||||||
** Règles *pragmatiques*
|
|
||||||
|
|
||||||
*** Organisation en fonction de la complexité
|
|
||||||
|
|
||||||
#+BEGIN_QUOTE
|
|
||||||
Make it work, make it right, make it fast
|
|
||||||
#+END_QUOTE
|
|
||||||
|
|
||||||
- Simple: directement IO (YOLO!)
|
|
||||||
- Medium: Haskell Design Patterns: The Handle Pattern:
|
|
||||||
https://jaspervdj.be/posts/2018-03-08-handle-pattern.html
|
|
||||||
- Medium (bis): MTL / Free / Freeer / Effects...
|
|
||||||
- Gros: Three Layer Haskell Cake:
|
|
||||||
http://www.parsonsmatt.org/2018/03/22/three_layer_haskell_cake.html
|
|
||||||
+ Layer 1: Imperatif
|
|
||||||
+ Orienté Objet (Level 2 / 2')
|
|
||||||
+ Fonctionnel
|
|
||||||
|
|
||||||
*** 3 couches
|
|
||||||
|
|
||||||
- *Imperatif*:
|
|
||||||
ReaderT IO
|
|
||||||
+ Insérer l'état dans une ~TVar~, ~MVar~ ou ~IORef~ (concurrence)
|
|
||||||
- *Orienté Objet*:
|
|
||||||
+ Handle / MTL / Free...
|
|
||||||
+ donner des access ~UserDB~, ~AccessTime~, ~APIHTTP~...
|
|
||||||
- *Fonctionnel*: Business Logic ~f : Handlers -> Inputs -> Command~
|
|
||||||
|
|
||||||
*** Services / Lib
|
|
||||||
|
|
||||||
Service: ~init~ / ~start~ / ~close~ + methodes...
|
|
||||||
Lib: methodes sans état interne.
|
|
||||||
|
|
||||||
* Conclusion
|
|
||||||
*** Pourquoi Haskell?
|
|
||||||
|
|
||||||
- avantage compétitif: qualité & productivité hors norme
|
|
||||||
- change son approche de la programmation
|
|
||||||
- les concepts appris sont utilisables dans tous les languages
|
|
||||||
- permet d'aller là où aucun autre langage ne peut vous amener
|
|
||||||
- Approfondissement sans fin:
|
|
||||||
- Théorie: théorie des catégories, théorie des types homotopiques, etc...
|
|
||||||
- Optim: compilateur
|
|
||||||
- Qualité: tests, preuves
|
|
||||||
- Organisation: capacité de contraindre de très haut vers très bas
|
|
||||||
|
|
||||||
*** Avantage compétitif
|
|
||||||
|
|
||||||
- France, Europe du sud & Functional Programming
|
|
||||||
- Coût Maintenance >> production d'un nouveau produit
|
|
||||||
- Coût de la refactorisation
|
|
||||||
- "Make it work, Make it right, Make it fast" moins cher.
|
|
||||||
|
|
||||||
*** Pour la suite
|
|
||||||
|
|
||||||
A chacun de choisir, livres, tutoriels, videos, chat, etc...
|
|
||||||
|
|
||||||
- Voici une liste de resources : https://www.haskell.org/documentation
|
|
||||||
- Mon tuto rapide : [[http://yannesposito.com/Scratch/en/blog/Haskell-the-Hard-Way/][Haskell the Hard Way]]
|
|
||||||
- Moteurs de recherche par type : [[http://hayoo.fh-wedel.de][hayoo]] & [[http://haskell.org/hoogle][hoogle]]
|
|
||||||
- Communauté & News : http://haskell.org/news & ~#haskell-fr~ sur freenode
|
|
||||||
- Libs: https://hackage.haskell.org & https://stackage.org
|
|
||||||
|
|
||||||
* Appendix
|
|
||||||
*** STM: Exemple (Concurrence) (1/2)
|
|
||||||
|
|
||||||
#+BEGIN_SRC java
|
|
||||||
class Account {
|
|
||||||
float balance;
|
|
||||||
synchronized void deposit(float amount){
|
|
||||||
balance += amount; }
|
|
||||||
synchronized void withdraw(float amount){
|
|
||||||
if (balance < amount) throw new OutOfMoneyError();
|
|
||||||
balance -= amount; }
|
|
||||||
synchronized void transfert(Account other, float amount){
|
|
||||||
other.withdraw(amount);
|
|
||||||
this.deposit(amount); }
|
|
||||||
}
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
Situation d'interblocage typique. (A transfert vers B et B vers A).
|
|
||||||
|
|
||||||
*** STM: Exemple (Concurrence) (2/2)
|
|
||||||
|
|
||||||
#+BEGIN_SRC haskell
|
|
||||||
deposit :: TVar Int -> Int -> STM ()
|
|
||||||
deposit acc n = do
|
|
||||||
bal <- readTVar acc
|
|
||||||
writeTVar acc (bal + n)
|
|
||||||
withdraw :: TVar Int -> Int -> STM ()
|
|
||||||
withdraw acc n = do
|
|
||||||
bal <- readTVar acc
|
|
||||||
if bal < n then retry
|
|
||||||
writeTVar acc (bal - n)
|
|
||||||
transfer :: TVar Int -> TVar Int -> Int -> STM ()
|
|
||||||
transfer from to n = do
|
|
||||||
withdraw from n
|
|
||||||
deposit to n
|
|
||||||
#+END_SRC
|
|
||||||
|
|
||||||
- pas de lock explicite, composition naturelle dans ~transfer~.
|
|
||||||
- si une des deux opération échoue toute la transaction échoue
|
|
||||||
- le système de type force cette opération a être atomique:
|
|
||||||
~atomically :: STM a -> IO a~
|
|
Binary file not shown.
|
@ -1,2 +0,0 @@
|
||||||
clean: *.hi *.o
|
|
||||||
rm -f *.hi *.o
|
|
|
@ -1,3 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
stack ghc --package parallel -- -threaded -O2 005_purete_par.hs
|
|
|
@ -1,10 +1,14 @@
|
||||||
* Imported Feeds :elfeed:
|
* Imported Feeds :elfeed:
|
||||||
** self
|
** self
|
||||||
*** [[http://feeds.feedburner.com/yannespositocomen][yannesposito.com]]
|
*** [[http://feeds.feedburner.com/yannespositocomen][yannesposito.com]]
|
||||||
|
*** [[https://her.esy.fun/posts/rss.xml][her.esy.fun posts]]
|
||||||
|
*** [[https://her.esy.fun/micro/rss.xml][her.esy.fun micro]]
|
||||||
** news :news:
|
** news :news:
|
||||||
*** [[https://hnrss.org/newest?points=500][HN]]
|
*** [[https://hnrss.org/newest?points=700][HN]]
|
||||||
*** [[https://www.laarc.io/rss][laarc]]
|
*** [[https://www.laarc.io/rss][laarc]]
|
||||||
*** [[https://lobste.rs/rss][lobsters]] :ignore:
|
*** [[https://lobste.rs/rss][lobsters]] :ignore:
|
||||||
|
***
|
||||||
|
*** [[https://nesslabs.com/feed][nesslabs]] :life:
|
||||||
** haskell :haskell:fp:
|
** haskell :haskell:fp:
|
||||||
*** [[http://feeds.feedburner.com/ezyang][Inside 206-105]]
|
*** [[http://feeds.feedburner.com/ezyang][Inside 206-105]]
|
||||||
*** [[http://blog.jle.im/rss][in Code — Entries]]
|
*** [[http://blog.jle.im/rss][in Code — Entries]]
|
||||||
|
|
260
famille.org
Normal file
260
famille.org
Normal file
|
@ -0,0 +1,260 @@
|
||||||
|
#+Title: Vers l'autonomie
|
||||||
|
#+Author: Yann Esposito
|
||||||
|
#+ARCHIVE: archives/famille.archive.org::
|
||||||
|
#+TODO: TODO(t) VU(v) IN-PROGRESS(p) HOLD(h@/!) WAITING(w@/!) | DONE(d) CANCELED(c@/!)
|
||||||
|
#+COLUMNS: %TODO %3PRIORITY %40ITEM(Task) %17Effort(Estimated Effort){:} %CLOCKSUM %8TAGS(TAG)
|
||||||
|
* TODO Être autonome [0/6]
|
||||||
|
** TODO Quotidien [0/3]
|
||||||
|
*** TODO Rangement, propreté [0/3]
|
||||||
|
**** TODO Faire sa chambre le matin [0/6]
|
||||||
|
***** TODO Faire le lit
|
||||||
|
***** TODO mettre ses habits sales au sale
|
||||||
|
***** TODO ramasser les décher et les mettre à la poubelle
|
||||||
|
***** TODO ne pas laisser de vaisselle dans la chambre
|
||||||
|
***** TODO ne pas laisser de bouteille d'eau dans la chambre
|
||||||
|
***** TODO ne pas laisser de nourriture dans la chambre
|
||||||
|
**** TODO Repas [0/8]
|
||||||
|
***** TODO Participer à mettre la table [0/6]
|
||||||
|
****** TODO Assiettes
|
||||||
|
****** TODO Couverts
|
||||||
|
****** TODO Verres
|
||||||
|
****** TODO Plat principal
|
||||||
|
****** TODO Eau
|
||||||
|
****** TODO Condiments (sel, poivre, vinaigrette, etc...)
|
||||||
|
***** TODO Nettoyer après avoir manger [0/2]
|
||||||
|
****** TODO ranger sa table [0/3]
|
||||||
|
******* TODO son assiette / bols / etc...
|
||||||
|
******* TODO ses couverts
|
||||||
|
******* TODO son verre
|
||||||
|
****** TODO débarrasser la table [0/6]
|
||||||
|
******* TODO l'eau à re-remplir, remettre au frais pour le lendemain
|
||||||
|
******* TODO débarrasser le plat principal
|
||||||
|
- si il reste beaucoup remettre le plat au frigo (le laisser refroidir)
|
||||||
|
- si il en reste peu, ou qu'on n'en remangera pas, vider le reste du plat
|
||||||
|
principal dans un autre récipient plus petit et le mettre soi au frigo,
|
||||||
|
soit au congélateur pour le manger plus tard. Et nettoyer, à la main, le
|
||||||
|
grand récipient (plat à gratin, saladier, marmite, etc...)
|
||||||
|
******* TODO débarrasser le pain et le remettre à sa place
|
||||||
|
******* TODO débarrasser les condiments (sel, moutarde, etc...)
|
||||||
|
******* TODO essuyer la table
|
||||||
|
- vérifier qu'il ne reste plus rien
|
||||||
|
- essuyer sur les rebords de la table
|
||||||
|
- nettoyer les miettes par terre ou essuyer si c'est vraiment sale
|
||||||
|
- après avoir passer l'éponge, essuyer avec une serviette pour ne pas
|
||||||
|
laisser des traces d'humidité
|
||||||
|
******* TODO Mettre au recyclage vs poubelle
|
||||||
|
***** TODO Savoir mettre correctement la vaisselle dans le lave vaisselle
|
||||||
|
- les verres jamais dans le mauvais sens
|
||||||
|
- les bols et les assiettes creusent ne doivent pas être obstruées
|
||||||
|
- il vaut mieux nettoyer une gros élément à la main que lancer le lave
|
||||||
|
vaisselle inutilement 2x
|
||||||
|
***** TODO Savoir si on doit lancer le lave vaisselle
|
||||||
|
***** TODO Savoir lancer le lave vaisselle si nécessaire
|
||||||
|
***** TODO Savoir si on doit débarrasser le lave vaisselle
|
||||||
|
***** TODO Débarrasser le lave vaisselle
|
||||||
|
**** TODO Zones communes [0/5]
|
||||||
|
***** TODO Salon/cuisine [0/6]
|
||||||
|
****** TODO Si le sol est sale lancer le robot
|
||||||
|
****** TODO Savoir vider et nettoyer le robot
|
||||||
|
****** TODO Si la poubelle est pleine, jeter la poubelle, savoir la remplacer
|
||||||
|
****** TODO Si la poubelle coule et salit le sol, savoir nettoyer le sol
|
||||||
|
****** TODO Savoir nettoyer la poubelle si elle est sale
|
||||||
|
****** TODO Savoir passer l'aspirateur et la pièce
|
||||||
|
***** TODO Savoir s'il faut arroser les plantes et les arroser si nécessaire
|
||||||
|
***** TODO Salle de bain [0/7]
|
||||||
|
****** TODO Savoir ranger sa sale de bain
|
||||||
|
****** TODO Savoir plier et ranger sa serviette
|
||||||
|
****** TODO Nettoyer le sol après la douche
|
||||||
|
****** TODO Nettoyer le siphon de la douche si nécessaire
|
||||||
|
****** TODO Nettoyer le lavabo
|
||||||
|
****** TODO Savoir ranger les produit d'hygiène, jeter et prévoir
|
||||||
|
****** TODO Savoir utiliser les produits d'entretiens
|
||||||
|
***** TODO Toilettes [0/4]
|
||||||
|
****** TODO Jeter les rouleau usagés
|
||||||
|
****** TODO Nettoyer le sol sale des toilettes si besoin
|
||||||
|
****** TODO Vérifier et nettoyer les traces sous l'abattant
|
||||||
|
****** TODO Savoir acheter du papier toilette (ne pas attendre qu'il soit trop tard)
|
||||||
|
***** TODO Entrée [0/4]
|
||||||
|
****** TODO ranger ses chaussures dès l'entrée dans l'appartement
|
||||||
|
****** TODO pendre ses manteaux/gilets dans la penderie
|
||||||
|
****** TODO ranger ses bonnets / gants / accessoires dans la penderie
|
||||||
|
****** TODO ramasser et ranger ce qui traîne
|
||||||
|
*** TODO Hygiène [0/4]
|
||||||
|
**** TODO Se brosser les dents
|
||||||
|
**** TODO Se doucher
|
||||||
|
**** TODO Dîner si possible en famille
|
||||||
|
**** TODO Se laver les mains avant de manger et de mettre la table
|
||||||
|
*** TODO Travail scolaire / permis / obligations diverses [0/2]
|
||||||
|
**** TODO Se lever à l'heure pour [0/7]
|
||||||
|
***** TODO prendre le petit déjeuner
|
||||||
|
***** TODO nettoyer le petit déjeuner
|
||||||
|
***** TODO faire son lit
|
||||||
|
***** TODO ranger sa chambre
|
||||||
|
***** TODO mettre ses affaires sales au sale
|
||||||
|
***** TODO avoir ses affaires scolaires prêtes
|
||||||
|
***** TODO préparer sa gamelle/ses en cas
|
||||||
|
**** TODO Après les cours [0/4]
|
||||||
|
***** TODO réviser le code
|
||||||
|
***** TODO réviser le travail scolaire
|
||||||
|
***** TODO ranger ses livres et cahier
|
||||||
|
***** TODO ranger ses affaires de sport
|
||||||
|
** TODO Hebdomadaire [0/2]
|
||||||
|
*** TODO Linge [0/7]
|
||||||
|
**** TODO Changer ses draps
|
||||||
|
**** TODO mettre une machine
|
||||||
|
**** TODO Nettoyer ses habits
|
||||||
|
**** TODO Étendre le linge juste apres que la machine soit terminée
|
||||||
|
**** TODO Ramasser le linge
|
||||||
|
**** TODO Repasser ses habits
|
||||||
|
**** TODO Plier et ranger ses habits
|
||||||
|
** TODO Nourriture [0/2]
|
||||||
|
*** TODO Organiser ses repas à l'avance [0/1]
|
||||||
|
**** TODO connaître et prévoir ses 3 prochains repas [0/2]
|
||||||
|
***** TODO avoir le budget des repas
|
||||||
|
***** TODO avoir prévu le moment et le temps de préparation
|
||||||
|
*** TODO Préparer ses repas [0/2]
|
||||||
|
**** TODO choisir des repas équilibrés [0/6]
|
||||||
|
***** TODO préparer un repas équilibre légumes / feculents / fruits
|
||||||
|
***** TODO préparer des pâtes [0/4]
|
||||||
|
****** TODO faire des pâtes natures
|
||||||
|
****** TODO faire des pâtes à la sauce tomate
|
||||||
|
****** TODO faire des pâtes au thon
|
||||||
|
****** TODO faire des pâtes pesto
|
||||||
|
***** TODO préparer du riz
|
||||||
|
***** TODO cuire de la viande hachée
|
||||||
|
***** TODO des des œufs
|
||||||
|
***** TODO un dessert
|
||||||
|
**** TODO nettoyer la cuisine [0/5]
|
||||||
|
***** TODO remettre au frigo / congélateur aussi vite que possible pendant la cuisine
|
||||||
|
***** TODO ranger la nourriture, à sa place dans les placards
|
||||||
|
***** TODO mettre les petits ustensiles au lave-vaisselle
|
||||||
|
***** TODO nettoyer à la main la grosse vaisselle (casseroles, saladier, passoire, etc...), l'essuyer et la ranger
|
||||||
|
***** TODO nettoyer et essuyer le plan de travail
|
||||||
|
** TODO Vie en commun, politesse [0/5]
|
||||||
|
*** TODO Ne pas rentrer dans une chambre sans taper et attendre la réponse
|
||||||
|
*** TODO Respecter les horaires communs
|
||||||
|
- pas de bruit après 23h
|
||||||
|
- ne plus aller manger/boire/lancer le micro-ondes etc... après 23h, un
|
||||||
|
verre d'eau c'est une chose, manger un repas complet n'est pas acceptable
|
||||||
|
*** TODO Entraide [0/3]
|
||||||
|
**** TODO On offre son aide
|
||||||
|
**** TODO Si on a besoin, on le demande
|
||||||
|
**** TODO Ranger pour les autres sans attendre d'y être invité
|
||||||
|
Malgré les règles, il arrive que d'autre personnes ne rangent pas.
|
||||||
|
Parfois une personne est plus fatiguée, malade, fragile.
|
||||||
|
On peut ranger pour eux, ils nous rendront la pareille en cas de besoin.
|
||||||
|
*** TODO Chacun à droit à la parole, les opinions doivent être respectées
|
||||||
|
- pas d'attaque ad hominem ;
|
||||||
|
- pas de moquerie ;
|
||||||
|
- pas d'insulte ;
|
||||||
|
- on laisse terminer la parole et le raisonnement de chacun autour de la
|
||||||
|
table ;
|
||||||
|
- on n'accapare pas la parole pendant trop longtemps ;
|
||||||
|
*** TODO Respecter les normes de comportement
|
||||||
|
- pas de confrontation physique
|
||||||
|
- pas d'intimidation, pas de plaisanterie d'intimidation
|
||||||
|
- pas de geste sans un accord préalable, etc...
|
||||||
|
- on ne rie pas des faiblesses des autres
|
||||||
|
*** TODO Vie de famille
|
||||||
|
- on peut exprimer un désaccord et exprimer pourquoi, mais les consignes ne
|
||||||
|
sont pas ouvertes à discussion
|
||||||
|
- on demande la permission avant de prendre ce qui n'est pas à nous
|
||||||
|
- lorsqu'on à terminé, on range
|
||||||
|
** TODO Gestion des problèmes fréquents [0/3]
|
||||||
|
*** TODO Bricolage [0/5]
|
||||||
|
**** TODO Savoir changer une ampoule
|
||||||
|
**** TODO Savoir réparer une porte qui s'abîme
|
||||||
|
**** TODO Savoir déboucher un évier
|
||||||
|
**** TODO Savoir nettoyer le siphon de la douche
|
||||||
|
**** TODO Savoir nettoyer et déboucher des toilettes
|
||||||
|
*** TODO Santé [0/3]
|
||||||
|
**** TODO Connaître les médicaments pour [0/7]
|
||||||
|
***** TODO Mal de gorge
|
||||||
|
***** TODO Fièvre
|
||||||
|
***** TODO Rhume
|
||||||
|
***** TODO Vomissements
|
||||||
|
***** TODO Diarrhées
|
||||||
|
***** TODO Mal de tête
|
||||||
|
***** TODO Blessure légère
|
||||||
|
**** TODO Savoir faire une trousse de premier soins
|
||||||
|
**** TODO Savoir acheter des médicaments
|
||||||
|
*** TODO Linge [0/1]
|
||||||
|
**** TODO Savoir traiter des taches
|
||||||
|
** TODO Budget [0/3]
|
||||||
|
*** TODO Repartir le budget loisir / nourriture / habits / coûts de la vie [0/4]
|
||||||
|
**** TODO Savoir tous les matins combien il reste
|
||||||
|
**** TODO Savoir tous les matins savoir combien va partir avant la prochaine entrée d'argent
|
||||||
|
**** TODO Savoir combien et quand auront lieu les prochaines dépenses
|
||||||
|
**** TODO Conserver 10% des revenus de coté tous les mois
|
||||||
|
*** TODO Savoir choisir des produits pour les courses
|
||||||
|
*** TODO Savoir consommer/acheter dans le monde moderne
|
||||||
|
- Ne jamais acheter d'assurance sur les produits que les vendeurs proposent
|
||||||
|
- Toujours préférer un achat complet qu'un abonnement, c'est par les
|
||||||
|
services et abonnements que l'argent s'échappe le plus.
|
||||||
|
- Presque toujours préférer un bien à un service
|
||||||
|
** TODO Administratif [0/6]
|
||||||
|
*** TODO Savoir organiser des documents
|
||||||
|
*** TODO Ne pas oublier de rendez-vous
|
||||||
|
*** TODO Savoir où trouver ses documents
|
||||||
|
*** TODO Savoir écrire une lettre
|
||||||
|
*** TODO savoir comment envoyer une lettre en recommandé avec accusé de réception
|
||||||
|
*** TODO Savoir comment récupérer des documents [0/7]
|
||||||
|
**** TODO justificatif de domicile
|
||||||
|
**** TODO mettre a jour sa carte de sécurité sociale
|
||||||
|
**** TODO savoir récupérer un RIB (Relevé d'identité Bancaire)
|
||||||
|
**** TODO savoir comment mettre fin à un contrat
|
||||||
|
**** TODO comment réagir en cas d'accident
|
||||||
|
**** TODO savoir faire opposition sur sa carte bleue
|
||||||
|
* TODO Objectifs Sportifs [0/2]
|
||||||
|
** TODO Régime [0/4]
|
||||||
|
*** Recommandations
|
||||||
|
https://www.insep.fr/fr/actualites/dossier-nutrition-et-performance-sportive
|
||||||
|
**** Besoins
|
||||||
|
***** Énergie (hypothèse 65kg)
|
||||||
|
****** Calories
|
||||||
|
en plus des efforts: 30kcal/kg/j soit pour 65kg => 1950kcal
|
||||||
|
****** Glucides => 200 à 650g/j
|
||||||
|
Très dépendant des efforts de 3 a 10g/kg/j -> de 200 a 650g de glucides par jour
|
||||||
|
****** Protéines => entre 78 et 97g/j, prise muscu: aller jusqu'à 130g/j; ne JAMAIS DÉPASSER 160g/j
|
||||||
|
******* période normale => 78 à 91g/j, max si force 97g/j
|
||||||
|
1,2 à 1.4g/kg/j, si exercices de force, 1,3 à 1.5g/kg/j
|
||||||
|
******* prise de masse => max 130g/j, ne JAMAIS DÉPASSER 160g/j
|
||||||
|
Période prise masse musculaire: aller jusqu'à max 2g/kg/j, jamais dépasser
|
||||||
|
2.5g/kg/j.
|
||||||
|
******* Recommandations:
|
||||||
|
- Attention pas de prise de quantité pour prise masse plus de 6 mois dans l'année.
|
||||||
|
- pas plus de 1/3 via des suppléments.
|
||||||
|
****** Lipides => 65 à 78g/j
|
||||||
|
- lipides: minimum 25% de lipides, soit minimum (1 à 1.2g/kg/j)
|
||||||
|
***** Idée prix par semaine
|
||||||
|
- 1kg de blanc poulet ~= 11€, 1 semaine prise de masse = 910g max, soit ~= 10€.
|
||||||
|
- 1kg de cote de boeuf ~= 40€, soit pour 910g ~= 36€
|
||||||
|
- 1kg de poisson ~= 40€, soit pour 910g ~= 36€
|
||||||
|
**** Chaque repas midi et soir:
|
||||||
|
- au moins une part de légume par repas, midi et soir. Préférer les choux
|
||||||
|
(rouge, brocolis, chou vert, chou-fleur, chou de Bruxelle)
|
||||||
|
- un aliment protéique: viande, volaille, poisson, œuf
|
||||||
|
- féculents: pain, pain complet, riz, riz complet, pâtes, légumes sec
|
||||||
|
(lentilles, pois-chiche, haricot rouges, haricot blancs, etc...)
|
||||||
|
- au moins une cuillère a soupe d'huile de colza
|
||||||
|
**** Courant de la journée:
|
||||||
|
- 3 produits laitiers, privilégiant laitages (yaourts, fromage blanc)
|
||||||
|
- 2 fruits, de préférence frais. Privilégier les fruits rouges.
|
||||||
|
- rester bien hydraté
|
||||||
|
**** Généralités
|
||||||
|
- minimiser les apports de nourritures transformer, un steak vaut mieux
|
||||||
|
qu'un cordon bleu.
|
||||||
|
- essayer de suivre les recommandations au moins 80% du temps
|
||||||
|
*** TODO étape 1
|
||||||
|
- budget 50€/semaine (>200€/mois, a comparer sur un SMIC).
|
||||||
|
- les parents font les courses
|
||||||
|
- apprentissage des recettes, prévoir les horaires (dégager quelques heures).
|
||||||
|
*** TODO étape 2
|
||||||
|
- les parents font les courses
|
||||||
|
- Bastien cuisine
|
||||||
|
*** TODO étape 3
|
||||||
|
- Bastien et les parents font les courses, aide vérification des achats
|
||||||
|
- Bastien cuisine
|
||||||
|
*** TODO étape 4
|
||||||
|
- Bastien fait les courses (avec ou sans les parents)
|
||||||
|
- Bastien cuisine
|
BIN
journal.org.gpg
BIN
journal.org.gpg
Binary file not shown.
BIN
notes.org.gpg
BIN
notes.org.gpg
Binary file not shown.
|
@ -2,7 +2,6 @@
|
||||||
#+TODO: TODO IN-PROGRESS WAIT | DONE CANCELED
|
#+TODO: TODO IN-PROGRESS WAIT | DONE CANCELED
|
||||||
|
|
||||||
M = Command
|
M = Command
|
||||||
|
|
||||||
* Style
|
* Style
|
||||||
** *bold*
|
** *bold*
|
||||||
** /italic/
|
** /italic/
|
||||||
|
@ -30,14 +29,13 @@ M = Command
|
||||||
* work with todos
|
* work with todos
|
||||||
** type =t= or =S-RIGHT= / =S-LEFT= to cycle from todo, done, nothing
|
** type =t= or =S-RIGHT= / =S-LEFT= to cycle from todo, done, nothing
|
||||||
** =, T= show todo tree
|
** =, T= show todo tree
|
||||||
** TODO [#B] Full Task Example :tag1:tag2:
|
** DONE [#B] Full Task Example :tag1:tag2:
|
||||||
DEADLINE: <2019-03-10>
|
CLOSED: [2019-08-08 Thu 15:13] DEADLINE: <2019-03-10>
|
||||||
|
|
||||||
:PROPERTIES: []
|
:PROPERTIES: []
|
||||||
:Effort: 2h
|
:Effort: 2h
|
||||||
:Cost: $200
|
:Cost: $200
|
||||||
:END:
|
:END:
|
||||||
|
|
||||||
* Tables
|
* Tables
|
||||||
|
|
||||||
#+PLOT: title:"example" ind:1 type:2d with:lines
|
#+PLOT: title:"example" ind:1 type:2d with:lines
|
||||||
|
|
|
@ -2,4 +2,3 @@
|
||||||
* Tasks
|
* Tasks
|
||||||
* Notes
|
* Notes
|
||||||
* Agenda
|
* Agenda
|
||||||
* TODO Create self private emacs package/spacemacs layer
|
|
||||||
|
|
50
standup.org
50
standup.org
|
@ -7,36 +7,22 @@
|
||||||
#+TAGS: doc meeting
|
#+TAGS: doc meeting
|
||||||
|
|
||||||
* Matthieu Sprunck
|
* Matthieu Sprunck
|
||||||
** DONE Review of Stealthwatch Enterprise Reference Module #2719
|
** DONE Fix reverted PR #2853 (IROH-INT: module loading with Trapperkeeper)
|
||||||
** DONE Review of Upgraded lein-monolith + cleanup #2726
|
CLOSED: [2019-08-27 Tue 08:40]
|
||||||
** DONE Umbrella: timeframe settings for the most recent dns requests call #2717
|
** IN-PROGRESS Bump ring-swagger-ui to v3 #2894
|
||||||
** DONE SMA Module developer documentation
|
** DONE Support for SWE
|
||||||
** DONE SMA Web Integration
|
|
||||||
** REVIEW Fix the test of the response time in events that was failing randomly #2729
|
|
||||||
* Guillaume Érétéo
|
|
||||||
** REVIEW improve textual search https://github.com/threatgrid/ctia/pull/820
|
|
||||||
** DONE reviewed Matthieu's PR https://github.com/threatgrid/iroh/pull/2725
|
|
||||||
** IN-PROGRESS investigating rollover API in ES to manage quickly growing indices like `event` https://www.elastic.co/guide/en/elasticsearch/reference/5.6/indices-rollover-index.html
|
|
||||||
* Yann Esposito
|
* Yann Esposito
|
||||||
** HOLD IROH-INT API Improvements
|
** Monday
|
||||||
- State "HOLD" from "IN-PROGRESS" [2019-06-07 Fri 17:02] \\
|
*** DONE refresh-jti in access/session tokens to be able to revoke them
|
||||||
Orbital scopes and user-management to make it all work
|
*** DONE Voltron Bug org-id mismatch in PROD: https://jira-eng-rtp3.cisco.com/jira/browse/VOL-2051
|
||||||
- State "IN-PROGRESS" from "HOLD" [2019-06-05 Wed 15:10]
|
*** IN-REVIEW make scope an optional parameter for OAuth2 /authorize endpoint
|
||||||
- State "HOLD" from "IN-PROGRESS" [2019-05-14 Tue] \\
|
https://github.com/threatgrid/iroh/pull/2912
|
||||||
worked on error format normalisation
|
** Tuesday
|
||||||
https://github.com/threatgrid/iroh/issues/2096
|
*** DONE make scope an optional parameter for OAuth2 /authorize endpoint
|
||||||
- separation of settings related code from enrichment code
|
https://github.com/threatgrid/iroh/pull/2912
|
||||||
** WAITING Tenzin config to change the JWT keys
|
*** IN-PROGRESS Review Swagger UI 3
|
||||||
- State "WAITING" from "IN-REVIEW" [2019-07-17 Wed 17:13]
|
https://github.com/threatgrid/iroh/pull/2911
|
||||||
- https://github.com/threatgrid/tenzin-config/pull/40
|
**** DONE CSS Enhancements
|
||||||
** DONE Serve JWT public key/OAuth2 Metadata
|
*** IN-PROGRESS Plan for using refresh-token also for CTR-UI
|
||||||
- https://github.com/threatgrid/iroh/pull/2837
|
https://github.com/threatgrid/iroh/issues/2913
|
||||||
- https://github.com/threatgrid/iroh/issues/2052
|
|
||||||
- https://github.com/threatgrid/iroh/issues/2531
|
|
||||||
- https://github.com/threatgrid/iroh/issues/2708
|
|
||||||
** DONE Fixed Many Public Developer Doc typos/errors
|
|
||||||
- https://github.com/threatgrid/iroh/issues/2708
|
|
||||||
** IN-PROGRESS Stack overflow in inspect
|
|
||||||
** DONE Parallelise tests
|
|
||||||
CLOSED: [2019-07-30 Tue 11:47]
|
|
||||||
** IN-PROGRESS Generate new clients for Cognitive, wrong copy/past on my part
|
|
||||||
|
|
Loading…
Reference in a new issue