git versioning

Résoudre les conflits avec git en ligne de commande

Il est possible de merger une branche sans avoir besoin de résoudre les conflits si vous êtes sûr que la version qui va venir est la bonne.

Cas d’un merge depuis une branche

Par exemple vous avez une branche feature/login par exemple, que vous voulez merger dans develop, or vous savez que les fichiers de cette branche feature doit être la plus récente, dans ce cas la commande est la suivante :

git checkout develop
git merge -X theirs feature/login

Cas d’un pull depuis un repository

Maintenant vous êtes en train de faire un pull depuis le repository, dans ce cas les fichiers qui vont venir vont fusionner avec vos fichiers en local, par exemple, vous fait un git pull

git pull -X theirs

Mais que se passe-t-il si vous avez fait un simple git pull et que vous êtes en situation de conflit? Il est toujours possible de résoudre rapidement en favorisant ce qui vient:

git checkout --theirs .
git add .
#dans le cas où vous voulez privilégier votre version
git chekout --ours .
git add .
vim logo

Plugin Vim Pour PHPStorm

Comment installer IdeaVim

Aller dans paramètres, taper plugin dans la boite de recherche, taper « vim » dans la recherche de la marketplace, choisir ideaVim

configurer l’équivalent de .vimrc : .ideavimrc

Vous pouvez pomper les réglage de votre .vimrc en mettant source ~/.vimrc dans .ideavimrc.

ces deux fichiers doivent se trouver dans le répertoire home (Linux et Mac OS), c’est pour ça que vous voyez les caractère tilde ~.

Vous n’aurez pas toutes les feature de vim, c’est le défaut des plugins qui ne remplaceront jamais le vrai vim.

https://github.com/JetBrains/ideavim

Tunnel SSH vers un ordinateur depuis votre ordinateur

Le tunneling SSH permet bien des choses, dans cet article je vais vous présenter une méthode pour accéder au shell d’un ordinateur situé n’importe où dans le monde (et à condition que les conditions soient réunies pour le faire) depuis votre ordinateur.

Par exemple on a le scénario suivant : vous êtes en télétravail, un autre collègue est en télétravail, vous êtes tous les deux développeurs (cela va de soi), et pour une raison quelconque, vous avez besoin d’accéder à son ordinateur, mais plus précisément à son shell, parce qu’il n’arrive pas à faire une tâche en ligne de commande.

Vous avez plusieurs solutions, dont une qui est de prendre le controle de son ordinateur via un logiciel comme TeamViewer, mais bon, la connexion n’est pas géniale, et c’est overkill pour un terminal.

L’autre solution consiste à ouvrir un tunnel vers son poste grâce à un serveur SSH, puis vous vous connectez à son ordinateur via ce même serveur SSH, voir le dessin ci-dessous.

Principe d’utilisation d’un serveur dédié pour faire du tunneling SSH

D’abord ouvrir un tunnel vers l’ordinateur de votre collègue, cette manipulation sera faite par lui depuis son shell, le port 8080 du serveur sera redirigé vers le port 22 de son ordinateur :

ssh -R 8080:127.0.0.1:22 son_compte@hostname-ou-ip

Ensuite le tunnel étant ouvert entre le serveur SSH et son ordinateur (un serveur SSH est en fait n’importe quel serveur dédié qui a permis l’ouverture du tunnel), vous allez vous connecter au serveur SSH sur le port 8080 (vous vous connectez sur le serveur et non à l’ordinateur de votre collègue hein ?)

ssh://hostname-ou-ip:8080

Vous aurez une invitation à ouvrir un terminal, ensuite le terminal s’ouvre et vous devez entrer le mot de passe du poste de votre collègue. Et voilà !

Les conditions pour que le serveur dédié puisse rediriger la connexion

vim logo

Les commandes VIM les plus courantes

Les différents mode en Vim:

Visual mode

Visual line mode : SHIFT + V

Command mode

Pour entrer en command mode, il faut taper les deux points « : »

Replace mode

Pour remplacer plusieurs occurrences d’un mot sous le curseur (opération assez courante) voici les combinaisons de touche, supposons que vous vouliez remplacer toto par tata :

# mettre le mot sur toto
# appuyer sur * pour aller à la prochaine occurence
# faire ciw (change inner word) puis entrez tata puis ESC
# puis autant de fois que nécessaire : appuyer sur n pour aller à la prochaine occurrence puis . (recommencer la dernière action)

Remplacer un seul caractère (sous le curseur)

Appuyer sur ‘r’ et taper la nouvelle lettre

Passer en Replace mode

SHIFT + r , permet de taper en mode remplacement, les caractère tapés remplacent les précédents caractères.

Visual Char mode : pour y entrer appuyer sur v, ça permet de sélectionner du texte

Obtenir de l’aide sur une commande

:help <command>

Edit mode

Comment faire une commande en navigation mode puis revenir de suite en edit mode

#il faut faire CTRL + o en edit mode pour temporairement être en normal mode, pratique pour aller en fin de ligne et continuer à éditer par exemple, <CTRL>+o rentre en normal mode pour une commande.
<CTRL>+o

#copier un mot sous le curseur, le curseur est au début du mot
yw
#copier un mot même si le curseur n'est pas au début du mot
yaw
#pour les nom de variable préfixée par un $  (ex: $this), yaw ne suffira pas dans ce cas utiliser le big word W (SHIFT + w)
yaW

#répéter un caractère 'J' 10 fois
<ESC>10iJ<ESC><ESC>

Changer la casse

Changer en minuscule ou en majuscule

 ~    : Changes the case of current character
 guu  : Change current line from upper to lower.
 gUU  : Change current LINE from lower to upper.
 guw  : Change to end of current WORD from upper to lower.<<utile
 guaw : Change all of current WORD to lower.              <<utile
 gUw  : Change to end of current WORD from lower to upper.<<utile
 gUaw : Change all of current WORD to upper.              <<utile
 g~~  : Invert case to entire line
 g~w  : Invert case to current WORD
 guG : Change to lowercase until the end of document.

Insert mode

Pour annuler une action, revenir sur normal mode en appuyant sur ESC ou CTRL+C, appuyer sur u en

Insérer un caractère plusieurs fois

<ESC> //nnormal mode
10    // nombre de fois
i    // insert mode
a    // le caractère
<ESC>  // quitter Insert mode

Bouger une ligne vers le haut ou vers le bas

Il faut utiliser la commande move .

:m 12  //bouge le ligne courante vers la ligne 12
:m 0   //bouge vers le début du fichier
:m $   // bouge après la dernière ligne du fichier
:5,7m 21   //bouge les ligne 5 à 7 à la ligne 21

Recherche

Rechercher une chaîne de caractères

Pour chercher un mot le plus simple est de rentrer le slash et de tapez la chaine à chercher

/motachercher
#s'il y a plusieurs occurences, appuyer sur n pour passer au suivant et SHIFT + n pour le précédent

Pour naviguer dans les occurrences trouvées utiliser les touches # (chercher en arrière)et * chercher en avant.

Rechercher le mot sous le curseur

#placer le curseur sur le mot et *

Rechercher la définition d’ue fonction

#placer le curseur sur le no de la fonction et
gd

Navigation mode

Naviguer dans Vim

CTRL + y : défile  d'une ligne vers le haut
CTRL + e : défile d'une ligne vers le bas
CTRL + f : défile d'une page vers le bas
CTRL + b : défile d'une page vers le haut
CTRL + d : défile d'une 1/2 page vers le bas
CTRL + u : défile d'une 1/2 page vers le haut

Placement du curseur sur l’écran

# position du curseur haut,milieu et bas (bouge le curseur)
H, M , L
#centrage du curseur dans la vue (ne bouge pas le curseur)
zt, zb ou zz

Placement du curseur au sein d’une ligne

#aller au dernier caractère et être en mode édition
SHIFT + A
#aller au dernier caraxtère
$
#aller au premier caractère et être en mode édition
SHIFT + I
# aller au premier caractère et curseur sur le 1er caractère
^^
#aller au premier caractère et curseur avant le 1er caractère
SHIFT + 0

Navigation par mot

#déplacer de mot en mot
w
#déplacer de mot en mot reverse
b
#déplacer de mot en mot en plus rapide (d'espace en espace en fait)
SHIFT + w
#reverse
SHIFT + b
#aller à la fin d'un mot
e
#aller début d'un mot 
w

Navigation par bloc (paragraphe…)

#les paragraphes sont séparés par une ligne vide ou des accolades
{ ou }
# aller au matching brace, trouver le } correspondant le plus immédiat de {, marche pour ( et [
%
# vous pouvez en profiter pour sélectionner le texte entre la paire de {}
v%
#voir le } correspondant, pour cela activer une option
:set showmatch

#Comment aller au {{[ le plus proche lorsque vous n'êtes pas dessus
[{  ou [[ ou [(  
#pour trouver celui qui est au dessus. Pour celui du dessous
]} ou ]] ou ])

Navigation par marks (signets)

Les signets (marks) permettent de mémoriser une ligne avec un raccourci (register), mais ne mémorise pas la colonne

