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::
|
||||
#+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 is SPC o c
|
||||
** Agenda
|
||||
*** DONE Appeler RDV dentaire
|
||||
CLOSED: [2019-07-15 Mon 16:15] DEADLINE: <2019-06-10 Mon>
|
||||
*** DONE Create self private emacs package/spacemacs layer
|
||||
CLOSED: [2019-07-31 Wed 14:27] DEADLINE: <2019-08-10 Sat>
|
||||
*** DONE finir le dyndns https://www.davd.io/build-your-own-dynamic-dns-in-5-minutes/
|
||||
CLOSED: [2019-09-03 Tue 12:54] DEADLINE: <2019-09-03 Tue>
|
||||
Le port 8080 est utilisé dans docker apparemment.
|
||||
*** 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:
|
||||
*** Redbot [0%]
|
||||
**** 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:
|
||||
** self
|
||||
*** [[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:
|
||||
*** [[https://hnrss.org/newest?points=500][HN]]
|
||||
*** [[https://hnrss.org/newest?points=700][HN]]
|
||||
*** [[https://www.laarc.io/rss][laarc]]
|
||||
*** [[https://lobste.rs/rss][lobsters]] :ignore:
|
||||
***
|
||||
*** [[https://nesslabs.com/feed][nesslabs]] :life:
|
||||
** haskell :haskell:fp:
|
||||
*** [[http://feeds.feedburner.com/ezyang][Inside 206-105]]
|
||||
*** [[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
|
||||
|
||||
M = Command
|
||||
|
||||
* Style
|
||||
** *bold*
|
||||
** /italic/
|
||||
|
@ -30,14 +29,13 @@ M = Command
|
|||
* work with todos
|
||||
** type =t= or =S-RIGHT= / =S-LEFT= to cycle from todo, done, nothing
|
||||
** =, T= show todo tree
|
||||
** TODO [#B] Full Task Example :tag1:tag2:
|
||||
DEADLINE: <2019-03-10>
|
||||
** DONE [#B] Full Task Example :tag1:tag2:
|
||||
CLOSED: [2019-08-08 Thu 15:13] DEADLINE: <2019-03-10>
|
||||
|
||||
:PROPERTIES: []
|
||||
:Effort: 2h
|
||||
:Cost: $200
|
||||
:END:
|
||||
|
||||
* Tables
|
||||
|
||||
#+PLOT: title:"example" ind:1 type:2d with:lines
|
||||
|
|
|
@ -2,4 +2,3 @@
|
|||
* Tasks
|
||||
* Notes
|
||||
* Agenda
|
||||
* TODO Create self private emacs package/spacemacs layer
|
||||
|
|
50
standup.org
50
standup.org
|
@ -7,36 +7,22 @@
|
|||
#+TAGS: doc meeting
|
||||
|
||||
* Matthieu Sprunck
|
||||
** DONE Review of Stealthwatch Enterprise Reference Module #2719
|
||||
** DONE Review of Upgraded lein-monolith + cleanup #2726
|
||||
** DONE Umbrella: timeframe settings for the most recent dns requests call #2717
|
||||
** DONE SMA Module developer documentation
|
||||
** 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
|
||||
** DONE Fix reverted PR #2853 (IROH-INT: module loading with Trapperkeeper)
|
||||
CLOSED: [2019-08-27 Tue 08:40]
|
||||
** IN-PROGRESS Bump ring-swagger-ui to v3 #2894
|
||||
** DONE Support for SWE
|
||||
* Yann Esposito
|
||||
** HOLD IROH-INT API Improvements
|
||||
- State "HOLD" from "IN-PROGRESS" [2019-06-07 Fri 17:02] \\
|
||||
Orbital scopes and user-management to make it all work
|
||||
- State "IN-PROGRESS" from "HOLD" [2019-06-05 Wed 15:10]
|
||||
- State "HOLD" from "IN-PROGRESS" [2019-05-14 Tue] \\
|
||||
worked on error format normalisation
|
||||
https://github.com/threatgrid/iroh/issues/2096
|
||||
- separation of settings related code from enrichment code
|
||||
** WAITING Tenzin config to change the JWT keys
|
||||
- State "WAITING" from "IN-REVIEW" [2019-07-17 Wed 17:13]
|
||||
- https://github.com/threatgrid/tenzin-config/pull/40
|
||||
** DONE Serve JWT public key/OAuth2 Metadata
|
||||
- https://github.com/threatgrid/iroh/pull/2837
|
||||
- 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
|
||||
** Monday
|
||||
*** DONE refresh-jti in access/session tokens to be able to revoke them
|
||||
*** DONE Voltron Bug org-id mismatch in PROD: https://jira-eng-rtp3.cisco.com/jira/browse/VOL-2051
|
||||
*** IN-REVIEW make scope an optional parameter for OAuth2 /authorize endpoint
|
||||
https://github.com/threatgrid/iroh/pull/2912
|
||||
** Tuesday
|
||||
*** DONE make scope an optional parameter for OAuth2 /authorize endpoint
|
||||
https://github.com/threatgrid/iroh/pull/2912
|
||||
*** IN-PROGRESS Review Swagger UI 3
|
||||
https://github.com/threatgrid/iroh/pull/2911
|
||||
**** DONE CSS Enhancements
|
||||
*** IN-PROGRESS Plan for using refresh-token also for CTR-UI
|
||||
https://github.com/threatgrid/iroh/issues/2913
|
||||
|
||||
|
|
Loading…
Reference in a new issue