Tutoriel backtesting avec Tradingview

Dans ce tutoriel nous allons voir comment simplement backtester une strétégie avec Tradingview, cet outil existe en gratuit et fait dans la verison gratuites énormément de chose.

On va écrire le script en Pinescript, et on va exécuter le backtest.

Ceci n’est pas un conseil financier.

strategy("Moving average Cross")

// Pinescript c'est L4G (langage de 4ème génération)
ema20 = ema(close,20)
ema50 = ema(close,50)


// on définit quand est ce qu'on long ou short
long = ema20 > ema50
short = ema20 < ema50

//ouverture du trade
strategy.entry("long", strategy.long,1.0,when=long)
strategy.entry("short", strategy.short,1.0,when=short)

// fermeture du trade
strategy.close("long",when=short)
strategy.close("short",when=long)

Cliquez sur « Update on chart »

Un fois que vous avez fait le script il faut clicker sur « Strategy tester », à côté de « Pine Editor », dans le sous menu, Overview vous pouvez voir la courbe de PNL

lien vers la documentation de Pinescript

définir une date de début et de fin

//@version=4
strategy("Moving average Cross")
ema20 = ema(close,20)
ema50 = ema(close,50)
long = ema20 > ema50
short = ema20 < ema50

start = timestamp(2021,04,01,0,0)
end = timestamp(2024,04,01,0,0)

if time >= start and time <= end
    strategy.entry("long", strategy.long,1.0,when=long)
    strategy.entry("short", strategy.short,1.0,when=short)
strategy.close("long",when=short)
strategy.close("short",when=long)

il faut mettre @version=4 sinon la condition if ne marche pas

Ensuite cliquez sur « Update on chart » pour que ça marche

Affichage des deux moyennes mobiles

//@version=4
strategy("Moving average Cross")
ema20 = ema(close,20)
ema50 = ema(close,50)
long = ema20 > ema50
short = ema20 < ema50