#enregistrer un mark (les mark sont spécifiques à un fichier)
me // e devient le raccourcis vers le marks
#naviguer au mark
`m  // backticks ou
'm  // apostrophe (ideaVim ne connait pas backtick je crois)
#lister les marks
:marks
#revenir à la position précédente
``

#Les jumps
vous pouvez rejouer les positions du curseur avec CTRL + i et CTRL + o
#lister les positions passées du curseur
:jumps


#  https://www.linux.com/news/vim-tips-moving-around-using-marks-and-jumps/

Copier Coller avec les registers sous Vim

Alors que la plupart des programmes ne disposent que d’une copie dans le clipboard, Vim en possède une dizaine, on se demande pourquoi par défaut ce n’est pas proposé dans les autres IDE.

Le registre par défaut est "", le contenu y est présent lorsque vous faites un d,c,s,x,y

" est utilisé pour accéder au register,

# utilisation basique copier coller, utilisez une lettre pour stocker le contenu copié
"ey // copier le contenu dans le register e y=yank
"ep // coller le contenu du register e
#voir les contenus des register
:reg
:reg e f h // que les registers cités

https://www.brianstorti.com/vim-registers/

Effacer avec VIM

Effacer et combinaison avec d’autre commandes

Effacer en avant ou en arrière

$ phrase exemple : "ceci est une phrase de pour illustrer le propos"
#curseur sur h de phrase
#effacer jusqu'à la lettre 'd'
dtd
#effacer en arrière jusqu'à 'u'
dTu
#effacer un mot sous le curseur, attention à la position du curseur, l'effacement se fait depuis le curseur jusqu'à la fin du mot
dw

#efface le mot entier quelque soit la position du curseur sur le mot
diw

#effacer le contenu à l'intérieur des parenthèses ou crochet ou accolade, remplacer <char> par (,{,[
di<char>

#effacer jusqu'à un caractère
dt<char>

Les sources:

https://opensource.com/article/19/2/getting-started-vim-visual-mode

Déplacer des lignes

Sans doute une de mes commandes préférée, vous pouvez bouger une ou des lignes, en absolue sans forcément depuis la position de votre curseur

#déplacer la ligne courante à la ligne 23
:m 23
:m 0
:m $

#déplacer un bloc
:m5,7m 21 // bouge block lignes 5à7 à la ligne 21

Déplacer des lignes en mode relatif

Lorsque vous avez activé le display des ligne en relatif, vous n’avez plus les numéros absolu cela peut être une gêne, mais il est possible de déplacer les lignes en relatif depuis la position de votre curseur.

#sélectionner votre ou vos lignes en mode visual block (SHIFT + V), taper :m, puis le nombre de ligne en relatif, donc pour déplacer en amont de une ligne
:'<,'>m-2 // oui -2 et pas -1
#remarquez la syntaxe assez compliquée avec les chevrons, ne vous en faites pas, ils se font automatiquement si vous vous placez en mode Visual Block

Visual block mode ou mode colonne

Le visual block mode est l’équivalent du mode colonne dans une EDI classique. Pour y basculer CTRL + v. un fois ceci fait, il faut sélectionner les lignes avec j. Exemple faire attention, l’exemple ci-dessous permet d’insérer sur toutes les lignes sélectionnées un même texte, mais c’est avec SHIFT + i qu’on va insérer et pas seulement i comme en mode normal.

#exemple de texte
Vim is a text editor
Vim is a text editor
Vim is a text editor
Vim is a text editor
#on veut ajouter great entre "a" et "text"
#curseur sur la première ligne et devant "text" puis CTRL + v
#j 4 fois, puis SHIFT + i, on insère "great", deux fois <ESC> pour sortir du visual block mode.
#pour effacer, sélectionner c'est intuitif.

Bonus : Utiliser vi sur la ligne de commande bash

Il est possible en faisant simplement une commande pour avoir la sensation d’être dans vi, le curseur ne change pas quelquesoit les modes.

set -o vi

Utiliser les macros en Vim

Les macros je n’ai pas besoin de vous expliquer, ce sont des suites d’actions que vous pouvez réappliquer

# démarrer l'enregistrement de la macro et lui assigner un raccourci lettre a
qa
....vous commandes
#arrêt de l'enregistrement de la macro vim
q
#exécuter votre macro
@a
#répéter l'exécution de votre macro

Pour faire de bonnes macros, il faut réfléchir un peu, si par exemple vous devez appliquer une action sur une liste (typique) commencer par placer votre curseur de façon tactique pour le début et la fin.

Normal mode

https://betterprogramming.pub/50-vim-mode-tips-for-ide-users-f7b525a794b3

Il y a de la redite mais, il y a des commandes additionnelles que je trouve intéressantes :

r en normal mode permet d'éditer le caractère sous le curseur tout en restant en normal mode, alors que s vous met en insert mode.
cw en normal mode permet de changer un mot (bascule en insert mode), alors que dw efface le mot (vous restez en normal mode)
% permet de trouver le (,{,[ matchant celui sous le curseur. % n'importe où va jusqu'au prochain ),],}.
H,M,L permet de déplacer le viewport, le curseur reste immobile
zz,zt,zb  bouge le curseur dans le viewport
Text Object : permet d'agir sur le mot où qu'on soit dans le mot (évite d'aller au début du mot poru effacer le mot par exemple)
daw : supprime le mot où que soit le curseur dans le mot
ciw : efface le mot et passe en insert mode

Insérer un newline sous le cursor en normal mode : il faut faire un remap qui correspond à i<Entrée>
nnoremap <Enter> i<Enter><Esc>k$
Changer les caractères entourant un mot (" ou ') (suround)
"Hello"  => 'Hello' : cs"'
Replace mode : R, remplace les caractère en normal mode.<Es> pour en sortir.
u et CTRL + R : undo et redo 
Voir aussi la section sur Splitting Windows
Navigation occasionnel en insert mode:
CTRL + o puis f g  (recherche de la lettre 'g') vous restez en insert mode, on n'y gagne rien.
Efface ligne et reste en insert mode : c$ (en fait depuis n'importe quelle position dans la ligne.
Efface depuis le curseur vers la fin du mot et reste en insert mode : cw
#effacer en arrière
d<flècheGauche>  efface le caractère à gauche
d$  efface depuis le curseur jusqu'à la fin de la ligne
d^  efface en arrière depuis le curseur jusqu'au caractère non espace 
d0  efface depuis le curseur en arrière jusqu'au début de la ligne
dw  efface depuis le curseur jusqu'à la fin du mot
db  efface en arrière depuis le curseur jusqu'au début du mot

#effacer en arrière et basculer en edit mode, remplace d par c
c<flècheGauche>  efface le caractère à gauche
c$  efface depuis le curseur jusqu'à la fin de la ligne
c^  efface en arrière depuis le curseur jusqu'au caractère non espace 
c0  efface depuis le curseur en arrière jusqu'au début de la ligne
cw  efface depuis le curseur jusqu'à la fin du mot
cb  efface en arrière depuis le curseur jusqu'au début du mot

VIM pour le HTML

Travailler en HTML supppose certaines actions que l’on rencontre peux en mode texte normal, par exemple aller à l’intérieur de tag HTML, effacer l’intérieur de tag HTML

effacer le texte entre les tags HTML ex:
<h1>Le sous titre</h1>
se placer entre les tags et faire : dit
cit pour passer en mode insertion après
effacer entre les parenthèses:  di(  ou ci(
effacer entre les guillemet : di"  ou encore mieux ci"
idem avec [,{,',<...

Les différents modes de VIM

  • normal mode
  • Insert mode
  • command mode
  • visual mode
  • select mode

Diverses commandes

SHIFT + j : supprime les retours chariot, 
Mode colonne, CTRL + V, puis j ou k, passer en INSERT MODE

Améliorer ses connaissances Shell

Un écran de veille Matrix pour votre shell

https://codeburst.io/install-and-setup-cmatrix-on-mac-a2076daee420

Un multiplexeur de terminal TMux

Tmux vous permet d’avoir quelque chose comme ci-dessous sur la photo

C’est un outil bien pratique pour avoir plusieur fenêtre à sa portée sans avoir besoin de switcher entre différentes onglets ou fenêtres

Dans le contexte Tmux pour scroller vous devez faire une combinaison de touche

CTRL-b puis [
https://superuser.com/questions/209437/how-do-i-scroll-in-tmux

Customisez votre prompt pour savoir dans quelle branche Git vous êtes

Grâce à un script qui customise votre prompt, vous saurez votre branche active sans avoir à perdre le temps de faire la commande git branch

https://gist.github.com/justintv/168835

Tuto NGrok, un outil pour tester vos sites et applications web

C’est par hasard que j’ai rencontré ce logiciel que je connaissais de nom sans savoir ce qu’il faisait, en fait je le confondais avec Grok.

NGrok est un logiciel qui permets d’exposer votre localhost à internet, ce se fait grâce à un tunnel SSH.

Commencez par télécharger le zip du logiciel, décompressez le pour avoir un exécutable (pas besoin d’installation)

Démarrer Ngrok

vous allumez votre serveur web local, vous démarrer Ngrok avec la commande suivante :

$ ngrok http 80
#vous aurez un écran comme ceci

ngrok by @inconshreveable                                                                                                        (Ctrl+C to quit)
                                                                                                                                                 
Session Status                online                                                                                                             
Account                       apple (Plan: Free)                                                                                             
Version                       2.3.35                                                                                                             
Region                        United States (us)                                                                                                 
Web Interface                 http://127.0.0.1:4040                                                                                              
Forwarding                    http://xxxxxxxx.ngrok.io -> http://localhost:80                                                                    
Forwarding                    https://xxxxxxxx.ngrok.io -> http://localhost:80                                                                   
                                                                                                                                                 
Connections                   ttl     opn     rt1     rt5     p50     p90                                                                        
                              12      0       0.00    0.00    5.13    5.90  

Notez bien l’url ayant comme domaine ngrok.io, il s’agit de l’adresse qui va aiguiller les requêtes su monde Internet vers votre site web en local !

En effet votre localhost n’est pas visible vis à vis de l’Internet. Car vous êtes derrière votre box ADSL ou Fibre, ce dernier doit être configuré en mode routeur pour que votre ordinateur soit accessible depuis le cloud. Heureusement que par défaut ce n’est pas le cas !

Vous disposez des deux adresses un en http et l’autre en https. Cette adresse va être mappée à votre http://localhost, si vous avez plusieurs sites dans leur répertoire, vous y accéderez en spécifiant le répertoire jusqu’à leur racine.

Par exemple soit la structure de répertoire suivant :

/
site1/
site2/
site3/public

Par défaut le / indique le répertoire racine du web correspondant à http://localhost. Pour accéder à site1 il vous faudra y accéder via :

http://xxxxxxxx.ngrok.io/site1
# de même
http://xxxxxxxx.ngrok.io/site2
http://xxxxxxxx.ngrok.io/site3/public
Pour le cas du stie 3, un installation Laravel ou Symfony, la racine web se trouve dans le dossier /public donc il faut le mettre dans l'url.

Pour voir les requêtes entrantes

Nous disposons d’un outil très intéressant pour savoir ce qu’on reçoit en nous mettons du côté du serveur web, en allant à l’adresse http://localhost:4040/, nous pouvons voir les requêtes entrantes et leurs détails.

Exemple d’utilisation de NGrok

J’ai eu à développer une application en React Native, qui s’appuie sur un back-end Laravel, et il y a vait des opérations Ajax de création d’utilisation ou d’identification, le problème c’est sous IOS, les urls des endpoints devaient être en https ! J’ai trouvé fastidieux de configurer en local un certificat SSL pour le développement, aussi j’ai dû pour faire mes test monter un virtual host sur un dédié, ce qui m’a pris un peu de temps.

Mais grâce à Ngrok, j’ai trouvé un moyen de requêter sur une url https vers un serveur de test (en l’occurence celui en localhost) très facilement, ce qui devrait accélérer le temps de développement !

D’autres usages : montrer à votre client son site web, ou à vos collègues développeurs.

Mais il y a bien plus de choses et je vous renvois à la documentation officielle pour les détails.

Ngrok Symfony

Quand vous utilisez un virtualhost en local pour développer une application comme Symfony, il faut faire une maniplation différente pour accéder à votre application web. En effet le répertoire qui sera exposé à Internet est dans le cas de Symfony 4. le répertoire /public. Si vous essayer d’accéder via la méthode décrite au début ça ne marchera pas, vous aurez une erreur. Il faut faire une autre commande :

./ngrok http -host-header=rewrite monsite:80

Avec cette méthode, quelqu’un de l’extérieur accédera à votre site en local comme si vous accédiez à votre site en local.

react native

React Native Découverte

Setup (création de l’appli) :

npm install -g create-react-native-app
create-react-native-app MyReactNative

install NodeJS Python Jdk8
npm install -g react-native-cli
npm start

Bootstrap bare react Native CLI App :

$ npm install -g react-native-cli
$ react-native init helloWorldReactNative  
$ cd helloWorldReactNative

Run (much easier than Ionic !!!)

Run instructions for iOS:
     • cd /Users/poste5hookipa/sites/reactnative/helloWorld && npx react-native run-ios
     - or -
     • Open helloWorld/ios/helloWorld.xcworkspace in Xcode or run "xed -b ios"
     • Hit the Run button

Run instructions for Android:

• Have an Android emulator running (quickest way to get started), or a device connected.
• cd /Users/poste5hookipa/sites/reactnative/helloWorld && npx react-native run-android

Architecture de l’application React Native :

Les fichier index.js et App.js quelle différence?

index.js est le fichier d’entrée de node.js, App.js est le fichier qui définit le composant global de l’application React Native <App/> qui contient tous les autres composants, c’est le composant root.

Le CLI originel, toujours en activité et c’est le CLI recommandé car de base.

Liens utiles : Navigation dans React Native avec React Navigation

REACT NATIVE VECTOR ICONS

Installation avec yarn

$ yarn add react-native-vector-icons

ou avec npm

$ npm i --save react-native-vector-icons

link << cette commande ne semble pas marcher…

link sert dans le cas de React Native à lier les dépendences natives, par exemple certaines librairies sont seulement en Javascript, pas besoin de faire un link, mais certaines librairies font appel à des fonctionnalités natives, donc il faut faire un link. Dans les anciennes versions de React Native, il fallait le faire manuellement, mais les récentes versions de React Native n’ont pas besoin de faire cette commande. ( 0.60+)

$ react-native link react-native-vector-icons
donc il est conseillé de le faire manuellement : copier le dossier Font depuis node_modules/react-native-vector-icons

Ouvrir Xcode et aller dans Info.plist (rien que le fait d’ouvrir Xcode normalement devrait faire marcher l’inclusion des icônes)
Néanmoins éditez le fichier info.plist et ajouter une propriété « Fonts provided by application »
Ajouter ensuite :
import Icon from "react-native-vector-icons/Ionicons"; //dans votre fichier

Il faut recompiler le projet pour que ça marche

Si message d’erreur :error Could not find the following native modules: RNVectorIcons. Did you forget to run "pod install"
faire $ pod install

Source : aboutreact.com/react-native-vector-icons/

Autre source officielle: https://github.com/oblador/react-native-vector-icons

React Native Element use the V1.2 because different from 0.19.1 !

Faire attention à la version de la librairie que vous utilisez, vous risquez de tomber dans des anciennes version de tutoriels qui ne marcheront pas pour vous. Exemple FormLabel, FormInput sont enlevés de la version 1.2

Syntaxe plus concise :

class Columns extends React.Component {
  render() {
    return (
      <>
        <td>Bonjour</td>
        <td>Monde</td>
      </>
    );
  }
}

error React Native CLI uses autolinking for native dependencies, but the following modules are linked manually:

  • react-native-vector-icons (to unlink run: « react-native unlink react-native-vector-icons »)
    This is likely happening when upgrading React Native from below 0.60 to 0.60 or above. Going forward, you can unlink this dependency via « react-native unlink  » and it will be included in your app automatically. If a library isn’t compatible with autolinking, disregard this message and notify the library maintainers.
    Read more about autolinking: https://github.com/react-native-community/cli/blob/master/docs/autolinking.md

Que fait la commande link?

https://reactnative.dev/docs/linking-libraries-ios << conseillé de le lire

Que fait la commande Pod Install?

(https://medium.com/@scottlydon18/podspecs-podfile-pod-install-what-happens-518af7e6471d)

Problèmes de builds pour IOS

BUILD FOR IOS problems: (https://stackoverflow.com/questions/35449248/failure-to-call-appregistry-registercomponent)
======================

A module failed to load due to an error and `AppRegistry.registerComponent` wasn't called.

FUNCTIONAL COMPONENT VS CLASS COMPONENT

ReactJS notes:https://medium.com/@Zwenza/functional-vs-class-components-in-react-231e3fbd7108

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

React Hooks, une autre façon de faire par rapport aux classes

Au début, React se travaillait essentiellement avec des classes avec le mot clé class, ce n’est pas une varie classe au sens OOP, mais plutôt un sucre syntaxique. Depuis la version 16.8, les Hooks sont là et permettent de travailler d’une façon plus fonctionnelle (au sens programmation fonctionnelle)

https://medium.com/better-programming/react-hooks-vs-classes-add2676a32f2

Exemple avec class

import React from 'react'

class Counter extends React.Component {
  constructor() {
    super()
    this.state = {
      counter: 0
    }
    this.handleIncrement = this.handleIncrement.bind(this)
  }
  
  handleIncrement() {
    this.setState({
      counter: this.state.counter += 1
    })
  }
  
  render() {
    return (
      <div>
        <div>{this.state.counter}</div>
        <hr />
        <button type="button" onClick={this.handleIncrement}>+</button>
     </div>
    ) 
  }
}

Exemple fonctionnel

import React, {useState} from 'react'

function Counter() {
  const [counter, incrementCounter] = useState(0)
  
  function handleIncrement() {
    incrementCounter(counter + 1)
  }

  return (
    <div>
      <div>{counter}</div>
      <hr />
      <button type="button" onClick={handleIncrement}>+</button>
    </div>
  ) 
}

serveur web apache php

Les redirections web dans le fichier .htaccess

Deux façons de faire des redirections

Si vous voulez faire une redirection avec un fichier htaccess, il existe en gros deux façons de le faire, Redirect et RedirectMatch, qui ne vous permettent pas d’utiliser des expressions régulières, et RewriteRule qui vous permet d’utiliser les expressions régulières et de le faire plus finement (non détaillé ici).

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Redirection sans le module mod_rewrite

Comment faire une redirection 301 dans le .htaccess?

Lorsque vous ne voyez pas la directive RewriteEngine On dans le fichier .htaccess, vous ne pouvez pas faire de règle de redirection. La directive RewriteEngine On est utilisé dans une installation WordPress pour la réécriture d’url. En général il se présente comme suit :

Le plus souvent c’est utilisé pour faire des jolies urls, mais il permet de faire des réécritures d’url, des redirections, erreurs 404 etc. Si vous voulez faire une redirection 301 en dehors de ce snippet, vous devez utiliser une autre syntaxe. Comme nous allons voir ci-après :

#une url en particulier
Redirect 301 /ancienne_url     http://monsite.com/new_url
# url commençant par /blog
RedirectMatch 301 ^/blog  

Dans la première partie on ne mentionne pas le nom de domaine, mais la partie qui est juste après. La syntaxe est intuitive, on fait une redirection 301 point.

Comment gérer les erreurs 404 dans le .htaccess?

Ici pareillement on change le code de redirection, 404.html est une page qui va être affiché en cas d’erreur 404 :

ErrorDocument 404 /404.html

Les pages supprimées définitivement avec 410 « Gone »

Si vous avez une page que vous ne voulez plus dans l’index de Google et vous ne voulez plus que Google la crawle pour la réindexer, vous devez renvoyer un code HTTP 410 « Gone », la page n’est plus là et elle ne doit plus être considérées. Cependant avec Google en particulier, il faut veiller à ce qu’il n’y ait aucun lien interne ou externe au site qui pointe vers cette page.

#il faut ajouter cette ligne si vous voulez personnaliser le message (optionnel)
ErrorDocument 410 "Gone"
Redirect 410 /busai/

#Redirect avec expression régulière pour les urls commençant par /blog (on commence après le nom de domaine)
RedirectMatch 410 ^/blog
RedirectMatch 410 html$

Les redirections avec le module mod_rewrite

#exemple avec WordPress
ErrorDocument 404 /404.html

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

#Redirection 301
RewriteRule ^(.*)  http://www.domaine.com/$1   [QSA,L,R=301]

# Redirection 410, notez la grande variété des règles, c que nous permet le module mod_rewrite
# le [G] correspond au 410 
RewriteRule \.html - [G]

RewriteCond %{QUERY_STRING} add-to-cart
RewriteRule (.*) - [G]
RewriteCond %{REQUEST_URI} ^/debut_url
RewriteRule (.*) - [G]

#suite du fichier htaccess standar WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
php

Débugger vos script PHP avec XDEBUG

XDEBUG est un add on très puissant pour débugger vos scripts Php. Il vous permet de connaitre le temps d’exécution d’un script, l’ordre dans lequel les fonctions s’enchainent, et permet de débugger via les éditeurs de code comme SublimeText ou PHPStorm ou VSCode. Dans le cas de SublimeText, il faut installer via Package install un plugin et configurer XDEBUG dans le fichier php.ini pour permettre de débugger depuis votre IDE, c’est ce qu’on appelle le remote debugging.

Configuration du  fichier php.ini

Aujourd’hui la plupart des installations php comportent Xdebug par défaut. Il suffit donc de configurer le fichier php.ini

Configurez votre section relative à Xdebug de cette façon :

[xdebug]
xdebug.remote_enable = 1
xdebug.profiler_enable = off
xdebug.profiler_enable_trigger = 1
xdebug.profiler_output_name = "cachegrind.out.%u.%H.%R"
xdebug.profiler_output_dir = "c:/wamp/tmp"
xdebug.show_local_vars=0

Ensuite dans l’url de votre browser ajoutez le paramètre GET  de cette façon :

http://example.com/?XDEBUG_PROFILE

Un fichier texte généré dans le répertoire c:/wamp/tmp et il est lisible avec le logiciel Wincachegrind.

Il peut se produire un message d’avertissement lorsque Wincache grind essai d’ouvrir et de parse le fichier grind, comme une duplication de clé, essayez avec une version plus ancienne. Ce projet n’est pas très activement maintenant, mais c’et le meilleur en tout cas pour nos besoins.

vs code logo

Les raccourcis clavier dans VSCode

ALT est souvent remplacé par OPTION dans Mac. CTRL est remplacé par COMMAND (ou pomme) . On ne traitera pas de Linux pour l’instant.

Augmentez votre productivité avec les raccourcis claviers

C’est un aspect complètement ignoré des débutants, mais ne pas connaitre les raccourcis clavier peut à la longue vous faire perdre beaucoup de temps. Il y a les raccourcis (peu) qu’un débutant doit connaitre dès la première heure, ce sont des raccourcis propre au système d’exploitation (ou à l’informatique), il y a les raccourcis du logiciel, et c’est ce que nous allons voir de suite et enfin nous allons mettre les raccourcis clavier un peu plus avancé, qu’il faudra acquérir dans les jours suivants

Les raccourcis clavier fondamentaux

  • copier : CTRL + C
  • coller : CTRL + V
  • chercher dans le fichier : CTRL + F
  • chercher et remplacer : CTRL + SHIFT + H
  • chercher dans le projet : CTRL + SHIFT + F
  • sélectionner un mot : double click souris sur le mot

Les raccourcis clavier de VSCode (débutant)

  • dupliquer une ligne : CTRL + C + V (appuyer sur C puis V tout en maintenant CTRL) ou CTRL + SHIFT + FLECHE vers le bas
  • chercher et remplacer :
  • indenter le document : SHIFT + ALT + F
  • chercher un fichier : CTRL + P
  • bouger une ligne vers le haut ou bas : ALT + UP ou DOWN (flèche)
  • Effacer une ligne : CTRL + X
  • Réindenter le code : SHIFT + ALT + F

Pour ne pas avoir à réindenter le code, vous pouvez paramétrer l’éditeur pour qu’il réindente à chaque sauvegarde de fichier (CTRL +S), ou mieux encore à chaque mise à jour. Je vous montre néanmoins la méthode 1 seulement largement suffisante.

Aller dans File (ou Fichier) > Preferences,

Puis cherchez format et cliquez sur format on save.

Plus de raccourcis clavier (intermédiaire)

  • Edition multi curseur : CTRL + ALT + UP ou DOWN
  • Naviguer entre les onglets : CTRL + SHIFT + TAB ou CTRL + TAB
  • Bracket matching : CTRL + SHIFT + \
  • Aller au début du fichier : CTRL + HOME
  • Aller à la fin du fichier : CTRL + END
  • Modifier toutes le occurences d’un mot : CTRL + F2

Voir les méthodes et propriétés d’une classe en programmation orientée objet

Surtout vrai et utile lorsque vous programmez en langage orienté objet avec ou sans framework comme Symfony en PHP, NodeJs en Javascript etc.

Méthode 1 : avec la barre de recherche ou en faisant CTRL + SHIFT + P

Dans la barre tapez le symbole @ lorsque vous êtes dans un contexte de fichier ouvert, ici je prends en exemple un fichier Entity d’un projet Symfony.

VSCode voir les propriétés et méthodes d'une classe

Naviguez avec les flèches du clavier pour et Entrée pour aller vers la méthode ou propriété voulue.

Méthode 2 : avec la barre latérale OUTLINE, cliquez dessus tout simplement, et vous allez voir apparaitre la liste.

VSCode voir les propriétés et méthodes d'une classe

Usages avancés

  • GOTO Type definition
  • GOTO Implementation
  • GOTO Symbol

Document officiel (pdf) pour Windows : Raccourcis clavier VSCode

Configuration avancées mais pratique :

Formatage du code automatique lors de la sauvegarde :

Allez dans Préférence, taper "format on save", cocher la case.
php

Comment se connecter à mysql en php?

Différentes méthodes de connexion à MySQL en PHP

Pour vous connecter à votre base de données, vous avez besoin du nom de la base de données, du nom de l’hôte qui héberge votre base de données, du nom de l’utilisateur qui a les droit de s’y connecter et du mot de passe bien évidemment.

Méthode âge de pierre

C’est la méthode que l’on apprend en premier lieu lorsqu’on apprend le PHP.

Cela se fait en deux temps : d’abord on crée un objet connexion à la base de données, et ensuite on fait la requête SQL et enfin on parcourt le tableau de résultats envoyés.

1/Définition des données de connexion

Nom de la base de données :  $db = ‘nom_base‘;

nom du serveur de la base de données : $host = ‘localhost’;  (le plus souvent)

nom de l’utilisateur :   $user = ‘username’;

et son mot de passe :  $pass = ‘password‘;

2/Instruction pour la connexion à la base de données:

@$conn = new mysqli($host,$user,$pass,$db);
if (mysqli_connect_errno())    {    echo 'Error  : could not connect to database. Try again';    exit;    }

Le @ signifie ne pas afficher de message d’erreur, je ne recommande pas de le mettre car il masque les erreurs et ne favorise pas le débuggage !

La seconde ligne tente la connexion et affiche un message d’erreur s’il y en a un.

Aujourd’hui (2020 en fait depuis des années déjà, il ne faut plus utiliser msqyli et encore moins mysql, qui ne sont pas sécure. Utiliser PDO à la place, c’est plus verbeux mais vous serez à la page et il y aura moins de risques.)

3/Exécution de la requête

Très important,c’est ce qui va vous faire parvenir les résultats.

$sql = “SELECT * FROM table LIMIT 10”;

Ici on sélectionne les 10 premiers résultat d’une table.

$result = $db->query($sql);

3/Parcourir le tableau associatif qui contient les enregistrements

Une fois que le résultat est retourné vous devez le parcourir ligne par ligne.

Pour ce faire on va s’aider de la boucle While.

while ($row = $result->fetch_assoc()){
   $result[]['nom'] = $row['nom']
// etc

}

Méthode Pro et actuelle avec PDO

Veuillez vous référer à cette page pour le tuto correspondant sur PDO.

Mac-OS

Créer son CSR avec le trousseau (Keychain Access) avec Mac

Le CSR (Certificate Signing Request) est un fichier qui est généré sur l’ordinateur du développeur pour lier le développeur à son ordinateur de build. Le développeur d’application mobile doit envoyer ce CSR pour générer un certificat sur le site developer.apple.com . Ce certificat servira à générer un provisioning profile, qui est un fichier qui lie l’application, le développeur(son poste de développement), et le device via le certificat, et le mode de distribution.

Créer un CSR avec Keychain Access

Le processus est entièrement graphique, allez dans Application > Utilitaires > Trousseau d'accès.

Ne mettez que votre email et enregistrez le CSR dans un répertoire du disque.

Ensuite vous allez utiliser ce CSR pour l’uploader sur le site developer.apple.com et créer un certificat.

Lien vers la doc officielle

linux logo

GNU Parallel pour accélérer vos process sous Linux

Soit un fichier avec 1000 urls à curler pour en connaitre la réponse HTTP seulement (le header seulement seulement pas le body)

time while read -r line;
do curl --head -k -s $line|grep HTTP;
done < url.txt


time while read -r line;
do parallel -I% --max-args 1 curl --head -k -s $line|grep HTTP;
done < url.txt


time while read -r line;
do parallel --jobs 5 -I% --max-args 1 curl --head -k -s $line|grep HTTP;
done < url.txt

Experimentation avec l’augmentation du nombre de jobs

Un paramètre intéressant à jouer avec est le nombre de jobs. Pour 1000 urls à checker le header HTTP, voici les temps :

  • Sans parallel : 1m57s
  • Avec Parallel par défaut : 42s
  • Avec Parallel --jobs 5 : 32s
  • Avec Parallel --jobs 10 : 23s

Il suffit de trouver le meilleur compromis (pas de proportionnalité entre le gain et le nombre de jobs.)

Comment trouver le device Id de votre Ipad ou Iphone

S’il y a bien un process laborieux de déploiement d’une application c’est bine sur IOS. Les processus sont très compliqués, et on oublie facilement. Ces quelques pages sont là pour aide mémoire.

Device id == UDID !!

Le device (iphone ou Ipad) a lui seul a plusieurs identifiants, mais en ce qui nous concerne le plus important est le UDID, car il va nous servir à générer le provisioning profile, pour déployer une application.

C’est une chaine de caractère de 40 caractères de long qui identifie de manière unique un device Apple.

Trouver le UDID (unique Device ID)- avec Itunes

Branchez le device à votre Mac, lancez Itunes

Cliquez sur l’icône à côté de « Musique »

Dans l’encart « Ipad mini 2 » (si vous avez un ipad mini) cliquez sur ECID pour faire tourner les textes, à un moment vous aurez le UDID

Sur Mac OS Catalina il est possible de le trouver dans le Finder

Vous seriez peut-être aussi intéressé de lire ces tutoriels complémentaires : Comment créer des provisioning profile pour déployer votre application mobile sur AppStore

Comment créer un provisioning profile Ad Hoc

Le provisioning profile Ad Hoc permet de diffuser une application sur un nombre limité d’appareil (100 iphones, 100 Ipads, 100 Ipods en cumulatif (info 2019)) pour un compte à 99 $/an.

Ces appareils doivent être enregistré avec leur UDID au moment de la création d’un provisioning profile dans l’interface de votre compte développeur Apple. L’avantage : pas besoin de validation de la part de l’équipe AppStore !

Un device peut contenir plusieurs provisioning profiles.

Source : lien

De quoi a-t-on besoin pour créer un provisioning profile?

Le provisioning profile a pour rôle de lier une AppID (l’application) et un certificat de distribution. Il prouve à Apple que c’est vous qui avez distribué une application, donc c’est pour ça que le certificat de distribution est lié à votre ordinateur Mac.

Ne pas confondre AppStore Connect et le Development Center. Vous pouvez accéder à ce dernier après vous être authentifié dans le Developement Center, en allant sur cette url.

source : lien

nginx

Installer NGINX sous Windows 10

NGINX est le second serveur web sui propulse les sites en PHP. Il se veut plus rapide qu’Apache, mais il est surtout fait pour servir du contenu statique. Cependant, sa conception le rend intéressant pour installer plusieurs version de PHP en simultané. Notez que Apache est également capable de le faire, mais ce petit tuto est là pour vous montrer une façon de faire sous Windows.

Téléchargez NGINX

Pour ce faire allez sur le site officiel sur cette page de et suivez les instructions (téléchargez la mainline). Nous prenons ici le parti de tout faire et de ne pas installer un équivalent de WAMP pour NGINX.

Décompressez l’exécutable où vous voulez, démarrer le serveur équivaut à démarrer un programme quelconque (NGINX ne tourne pas comme un service Windows, c’est écrit sur la page). Une fois que vous avez démarré l’exécutable, prenez connaissance de ces quelques commandes :

nginx -s stop 	fast shutdown
nginx -s quit 	graceful shutdown
nginx -s reload 	changing configuration, starting new worker processes with a new configuration, graceful shutdown of old worker processes
nginx -s reopen 	re-opening log files

Notez que ces commandes n’ont pas l’air de marcher sous Windows 10, ça ne marche que si vous êtes dans le même répertoire que l’exécutable nginx.exe. Cependant voici la commande qui tuera pour sûr les process partout :

taskkill /f /IM nginx.exe

Télécharger le zip PHP

Sur le site officiel, dans la section windows, Télécharger un package PHP 7.4, choisissez le thread safe 64bits si vous êtes sous Windows 10 (je suppose qu’en 2020, vous êtes dans ce cas)

Décompressez le zip dans un répertoire c:\PHP\7.4

constituez un fichier .bat pour lancer le fichier C:\PHP\7.4\php-cgi.exe, s’assurer que cet exécutable est dans le même répertoire que le php.exe.

@ECHO OFF
ECHO Starting PHP FastCGI...
set PATH=C:\PHP;%PATH%
rem c:\bin\RunHiddenConsole.exe 
C:\PHP\7.4\php-cgi.exe -b 127.0.0.1:9123

De même si vous voulez arrêter le process de Fast CGI voici la commande :

taskkill /f /IM php-cgi.exe

Ensuite dans le fichier de configuration de NGINX nginx.conf dans la section server, ajoutez la ligne include fast-cgi.conf :

server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9123;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi_params;
            include fastcgi.conf;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }

Si vous n’avez pas cette ligne vous aurez un message « No input file specified ».

Démarrer le serveur NGINX avec le PHP Fast CGI

Démarrez le fichier batch, ensuite démarrez NGINX, allez dans le dossier c:\nginx\html (créez un fichier index.php), dans le navigateur allez à http://localhost, votre page doit normalement s’afficher. Prochain article nous verrson comment affecter une version de PHP par virtual host.

php

Installer php 7.2 sous Mac OS

Le temps file, et les version antérieures de PHP ne seront plus supportées, par exemple de plus en plus de librairies exigent php 7.0 minimum, certes c’est présent dans les installation récentes, mais vous devez savoir aussi installer les versions de php 7.1, 7.2, 7.3, 7.4 par exemple. Voici un petit tuto sous Mac OS pour installer une version 7.2 de php. Ici PHP est installé en tant que module d’Apache.

Utiliser Homebrew pour installer php 7.2

Homebrew est un gestionnaire de package, un peu comme composer pour le php, mais pour le système Mac.

brew install php@7.2

Cette fonction va créer un répertoire dans usr/local/Cellar/php@7.2. Cellar est l’endroit où sont stockés les package Mac.

Changer la version de php pour la ligne de commande sous Mac OS

Vous n’êtes pas sensé ignorer qu’il existe deux version d’interpréteur sur une installation serveur, l’interpréteur php en ligne de commande, et l’interpréteur web.

echo 'export PATH="/usr/local/opt/php@7.2/bin:$PATH"' >> ~/.bash_profile
echo 'export PATH="/usr/local/opt/php@7.2/sbin:$PATH"' >> ~/.bash_profile

Cette commande bash va insérer une ligne dans votre fichier de configuration .bash_profile, pour le faire pointer sur la nouvelle version de php.

Changer la version de php pour le web

Pour ce faire il faut aller modifier le fichier de configuration d’Apache dans le cas où php est en mode module d’Apache (ce n’est pas fcgi). Décommentez tout autre ligne de chargement d’une autre version de php.

LoadModule php7_module  /usr/local/opt/php@7.2/lib/httpd/modules/libphp7.so

Vérifiez avec phpinfo() la version . Normalement c’est tout ce dont vous aurez besoin. En module pour apache, il n’est pas possible d’installer plusieurs versions de php en simultané (chose que fait facilement Nginx), mais il est possible sous Apache d’installer plusieurs version en simultané de php si on utilise fastCGI par exemple.

Attention, on n’a pas touché à php.ini, il peut y avoir des différences subtiles ! Pour cet exemple je suis passé de php 7.1.23 à php 7.2.23

Installer la version xdebug correspondante à PHP 7.2

Prochainement j’indiquerai comment mettre en place le module xdebug pour cette version de PHP.

Il faut installer le xDebug correspondant à la version de PHP 7.2, comme xDebug a été enlevé du dépôt Homebrew, il faut utiliser PECL pour l’installer.

pecl install xdebug
#Si ERROR: failed to mkdir /usr/local/Cellar/php@7.2/7.2.23/pecl/20170718
#créer à la main le répertoire, si création impossible , il s'agit surement d'un lien #symbolique,l'effacer et refaire mkdir

Pour savoir où xdebug.so a été installé (pour pouvoir paramétrer xDebug dans le fichier php.ini), comme vous avez utilisé Brew, il se trouve dans le répertoire Cellar :

/usr/local/Cellar/php@7.2/7.2.23/pecl/20170718/xdebug.so
#à la fin de l'installation ce message vous sera affiché.
logo git

A quoi sert Git tag?

Git tag sert en général à marquer un version de release majeure. Par exemple lorsque votre logiciel passe à la version 2.0.0 ou à la version 1.5.0, voire 1.5.4 quoique.

Comme d’habitude avec Git, chaque commande fait beaucoup de choses, mais nous pouvons voir les choses de façon plus simple (point de vue adopté ici), c’est comment utiliser les commandes de Git pour notre travail quotidien de développeur, où mettre le curseur dans la connaissance de ses commandes?

Ici j’ai listé pour ma mémoire et pour votre information les choses communes qu’on peut faire avec git tag sans aller trop en profondeur.

#add a tag : lightweight(pointer to a commit) or annotated
#lightweight
git tag v1.4

#annotated
git tag -a v1.4 -m "my version 1.4"

#push tag information
#en effet un push classique ne pousse pas le tag vers le remote repository
git push origin v1.4

#list tag:
git tag

#search by pattern
git tag  -l "v1.8.5*"

Lightweight tag

C’est dans ce cas un simple label qui pointe vers un commit en particulier, donc ça rend plus lisible le commit.

Annotated tag

Ici le tag n’est pas seulement un pointeur avec un label lisible, mais il contient les informations sur le commit, et les informations sont tirées de l’index .git.

Effacer un tag localement et en remote

#effacer le tag v1.2
git tag -d v1.2
#effacer le tag distant
git push --delete origin v1.2

git push origin :refs/tags/v1.0  #utiliser pour faire le distingo entre une branche et un tag

Effacer un tag sur le remote

Créer un tag sur un commit précédent

Il peut arriver que vous n’ayez pas taggé un commit lors d’une mise en production par exemple, dans ce cas vous pouvez tagger un commit plus ancien. Par défaut le tag se fait sur le HEAD qui est le plus récent.

Faites un git log -n ou un git log --pretty=oneline

#tagger sur un commit en particulier, tag annoté
git tag -a v1.2 9fceb02 -m "Message here"

Visualiser les tags dans github.com

Pour voir les tags, il suffit d’aller dans la page d’accueil de votre dépôt et de cliquer sur l’onglet « release ».

logo git

Commandes avancées en git ligne de commande

Je recommande d’utiliser Git en ligne de commande (sauf pour résoudre les conflits, dans ce cas les IDE sont d’une grande aide visuelle). Voici listées par thème des commandes que je considère essentielles, elle vous permettent de mieux voir le potentiel de Git, que même vous n’aurez pas soupçonné dans une logiciel graphique.

Git Commit

Connaître les fichiers modifié dans le dernier commit

git show --pretty="" --name-only sha
#le sha est le hash du commit, vous n'avez pas besoin d'avoir l'entièreté du hash, mais suffisamment pour discriminer le commit

Connaître les fichiers modifiés entre deux commits

git diff --name-only sha1 sha2
#sha1 et sha2 sont les hashs des commits 
#pour voir les différences entre les 10 et 5 derniers commits
git diff --name-only HEAD~10 HEAD~5
#il exsite beaucoup plus de variations mais l'essentiel est dans la première commande

Git branch

Montrer les branches existantes locale et en remote

$ git branch -a
#montrer seulement les branches en remote
$ git branch -r

Ajouter une description à une branche

$ git branch --edit-description
#pour voir la description
$ git config branch.mabranche.description
# en l'état si vous ne faites rien vous ne poussez pas ces descriptions, car elles sont écrites dans .git/config, si vous voulez les pousser, setter dans le config de cette manière :
$ git config --global branchdesc true
$ git merge --log <branch> #va mettre la description dans le message de merge
tuto ionic 4

Démarrer un projet avec Ionic 3

Ionic 3 est un framework de développement d’application mobile, en gros vous n’avez pas besoin de connaitre le Java pour développer une application Android, vous n’avez pas besoin de connaitre le Swift ou Objective-C pour développer une application IOS. Vous avez seulement besoin de connaitre le Javascript (le Typescript pour Ionic 3). Ionic 3 peut se baser sur Angular 2+ comme framework.

Un projet Ionic 3 , c’est beaucoup de réglage, de syntaxe avec annotation, vous codez dans des stubs tout fait. Il faut connaitre l’écosystème de plugins, qui est à la base de fonctionnalités natives. Une application Ionic a l’avantage de vous faire coder une seule fois et créer deux application mobile pour les plateformes Android et IOS, via la compilation avec Android Studio et XCode.

Comme vous codez des applications qui sont destinées à être mises sur les store, vous devez connaitre les déploiements vers ces deux plateforme, perso j’ai trouvé celle de IOS laborieuse.

Bootstrappez votre application Ionic 3

Installation de NodeJs et NPM

Ces deux logiciels sont à la base de développement avec les framework Javascript, ces sont surtout des outils pour automatiser des tâches de build. Téléchargez d’abord NodeJS, de préférence une version LTS, dont la maintenance est assurée.

Installation via NPM de Ionic et Cordova

Créez vous un répertoire pour votre projet et allez dedans, et faites la commande :

#Mac Linux
sudo npm install -g ionic
sudo npm install -g cordova

#syntaxe alternative
sudo npm install -g ionic cordova

Je me suis posé beaucoup de questions quand à la possibilité de ne pas installer en global pour un projet, pour l’instant j’ai suivi la méthode préconisée par le site officiel de Ionic.

Pourquoi Cordova?

A la base c’est le projet Cordova qui permettait de développer des application mobile cross-platform, mais le look and feel n’était pas assez natif, et peut être manquait de tooling, donc le projet Ionic est un wrapper sur Cordova, et permet en gros d’avoir un look plus natif, mais pas que.

Mise à jour de Cordova

Parce que tout va très dans le monde de l’informatique, il vous faut parfois mettre à jour Cordova, pour ce faire effacez d’abord votre répertoire Android ou IOS, car Cordova fait le lien entre la plateforme et votre code Javascript

cordova platform update android

Créer l’application Ionic

Maintenant que tout les scripts sont installés, nous allons créer une application Ionic

# ionic-angular == ionic 3 !
ionic start ibeacon blank --type=ionic-angular
# allez dans le répertoire de l'application
ionic serve

Un répertoire ibeacon sera créé, c’est celui de votre projet, un répertoire node_modules sera créé, et contiendra toutes les librairies nécessaires à votre projet. Ce répertoire peut vite est volumineux, il ne faut pas le versionner sous Git. Un fichier packages.json sera généré, ce fichier consigne les librairies qui sont installées via NPM. Il faut le versionner, car il permet de reconstituer le répertoire node_modules sur un autre poste si besoin est.

blank est le template de votre projet, il existe d’autres template : sidemenu avec une barre latérale, tabs avec 3 onglets, super avec 14 designs de page, tutorial pour commencer à apprendre avec Ionic 3.

Cette commande va lancer l’application dans votre navigateur par défaut sur le port 8100 à l’adresse http://localhost:8100

Le fait que ce soit sur le port 8100 fait que Ionic ne va pas interférer si vous avez un serveur Apache ou Nginx sur le port 80 par exemple.

Structure d’un projet Ionic 3

La structure se base sur celle de Cordova, nous voyons qu’il y a un répertoire principal /src, il y a souvent le tryptique fichier ts/fichier scss/template html.

/src
    /app
        app.module.ts
        app.html
        app.scss
        main.ts
        app.component.ts
    /pages
    /assets
    /theme
/www
    /assets
    /build
index.html
manifest.json
service-worker.js

Le fichier à la racine du répertoire index.html est le point d’entrée de l’application. Vous pouvez comparer avec le index.html de /www/index.html, ils sont quasi identiques.

Le répertoire www contient les fichiers compilés, que vous allez déployer, en effet les fichiers qui sont dans le répertoire src sont uniquement utilisé en développement, et servent à compiler l’application finale.

Le répertoire /src a plusieurs répertoires importants, /app contient le root module de l’application, qui est en fait un wrapper pour charger le reste des modules, app.module.ts est le premier module à être chargé.

Le répertoire /app

Ce répertoire est très important car il contient le root module qui va appeler les modules restants. Le fichier main.ts est le fichier dans lequel vous allez mettre votre code propre, votre code métier, il y a le tryptique app.* où * est scss,html,ts. Il y a le composant app.component.ts, le code de ce script crée une classe qui est chargée dans le fichier app.module.ts.

Le contenu de app.module.ts contient le code suivant :

@NgModule({
  declarations: [MyApp, HelloIonicPage, ItemDetailsPage, ListPage],
  imports: [BrowserModule, IonicModule.forRoot(MyApp)],
  bootstrap: [IonicApp],
  entryComponents: [MyApp, HelloIonicPage, ItemDetailsPage, ListPage],
  providers: [StatusBar, SplashScreen, {provide: ErrorHandler, useClass: IonicErrorHandler}]
})
export class AppModule {}

Toute application contient un élément racine, qui va piloter l’application et charger le reste des modules. Les composants à charger sont à l’attribut entryComponent (dans Ionic, tout est à base de composants). « MyApp » est le nom de la classe (du composant) définit dans le fichier app.component.ts .

Le fichier app.html a un élément <ion-nav> dont un des attributs est [root]="rootPage",

Le répertoire /pages

Il contient les différentes « pages » ou vues de l’application. Chaque page est constituée du tryptique ts/html/scss.

Le répertoire /assets

Il contient les images, icônes, des éléments de la vue.

Lancer l’application sur un navigateur

Cette action est vraiment la plus facile, il suffit de lancer la commande :

ionic serve

Votre application se lancera sur votre navigateur par défaut sur le port 8100 sur l’adresse http://localhost:8100

Lancer l’application dans un émulateur

Pour ce faire il vous faut installer sur Windows Android Studio, et notez que sur Windows vous ne pouvez pas émuler un Iphone. Pour MacOs il est possible de lancer l’émulateur IOS et Android, avec l’aide respectivement de XCode et Android Studio.

Lancer avec un émulateur smartphone

Vous devez disposer de Android Studio, Java 8, et Gradle à installer séparément avec Homebrew

brew install gradle

Paramétrage pour l’environnement Android Studio. Il faut setter les variables d’environnement, voir cette page.

export ANDROID_SDK_ROOT=$HOME/Library/Android/sdk
# avdmanager, sdkmanager
export PATH=$PATH:$ANDROID_SDK_ROOT/tools/bin
# adb, logcat
export PATH=$PATH:$ANDROID_SDK_ROOT/platform-tools
# emulator
export PATH=$PATH:$ANDROID_SDK_ROOT/emulator

export PATH=$PATH:$ANDROID_SDK_ROOT/build-tools
#gradle home setting, mettre le chemin de gradle que vous avez installé avec Homebrew (brew info gradle pour connaitre le chemin)
export GRADLE_HOME=/usr/local/Cellar/gradle/5.6.3
export PATH=$PATH:$GRADLE_HOME/bin

Installer (et enlever) les plateformes IOS et Android

Pour convertir le code Javascript en Java ou Swift, il faut d’abord installer les plateformes. Exécutez ces instructions en sudo :

ionic cordova platform add ios
ionic cordova platform add android
#pour enlever
ionic cordova platform rm ios

!! Vous aurez sans doute en phase de build un erreur de droit d'accès, c'est parce que vous avez dû créé la plateforme avec un sudo, dans ce cas changez le owner du répertoire plateform

$ chown -R moi:moi platform

Sur Mac Os j’ai eu le problème suivant: les répertoire /platforms appartiennent à root, il a fallu faire un sudo chown -R monuser: /platforms pour changer le propriétaire de l’arborescence.





Lancez votre application sur un smartphone physique

Lancez votre application Ionic sur IOS

Vous devez disposer de XCode, la première chose à faire est de disposer d’un Apple ID ou d’un compte développeur Apple (cette procédure est plus compliquée), c’est un identifiant d’un compte sur apple.com. Ensuite la chose importante est de créer un provisioning profile en utilisant l’Apple ID. Qu’est ce qu’un provisioning profile?



A provisioning profile is a collection of digital entities that uniquely ties developers and devices to an authorized iPhone Development Team and enables a device to be used for testing. A Development Provisioning Profile must be installed on each device on which you wish to run your application code. Each Development Provisioning Profile will contain a set of iPhone Development Certificates, Unique Device Identifiers and an App ID. Devices specified within the provisioning profile can be used for testing only by those individuals whose iPhone Development Certificates are included in the profile. A single device can contain multiple provisioning profiles.

Source

Un provisioning profile est un ensemble d’identifiant qui lie de façon unique un device à une équipe de développeur, permettant en phase de développement de tester l’application. Ce profile (Vous le téléchargez depuis votre compte sur appe.com) doit être installé sur chaque device. un device peut contenir plusieurs provisioning profile. Avec ce dernier vous choisissez quel device peut lancer l’application et quels service votre application peut utiliser.

Provisioning is the process of preparing and configuring an app to launch on devices and to use app services. During development, you choose which devices can run your app and which app services your app can access. A provisioning profile is downloaded from your developer account and embedded in the app bundle, and the entire bundle is code-signed. The embedded provisioning profile is installed on the device before the app is launched. If the information in the provisioning profile doesn’t match certain criteria, your app won’t launch. You indirectly configure a development provisioning profile by choosing options in Xcode

Source

Bon ce n’est pas tout de faire une application, encore faut-il la déployer sur un smartphone ! là est vraiment la valeur ajoutée de Cordova et Ionic, faire une application native sans connaitre Java ou Swift.

Lancez votre application Ionic sur un smartphone Android

ionic cordova run android --device

si vous avez une erreur installez

sudo npm i -g native-run

Il se peut que votre Mac n’arrive pas à détecter votre téléphone Android, dans ce cas vérifiez bien que vous êtes en mode développeur (lien ici) et que le débogage USB est activé, branchez le câble USB à votre smartphone, ensuite dans Android Studio, allez scanner les devices dans le volet gradle (screenshot ici) en haut à droite de Android Studio. Lors de la connexion de votre smartphone Android via le port USB, n’oubliez de sélectionner « Transfert de fichier », car il faudra y mettre des fichiers.

Si le device ne s’affiche vérifiez les points suivants : smartphone en mode développeur, activer le mode débogage, ensuite allez sur « Run » du menu, « Select device », puis sur la popup « Troubleshoot » vous aurez cet écran :

Faites un « rescan device ».

Vidéo sur le déploiement sur Android en seconde partie (vidéo en anglais)

Le grand final déploiement dans les stores !

La majorité des applications doivent être sur les stores, pour profiter de leur audience. Sauf certaines applications confidentielles ou B2B, le reste vous avez tout intérêt à installer sur les stores Appstore pour IOS et Google Play pour Android.

Vidéo sur le déploiement sur l’Appstore, de la génération du CSR jusqu’à l’upload de l’application et paramétrage sur Itunes Connect

Erreur Fréquemment rencontrée lorsque vous démarrez en local une application ionic :

ERROR: Component xyz is not part of any NgModule or the module has not been imported into your module

Vous avez oublié de déclarer ce composant dans le fichier app.module.ts sous l’annotation @NgModule.

@NgModule({
  declarations: [ // déclarer le composant ici
    MyApp,
...
    HomePage,
    MentionsPage
  ],
...
})

Script shell pour connaitre le code HTTP d’une page web

J’ai eu besoin de faire rapidement et surtout simplement un script pour avoir le header HTTP d’un fichier d’urls. Dans mon cas le plus simple était de faire un script shell et de lui donner à manger un fichier d’url. Couplé à Curl, on peut simplement avoir une masse de résultats facile à lire.

D’abord la commande curl qui permet d’avoir le header HTTP

curl --header -k https://monsite.fr/page.html

HTTP/1.1 410 Gone
Date: Wed, 23 Oct 2019 20:32:02 GMT
Server: Apache/2.4.25
Content-Type: text/html; charset=iso-8859-1

Ce qui m’intéressait était le code HTTP, donc avec un grep on peut extraire la ligne qui nous intéresse

curl --header -k https://monsite.fr/page.html | grep HTTP

De fil en aiguille en faisant un script qui lisait un fichier ligne par ligne, et ensuite appliquait la commande ci-dessus, et en insérant le résultat de la commande dans un fichier nous obtenons un fichier de résultats exploitable, voici le script ci-dessous :

#!/bin/bash
file="/home/creatissus/url.txt"

truncate -s 0 out.txt
while IFS= read line
do
header="$(curl --head -k "$line" | grep HTTP)"
echo "$line $header" >> out.txt
done <"$file"

Nous obtenons un fichier où chaque ligne est l’url suivi du code HTTP. Pour finir extrayons les ligne contenant le code 404 :

grep 404 url.txt > 404.txt

Et voilà j’espère que cela vous a plu et que ce script vous soit utile.

Qu’est ce que le temporal dead zone TDZ en ES6?

Cette feature a été introduite depuis ES6 et concerne let et const, deux façons alternatives de déclarer des variables. En bref, si vous vouez accéder à des variables déclarées par let et const avant qu’elle ne soient initialisée va déclencher un ReferenceError là où l’utilisation de var va déclencher un undefined.

#utilisation nominale
var a = "bonjour"
console.log(a)
> "Bonjour"

#utilisation avant initialisation
console.log(b)
var b = "bonsoir" // undefined

#avec const
console.log(c)
const c = "hello" // ReferenceError: can't access lexical declaration `b' before initialization

