Nom de l’auteur/autrice :yvonh

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

Update 22/07/2024 : cela fait quelques années qu’il faut créer un compte pour pouvoir utiliser Ngrok, je le mets là

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.

Usages possible de Ngrok

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 qui 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. (http://nginx.org/en/docs/windows.html)

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

Démarrer Nginx

allez dans le répertoire de votre nginx et tapez la commande
>start nginx
 ensuite pour visualiser les process

>>tasklist /fi "imagename eq nginx.exe"

Nom de l’image                 PID Nom de la sessio Numéro de s Utilisation
========================= ======== ================ =========== ============
nginx.exe                    15308 Console                   17     8 260 Ko
nginx.exe                    15476 Console                   17     8 588 Ko

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

Créer un tag sur un commit précédent (commit spécifique)

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

Tirer les tags depuis upstream

Si vous avez forké un projet, et que l’origin du projet (appelé upstream) a créé un tags, la synchronisation avec une branch ne fera pas apparaitre dans votre repository le tags.

Par contre en local vous pouvez tirer le tag:

git fetch --tags upstream
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.

MySQL Error 1055 Expression #n of SELECT list is not in GROUP BY clause and contains nonaggregated column

Si vous êtes sur cette page c’est que vous avez rencontré une erreur avec la version 5.7 de MySQL ! (Je suis sous OSX Mojave, aussi cette solution est significative pour les Mac, mais aussi pour Linux)

Pourquoi avez vous cette erreur ?

Dans la version 5.7 de MySQL, lorsque vous faites une aggrégation de colonne, vous devez spécifier explicitement le nom de la colonne à aggréger dans le SELECT sinon vous aurez cette erreur. Parce que par défaut dans cette nouvelle version on interdit des GROUP BY implicite. Normalement le GROUP BY ne peut se faire que sur des noms de colonnes agrégées par une des 5 fonctions d’aggrégation suivantes : SUM, COUNT, MAX, MIN, AVERAGE .

Il y a une variable qui s’appelle sqlmode, et conditionne le fonctionnement des requêtes SQL. Par défaut sont contenu est :

ONLY_FULL_GROUP_BY,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

En premier on a ONLY_FULL_GROUP_BY, c’est elle qui nous intéresse. Il faut le supprimer pour vous puissiez faire des GROUP BY implicite. Qu’est-ce qu’un GROUP BY implicite? Imaginez que vous avez la requête suivante

SELECT id, username FROM user GROUP BY id

Sur la requête ci-dessus, on groupe sur la colonne id, or il n’y aucune fonction d’aggrégation. Donc ceci n’est plus permis, à moins de faire un petit réglage dans le fichier de configuration my.cnf un peu plus loin.

Voici une requête plus propre :

SELECT count(amount) AS total, customer FROM order GROUP BY total

Dans la requête ci-dessus, la colonne avec l’alias total est une colonne agrégée, donc le group by sur cette colonne est tout à fait explicite, avec la nouvelle version de MySQL elle passera sans problème. C’est d’ailleurs comme ça que j’avais appris.

Comment résoudre cette erreur ?

Dans la configuration de MySQL 5.7, il faut trouver la variable qui permet de configurer soit en runtime soit au démarrage (et ce de façon permanente) le comportement de votre base de données favorite.

La façon runtime (ne marche pas pour moi)

Vous pouvez faire cette requête dans la console MySQL pour montrer le contenu de la variable sql_mode:

SELECT @@sql_mode 
> STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Jouez cette requête pour modifier la variable, le but étant de supprimer le ONLY_FULL_GROUP_BY et de garder le reste, je tiens à préciser que cette méthode n’a pas marché pour moi, néanmoins marche dans pour les requêtes dans MySQLWorkbench.

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

La façon permanente

Le mieux est de modifier le fichier my.cnf, et de redémarrer MySQL. Donc éditez le fichier my.cnf qui se trouve dans /etc pour Linux et MacOS en insérant cette ligne dans la section [mysqld] :

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Redémarrer MySQL sur Linux (Debian, Ubuntu)

sudo /etc/init.d/mysql restart
ou
service mysqld restart

Redémarrer MySQL sur MacOS

J’ai eu plus de difficulté, en effet sur le Net, on trouve souvent cette commande :

sudo /usr/local/mysql/support-files/mysql.server restart

Si elle ne marche pas, je pense si vous avez installé MySQL avec Homebrew, il faut localiser le répertoire de MySQL, pour ma part sous Mojave il se trouve dans le répertoire /usr/local/Cellar/mysql@5.7/5.7.26/support-files/mysql.server :

sudo /usr/local/Cellar/mysql@5.7/5.7.26/support-files/mysql.server restart

Pourquoi ne pas modifier les requêtes SQL pour les mettre à jour?

C’est possible, mais vous n’avez pas forcément le temps de le faire, aussi j’ai choisi cette solution.

Note :

J’ai perdu pas mal de temps avec PDO, n’ayant pas les affichages d’erreurs, juste après la requête, vous pouvez retourner le code erreur donné par PDO, il faut absolument le faire car PDO peut planter sans broncher, et le mettre dans le bloc try ... catch ne suffit pas à lancer une PDOException (du moins dans mes réglages à moi)

$stmt = $dbh->query($sql);
$dbh->errorInfo();// tableau d'erreur très utile !

Linux utiliser Sed pour manipuler les chaines de string

Personnellement je confondais souvent Awk et Sed, je ne voyais pas trop la différence. Mais maintenant ce qu’il faut retenir c’est que Awk travailler avec des fichiers dont les lignes sont semblables, genre fichier .csv. pour ce qui est de Sed, on l’utilisera plutôt pour remplacer des caractères par d’autres.

La similitude entre les deux outils est qu’ils travaillent ligne par ligne.

Recettes génériques Sed :

sed 's/"//g' efface les guillemets

sed 's/^/"/' ajoute un guillemet au début de chaque ligne

sed 's/$/"/' ajoute un guillemet à la fin de chaque ligne

sed 's/|/"|"/g' adds a quote before and after each pipe.

Pour être à l’aise avec Sed, il faut connaitre un peu les expressions régulières.

Un mois avec un framework PHP petite désillusion

La veille d’écrire ce post, cela faisait à peu près deux mois que je m’était mis sur Symfony 4 (j’ai eu aussi une petite période avec Symfony 2 par le passé mais moins investi)

Pourquoi ce tweet? comme souvent mes tweets répondent à l’émotion du moment, posons la question : pourquoi ce message ?

Mon background

Ingénieur non informatique de formation, j’ai commencé ma carrière dans l’industrie puis me suis tourné vers l’informatique il y a un peu plus de dix ans, je suis entré dans le développement web. Je suis autodidacte, et ces 3 dernières années j’ai un peu boosté mon niveau en devenant salarié et travaillant dans une équipe.

Je possède des compétences en Linux, le stack LAMP, un peu vieille école, c’est-à-dire the hard way is easier (rien ne vaut une bonne requête SQL). Je n’ai pas beaucoup de théorie sur l’informatique (algo etc), j’ai fait mes armes à l’école anglo-saxonne et web, cependant je suis passé par math sup/spé.

Mon premier framework avec lequel j’ai vraiment travaillé est AngularJS, ce fut fun, puis .Net, grosse montagne, trop grosse, mais j’ai apprécié la puissance de Visual Studio, j’ai enfin compris l’intérêt du typage statique dans un IDE, puis un petit détour par Java (pouah !), puis brièvement sur Laravel 5, et là je suis sur Symfony 4.

J’avais de grandes attentes, un framework digne du nom, qu’on arrête de se moque des développeurs PHP avec les appels BDD mélangé à du HTML, c’est un level up pour moi et surtout mon CV (compétence très demandée du moins en France, donc pérennité du boulot). Symfony 4 c’est aussi et indubitablement les meilleures pratiques en code, les meilleurs patterns, pas de doute, cela fera de moi un meilleur développeur !

Ce billet n’est pas une critique de Symfony et on alter ego Laravel, et je cible tous les frameworks serverside en général.

Ce qui suit n’engage que moi, et d’autres personnes peuvent penser différemment.

Ma philosophie du code

Ce qui m’attire dans le développement c’est la résolution de problème, augmenter la productivité des gens en leur fournissant des codes qui automatisent le travail rébarbatif. Chaque fois que j’arrive à faire quelques chose en code, j’ai un shoot d’adrénaline, une satisfaction qui égaye ma journée, et en informatique c’est quelque chose de constant (ça m’arrive au moins une fois par jour). J’aime trouver des solutions, créatives, détournées, parfois même en enlevant tout le code et utiliser un software qui fait le boulot, ça me satisfait.

Le développement informatique nous procure beaucoup de libertés, moi ce qui me plait le plus c’est de créer, j’avoue que une fois que le logiciel est créé, je n’ai pas envie de faire la maintenance, ou faire une TMA trop longtemps, ce n’est pas ma tasse de thé de rester avec un logiciel des années, ce qui me plait c’est la phase travaux neuf. (j’aime aussi améliorer un logiciel pourri si le temps m’est permis, optimiser une requête SQL afin de le faire tourner dix fois plus vite me procure autant de plaisir que les travaux neufs).

Bien sûr je ne suis pas un cador, mon code n’est pas parfait, je n’y arrive pas du premier coup, je ne suis pas un ingénieur 10X (MDR). Avec l’expérience j’arrive à produire un code pas trop dégueulasse, avec toujours de meilleures pratiques. Mes applis marchent et délivrent.

Le problème avec les frameworks

J’avoue c’est Symfony le déclencheur, cela aura sans doute été moins évident avec Laravel. Donc j’ai pu regarder pas mal de vidéo de Symfony et j’ai appris beaucoup de choses, j’ai aussi fait beaucoup en code sur un projet vrai, pas sur les exercices.

Je me suis rendu compte avec les tuto sur les formulaires Symfony (qui est LE PLUS morceaux du framework à mon avis) sont un très grosse montagne, mais en même temps qu’il n’y avait pas de grosse difficultés, le framework est bien pensé. On peut tout faire, mais le problème est que l’on peut tout faire à la mode Symfony. Donc il faut savoir, pas de secret.

Un framework dirigiste

En anglais on appelle cela un opinionated framework, un framework où il faut faire à leur façon. En fait les séries de vidéos très bien faites, montrent que c’est une série de recettes qu’il faut appliquer, il ya beaucoup de choses à savoir (le côté difficile) et en même temps ce n’est pas si compliqué si on sait comment faire.

Beaucoup de paramétrages

Symfony vient avec une série de fichiers YAML, une notation très succincte, qui permet de configurer l’environnement de l’application. Donc le paramétrage est un aspect très prégnant d’une application faite avec Symfony. De même les entités sont paramétrées avec des annotations Doctrine, qui définissent les relation entre les entités (miroir des tables de la base de données), mais ça je trouve plutôt pas mal car vous gagnez beaucoup de temps, mais il faut il y a beaucoup de chose à savoir !

Une fois qu’on respecte à la lettre les recettes, on s’aperçoit que finalement on a peu de liberté pour coder, puisque tout est réglé au millimètre. En fait votre seule liberté est dans la couche business.

Travailler avec un framework de grade entreprise, les contreparties

Un framework a une raison d’exister puisqu’il y a un marché, et ce marché c’est celui de l’entreprise, des moyennes et grosses applications. Il faut produire des applications robustes, dans un minimum de temps, et que cette application soit extensible. Et pour remplir ces objectifs, on ne peut pas faire autrement, on ne peut pas réinventer la roue à chaque fois.

Je n’ai plus l’impression d’être un artisan du web, mais plutôt un ouvrier qui va travailler selon des normes ISO, des process, je ne critique pas cela, car dès qu’on vise une certaine qualité logicielle, il faut passer par ces frameworks. Mais ce faisant on va faire toujours les mêmes choses.

C’est pour ça que j’ai abandonné l’idée de développer des connaissances en Java et C#, car de facto quand vous abordez des projets dans ces langages, vous vous retrouvez face à des léviathans.

Donc en bref, vous gagnez en bonne pratique et robustesse, qualité de l’application (bonne chose), mais c’est au détriment de la liberté.

Note : Ce n’est pas parce qu’un framework vous oblige à coder de telle façon qu’il n’est pas possible de sortir une application codée de façon dégueulasse.

Je ne sais pas où vous pouvez vous caser, mais le futur que vous envisagez n’est peut-être pas aussi intéressant que vous pensiez, faire des projets qui se ressemblent va finir par vous user, ce qui nous fait au problème suivant : trouverez vous le plaisir de coder si cela devient routinier?

PS : inutile de commenter, le débat peut se poursuivre sur Twitter.

Exploiter la table d’information de MySQL

La table information_schema de la base MySQL contient tout un tas d’informations intéressantes. Vous aves les informations sur les utilisateurs, mais surtout les informations sur les tables. Voici quelques exemples de requêtes qui peuvent être faites :

SELECT table_name ,
  round(((data_length + index_length) / 1024 / 1024), 2) as SIZE_MB
FROM information_schema.TABLES where table_schema = 'database_name'
WHERE table_schema = DATABASE() ORDER BY SIZE_MB DESC;

Mettre en place l’authentification basique HTTP

Sur ‘importe quel site web, vous pouvez mettre en place un système de login très simple sans recours à du HTML et du code PHP, cela s’appelle l’authentification basique HTTP. Il suffit de mettre dans un fichier .htaccess le code suivant :

AuthType Basic
AuthName "Restricted Content"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
Retour en haut