Les Monades (suite): Le Functor Maybe..

Il y a deux containers

Nous avons vue dans le précédent post un pseudo-container qui nous permet d’emballer nos valeurs. Nous allons muscler un peu notre container mais partons d’un exemple.

Je souhaite récupérer le mail du client “bob” ou afficher “pas de mail”

1
2
3
4
5
6
7
function getMail($name) {
$mail = getUserByName($name)->getAddress()->getMail();
if (null === $mail) {
   return "pas de mail";
}
return $mail;
}

Facile non ?

Les Monades en PHP c’est possible..

Introduction

Nous allons voir ensemble les monades. Nous allons voir la monade Identity. elle n’est pas très utile mais nécessaire si vous voulez comprendre la monade/functor Maybe qui j’espère va changer votre façon de voir votre code mais ce sera dans le post suivant.

Les monades sont des structures de la programmation fonctionnelle. Très utilisées dans le langage Haskell. En pratique Haskell serait moins attractifs sans cette structure. (Je ne suis absolument pas développeur Haskell.)

Faire des jointures sur des fichiers csv

Introduction

Un problème que j’ai eu au travail.

Soit les deux fichiers suivants csv suivant

1
2
3
4
5
ID_1,Noms1,Personne1
ID_2,Noms2,Personne1
ID_2,Noms2,Personne2
ID_3,Noms3,Personne1
ID_5,Noms5,Personne5
1
2
3
4
SIRET1,Adresse1,Noms1Annuaire,ID_1
SIRET2,Adresse2,Noms2Annuaire,ID_2
SIRET3,Adresse3,Noms3Annuaire,ID_3
SIRET4,Adresse4,Noms4Annuaire,ID_4

Je souhaite faire un merge de ces deux csv. Comment faire ?

Git grep

Dans le post précédent j’ai parlé des commandes linux patch et diff. des fonctionnalités ou on utiliserait plutôt Git. Ici je vais faire le contraire : utiliser git sans utiliser les commandes linux. Je vais parler de git grep.

git grep

l’utilisation est très simple

1
git grep hello

On peut utiliser une regex le résultat s’affiche dans un pager (sous linux c’est souvent less).

Diff et patch, pas besoin de git

Nous allons jouer un peu avec les diff et les patchs.

 Mise en place

Soit le fichier suivant README.md

1
2
3
4
5
Ceci est un exemple.


Ceci est une ligne ajoutée

Modifions le fichier par ceci.

1
2
3
4
5
6
7
8
9
Ceci est un exemple.







j'ai ajouté cette ligne

Enregistrons celui-ci en README2.md

Et lançons la commande suivante

1
diff README.md README2.md

Nous obtenons le résultat suivant

1
2
3
4
5
6
7
4d3
< Ceci est une ligne ajoutée
6a6,9
>
>
>
> j'ai ajouté cette ligne

Il y a en fait plusieurs formats

Essayez la commande suivante

1
diff -u README.md README2.md > readme.diff

On obtient le fichier suivant

1
2
3
4
5
6
7
8
9
10
11
12
13
--- README.md   2015-11-02 22:07:43.728854981 +0100
+++ README2.md  2015-11-02 22:13:58.244839112 +0100
@@ -1,6 +1,9 @@
 Ceci est un exemple.


-Ceci est une ligne ajoutée


+
+
+
+j'ai ajouté cette ligne

Listes Chainées Iterator

Troisième partie sur la SPL et les listes chainées.

Nous allons implémenter l’interface ArrayAccess. Donc notre liste chainée va se comporter comme un array.

Je vais rajouter deux méthodes. Attention les Array commencent traditionnellement à 0 d’où le $this->count -1

Retour vers le futur avec Vim

Parlons de retour vers le futur.

En effet le héros dans le film 2 arrive le 21 octobre 2015. Bon on n’a pas les voitures volantes. Et c’est toujours le même éditeur de texte (vi date de 1976 !).

Annuler dans VIM

Pour annuler de VIM c’est plutôt simple u pour undo. Pour refaire c’est moins simple <CTRL + r>. Mais en pratique c’est plus puissant que cela.

En fait on peut voyager dans le temps avec VIM.

Retour dans le passé

Grâce à la commande :earlier

  • :earlier 5m reviens en arrière de 5 minutes
  • :earlier 10 annule 10 modifications
  • :earlier 5h annule 5 heures.
  • :earlier 1f ramène le fichier avant le dernier enregistrement
  • :earlier 2f ramène le fichier à l’avant-dernier enregistrement

Bien sur on peut faire un retour vers futur avec la commande suivante.

  • :later 5m retourne 5 minute plus tard.
  • :later 10 refait les 10 derniers modifications

Encore plus fort se déplacer dans l’historique de VIM

Les fractales en php Mandelbrot

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
______________________________________
______________________________________
___________________________*__________
_________________________****_________
_________________________****_________
_________________________****_________
______________________________________
___________________*__**********______
___________________**************_**__
___________________*****************__
__________________*****************___
_________________*******************__
________________*********************_
________________*********************_
______*__*_____**********************_
______*******__**********************_
_____*********_**********************_
_____*********_**********************_
___*_*********_*********************__
***********************************___
___*_*********_*********************__
_____*********_**********************_
_____*********_**********************_
______*******__**********************_
______*__*_____**********************_
________________*********************_
________________*********************_
_________________*******************__
__________________*****************___
___________________*****************__
___________________**************_**__
___________________*__**********______
______________________________________
_________________________****_________
_________________________****_________
_________________________****_________
___________________________*__________
_____________________________________

Listes chainées : implémentation

Dans la partie 1 nous avons appris à surcharger le count ainsi que les différentes méthodes de ArrayAccess. Pour faire un exemple un peu plus concret, je vais impémenter les listes chainées. Les listes doublement chainée sont déja implémentées dans la SPL via SplDoublyLinkedList.

Le liste chainée (linked list en anglais) est une structure de donnée. Nous allons essayer d’implémenter une liste chainée en PHP. Cela nous permettra de comprendre l’idée. Nous allons implémenter l’interface Countable. (J’implémente ArrayAccess et Iterator dans le post suivant).

Une liste chainée est constituée de Node ou noeud/chainon.

Un node a deux propriétés.

  • Sa valeurs
  • Le liens vers le noeud suivant