Le variable hoisting

Pour comprendre le TDZ, il faut d’abord comprendre ce qu’est le hoiosting (hissage en anglais). Dans le langage de programmation JS, les variables sont les premières choses processées lors d’une compilation. déclarer une variable n’importe où équivaut à les déclarer en début de script. (source MDN).

Lorsque vous écrivez var a = « bonjour » en fait il y a deux choses qui se passent (et il faut avoir le réflexe de voir la chose de cette façon)

1/la déclaration de la variable : var a

2/l’initialisation de la variable, on lui donne une valeur : a = "bonjour"

Le hoisting (hissage) ne concerne que la déclaration et pas l’initialisation (important à savoir).

#donc écrire 
a = "bonjour"
var a
#est équivalent à
var a
a = "bonjour"

Pour cette raison, il est conseillé de déclarer les variable au début de leur scope (global ou dans la fonction). Donc ci-dessous un exemple :

function  dire(){
    console.log(a)
    var a = "bonjour"
}
#équivalent à
function dire(){
    var a
    console.log(a)
    a = "bonjour"
}

#autre exemple avec deux variables
var a = "bonjour"
var b = "bonsoir"

#équivalent à 
var a
var b
a = "bonjour"
b = "bonsoir"


#autre exemple
var x = y, y = 'A';
console.log(x + y); // undefinedA

