Nous allons voir comment simplifier l’accès en mettant un accès SSH sur chaque instance. Pour se connecter à l’instance 101. La commande sera
1
|
|
Enfin je donne la version complète du fichier ipstable_start.sh
Pour se connecter sur un instance pour le moment on est obligé de passé par l’interface graphique ou par la ligne de commande. La ligne de commande n’est pas évidente( pour quitter Ctrl A
+ q
) et pas pratique. On aimerait pourvoir se connecter via l’extérieur pour mettre en place du déploiement automatique genre capistrano
Avec OpenVZ par défaut le ssh est ouvert pour l’utilisateur root. Ce n’est pas le cas sur LXC. Deux possibilités:
sudo adduser deploy
sur l’instance, c’est d’ailleurs en un sens inévitable si vous travaillez en équipe./etc/ssh/sshd_config
sur l’instance et modifier la ligne PermitRootLogin without-password
à PermitRootLogin yes
voici la syntaxe pour la machine vm101
.
On redirige le port 50101 du proxmox vers la vm101 port 22
1
|
|
On peut faire une boucle for pour créer par défaut. vm101->50101, vm102->50102, ..
1 2 3 4 5 |
|
Il y aussi des règles sur mesure, Dans mon fichier vous verrez l’exemple de Node+Socket.io ou je redirige le port 8000 du proxmox vers l’instance 102
1
|
|
Enfin le fichier final.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
un exemple pour la vm101 (si l’utilisateur deploy existe..)
Un morceau de deploy.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
Alors la commande
1
|
|
se connecte tout seul sur la Vm
La documentation de capistrano est bien faite. Pour Symfony il existe capyfony mais c’est depreacted depuis..
J’ai eu beaucoup de mal à trouver des documentations à jours pour le PROXMOX 4. Cette série d’article contient le résultat de mes recherches. (Je remercie aussi mes collègues pour l’aide).
Il y a plein de liens qui expliquent beaucoup mieux que moi. N’hésitez pas à commencer par ceux-là et revenez sur mes posts pour adapter de proxmox3 à proxmox4. Je pense surtout à
Merci de m’avoir lu.
Soit le JsonSchema suivant
1
|
|
Pas de retour à la ligne.
Grâce à la commande suivante.
1
|
|
Le fichier devient
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
|
On utilise en pratique python pour réécrire le code.
Vous pouvez essayer
1
|
|
Ce qui est pratique est que python est installé par défaut sous Linux. Il existe aussi jq, mais il n’est pas par défaut.
]]>Je suis en train de suivre la formation sur FreeCodeCamp. Un des exercices et de refaire “le jeu de la vie” en React.
Le jeu de la vie a été crée par Conway.
Les règles sont très simples.
Une animation parle mieux..
Vidéo du créateur
Voici le code que j’ai implémenté.
See the Pen Game of life React FreecodeCamp by mcamuzat (@mcamuzat) on CodePen.
Au moment ou j’écris ces lignes, un nouveau type de vaisseau a été découvert voir aussi... Il y a toujours des amateurs..
Sous google une recherche sur conway’s game of life donne un easter-egg.
]]>vim
ou nano
. Je suis un grand fan de de vim
mais aujourd’hui je vais parler de nano
. Par défaut il n’y a pas de coloration syntaxique et pas de couleurs tout cours. Nous allons activer celle-ci
Et voici le résultat sur un fichier php.
Il faut créer un fichier .nanorc
dans votre home. Et rajouter la ligne suivante.
1
|
|
Tous les fichiers se situent /usr/share/nano
1 2 3 4 5 6 |
|
Il suffit d’ajouter la ligne avec le langage que voulez.
1
|
|
Mais il y a encore mieux !
Un dépot avec plein de fichier .nanorc
.
Pour installer
1
|
|
Il suffit de rajouter dans son .nanorc
1
|
|
Il y a aussi ce dépôt.
Nano est un outil très chouette. C’est souvent l’éditeur par défault dans linux.
]]>Il permet d’aligner les lignes de codes par exemple :
1 2 3 |
|
Si je sélectionne le texte et que j’appuie sur :
et que je tape :Tabularize /|
Mon tableau devient
1 2 3 |
|
Cela marche avec n’importe quelle clés
1 2 |
|
J’appuie :Tabularize /=
1 2 |
|
la syntaxe est :Tabularize /<le ou les caractères que vous voulez indenter>
Pour les tableaux en php
1 2 3 4 |
|
Résultats : :Tabularize /=>
:
1 2 3 4 |
|
Je m’en sers surtout pour indenter les tableaux dans les features dans Behat.
Si vous avez installé vim-plug il suffit de rajouter la ligne suivante.
1
|
|
Une video qui explique tout (en anglais).
Il existe une quantité monstrueuse de plugin sur Vim. Je vais parler de la gestion de plugin. Avant de commencer une série sur les meilleurs plugins de Vim.
Nous allons utiliser un gestionnaire de plugin : vim-plug.
Nous allons éditer notre fichier ~/.vimrc
Nous collons les lignes suivantes au tout début de votre fichier.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
Voila exactement ce que fais le programme.
call plug#begin('~/.vim/plugged')
et call plug#end()
Par exemple si je souhaite rajoutez le plugin Nerdtree (permet un d’avoir une affichage en arbre des fichiers)
1 2 3 4 5 |
|
Pour installer dans vim
1
|
|
Normalement tout les plugins s’installent en parallèles avec des jolies barres de progressions.
Pour updater les plugins
1
|
|
Pour supprimer les plugins inutiles
1
|
|
Enfin il existe une vue spécifique pour voir le status des plugins
1
|
|
Ce qui est sympa avec Vim-plug est que l’on peut mettre des conditions dans les plugins
1
|
|
ici vim-snippets
dépends de ultisnips
On charge paresseusement les plugins
1
|
|
Je n’ai besoin du plugin php-vim
que si j’utilise un fichier PHP.
1
|
|
Je charge le plugin que si je l’appelle.
bundle
dans .vim
et de cloner le plugin vim. Et le plugin était installé. Pour supprimer le plugin, il suffit faire un rm du dépôt1 2 3 4 5 |
|
J’ai utilisé ceci pendant des années et cela me suffisait
.vimrc
L’idée est de versionner son fichier .vimrc
sur github. Et de partager les raccourcis claviers, Il n’est pas rare d’avoir des fichiers de 1000 lignes. Je suis en train de refaire le mien.
Un vimrc c’est pour résumer.
.vimrc
que je trouveNous allons continuer avec les plugins dans une future série d’articles.
Merci de m’avoir lu, Je m’excuse pour les fautes.
]]>nginxproxy
.
Ce que je veux..
J’ai plusieurs sites et noms de domaine sur mon Proxmox. Je souhaite mettre chaque site dans un container. Ainsi tout est isolé, je peux mettre toute les versions que je veux.
Par exemple, je souhaite
Nous allons utiliser Nginx pour rediriger le trafic.
Je vais
Il suffit de rajouter la ligne suivante dans mon fichier iptables_start.sh
sur le Proxmox
1 2 |
|
Maintenant tout le trafic web se redirige vers le futur Nginx.
Sur la vm précédemment crée.
1
|
|
Il faut rajouter la ligne suivante dans le fichier /etc/nginx/nginx.conf
1 2 3 4 5 6 7 8 |
|
Et rajouter ou créer (je ne me souviens plus ..) le fichier /etc/nginx/proxy_params
1 2 3 4 |
|
Enfin voici un exemple pour blog.domaine1.com
/etc/nginx/sites-available/blog.domaine1.com.conf
1 2 3 4 5 6 7 |
|
Pas grand chose à rajouter la conf parle d’elle-même.
Il ne reste plus qu’a activer le site
1 2 |
|
Un Nginx restart..
1
|
|
Il ne nous reste plus qu’a créer une VM pour héberger le blog.domaine1.com
Tout cela marche bien mais je suis resté assez flou sur la façon de se connecter sur les VMs
Dans la partie 3 Je vais essayer de clarifier tout cela.. Je m’excuse pour les fautes d’orthographes. Et je vous remercie de m’avoir lu.
J’ai acheté un serveur dédié chez OVH. Au travail nous utilisons un Proxmox En solution de virtualisation. Étant plutôt content du logiciel. J’ai tout naturellement installé Proxmox sur mon serveur dédié. J’en ai profité pour passer à la version 4.
Mais …
Proxmox V4 utilise LXC alors que la version précédente utilise OpenVZ. Et tous les tutoriaux sont globalement sur les versions 3.
Je suis arrivé à installer le logiciel. Voici le résumé de la première partie
J’ai acheté la machine déjà installée sur OVH.
Pas grand chose à dire dessus.
se connecter en ssh
1
|
|
dans le /etc/network/interfaces
C’est un peu la ou j’ai eu beaucoup de mal. Par défaut il y a normalement déjà deux interfaces virtuelles (des bridges pour être plus précis) déjà installées. vmbr0
et vmbr1
.
vmbr0
Voici la configuration de mon serveur.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
Je n’ai rajouté que les lignes suivantes dans vmbr1
1 2 3 4 |
|
Il faut aussi activer l’IP forwarding
pour ce faire il faut éditer le fichier /etc/sysctl.conf
1 2 |
|
Il faut lancer le programme pour prendre en compte les modifications
1
|
|
Et redémarrer le service network
1
|
|
Voici le script dans le répertoire
/root/iptables_start.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
La première partie vide toute les règles de redirection.
La seconde partie va permettre au VM dont l’IP est entre 192.168.15.1 à 192.168.15.254 de sortir sur le réseau.
vmbr1
avec une adresse en 192.168.15.20/24iptables_start.sh
qui supprime les anciennes regles et qui permet au réseau 192.168.15.0/24 de récuperer le net.Allons sur la dashboard de votre proxmox (voir mail OVH)
Normalement vous avez une icônes avec un disque dur avec normal(..) cliquer sur content->menu Template
Téléchargeons une Ubuntu.
Cliquer sur l’icône create CT
en haut à droite.
Normalement avoir l’image suivante.
Mettons le noms de l’instance nginxproxy
et mettons un mots de passe. Normalement on vous propose VM ID 101
si vous n’avez aucun container.
Mettre l’iso Ubuntu que vous venez de télécharger
8 giga c’est très bien
C’est ici que l’on regle le nombre de cpu
Vous pouvez rajouter de la mémoire ici (2Giga en Memoire, Swap 512)
C’est ici que c’est un peu plus compliqué
dans le bridge mettre vmbr1
Dans l’ip c’est simple c’est 192.168.15.<numéro d'instance>/24
. si vous avez l’instance 101 alors l’ip est 192.168.15.101/24
Dans la gateway c’est 192.168.15.20
la même IP défini dans le vmbr1
Rien à faire..
Vous n’avez plus qu’a confirmer. Normalement en 15 secondes la VM est crée.
Avant d’allumer la vm cliquer sur l’icône de la VM puis Options
puis cliquez sur la ligne Start at boot
puis Edit
et yes
si le proxmox redémarre, on relance la machine (ce qui n’est pas le cas par défaut)
Vous pouvez lancer la vm cliquez sur start.
Nous avons réglé le proxmox, installé la première instance. dans la partie 2 nous nous connecterons sur l’instance pour terminer les réglages. Nous mettrons en place aussi le nginx pour rediriger les urls vers les bonnes instances.
Cela crée une animation des différents commits. Cela permet de visualiser le travail accompli, les différents intervenants.
Crée un modèle 3D du dépots.
C’est assez bizarre.. On ne comprend pas trop ce qui est représenté. Mais C’est plûtot joli.
Rentrez l’utilisateur et puis le projet (la visualisation s’inspire de codeswarm)
Vue par auteur
Vue par projet
Il y a eu des tentatives de générer un CV via le dépôt de github (Notamment resumé (down) et The Open Source Report Card (down). Les deux sites ne marchent plus depuis la modifcation de l’API de Github.
Un Github bien rempli montre que l’utilisateur est actif et qu’il participe. Mais le contraire ne prouve rien. Cela fait 7 ans que je bosse dans le monde de l’informatique. Mon Github est plutôt vide (mais grâce au blog je le remplis chaque semaine..)
]]>Pour écrire du code en Markdown on utilise la syntaxe suivante
1 2 |
|
C’est pas génial car on perd la coloration syntaxique, et j’ai fais pas mal d’erreurs.
Mais grâce à la commande suivante
1
|
|
Voici un avant et après
C’est beaucoup mieux ! Un petit bémol pour le PHP (ma joie !) il faut obligatoirement mettre <?php
.
Bref un commande que j’aurai aimé avoir avant.
Il y a plein d’astuce de ce genre sur le site suivant
]]>Règle N°1 : éviter git add .
Personnellement j’utilise tig. (voir le post)
Solution bis :
1
|
|
Règle N°2 : éviter le git reset --hard
La solution est un peu trop radicale. Comme le git add .
vous allez le regretter un jour, car vous perdez tout votre travail. Ce que vous voulez c’est remettre certain fichier au propre et ce n’est pas forcement la bonne commande.
1
|
|
A noter que cela réverte tout vos fichiers, mais s’il faut filtrer.
1
|
|
Bien entendu il existe le mode interactif
1
|
|
Attention si le commit est déja pushé. Vous serez obliger de faire un push -f
donc on évite de faire cela sur les branches master, staging, develop
Vous avez commiter mais le commit est pas bon.
Si c’est juste le message qui est faux
1
|
|
Si un des fichiers n’est pas bon
1
|
|
Vous remarquez que j’utilise --soft
au lieu --hard
. Le reset soft me remets avant que j’ai commité. Je ne perds pas mon travail, même mieux les fichiers sont déjà prêt à être commités.
Vous avez un export.sql
, toto.txt
, npm-debug.log
Attention à ne pas perdre du travail.
1 2 |
|
Avec -f
force Obligatoire -d
pour directory(répertoire) -x
virer les fichiers ignorés de git.
Pour voir ce qui pourrait être effacé pendant la commande.
1
|
|
Enfin il existe aussi un mode interactif
1
|
|
a
au lieu de i
Tout le monde utilise VI pour éditer ses fichiers de configs sous linux ou les fichiers sur un serveur distant (il y a aussi nano
qui marche super bien). Moi personnellement je code aussi du php/js avec. Pour insérer du texte on utilise la touche i
comme insérer puis ESC
pour quitter le mode insertion. Je vais parler des autres touches pour insérer du texte.
Le problème de la touche i
c’est justement que l’on insère le texte. Le curseur n’est pas à la bonne position. On souhaite plutôt ajouter du texte après le curseur. Et c’est le principe de la touche a
(comme Append ou Ajouter).
Si c’est rajouter une ligne vide. La touche o
comme open une nouvelle ligne.
la lettre majuscule est la version plus musclée que la minuscule
i
insère au début du curseur.I
insère au début de la lignea
ajoute du texte à la fin du curseur.A
ajoute du texte à la fin de la ligne.la lettre majuscule est le contraire de la version minuscule
o
ouvre une ligne après le curseurO
ouvre une ligne avant le curseurEn résumé
i
et ->
: utiliser a
I
suivi de//
A,
i
et <enter>
, la touche o
.Essayons de commenter les trois lignes.
1 2 3 |
|
J’appuie sur I
puis //
pour commenter
J’obtiens
1 2 3 |
|
J’appuie sur j
ou bas
1 2 3 |
|
Si j’appuie sur la touche .
je répète la dernière instruction. La touche .
est probablement la touche la plus utile.
1 2 3 |
|
Et ainsi de suite..
Mais il y a beaucoup de manière sur VIM pour faire la même chose.
Par exemple sélectionnons le texte avec la touche v
ou la souris( set mouse=a
). puis appuyons sur :
Vous deviez voir
1
|
|
alors complétons la ligne par '<,'>norm I//
et tout le texte sélectionné est commenté!
La commande précédente se lit sur la zone sélectionnée '<,'>
appuyez(norm
) sur I
puis \\
.
La touche gi
vous emmène au dernier endroit ou vous avez inséré du texte et place directement en insertion.
En conclusion, Il n’y pas que le touche i
dans Vi. En fait on se sert assez peu de cette touche.. C’est pourtant la plus connue..
Sur les projets backends pour éviter d’installer un linux, le site conseille de créer un compte sur Cloud9.
Je crée un nouveau workspace.
Je choisis nodejs.
Sur cette image on voit l’explorateur de fichiers, l’éditeur et la ligne de commande. Nous sommes déjà dans un vm. Toutes les commandes Linux sont disponibles. apt-get
, npm
etc..
Dans l’onglet windows>share
Ici on voit l’url de l’environment. Si j’allume le nodejs. mon application est disponible à
1
|
|
à la création de l’environnement il est possible de choisir un dépôt.
on précise par exemple..
1
|
|
Ainsi l’environnement est déjà prêt.
Cloud9 est gratuit et il n’y pas vraiment de raison de se priver.
Il n’y a qu’un environnement privé pour une licence gratuite. Mais c’est largement suffisant pour débuter.
]]>Nous allons voir ensemble comment les applicatives se comportent sur les listes.
Rappelons que l’idée des applicatives c’est
Pour la liste c’est un peu près la même idée.
Initialisons une Collection de valeurs
1
|
|
Créons un collection de fonctions
1 2 3 4 5 6 7 8 |
|
Regardons de suite le résultat, nous obtenons une collection qui contient [4, 5, 5, 6]
. En fait on a calculé toutes les possibilités.. Puisque [1+3, 1+4, 2+3, 2+4]
Essayons de programmer un générateur de nom de scout (?!!)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
Grâce à l’évaluation partielle je peux créer des fonctions à plusieurs arguments. Les applicatives sur les listes me permette de faire toutes les combinaisons.
J’obtiens
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Bon c’est sur que petit renard affectueux n’est pas génial comme nom..
Le Panda bavard.
Liste des articles
Le but ici est de s’introduire le premier dans un programme(via connection ssh, iso) et de capturer le drapeau. C’est un concours et un peu un jeux de piste. On distingue deux types
les CTF. c’est un jeu avec une date de début et une date de fin. Je n’ai jamais participé à ce genre d’évènement.
Quand on peux rentrer à n’importe quelle moment on parle de Wargame.
Il y a plein de techniques j’avoue que je connais assez peu, j’ai un peu joué avec la backtrack (maintenant connue sur le nom de Khali-Linux)
Pour apprendres les failles XSS , C’est google qui a fais le site suivant
Je suis beaucoup sur Codewars. La présentation est clean..
Mais il existe une énorme quantité de site dans le même genre.
Et aussi
Il existe aussi des concours pour apprendre de la cryptologie
Je vous laisse j’ai un crime à résoudre.. Il y a de quoi s’occuper.
]]>Je ne développe pas en Haskell mais je regarde beaucoup. La série que j’écris sur la programmation fonctionnelle me force à regarder le langage de plus près. Le monde haskell s’est enrichi d’un nouvel outil Stack.
Stack est un logiciel qui gère l’installation/les packages/la création/le build/les tests d’un projet Haskell.
Il a plusieurs avantages:
stack.yml
c’est l’équivalent d’un composer.json
en php ou un package.json
en node.~/.stack
tout les programmes sont isolés et n’interfèrent pas avec les autres logiciels déjà pré installés.Il suffit d’ajouter les clés/et le dépôt sous ubuntu : voir la documentation Une fois que le logiciel est installé
1
|
|
crée une arborescence toute faite
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
A noter qu’il existe des templates d’applications (Un peu comme Yeoman)
Par exemple pour créer une application Yesod (Pour faire un serveur web) et Mysql
1
|
|
Pour lister les différents templates
1 2 3 4 5 6 7 8 9 10 11 |
|
1 2 |
|
Si Haskell n’est pas encore installé dans ~/.stack
, le logiciel s’occupe de tout, il installe aussi toutes les dépendances.
1
|
|
Le haskell est un language compilé. Le logiciel compile tout le projet.
Pour lancer le programme
1
|
|
Pour lancer les tests. Tout les projets viennents avec des tests
1
|
|
un peu comme un make install
1
|
|
Docker c’est cool et pratique.
dans le stack.yml
1 2 3 4 5 6 7 8 9 10 11 |
|
Si l’image de base existe déjà
Alors
1
|
|
Cela génère le container.
Il ne reste plus qu’à lancer le container
1
|
|
stack new nom-du-projet nom-du-template
crée un nouveau projetstack setup
mise en place du projetstack build
compile le projetstack exec nom-du-programme
lance le programmestack repl
Lance le mode interactifstack test
Lance les testsstack install
installe le programme.stack templates
liste tout les templates.Je me mets au Haskell. C’est assez passionnant. Le langage n’est pas simple (je me casse un peu les dents dessus). Je suis pour l’instant juste sur les premiers problèmes de codewars. J’espère faire des post sur haskell par la suite. Il y a déja plein de tutoriels.
Reprenons le container Maybe
Ce que j’aimerai c’est pouvoir faire ce genre d’opération
1 2 3 |
|
La bonne nouvelle c’est que c’est possible.
J’ai besoin de 2 étapes:
ap
pour applicative.Grâce à composer c’est très simple.
1
|
|
Voici le fichier php dans la racine du projet
1 2 3 4 5 6 7 8 9 |
|
Si vous obtenez ceci
1 2 3 4 |
|
Tout va bien!!
Je n’ai pas utilisé les mêmes noms que la librairie voici les traductions
Maybe\just(10)
est un helper Maybe\Just::of(10)
Maybe\nothing()
-> Maybe\Nothing::of(10)
Nous allons faire quelque chose de curieux puisque nous ne mettons pas une valeur dans notre Maybe mais une fonction !
Regardons un exemple simple
1 2 3 4 5 |
|
Dans le premier Maybe on a mis une fonction. ap
prend en entrée un Maybe.
Nous obtenons
1 2 3 4 |
|
Essayons avec Nothing
1 2 3 |
|
Le résultat
1 2 |
|
Cela ne semble pas très utiles
Nous allons utiliser notre fonction curryN
du post précédent.
1 2 3 4 5 6 7 8 9 10 |
|
(? + ?)
just(? + ?)
ap
je soumet le premier argument, il manque encore un argument , la fonction devient just( 5 + ?)
.ap
l’argument manquant est fournis. La fonction est complète just( 5 + 5)
-> just(10)
.La recette est simple, Je mets la fonction à plusieurs arguments dans mon Maybe avec le curryN. et j’applique chacun des arguments.
En fait si on fait une image
Mais nous pouvons faire cela avec toutes les fonctions
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
C’est pratique car nous pouvons maintenant appliquer des fonctions à plusieurs arguments. et des fonctions qui ne travaillent pas avec des object Maybe, Nothing.
Quand on “augmente” les fonctions pour travailler avec d’autre types, on appelle cela le Lift
D’ailleurs cela s’exprime en 1 ligne avec la librairie
1 2 3 4 5 |
|
map
qui prend en entrée une fonction.ap
prend en entrée un applicative. Cela permet d’appliquer des fonctions à plusieurs arguments.bind
qui prend entrée une fonction monadique c’est à dire qui renvoie une Nomade.Tous les monades que j’ai présenté implémentent les 3 fonctions (Maybe, Collection, Identity(Container)).
Dans le prochain Post nous allons voir le cas particulier de ap
pour les collections.
C’est assez basique mais la présentation est très propre Cssdiner
flex
C’est relativement récent cela ne marche pas sur tout les navigateurs (pas de problème sous firefox) flexbox froggy
Pas un jeu mais un tutoriel de la part de mozilla thimble
Le but est à la fois simple et plutôt compliqué faire atteindre x à l’infini. Sauf que vous devez payer pour ajouter des caractères.
On ne peux utiliser les caractères [e, E, *, /, 5, 6, 7, 8, 9, another x]
. Ce serait trop simple x+=x
.
Quand on connait l’astuce cela se résout en 30 secondes.
Voila de quoi occuper vos soirées.
]]>J’ai besoin pour le prochain chapitre d’introduire la notion d’application partielle. Cela consiste à évaluer une partie de la fonction même si je n’ai pas tous les arguments.
Soit la fonction suivante.
1 2 3 |
|
Que donne l’exécution ?
1
|
|
Une erreur bien entendu, puisque il manque un argument..
Voici une fonction tirée de la librairie php-functionnal
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Et maintenant reprenons ma première fonction
1
|
|
Maintenant réessayons notre commande
1
|
|
Je n’ai pas d’erreur mais il y a mieux !
1
|
|
Varions encore un peu avec aucun argument
1 2 |
|
S’il manque un argument, la fonction ne renvoie pas de résultat mais une nouvelle fonction.
On appelle cela l’évaluation partielle.
C’est plutôt pratique..
Par exemple
1 2 |
|
Devient
1 2 3 |
|
Si toute les fonctions ne prennent qu’un argument, Il y a moins de cas à tester. De plus cela permet une meilleure isolation du code. Une fonction à 5-6 arguments est rarement un bon signe dans le code.
Nous allons nous servir de cette astuce pour nos monades/functors. Depuis le début on ne peux mettre qu’une seule valeur dans mon container donc comment faire pour faire des fonctions à plusieurs arguments ?
Il faut quand même noter que le langage PHP n’est pas génial pour le coup.
L’expression suivante en javascript est parfaitement légale.
1
|
|
je suis obligé d’utiliser une variable intermédiaire en PHP.
1 2 |
|
Bref la syntaxe n’est pas très pratique.
En Haskell et OCaml l’évaluation partielle est la norme.
1
|
|
En fait le langage fait.
1
|
|
Transformer une fonction à plusieurs arguments en une série de fonction à un argument s’appelle la Curryfication. Cela vient du prénom de la première personne a avoir écris sur le sujet Haskell Curry. Le nom de famille doit voir dire quelque chose aussi..
Cela semble un peu compliqué et pas forcement intéressant sur les exemples que j’ai choisi. Mais dans le prochain post nous allons utiliser cette notion.
Merci de m’avoir lu.
Voici notre nouveau container Le container List. Il prend en entrée un tableau (Array) ou en Php un Traversable
.
Nous allons voir ensemble les listes, Collections. Nous allons voir le map
, le bind
nous allons voir que le comportement n’est pas exactement le même..
Ne nous embêtons pas allons directement dans l’implémentation.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
On garde toujours la même définition. map
prend toujours une fonction et renvoie un Objet du même type. extract
renvoie la valeur, Collection::of
renvoie une collection.
Quelques exemples
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Nous allons reprendre notre liste du post précédent
1 2 3 4 5 |
|
maybe
grâce à l’instruction maybeFromValue
(post2)Nous aimerions utiliser notre instruction get
.
l’algo :
Cela donne ..
1 2 3 4 5 6 7 8 |
|
Oui vous ne rêvez pas c’est une fonction qui renvoie une fonction qui renvoie une fonction.
L’implémentation est sympathique..
1 2 3 4 5 6 |
|
Nous obtenons en une ligne sans if sans condition.
1
|
|
Je n’ai pas donnée le code du bind qui se résume à
1 2 3 4 |
|
Je vais essayer de justifier tout cela.
Partons d’abord du principe que $this->concat
n’existe pas..
Donc mon bind
devient
1 2 3 4 |
|
Un exemple
1 2 3 4 5 6 7 |
|
Le résultat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
Nous avons une collection qui contient une collection (double container!!) et pire dans chaque valeur est encore une collection !. On perd aussi le chainage.
Bref nous avons tout perdu.
Nous allons aplatir le résultat.
C’est a dire que nous allons transformer notre collection [[a],[b],[c]]
en [a, b, c]
Voici l’implémentation en code.. C’est un peu long n’hésitez pas à sauter cette partie..
Partons du principe que c’est un array..
On aplati notre liste ainsi
1 2 3 4 5 6 7 8 |
|
Le problème est que notre collection n’est pas un Array
.. Mais essayons avec une fonction un peu plus tordue
1 2 3 4 5 6 7 8 |
|
C’est un façon un peu plus complexe d’exprimer la même chose que le code plus haut. Sans utiliser les boucles foreach
.
Le reduce pour notre collection est facilement exprimable.
1 2 3 4 5 6 7 8 9 |
|
Reprenons le code du array_reduce
et utilisons notre reduce
1 2 3 4 5 6 7 8 9 10 11 |
|
Voici comment on aplatit notre fonction et on sauvegarde le chainage. Mais il y a mieux..
Montrons quelque exemples de bind.
Soit le fonction suivante
1 2 3 |
|
Un exemple
1 2 3 4 |
|
Le résultat
1
|
|
1
|
|
Nous commençons avec un lapin, nous multiplions par 3 à chaque interaction. Comme la liste est aplatie à chaque fois.
Soit la fonction suivante
1 2 3 4 5 6 7 8 |
|
Soit la fonction suivante
La fonction inférieure à 20 renvoie un array vide.
1 2 3 4 5 6 7 8 9 10 11 12 |
|
bind
1
|
|
bind
1
|
|
bind
1
|
|
1 2 3 4 5 6 7 |
|
cette fonction donne toute les parties possibles dans deux coup.
On comprend assez bien l’intérêt de cette monade pour gérer des listes, mais il y a une autre vision possible. La collection avec le bind est considérée comme une façon de gérer des entrées non déterministes. J’ai eu un peu de mal à comprendre, mais voici l’idée.
La valeur 3 n’a qu’une valeur qui est 3
facile, la valeur [1, 2, 3]
est une représentation de la même valeur sauf qu’elle à trois états possible 1, 2, 3
. Grâce au bind
je prend en compte tous les états possibles.
Pour résumer :
Il reste encore beaucoup de chose à parler. Nous avons parlé des functors(map
ou fmap
), des monades (of
et bind
) nous allons voir les applicatives..
Il existe en français !! Apprendre Haskell vous fera le plus grand bien !
Partie 1 : Monade/Functor