Just a save point

This commit is contained in:
Yann Esposito (Yogsototh) 2019-09-14 21:26:57 +02:00
parent ffe1c79e1e
commit 76c4f5824d
Signed by untrusted user who does not match committer: yogsototh
GPG key ID: 7B19A4C650D59646
14 changed files with 304 additions and 945 deletions

Binary file not shown.

View file

@ -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.

View file

@ -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)~~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~

View file

@ -1,2 +0,0 @@
clean: *.hi *.o
rm -f *.hi *.o

View file

@ -1,3 +0,0 @@
#!/bin/bash
stack ghc --package parallel -- -threaded -O2 005_purete_par.hs

View file

@ -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
View 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

Binary file not shown.

Binary file not shown.

View file

@ -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

View file

@ -2,4 +2,3 @@
* Tasks
* Notes
* Agenda
* TODO Create self private emacs package/spacemacs layer

View file

@ -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