#équivalent à
var x
var y
x = y // y n'est pas initialisé mais il existe et vaut undefined
y = 'A' // y est initialisé, mais x est toujours undefined
console.log(x + y) // undefinedA

La TDZ Temporal Dead Zone

Le petit exemple ci-dessous illustre les effets du TDZ pour let :

console.log(x) //ReferenceError: can't access lexical declaration `x' before initialization
let x = "bonjour" 

# équivalent
let x
console.log(x)
x = "bonjour"

let fait intervenir le hoisting, mais à la différence de var, si on essai d’y accéder, il renvoie ReferenceError. La TDZ est la propriété qui renvoie une ReferenceError lorsqu’on essai d’accéder à une variable non initialisée. La TDZ est cet espace entre la déclaration et l’initialisation d’une variable.

La TDZ a été créé pour avoir plus de feedback lorsque l’on code en Javascript.

Pour aller plus loin : la TDZ concerne aussi les argument d’une fonction. Je ne traiterais pas de ce sujet pour l’instant.

Pour plus d’information : la source d’inspiration

Comment installer Composer le gestionnaire de package de PHP

Aujourd’hui tout lange de programmation moderne se doit d’avoir un gestionnaire de package, pour NodeJS on a NPM, pour C# on a Nugget, etc.

Installation de Composer sous Windows