plot(ema50, title="ma50", color=#ffc1cc, linewidth=3)
plot(ema20, title="ma20", color=#00ffaa, linewidth=2)

start = timestamp(2021,04,01,0,0)
end = timestamp(2024,04,01,0,0)

if time >= start and time <= end
    strategy.entry("long", strategy.long,1.0,when=long)
    strategy.entry("short", strategy.short,1.0,when=short)
strategy.close("long",when=short)
strategy.close("short",when=long)

//Version avec Overlay sur la courbe des prix
il suffit de modifier la première ligne de code
strategy("Moving average Cross",overlay=true)

Ensuite cliquez sur « Update on chart » pour que mettre à jour le graphe, les deux moyennes mobiles sont dans le bas de l’écran séparés du graphique des prix. Ajoutez la propriété overlay=true pour superposer les deux graphique, auparavant supprimez le graphique du bas avec les deux moyennes mobiles.

Retarder l’entrée en position à la 10ème bougie en plus de la condition des moyennes mobiles

On fait ceci pour éviter que le croisement des moyennes mobiles ne soit que éphémères.

//@version=4
strategy("Moving average Cross",overlay=true)
ema20 = ema(close,20)
ema50 = ema(close,50)
long = ema20 > ema50
short = ema20 < ema50

//on attend la consolidation pour passer à l'action pour éviter de se faire stopper
longcondition = long and long[10] and not long[11]
shortcondition = short and short[10] and not short[11]

plot(ema50, title="ma50", color=#ffc1cc, linewidth=3)
plot(ema20, title="ma20", color=#00ffaa, linewidth=2)

start = timestamp(2021,04,01,0,0)
end = timestamp(2024,04,01,0,0)

if time >= start and time <= end
    strategy.entry("long", strategy.long,1.0,when=longcondition)
    strategy.entry("short", strategy.short,1.0,when=shortcondition)
strategy.close("long",when=shortcondition)
strategy.close("short",when=longcondition)

On a pris moins de trade mais le PNL est moins intéressant, mais vous voyez ici l’idée, on joue sur les potard afin d’améliorer le PNL. Une fois que vous avez des résultats intéressants, vous pouvez appliquer pour le futur dans votre stratégie de quant.

Après le réglage

Avertissement sur les limites du backtesting

Le backtesting n’est pas trivial, et ce qui est donnée par Tradingview peut ne pas être juste dans la réalité. Regardez cette vidéo

Le quant marche mieux dans le low time frame intraday avec des bougies d’un quart d’heure. je ne suis pas spécialiste et j’ai fait cet article à des fin didactique, je n’ai pas fait de robot de trading.

Simuler le clic d’une souris avec Javascript

Non je ne parle pas de l’événement « click » ou « onclick », mais carrément de créer un événement souris. En javascript nous disposons de MouseEvent, qui ne se limite pas au seul clic gauche ou droit, mais tient compte aussi des déplacements de la souris.

var clickEvent = new MouseEvent('click', {
    bubbles: true,
    cancellable: true,
    clientX: 32,
    clientY: 32,
})

Voici le la documentation officielle de MouseEvent. Cependant je dois aussi vous dire qu’il y a un autre événement appelé PointerEvent. Cet événement est plus générique, car il peut gérer les événement touch, multi contact, alors que MouseEvent ne peut pas. Mais dans cet article nous allons nous concentrer sur MouseEvent.

Description de MouseEvent

Les 3 coordonnées de la souris dans une page web

Le référentiel d’un élément HTML

Le référentiel de la fenêtre

Le référentiel du document

Mise en apllication de MouseEvent

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>MouseEvent</title>
    <script src="MouseEvent.js" defer></script>
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <div class="container">
        <div class="header"></div>
        <div class="main">
            <h1>Titre</h1>
            <div class="card">
                <p>Ceci est un exemple pour illustrer MouseEvent</p>
            </div>
        </div>
    </div>
</body>


</html>

function simulateClick() {
    let titre = document.querySelector('h1')

    let clickEvent = new MouseEvent('click', {
        bubbles: true,
        cancellable: true,
        /*    offsetX: 20,
            offsetY: 20,*/
    })


    console.log('dispatch')
    titre.dispatchEvent(clickEvent)
    console.log('clicked')

}

let h2 = document.querySelector('h1').addEventListener('click', function (e) {
    alert('toto')
})

setTimeout(simulateClick, 300)

La fonction simulateClick() va sélectionner l’élément H1 et la mettre dans la variable titre, construit un objet Event (MouseEvent pour être plus précis, MouseEvent héritant de Event), ensuite et c’est là qu’il faut être attentif, c’est titre qui va émettre (dispatch) l’événement clickEvent.

Dans le programme principal, h2 qui représente le même élément que titre reçoit une simulation de click et donc une alert() va faire apparaitre une popup. au bout de 300 millisecondes.

Liens en rapport avec l’article:

/////////////////////// DOM onunload ////////////////////
https://stackoverflow.com/questions/11177233/javascript-event-that-runs-before-page-changes
https://stackoverflow.com/questions/446892/how-to-find-event-listeners-on-a-dom-node-in-javascript-or-in-debugging
https://stackoverflow.com/questions/4386300/javascript-dom-how-to-remove-all-event-listeners-of-a-dom-object/64484951#64484951

Comprendre les modules en javascript

Qu’est ce qu’un module en Javascript?

Un module est un fichier tout simplement rien de plus. On parle de module en javascript moderne, en effet ce concept n’existait pas avant ES6. Les modules existent en NodeJs également. Mais dans cet article je ne vais parler que des modules côté client.

Avant l’existence des modules, on ne pouvait pas importer un fichier Javascript dans un autre fichier Javascript comme on peut le faire en PHP.

Ici on ne va parler que des modules front end, dont la syntaxe est différente des modules dans NodeJS, dans ce dernier il existe au moins deux façon de faire, avec require() (commonJs) et import (AMD).

Comment on faisait avant pour importer un script Javascript?

#index.html
<html>
...
<body>
..
<script src="index.js"></script>
<script src="helper.js"></script>
...

On se servait de la balise script our importer les fichiers, index.js ne pouvait pas importer helper.js. La conséquence est que dans un fichier HTML on pouvait avoir facilement plus d’une dizaine d’import de fichier javascript. Cela pouvait avoir un impoact sur la rapidité du site.

Et vinrent les modules Javascript

Dès qu’il y a un import de modules, on observe au minimum deux fichiers. Soient deux fichiers, un principal.js, et un helper.js

//index.html
<script type="module">
import {sayHi} from './helper.js';

sayHi('John');
</script>
// helper.js
export function sayHi(name){
     console.log('Hello ' +  name)
}

On peut importer une fonction à condition qu’elle ait été exportée depuis le fichier helper.js. Dans la balise script on doit ajouter l’attribut type= »module » pour que cela marche.

Les caractéristiques de modules

Les modules utilisent le mode strict

Dans un code Javascript vous utilisez le mode strict pour forcer une plus grande rigueur dans la programmation

Par exemple dans un fichier HTML

<script>
a = 5  // autorisé pas d'erreur dans la console
</script>

Par contre

<script>
"use strict"
a = 5  // ReferenceError: a is not defined
</script>

de même dans un module
<script type="module">
a = 5 // ReferenceError: a is not defined  bien qu'on n'ait pas eu à mettre use strict 
</script>

Le scope des variables

Chaque module a son scope pour ses variables (je parle des variable globales du module, pas les variable locales des fonctions), les modules ne communiquenet donc pas leur variables, autrement dit, un module ne peut utiliser une variable globales d’un autre module.

// user.js
let user = "Jules"

// main.js
console.log(user) //  

//index.html
<script type="module" src="user.js"></script>
<script type="module" src="hello.js"></script>

la console va afficher "SyntaxError: The requested module './lib.js' does not provide an export named 'user'"

//on modifie dans user.js
export let user = "Jules"  // correct

//Pour illustrer directement dans une page HTML
<script type="module">
    export let user = "Jules"
</script>
<script type="module">
    console.log(user)  // Erreur,et on ne peut faire import du module puisqu'il est inline, la seule façon urait été de faire window.user = "Jules"
</script>

Evaluation une seule fois du module à l’import

//index.html
<script type="module">
    window.test = 0
</script>
<script type="module">
    import { val } from './util.js'

</script>
<script type="module">
    import { val } from './util.js'

    console.log(val)
</script>

// util.js
window.test++
export let val = window.test

bien que l’on ait importé deux fois le module util.js, le code va afficher 1 et non 2

Prenons un autre exemple, qui va montrer que cet aspect est en fait pratique, permet aux différents scripts de se « partager  » une variable

// config.js
export let config = {};

// 1.js
import { config } from './config.js'
config.user = "user1"

//2.js
import { config } from './config.js'
config.url = "http://local.test/user1"

// index.html
<script type="module" src="1.js"></script>
<script type="module" src="2.js"></script>
<script type="module">
    import { config } from './config.js'
    console.log(config)
</script>

L’exemple ci-dessus montre que les fichier 1.js et 2.js apportent des nouvelles propriétés

La propriété meta de import

// en reprenant l'exemple précédent

// index.html
<script type="module" src="1.js"></script>
<script type="module" src="2.js"></script>
<script type="module">
    import { config } from './config.js'
    console.log(import.meta)
</script>

On obtient quelques informations sur le module courant.

Le mot clé this dans un module

Dans un module le mot clé this n’existe pas, il est undefined

<script>
  alert(this); // window
</script>

<script type="module">
  alert(this); // undefined
</script>

Les script module sont deferred dans un client

Ce qui suit n’est valable que dans un navigateur

Vous connaissez l’attribut defer dans la balise script.

<script type="module">
  alert(typeof button); // ce module est defer, il se télécharge immédiatement, mais il attend que le HTML finisse de se télécharger avant de s'exécuter.
</script>


<script>
  alert(typeof button); // s'exécute immédiatement après le téléchargement, avant que le HTML du bouton ne vienne
</script>

<button id="button">Button</button>

Toujours préciser le chemin,

Même si le script est adjacent à votre page HTML, il faut préfixer avec un point slash

import {compteur} from 'util.js'; // dans un navigateur ceci n'est pas autorisé,TypeError: Failed to resolve module specifier "util.js". Relative references must start with either "/", "./", or "../".
import {compteur} from './util.js'; 

scripts externes et CORS

L’inclusion de script externe en tant que module doit se faire avec précaution dans le cas des modules. Pour les scripts externes de même origine que la page HTML, pas de soucis, mais si le script vient d’un autre nom de domaine, alors le serveur d’origine

<script type="module" src="https://site.com/script.js"></script>
il faut que site.com ait activé le CORS.

async et les modules

Le mot clé async permet de télécharger en parallèle un script javascript externe, mais ne s’utilise pas pour les script inline (à même la page HTML). dans le cas des modules, le mot clé async s’applique aussi aux Javascript inline.

async Javascript import
<script async type="module">
  import {counter} from './utils.js';

  counter.count();
</script>

Async, defer, preload, prefetch : tout savoir sur ces attributs

Ces attributs lorsqu’il sont utilisés sur une page HTML on tous un point commun : ils permettent de télécharger de façon asynchrone les fichiers liés depuis la page web, dans le but d’accélérer le téléchargement de la page et son exécution.

Async et Defer s’appliquent à la balise <script> uniquement

Comment utiliser ces deux attribut dans un script ? voici un exemple

<script src="init.js" defer></script>

ou 

<script src="init.js" async></script>

Quelle est la différence entre async et defer? Regardez les deux schémas tirés de ce site,

async ne vas pas attendre la fin du téléchargement de la page HTML pour s’éxécuter, alors sur defer va attendre la fin du téléchargement de la page HTML (le parsing plus exactement).defer va être utile si vous avez besoin que tous les éléments du DOM soient mis en place.

Preload et Prefetch sont pour les balises <link>

<link rel="preload" href="style/style.css">
<link rel="preload" href="main.js">

preload permet de télécharger de façon asynchrone les ressources indiquée (css, javascript), mais il ne sont pas exécutés. Ils seront exécutés par le navigateur en cas de nécessité, ce qui est une bonne forme d’optimisation. Pour en savoir plus sur les détails techniques, cette page de la documentation officielle sur MDN.

Prefetch pour pré-télécharger des pages web

<link rel="prefetch" href="/articles/" as="document">

Cet attribut a pour but de prétélécharger une page (même si on ne va pas la visiter) pour que lorsqu’on clique sur le lien, on n’ai pas à la télécharger. Il faut bien sûr s’assurer que c’est une page souvent visitée. La page prétéléchargée sera dans le cache prefetch.

L’image ci-dessus explique le fonctionnement (source : lien de la source).

Docker denied: requested access to the resource is denied

The push refers to repository [docker.io/yvonhuynh/hello2]
An image does not exist locally with the tag: yvonhuynh/hello2

Si vous venez de commencer récemment à suivre un tutoriel Docker et que vous avez ce message, alors il y a peut être deux raisons, la seconde raison est plus probable.

Le contexte :

vous avez construit une image docker et vous aimeriez la pousser ver le hub de docker, mais vous rencontrez ce message lorsque vous poussez votre image soit depuis le Docker Desktop, soit depuis la ligne de commande.

Le dockerfile:

FROM node:alpine
COPY . /app
WORKDIR /app
CMD node app.js

Le projet javascript:

console.log('bonjour version 2')

Première raison possible :

Vos identifiants de connexion ne son tpas les bon

Cette raison est à titre préventif, il est fort à parier que ce n’est pas le cas.

docker logout
docker login
// renseignez vos identifiants.

Seconde raison possible:

Vous n’avez pas donné un tag à votre image

Vous avez buildé une image avec la commande:

docker build -t hello2
docker tag nom_image NOM_DOCKERHUB/nom_image



docker tag hello2 yvonhuynh/hello2


docker push  yvonhuynh/hello2

Le nom de l’image s’appelle hello2 dans le hub docker.

Quelle différence entre le Node et les Elements dans le DOM?

lorsque vous faites des requêtes sur les éléments d’une page HTML et en faisant un affichage des éléments que vous avez obtenus, parfois vous avez des nodelist et parfois vous avez des Element, cela peut prêter à confusion parce que à première vue ce sont deux choses qui sont similaires, mais alors si elles sont similaires pourquoi elle portent deux types différents?

Node (Nœuds) dans le DOM

Dans le DOM, tout est un nœud. Un nœud peut être un élément, un attribut, un texte, un commentaire, un document, ou tout autre type d’objet DOM. Les nœuds sont organisés dans une structure arborescente, avec le nœud de document en haut et tous les autres nœuds en découlant.

Les nœuds ont des propriétés et des méthodes qui vous permettent de les manipuler ainsi que leurs nœuds enfants. Par exemple, vous pouvez utiliser la méthode appendChild() pour ajouter un nœud enfant à un nœud existant.

Éléments dans le DOM

Les éléments sont un type spécifique de nœud qui représente un élément HTML ou XML. Les éléments ont toutes les propriétés et méthodes d’un nœud, mais ils ont également des propriétés et des méthodes supplémentaires qui leur sont propres.

Par exemple, les éléments ont une propriété tagName qui spécifie le nom de l’élément, tel que « div » ou « span ». Les éléments ont également des attributs, qui peuvent être accédés en utilisant la méthode getAttribute() ou simplement en accédant à l’attribut comme une propriété de l’élément.

Il existe 12 types de noeuds

Source StackOverflow

Element est un type de noeud, il y a aussi les noeuds TEXT, COMMENT, etc. Mais le plus familier pour nous est le type Element, les éléments de la page HTML.

Quand obtient l’un ou l’autre?

Lorsque vous faite une requêtes qui peut retourner plusieurs item, vous obtenex un NodeList (ce n’est pas un tableau !)

    <div class="container">
        <ul id="liste">
            <li id="un">Un</li>
            <li id="deux">Deux</li>
            <li id="trois">Trois</li>
        </ul>
    </div>


let el = document.getElementById('un')   
console.log(el)  // retourne un Element

let nodelist = document.querySelectorAll('li')
console.log(nodelist)   // retourne un nodeList

Dans l’exemple ci-dessus, même si le second exemple retourne un NodeList, les items de cette nodelist sont des Elements ! Vous pouvez le vérifier avec instanceof

console.log(nodelist[0] instanceof Element)  // true
console.log(nodelist[0] instanceof Node)  // true
console.log(el instanceof Node)  // true

Mais alors pourquoi dans ce cas on ne fait pas un objet ElementList? c’est un choix des ingéieurs qui ont fait Javascript.

Par contre HTML5 définit un objet HTMLCollection, qui est un objet qui ne contient que des Element, qui exclut tous les autres types de noeuds. Vous pouvez voir HTMLCollection à l’oeuvre avec l’exemple suivant:

let el = document.getElementById('liste') 

En pratique vous n’avez pas à vous soucier de ces subtiles différences.

Je participe à un projet Hyperledger

Cela fait pas mal de temps que je voulais m’investir dans un projet blockchain, à défaut de blockchain publique, je vais travailler sur une blockchain privée, et c’est sur Hyperledger.

Le type de projet de tokenization immobilière, thème très en vogue actuellement. Le but est de permettre une plus grande liquidité dans l’immobilier et de dépoussiérer les pratiques en vigueur.

RealtyKey.io est la plateforme web2 pour aborder le web3.

Principe de RealtyKey

Le principe est un principe d’investissement. Jusque là rien de différent, là où ça commence à se différencier de la finance traditionnelle, c’est que vous achetez un certificat d’investissement, appelé NFT et ce après avoir créé un compte (vous obtenez un AccountKey), vous détenez un NFT InvestKey prouvant que vous êtes inscrit . Ce dernier NFT vous permet de minter deux autres types de NFT, les Incomekey qui vous permettent de toucher un loyer du bien dans lequel vous avez investi, et les RealtyKey qui vous permettent d’habiter quelques temps dans un bien dans lequel vous avez investi.

La stack technique

La blockchain Hyperledger est contenue dans un Kubernetes, un orchestrateur de conteneurs Dockers. Le langage de développement de la blockchain, celui utilisé pour écrire les smart contracts appelé chaincode dans Hyperledger, est le langage Go, assez facile à appréhender.

Hyperledger expose un webservice directement consommable via Postman par exemple.

C’est assez différent de ce que je connais sur les blockchains publiques, notamment Ethereum et autres EVM compatibles. Le langage pour faire les smart contracts pour les chaine EVM est Solidity , que certains disent assez proche de Javascript, ce que personnellement je ne trouve pas, c’est assez unique.

Les différences entre une blockchain privée et une blockchain publique

Le choix d’une blockchain privée est motivée par les raison suivantes (non exhaustives)

  • pas de notion de consensus
  • milieu confiné à priori non sensible aux hacks
  • grand TPS
  • beaucoup plus sécurisée

Pourquoi utiliser la blockchain pour investir de façon fractionnée dans l’immobilier?

La blockchain permet de tout tracer sans pouvoir de falsification. Le fait de tokéniser rend l’actif plus liquide, et améliore la facilité de trouver une contrepartie quand on veut vendre.

Meilleure liquidité

Le ticket d’entrée bas permet à tout le monde de participer à la possession d’un bien. Vous n’avez pas à passer les étapes du notaire, DPE, etc. Tout est fait, vous n’avez qu’à entrer dans un investissement après avoir obtenu votre account key. L’opération ne prend que 15 minutes.

Meilleure contrepartie

L’apport de liquidités et l’ouverture à un marché financier cryptonatif plus vaste permettra une plus grande participation d’acteurs (idéalement particuliers comme institutionnels), concrètement si vous ne voulez plus investir dans un bien, où que vous voulez arbitrer vers un autre bien, et que vous voulez vendre vos parts, vous trouverez plus facilement un acheteur pour vos parts.

Ceci est à mettre en opposition avec un produit comme la SCPI, où il est notoire que les conditions de sortie sont plus délicates et de loin (clause de sortie, illiquidité du produit).

Processez des fichier CSV avec AWK pour faire des requêtes SQL

AWK est un utilitaire du monde UNIX et Linux, très puissant et très rapide, très adapté dans le traitement de ligne.

awk -F "," '{print "INSERT INTO table (last_name,first_name,email) VALUES ('\''"$1"'\'', '\''"$2"'\'','\''"$3"'\'');"}' test.txt

Les difficultés relatives à AWK

J’ai rencontré les plus grandes difficultés lorsque j’ai dû concaténer les colonnes du fichier texte. En effet dans une requêtes SQL de type INSERT, il y les valeurs à entourer d’apostrophe dans le fichier de sortie, donc il faut échapper le caractère apostrophe, et ce n’est pas un simple backslash, car le backslash doit être échappé par une apostrophe pour être reconnu comme un backslash d’échappement !

  • https://unix.stackexchange.com/questions/593212/awk-print-apostrophe-single-quote
  • https://earthly.dev/blog/awk-csv/
  • https://www.tutorialspoint.com/awk/awk_basic_examples.htm
  • https://www.geeksforgeeks.org/awk-command-unixlinux-examples/

Scraper le web avec Selenium en Python

Contexte : je suis sous MacOS en architecture Intel 64bit (processeur Core i5)

Selenium vous permet programmatiquement d’émuler un navigateur (ici ce sera Chrome), et de télécharge une page et de l’analyser. Pourquoi est ce que c’estintéressant? Pour les test d’interface d’une part, puis d’autre part si vous voulez scraper une page très javascript, où les éléments sont rendus en JS donc non récupérables par un scrap avec BeautifulSoup, Selenium le peut.

Il est juste plus lent que BeautifulSoup, en effet il se repose sur le navigateur Chrome (notre cas ici mais ça peut être n’importe quel navigateur) qui fait le rendu, alors que BeautifulSoup ne fait pas le rendu.

Pré-requis :

  • connaissez votre version de navigateur Chrome, en allant dans les 3 petits point puis Aide puis A Propos de Google Chrome
  • Déterminez l’architecture de votre plateforme
  • Ensuite allez sur le site de Chromium pour télécharger le driver à mettre dans le même répertoire que votre script, le driver permet à Selenium de contrôler Chrome, c’est dépendant de l’OS et du microprocesseur. Il faut suivre le lien pour les dernières versions de Chrome
  • Installer la librairie Selenium pip install selenium

Script minimal de Selenium pour scraper une page

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

browser = webdriver.Chrome()   #mac https://stackoverflow.com/questions/76928765/attributeerror-str-object-has-no-attribute-capabilities-in-selenium
#driver = webdriver.Chrome('./chromedriver'). #ne marche pas sur Mac

browser.get("https://www.python.org")

print(browser.title)

Faire marcher LOAD DATA INFILE dans mysql 8

Pourquoi utiliser LOAD DATA INFILE ?

Cette commande permet de charger des données dans une table de votre base de données à une très grande de vitesse. J’ai pu par exemple insérer 500000 lignes en seulement 7 secondes. C’est quelque chose à considérer si vous avez de grosses bases à reproduire dans un environnement. En effet, par le passé, j’ai travaillé dans une entreprise où il fallait attendre 6h pour mettre en place la base de données, je pense que avec cette méthode on pourrait très bien ramener à moins de 10 minutes. Attention, le chargement est très rapide pour une table donnée, je ne tiens pas compte du temps de passage entre une table et une autre, mais normalement il n’y a pas de problème.

La méthode la plus souvent utilisée pour insérer un fichier dans une table, et de faire un fichier constitué de clause insert, cette méthode n’est pas très rapide en effet si vous avez plusieurs lignes insert mais c’est plusieurs requêtes qui sont faites cependant on peut optimiser en faisant un insert multiligne, mais même ça ça ralentit le chargement des données. En effet le fait d’exécuter une requête SQL va faire intervenir le moteur de base de données, qui doit lire la requête SQL l’interpréter l’exécuter et mettre en mémoire les choses.

Avec cette méthode, en outre passe l’exécution de requête SQL, en effet par exemple lorsque en charge un fichier CSV, il n’y a pas de requête SQL qui est faite, on injecte les données simplement colonne par colonne, ligne par ligne. Il n’y a donc pas d’exécution de code SQL, c’est une insertion brute, c’est pour ça que c’est aussi rapide.

Dans vos bases de données de développement, par exemple e-commerce, vous pouvez vous permettre d’utiliser une méthode traditionnelle, mais si vous êtes amené à travailler avec de grosses bases de données, comme un Big Data, analyse des données, vous avez de très grosses bases de données, à reconstituer dans la base de données. Cette méthode est donc très avantageuse.

Le problème avec cette fonction

Le problème avec cette fonction c’est qu’il est assez difficile de le paramétrer, en particulier avec mysql8. Le problème est encore plus ardu lorsque vous utilisez PHPmyadmin pour faire l’insertion de données. En effet, on intercalant entre le fichier et la base de données un logiciel écrit en PHP donc pas forcément très performant, vous augmentez les chances que cela ne marche pas. Je vous recommande donc de faire l’insertion depuis la ligne de commande. Même malgré ça nous allons rencontrer quelques difficultés.

Nous allons prendre un exemple simple, avec un petit fichier test.csv de quelques lignes, nous allons surtout nous concentrer sur la partie amont de l’insertion.

id,nom,prenom,email
1,"Dupont","Alex","dupont.alex@gmail.com"
2,"Dupont","Danielle","dupont.danielle@gmail.com"
3,"Durand","Ines","durand.ines@gmail.com"
4,"Durand","Hugo","durand.hugo@hotmail.com"
5,"Camus","Albert","albert.camus@gmail.com"

Nous allons disposer d’une table dont voici le code

CREATE TABLE `test` (
  `id` int NOT NULL,
  `nom` varchar(50) NOT NULL,
  `prenom` varchar(50) NOT NULL,
  `email` varchar(150) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

Première tentative d’insertion dans PHPMyAdmin

Pour information la documentation officielle traitant de cette fonction se trouve sur cette page. La doc officielle dit aussi que MySQL doit avoir les privilèges sur les fichier à importer (logique), par exemple il doit avoir les droit de lecture sur le fichier test.csv.

LOAD DATA LOCAL INFILE 'E:\OneDrive\formapedia_cours\coursSQL\load infile\test.csv' INTO TABLE test
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(id, nom,prenom,email);

Ceci se solde par une erreur « #2068 - LOAD DATA LOCAL INFILE is forbidden, check related settings like mysqli.allow_local_infile|mysqli.local_infile_directory or PDO::MYSQL_ATTR_LOCAL_INFILE|PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY« . Ce qui est embêtant car je vois PDO donc j’imagine que ce doit être un réglage PHP dans PHPMyAdmin, il va falloir bidouiller le fichier de configuration. Je vois aussi qu’il y a un réglage dans le fichier de configuration de MySQL. Recherches infructueuses. Ce que je vois est qu’il faut mettre une variable de configuration dans my.ini (Windows) ou my.cnf (Linux)

[mysql]
local-infile=1

[mysqld]
...
local_infile=1 <<  parfois je vois local-infile=1  (avec le trait d'union)

[mysqldump]
quick
max_allowed_packet=512M

En redémarrant le serveur, je n’ai pas plus de succès…

Je tente de passer par MySQL en ligne de commande

En fait je fais ça, car je sais que PhpmyAdmin introduit une couche de configuration rendant la tâche plus délicate. Je passe donc par la ligne de commande qui est plus simple. En se connectant en ligne, n’oubliez pas de sélectionner la base de donnée avec use.

En collant le texte ci-dessous: Attention \r\n dans le système Windows mais \n tout court pour Linux

LOAD DATA LOCAL INFILE 'E:\OneDrive\formapedia_cours\coursSQL\load infile\test.csv' INTO TABLE test
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(id, nom,prenom,email);

J’ai a réponse suivante:

ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.

C’est donc une question de restriction de lecture de fichier, mais je suis sous Windows, je ne m’inquiète pas trop (Linux est plus subtile), j’essais néanmoins de placer le fichier csv dans le répertoire où se trouve la base de données (dans le répertoire d’installation de MySQL, chaque base de données correspond à un fichier binaire, dans un répertoire de même nom (dans le cas de InnoDB). Mais j’ai toujours le même problème.

La révélation

c’est alors que je tombe sur cette page qui me dit de me connecter avec un argument:

mysql --local-infile=1 -u root -p

Et voilà j’ai pu loader le csv sans problème !

Mettre en place un environnement Python dans VSCode

CTRL + SHIFT + P puis Python: Create Environment et sélectionnez la commande.

Choisissez l’interpréteur

Ensuite ça prend un peu de temps pour créer l’espace virtuel, isolé de développement Python.

Pour s’assurer de la version de l’interpréteur Python, dans la palette de commande (CTRL + SHIFT + P) puis Python: Selectg Interpreter

Maintenant vous êtes prêt pour commencer à code en Python dans VSCode.

Créez un fichier hello.py,

print("hello")

Pour exécuter, appuyez sur le triangle en haut à droite de VSCode, liste déroulante choisir Debug Python File. Notez le point rouge qui est le point d’arrêt.

Debugger python sous VScode

Il suffit de mettre un pint d’arrêt et de cliquer sur le symbole debug dans la barre latérale. Une autre méthode est d’utiliser le menu contextuel et démarrer le script.

Pour plus d’information ce lien.

Quand utiliser Redux

Quand ne pas utiliser Redux

  • budget peu élevé
  • application de taille petite à moyenne
  • UI simple, flux de données simple
  • données statiques

Pours et contres de Redux:

Pour :

  • débug facilité
  • test
  • faire et défaire
  • persistence de state
  • préserve le state d’une page

Contre:

  • complexité
  • verbosité

Débuter avec Greasemonkey

C’est un plugin navigateur qui vous permet d’exécuter du code Javascript sur la page où vous vous trouvez. Vous connaissez les extensions de navigateur? Greasemonkey vous permet facilement de retrouver les mêmes capacités sans avoir à coder toute l’extension.

Installez Greasemonkey version 4 (sur Chrome c’est TamperMonkey).

Pour aller au plus simple, cliquez sur l’icône du singe, vérifiez qu’il est bien activé puis cliquez sur Nouveau Script

// ==UserScript==
// @name     Anonyme Script 813510
// @version  1
// @grant    none
// ==/UserScript==


Sion on veut de l'ajax (cross domain en plus !)
//@grant GM.xmlHttpRequest

Vous pouvez personnaliser les annotations, @name pour le nom du script, @version qui n’aura pas d’influence sur votre scripts, et surtout @grant est très important, si vous voulez par exemple faire une requêtes Ajax, par défaut vous ne pouvez pas. Je vous joins la page de documentation du plugin:

wordpress cURL error 60: SSL certificate problem: unable to get local issuer certificate

Récemment j’ai eu droit en voulant activer mon thème Astra, je me suis heurté à l’erreur suivante :

cURL error 60: SSL certificate problem: unable to get local issuer certificate

Ce n’est pas un problème du thème Astra

Ce n’est pas un problème de votre hébergeur

J’ai fait 2 aller retours vers le hébergeur 02Switch, qui est très bien, réactif, mais n’a pu me solutionner mon problème, se contentant de dire que chez eux tout va bien. Bien sûr je ne savais pas quel était le vrai problème, je sentais que c’était un problème du serveur du site, et pas de celui d’Astra, comme me le suggérait l’hébergeur.

La solution est ailleurs

Ce n’est seulement qu’après avoir vu la petite vidéo d’Astra montrant que (tout plugins désactivés, le problème persistait, en effet en allant sur Outil > Santé du site, il y avait une alerte d’erreur critique concernant REST API, en gros les appels vers d’autres serveurs échouaient à cause du certificat.

En googlant un peu plus sur Internet, j’ai trouvé la solution sur cette page :

Le problème était que le certificat de WordPress, le fichier ca-bundle.crt localisé dans wp-includes/certificates, datait de 2016…

La solution consistait à télécharger un certificat plus récent sur ce lien le fichier ca-cert.pem. Le soucis c’est que ce fichier ne nommait pas pareil, pas de panique il suffit juste de copier le contenu texte de ce fichier et de remplacer l’ancien contenu intégralement du fichier ca-bundle.crt et le tour est joué.

Se familiariser avec l’API Binance

Maintes fois j’ai tâté de l’API Binance, entrecoupé de période d’inactivité, et quand je revenais, je devais tout réapprendre, ayant tous oublié…

Ce post est une tentative de mémorisation de cette API, mes besoins pour le moment concernent l’order book et les kline (chandelier japonais).

La page d’entrée de la documentation API Binance.

Order book

L’order book est le livre des ordres de bourse à cours limité, ce sont des ordres en attente d’exécution, à la différence des ordres market, que vous ne verrez pas car ils sont passés immédiatement.

Les données vous permettent de tracer la profondeur de marché, de voir la densité des ordres en fonction du cours d’exécution

Quotation en temps réel à différents timeframes

Cette fonctionnalité est primordiale pour tracer les cours des crypto, on a besoin en version OHLC, pour tracer les bougies et faire de l’analyse technique dessus.

Installer le framework Express pour nodeJS

Ce tuto montre comment bootstraper un projet NodeJS avec la base de donnée MySQL

Installation de NodeJS et NPM

Pour l’installation, il suffit de télécharger NodeJS (la dernière version) NPM sera disponible automatiquement.

Installation de Express

Express est un framework MVC fait pour NodeJS, c’est l’équivalent de Symfony pour le PHP. Créez un répertoire pour votre projet

npm init   // pour initialiser le package.json

Installation des packages pour le projet

npm i dotenv
npm i express
npm i mysql

Code minimal pour se connecter à la base de donnée:

On veut vérifier avant de continuer plus loin que la connexion se fait sans problème.

#index.js
const express = require('express')
const app = express()
require("dotenv").config()
var mysql = require('mysql');


app.get('/', (req, res) => {
    res.send('Hello World!')
})

app.listen(port, () => {
    console.log(`Example app listening on port ${port}`)
})

const DB_HOST = process.env.DB_HOST
const DB_USER = process.env.DB_USER
const DB_PASSWORD = process.env.DB_PASSWORD
const DB_DATABASE = process.env.DB_DATABASE
const DB_PORT = process.env.DB_PORT

var con = mysql.createConnection({
    host: DB_HOST,
    user: DB_USER,
    password: DB_PASSWORD,
    port: DB_PORT
});
con.connect(function (err) {
    if (err) throw err;
    console.log("Connected!");
});

Code générique pour requêter dans une table

var con = mysql.createConnection({
    host: DB_HOST,
    user: DB_USER,
    password: DB_PASSWORD,
    port: DB_PORT
});
con.connect(function (err) {
    if (err) throw err;
    console.log("Connected!");
});

Installer nodemon pour recharger au changement de fichier

npm install --save-dev nodemon
pour lancer avec nodemon à la place de node
./node_modules/.bin/nodemon index.js

Débugger sous NodeJS avec VSCode

VSCode est vraiment l’éditeur de code couteau suisse, son avantage est que s’il y a un langage même confidentiel, vous trouverez un plugin. Même s’il n’est pas le meilleur dans chaque catégorie, par exemple je trouve PHPStorm mieux pour le PHP, il est un très bon outil gratuit de surcroît.

Pour NodeJs, c’est un peu plus simple que pour Xdebug en PHP, il y ap lusieur façons de déclencher le débugger de NodeJS, on va voir l’auto déclenchement du débugger dès qu’un process node est en cours d’exécution.

Je suppose que vous ayez un fichier index.js, à exécuter via la commande shell, pour le lancer vous faites node index.js. Si vous ne l’avez pas fait vous pouvez démarrer un projet NodeJS.

Et là vous devrez avoir la barre de status orange, indiquant que le débug est actif.

Configuration de VSCode pour le debug automatique (Auto attach)

Pour activer l’auto attach, faites la combinaison de touche : SHIFT + CTRL + P, une boite de recherche va apparaitre, tapez « Toggle Auto Attach » pour trouver l’option et cliquez dessus.

Maintenant chaque fois que vous démarrez un process NodeJS, VSCode se met en mode debug.

Comment déployer votre propre package sur NPM?

Nous allons voir comment créer et déployer soi-même son package NPM, plutôt cool comme idée non? Voici les étapes :

  • Créer un compte sur le site de NPM
  • écrire notre package
  • tester localement
  • publier notre package sur NPM
  • test grandeur nature de notre package

Créer un compte sur le registre NPM

Voici un fichier par default de package.json, personnalisez le :

{
  "name": "npmpackage",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

packge.json est le fichier important sans lui vous ne pouvez pas publier de package.

Le fichier index.js est le point d’entrée de votre package.

Le nom du package doit être unique dans tout le repository NPM, cela a donné à l’affaire du npmgate

Dans la barre de recherche de NPM vous pouvez chercher par nom de package.

Créez le fichier index.js

On va faire simple un seul fichier:

let uniqueArr = [];

function removeArrayDuplicates(arr) {
    // Accepts an array from which the duplicates
    // will be removed

    if (!Array.isArray(arr)) {
        arr = [];
    }

    let theSet = new Set(arr);

    arr.filter((num) => {
        if (!uniqueArr.includes(num)) {
            uniqueArr.push(num)
        }
    })

    return uniqueArr;
}

/* code de test */
let myNums = [1, 2, 3, 1, 4, 1, 2, 5, 3, 4];
let uniqueNums = removeArrayDuplicates(myNums)
console.log(uniqueNums);

Mettez à jour le package.json

{
  "name": "remove-dup-arr",
  "version": "0.1.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "remove",
    "array",
    "duplicate"
  ],
  "author": "refschool <[referencementschool@gmail.com](mailto:referencementschool@gmail.com)>",
  "license": "ISC"
}

Publication de votre package NPM

Pour cela inutile d’aller sur le site web de NPM ! vous pouvez tout faire en ligne dans votre terminal. Enlevez le code inutile d’application qui vient après la fonction.

npm login
// entrez vos identifiants

npm publish

j’ai eu un problème car le nom du paquet existe déjà, donc ce qu’on peut faire c’est de changer vers un nom qui n’existe pas encore

{
  "name": "openweather-wrapper",
  "version": "0.1.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "openweather",
    "meteo",
    "demo"
  ],
  "author": "refschool <[referencementschool@gmail.com](mailto:referencementschool@gmail.com)>",
  "license": "ISC"
}

PS E:\npmpackage> npm publish 
Debugger attached.
npm notice 
npm notice �📦  openweather-wrapper@0.1.0
npm notice === Tarball Contents ===
npm notice 521B index.js    
npm notice 359B package.json
npm notice === Tarball Details ===
npm notice name:          openweather-wrapper
npm notice version:       0.1.0
npm notice filename:      openweather-wrapper-0.1.0.tgz
npm notice package size:  586 B
npm notice unpacked size: 880 B
npm notice shasum:        ca698456c2b3c8691534f370f7539d0c42662724
npm notice integrity:     sha512-oCm4uzyLUsJC3[...]b1V0cR834Cchg==
npm notice total files:   2
npm notice
npm notice Publishing to https://registry.npmjs.org/
+ openweather-wrapper@0.1.0
Waiting for the debugger to disconnect...

Vérifions sur le site NPM la présence de notre package qui est visible pour le monde entier :

Test grandeur nature de notre package NPM

Maintenant que notre package est déployé je me suis rendu compte que quelque chose n’allait pas, il n’est pas utilisable car pas de directive export !

Remédions à cela à la fin du fichier index.js

module.exports = removeArrayDuplicates;

et republions.

Maintenant créons un autre répertoire (qui n’a rien à voir avec notre précédent répertoire) dans lequel nous allons tester notre package

npm install openweather-wrapper

Un répertoire node_modules va être créé.

Créez un fichier test.js avec le code suivant :

const tab = [8, 4, 2, 65, 2, 33, 33, 33, 22, 8, 8];
const removeArrayDup = require('openweather-wrapper');
let unik = removeArrayDup(tab)

console.log(unik)

Félicitation vous avez réussi !

Créer une application web React

Installer NodeJS

Si vous installez pour la première fois NodeJS voici la comamnde avec Homebrew (je vous recommande de la farie avec Homebrew, pour les upgrade plus tard, c’est plus facile)

brew install node

npm install create-react-app

npx create-react-app monApp

Mise à jour de NodeJS sur MacOS

Si vous avez déjà NodeJs d’installé, vérifiez que vous avez la dernière version, si vous ‘avez pas la dernière version, faites un upgrade

Vérifiez votre version de nodeJS sur votre poste, et regardez quelle est la dernière version de NodeJS, pour ma part j’éatis à 12, la dernière version étant 19 !

> node -v
> brew upgrade node

Upgrader NodeJS non installé avec Homebrew

L’ennui est que je n’avais pas installé nodeJs avec Br–Hombrew, donc il fallait désinstaller à la main ! heureusement j’ai trouvé un script shell de désinstallation

Puis en en voulant faire un symlink

brew link node

J’ai eu une erreur de ce type :

Error: Could not symlink include/node/common.gypi

Il faut changer le mode, c’est un problème de droit

sudo chown -R $(whoami) $(brew --prefix)/*

brew link --overwrite node

Je vous conseille d’utiliser Homebrew pour avoir des install plus clean, et pas seulement pour nodeJS.

Installer create-react-app avec NPM

npm install create-react-app

//création du projet
npm create-react-app myApp 
cd to folder

//lancement du projet
npm start

Vous pouvez utiliser NPX à la place de NPM, la différence c’est que NPX ne télécharge pas le package, à la différence de NPM.

Installer PHP 8.1 sur votre macintosh pour MAMP

MacOS est un dérivé de FreeBSD, donc contient déjà un serveur apache, mais c’est tout.

MAMP est une solution de développement intégré comme WAMP, Laragon ou encore XAMP.

Les version nouvelles de PHP sortant, il faut se mettre à jour. Nous allons voir comment mettre à jour la version de PHP avec Homebrew.

Mettre à jour HomeBrew

Ici il s’agit d’avoir la dernière version de Homebrew Core. Parfois vous avez le message suivant

Warning: homebrew/core is shallow clone. To get complete history run:
  git -C "$(brew --repo homebrew/core)" fetch --unshallow

Cela veut dire qu’il faut avoir tout le code source de Homebrew, il faut taper la commande suivante (ça prend pas mal de temps), mais si vous ne le faites pas et que vous voulez installer une nouvelle version de PHP (ou de tout autre logiciel, vous n’arriverez pas). Exécutez la commande Git, shallow veut dire creux, en fait pour sauver de l’espace, tout n’était pas téléchargé.

it -C "/chemin/vers/homebrew/core" fetch --unshallow

Si vous n’avez pas ce message ce n’est pas grave, vous êtes en bonne voie. Patientez un bon moment pendant que cette commande s’exécute.

Installer la nouvelle version de PHP

brew install php@8.1

Cela va télécharger PHP dans le répertoire /usr/local/Cellar/php@8.1/lib, et dans /usr/local/opt/php/php8.1 qui est en fait un raccourci vers le premier répertoire, une fois dans le répertoire PHP localisé, vous avez deux sous répertoires, /httpd et /php.

Allez dans Cellar/php/ copier le répertoire php8.1 nouvellement créé, vers MAMP dans Application/MAMP/bin/PHP

Si le dossier PHP que vous avez collé ne s’appelle pas php8.1, renommez le comme ça car cela va permettre à MAMP de la reconnaitre au redémarrage. Redémarrez MAMP et sélectionnez la nouvelle version de PHP, par défaut seules les deux dernières versions de PHP sont montrées dans la liste déroulante.

Copier le fichier libphp.so

Démarrez le serveur Apache, vous allez voir une erreur, car il manque encore une manipulation à faire, il faut le fichier libphp.so.

Ce fichier est à récupérer dans le répertoire usr/local/lib/http/modules et à mettre dans /MAMP/bin/php/php8.1/modules

Redémarrez MAMP, normalement tout est bon.

php

Configurer Xdebug avec Visual Studio Code

Pour ceux qui ne veulent pas dépenser 250 euros pour avoir une license de PHPStorm, il reste Visual Studio Code, qui est gratuite. Cet IDE s’est imposé comme un IDE à tout faire, ce qui en fait un outil très intéressant pour toucher à tout type de langages (même Solidity). Nous allons voir comment configurer XDebug pour fonctionner avec VSCode.

Qu’est que Xdebug?

Xdebug est une extension bas niveau qui permet de débugger pas à pas votre code PHP.

Pour savoir débugger est important?

Quand vous avez un grand projet, inutile de faire des var_dump, echo ou print, il faut absolument passer pas un debugger, vous deviendrez un meilleur codeur. Typiquement un projet Symfony avec des milliers de fichier potentiellement, on ne s’en sort pas avec des echo !

Comment le debug est déclenché?

Le serveur web reçoit l’instruction de débugger via un cookie spécial envoyé par le navigateur, via une extension Chrome (donc pas dispo avec Firefox par exemple quoique l’on peut trouver si l’on veut un équivalent). Le setup risque d’être un peu long mais cela en vaut vraiment le coup !

Quelle version de Xdebug faut il installer?

En fait il faut aller voir le tableau de correspondance pour trouver la paire de logiciel PHP/Xdebug qui fonctionne. Le site officiel possède un tableau de compatibilité version de PHP et version de XDebug, soyez à jour ! J’ai fait plusieurs tutos sur Xdebug sur ce site, et je fais un nouveau tuto pour remettre à jour les versions qui marchent, et aussi les façons de configurer ont changé, donc il était temps de remettre à jours les connaissances avec les dernières version des tous les logiciels PHP 8.x et Xdebug 3.x

Allez sur le site officiel pour télécharger le zip, attention, il y a différentes versions pour une même version de Xdebug. Pour windows il faut choisir la thread sae, 64 bits.

Où configurer le Xdebug?

Il faut aller dans le fichier php.ini, attention, il y a deux version de php.ini, une pour la version CLI (en ligne de commande) et une pour la version web, à deux endroits différent, utiliser phpinfo(); CTRL+F de php.ini et vous aurez le chemin du fichier. Collez ce texte en fin de fichier.

[xdebug]
zend_extension="C:\laragonwamp\bin\php\php-8.1.10-Win32-vs16-x64\ext\php_xdebug-3.1.5-8.1-vs16-x86_64.dll"
xdebug.mode=debug
xdebug.client_host=127.0.0.1
xdebug.client_port=9003
xdebug.start_with_request=yes
xdebug.idekey=XDEBUG_ECLIPSE

N’oubliez pas de recharger Apache !

Installer l’extension Chrome Xdebug

Comme nous avons vu plus tôt, c’est le navigateur qui envoit un en-tête spécial pour déclencher XDebug. Regardez la section COOKIE lorsque le script suivant est exécuté:

<?php
phpinfo();

Et coté navigateur en regardant les en-têtes envoyés :

Regardez la section COOKIE, on a bien la même chose envoyée par le navigateur. Ceci est possible grâce à l’extension Xdebug pour Chrome (faites une recherche sur Google) qui envoit automatiquement ce cookie. Installons le. Vérifiez ensuite que le petit insecte est au vert (actif), sinon cliquez dessus.

Fichier de configuration dans VScode et plugin Xdebug pour PHP

Attention ce n’est pas fini ! mais bientôt ! Puisque nous débuggons sous VSCode, nous allons ajouter un plugin dédié et un fichier de configuration pour VSCode. Tout d’abord, le plugin, installez le plugin, entre PHP DEBUG dans la barre de recherche des plugins. Installez celui avec la mention « Debug support for PHP with XDebug »

Le fichier de configuration

Cliquez sur l’icône de débug sous VSCode, puis Add Configuration, un ficheir JSON va s’ouvrir, collez le code ci-dessous

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for Xdebug",
            "type": "php",
            "request": "launch",
            "port": 9003
        }
    ]
}

Testez votre script

Maintenant créez un fichier PHP dans un virtualhost, mettez un point d’arrêt sur une ligne, cliquez sur Listen to Xdebug, et chargez la page dans votre navigateur !

Mode pas à pas

Installe Xdebug sur MacOs

Pour les MacOs, le fichier Xdebug est à installer avec PECL

>pecl install xdebug
Build process completed successfully
Installing '/usr/local/Cellar/php/8.2.1/pecl/20220829/xdebug.so'
install ok: channel://pecl.php.net/xdebug-3.2.0
Extension xdebug enabled in php.ini

Localisez l’endroit où se trouve Xdebug de suite après l’installation, le chemin est normalement affiché, recopiez le pour le mettre dans le fichier php.ini,

Installer Xdebug pour Linux

La procédure est à peu près la même que pour MacOs, utilisez PECL pour installer Xdebug, recopiez le chemin

Comment télécharger une vidéo Wistia avec le langage Python

La plateforme Wistia est un hébergeur de vidéo, souvent utilisé dans les sites en accès restreint (pour la formation par exemple). Parfois on a envie de télécharger les vidéo pour regarder plus tranquillement quan on est en vacances dans un endroit où l’internet n’est pas très développé. Il vous faut télécharger les vidéos.

Nous allons voir comment on peut le faire ne Python. Pour ce faire vous devez avoir installé un environnement python et avoir déjà manipulé ce langage.

Le dépôt du projet Wisty : https://pypi.org/project/wisty/

Télécharger la librairie Wisty

pip install wisty

Extraire l’identifiant de la vidéo

sur la vidéo, faites un clic droit, ou deux clic droit pour faire apparaitre la popup qui vous permet de copier le code HTML d’intégration de la vidéo. Collez ce code dans un éditeur de texte, copiez la portion qui est juste après l’url de la page

<a href="https://www.lesite.com?wvideo=nts3yvnjlb">

Ici c’est nts3yvnjlb, nous allons avoir beosin de cet identifiant dans la commande en ligne

Ecrire la ligne de commande qui permet de télécharger la vidéo

Si vous utilisez le terminal de Pycharm, dans le projet ou le venv dans lequel vous avez installé Wisty, vous pouvez directement taper cette commande:

wisty -i nts3yvnjlb-r 720p -n nom-fichier-en-local

Si vous voulez faire la même chose depuis un prompt DOS :

C:\Users\admin\PycharmProjects\pythonProject\venv\Scripts\wisty -i nts3yvnjlb-r 720p -n nom-fichier-en-local

Assurez vous que le nom du projet (pythonProject) est bien celui où vous avez installé la librairie.

Comment économiser de l’espace mémoire

Le paramère 720p concerne la résolution de la vidéo que vous téléchargez, la définition 1080p est vraiment dix fois plus lourde que la 720p, qui reste pour certains types de vidéo de très bonne qualité.

Optimiser vos téléchargement avec un script batch sous Windows

Par exemple sur Windows vous pouvez créer un fichier .bat et y mettre les multiple commandes de téléchargements de vidéo. Mettez de préférence les commandes avec le chemin absolu, une comande par ligne, ensuite il ne vous reste plus qu’à lancer le fichier .bat pour télécharger tranquillement vos vidéos.

logo windows

Protéger votre SSD des problèmes de boot

Récemment j’ai encore eu mon SSD pourtant de marque (un Crucial) qui a refusé subitement de démarrer ! j’ai vraiment eu le ras le bol, d’autant plus que c’est arrivé à mes 7 autres SSD par le passé. Je n’arrive pas à comprendre pourquoi ça m’arrive si souvent, d’autant plus que sur Internet, les informations convergent vers une bonne fiabilité des SSD.

Je pense que peut être c’est mon circuit électrique qui est en cause, les pics de courant par exemple. N’ayant pas d’argent à investir dans un onduleur, je pense m’équiper de multiprise (contre les surtensions violentes).

En attendant ce que vous pouvez faire c’est de ne pas mettre en veille votre ordinateur, il semblerait que cela ne soit pas très bon pour les SSD.

Je précise que c’est pour mon PC en tour, pour mon Mac, il est vrai que je n’utilise pas beaucoup je ne rencontre pas ce genre de problème.

N’interrompez pas votre disque dur

La manipulation à faire est la suivante (il faut aller dans la configuration avancé de votre SSD).

Allez dans le panneau de configuration, puis dans Matériel et audio,

Puis aller dans Option d’alimentation

Puis aller dans Modifier les paramètres du mode,(Utilisation normale)

puis dans Modifier les paramètres d’alimentation avancés,

Puis aller dans Arrêter le disque dur après, mettre jamais (le disque dur ne sera jamais mis en pause)

puis dans PCI Express, désactivez l’économie d’énergie.

Précautions supplémentaires pour ne pas perdre vos données et programmes installés

Je double mon SSD pour en faire une sauvegarde avec Macrium un outil de clonage gratuit. Il faut faire ceci régulièrement, idéalement tous les mois, la version gratuite ne propose pas de sauvegarde incrémentale. Ce matin quand mon SSD a eu un problème, je n’avais pas encore fait de sauvegarde pendant 6 mois…j’ai regretté mais j’ai réussi à récupérer mon SSD avec CheckDisk, l’outil de Microsoft, alors que Storage Executive de Micron signalait que mon disque était normal…

Avoir un clone, évite de réinstaller votre système d’exploitation, ce qui prend une journée avec tous les logiciels.

Onedrive pour sauver toutes vos données importantes

Je ne saurais vous encourager à prendre une solution payante de sauvegarde comme Onedrive, qui sauvegarde précieusement vos données personnelles et de travail, pour dormir tranquille. Dropbox fut un temps mon favori, mais est devenu trop cher et se tourne plus vers une clientèle professionnelle.

Savoir quel programme utilise un port

Cette commande sous terminal DOS liste les différents ports utilisé

netstat -ano -p tcp 
Connexions actives

  Proto  Adresse locale         Adresse distante       État
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       8988
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       1080
  TCP    0.0.0.0:443            0.0.0.0:0              LISTENING       8988
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING       4
  TCP    0.0.0.0:554            0.0.0.0:0              LISTENING       1020
  TCP    0.0.0.0:2869           0.0.0.0:0              LISTENING       4
  TCP    0.0.0.0:3306           0.0.0.0:0              LISTENING       17352
  TCP    0.0.0.0:5040           0.0.0.0:0              LISTENING       6168
  TCP    0.0.0.0:5357           0.0.0.0:0              LISTENING       4
  TCP    0.0.0.0:10243          0.0.0.0:0              LISTENING       4
  TCP    0.0.0.0:33060          0.0.0.0:0              LISTENING       17352
  TCP    0.0.0.0:49664          0.0.0.0:0              LISTENING       784
  TCP    0.0.0.0:49665          0.0.0.0:0              LISTENING       724
  TCP    0.0.0.0:49666          0.0.0.0:0              LISTENING       1692
  TCP    0.0.0.0:49667          0.0.0.0:0              LISTENING       1600
  TCP    0.0.0.0:49668          0.0.0.0:0              LISTENING       3108
  TCP    0.0.0.0:49669          0.0.0.0:0              LISTENING       776
  TCP    127.0.0.1:5354         0.0.0.0:0              LISTENING       3588
  TCP    127.0.0.1:5939         0.0.0.0:0              LISTENING       4296
  TCP    127.0.0.1:55676        0.0.0.0:0              LISTENING       23680
> tasklist |find "8988"
httpd.exe                     8988 Console                   17    15 688 Ko

Cette commande va indiquer spécifiquement le programme rattaché au processus. httpd.exe est le programme Apache.

logo ethereum

Requêter Uniswap avec TheGraph

TheGraph s’apuie sur la technologie GraphQL de Faceboo, bien connu des développeurs web, pour requêter Uniswap, à la manière d’une webservice REST.

Il faut se faire la main avec la syntaxe de GraphQL, mais elle est assez intuitive.

Pour ce faire nous allons aller sur le site de TheGraph, et directement sur l’interface de requêtage vers Uniswap V3.

Former une requête simple vers Uniswap V3

Dans la fenêtre, vous allez coller la requêt suivante :

{
  tokens {
    symbol
    name
    decimals
  }
}

Cette requpete va lister tous les tokens, sans filtre.

Filtre avec une crypto spécifique

{
  tokens (where:{name:"Neos Credits"},first:1){
    symbol
    name
    decimals
  }
}
La sandbox de TheGraph

Les entités d’Uniswap V3

La troisième colonne liste les entités que vous pouvez requêter. On retrouve l’entité Token, en cliquant dessus vous aurez le schéma de cette entité.

Retour en haut