Pour avoir les étapes d’installation, se référer à cet article relatif à l’installation de Composer.

Il suffit d’installer l’exécutable composer-setup.exe

Installation de composer sous Linux/MacOS

Il est préférable d’installer en ligne,

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
#vérification 
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
#exécution du fichier php qui va installer composer
php composer-setup.php
#effacement du fichier php qui nous a servi à installer composer
php -r "unlink('composer-setup.php');"

Le fichier composer.json

Ce fichier consigne tous les paquets qui sont installés, lisez les section require ou require-dev, ils listent les paquets qui seront installés dans le dossier vendor.

Composer a aussi un rôle de chargement des classes des librairies qui sont dans le dossier vendor, en effet il n’est pas simple d’accéder à des classes qui sont enfouis profondément dans ce répertoire.

L’autoloading dans composer

Dans notre répertoire de travail nous voulons pouvoir accéder aux classes depuis notre répertoire de travail

/app
   /controller
   /services
/vendor
  /librairie1
    /Query.php

Par exemple dans le répertoire controller de notre projet, nous voulons accéder à la classe Query.php, nous voyons le chemin pour y arriver, donc dans notre fichier controller :

use \librairies\Query
class UserController {
  $query = new Query()
}

Remarquez la correspondance entre le chemin et le use, il y a correspondance entre le chemin pour aller jusqu’à la classe et la syntaxe du use.

Erreurs qu’on peut rencontrer avec composer

Pas assez de mémoire pour exécuter composer

On utilise composer en ligne de commande, PHP dispose d’une variable d’environnement qui fixe le seuil maximal de mémoire autorisé pour exécuter des script php, et composer en réalité est un script php qui s’exécute ! Nous pouvons faire appel à la variable memory_limit de cette façon

>php -d memory_limit=512M /usr/local/bin/composer update
#note : PHP en ligne de commande est différent de PHP pour le serveur web !
#ou encore mieux exécuter sans limite de mémoire
php -d memory_limit=-1 /usr/local/bin/composer update

Note pour le framework Symfony :

S’il existe un fichier parameters.yaml.dist, composer va tenter de générer un parameters.yaml depuis ce dernier fichier, écrasant le parameters.yaml original, donc faites attention lorsque vous importez un projet existant !

php

Installer PHP 5.6 sur Mac OS

Comme nous nous dirigeons vers le futur, sur Mac OS Homebrew, PHP 5.6 n’est plus disponible. Or cette version de PHP était très utilisée, et quand vous récupérez des projets ancienc qui tournent sous cette version, ils risquent de ne pas tourner sur PHP 7 par exemple. Dans ce cas vous avez besoin de vous tourner vers la version PHP 5.6.

Seulement Homebrew officiellement ne fournit plus PHP 56. Mais il est quand même possible de l’installer avec une petite manipulation.

brew tap exolnet/homebrew-deprecated

brew install php@5.6

Ajoutez dans le fichier /etc/apache2/httpd.conf la ligne

LoadModule php5_module /usr/local/opt/php@5.6/lib/httpd/modules/libphp5.so

Et décommentez la ligne qui charge le module php7, redémarrez apache avec la commande suivante (vous aurez besoin de rentrer le mot de passe :

sudo apachectl restart

Ensuite pour vérifier la version de php surtout ne faites pas en ligne de commande php -v . ! En effet il existe deux version de PHP potentiellement, une version pour la ligne de commande et une version pour le serveur web.

Changer la version de PHP utilisée en ligne de commande

Là c’est un peu plus délicat. En faisant l’installation de PHP 5.6 via Homebrew, le binaire est installé dans le répertoire : /usr/local/Cellar/php@5.6/5.6.40/bin/

Pour exécuter PHP de ce répertoire et disposer de la version 56, indiquez le chemin complet :

/usr/local/Cellar/php@5.6/5.6.40/bin/php -v

PHP 5.6.40 (cli) (built: Apr 23 2019 11:14:34) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies

Redirection 410 dans Htaccess

Voici comment faire une redirection 410 dans le fichier htaccess. La redirection 410 c’est pour indiquer que la page n’existe plus, à al différence de la page 404, qui est introuvable, donc pas spécifiée comme à effacer de l’index des moteurs de recherche.

Cette recette est utilie lorsque dans l’onglet « Couverture » de Google Search Console, vous avez une masse d’url que Google crawle sans arrêt. La massse noire d’url peut être néfaste pour le référencement de votre site.

Le fichier Htaccess

La règle s’écrit avec RewriteRule, avec le flag [G] voir le Guide de référence des flags de Apache. Ce flag permet d’envoyer un 410 Gone, la page est partie en clair.

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule \.html - [G]

RewriteCond %{QUERY_STRING} add-to-cart
RewriteRule (.*) - [G]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Dans l’exemple ci-dessus, toutes les urls qui se terminent pat .html vont renvoyer une header 410. La seconde règle un peu plus complexe va exécuter l’envoi du header 410 si dans la partie Query string de l’url, nous avons la chaine « add-to-cart », en fait Google a la facheuse tendance à tout indexer, même le panier !

Notez le tiret avant le flag.

Retour en haut