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

Utiliser un socket en Python pour lire les cours sur Binance

A quoi servent les sockets?

Les sockets vous permettent d’ouvrir une liaison continue entre le serveur et le client. A la différence d’une requête AJAX, qui est l’équivalent d’un chargement de page HTTP, qui s’arrête une fois les informations téléchargées, le socket ouvre un stream continu. Cela évite les limitations des requêtes AJAX, comme par exemple la limitation du nombre de requêtes par minutes par exemple.

Si vous voulez connaitre un cours de bourse en temps réel, hors de question d’utiliser des requêtes AJAX, car vous allez vous faire blacklister.

Installer la librairie websocket-client

Il vous faut installer la librairie websocket-client (attention il y a une autre librairie qui s’appelle websocket, ce n’est pas celle là)

pip install websocket-client

Le script:

import websocket,json,os
def on_message(ws, message):
    """ convert string to dictionary"""
    message = json.loads(message)
    clear = lambda: os.system('cls')
    clear()
    print(message)
    print(" ",message['data'][0]['p'],flush=True,end="\r")


def on_error(ws, error):
    print(error)

def on_close(ws, close_status_code, close_msg):
    print("### closed ###")

def on_open(ws):
    ws.send('{"method":"SUBSCRIBE","params":["btcusdt@aggTrade","btcusdt@depth"],"id":1}')

if __name__ == "__main__":
    websocket.enableTrace(False)
    ws = websocket.WebSocketApp(f"wss://stream.binance.com:9443/ws/bnbbtcopen@depth",
                              on_open=on_open,
                              on_message=on_message,
                              on_error=on_error,
                              on_close=on_close)
    ws.on_open = on_open
    ws.run_forever()

Lien vers la documentation du service websocket de Binance:

Python Module not found en exécution en ligne de commande

Alors que ça marchait très bien sous PyCharm…

Imaginons que vous ayez un programme utilisant une librairie externe, par exemple Beautifulsoup, ce dernier étant une librairie externe, donc il faut l’importer avec la commande :

pip install beautifulsoup4

Sous PyCharm, la librairie sera installée dans la section External Librairies, dans la barre latérale Project. Mais le véritable répertoire (sous Windows) sera :

C:\Users\mon_user\PycharmProjects\nom_projet\venv\Lib\site-packages

Remplacez mon_user et nom_projet par vos données propres.

Ainsi lorsque vous exécutez un programme en ligne de commande, et qu’il vous dit « Module Not Found …bs4 » c’est que l’exécutable Python n’arrive pas à le trouver. Il faut créer la variable PYTHONPATH.

Pour ce faire (Windows) dans la boite de recherche de Windows (Cortana) tapez PATH, vous accédez aux variables d’environnement. Ajoutez la nouvelle variable PYTHONPATH puis ajoutez le chemin cité plus haut. MAintenant vous pouvez lancer votre programme en ligne de commande.

Lister les valeurs des chemins d’inclusion

import sys
print(sys.path)

Ce programme va vous afficher tous les chemins qui sont tenus compte pour la recherche de module. En fonction de votre environnement virtuel, les résultats peuvent différer, et vous saurez pourquoi vous avez un Module Not Found.

javascript

Mémento de Fetch

Faire une requête GET avec fetch

L’expression la plus simple pour une requête GET avec fetch est :

fetch("https://google.fr")
.then(function(response){
    return response.json
})
.then()

Pour une requête GET pas la peine d’indiquer à la fonction car c’est celui par défaut

Faire une requête POST avec fetch

Le body

let apiUrl = "http://localhost/api/"
            fetch(apiUrl, {
                method: "POST",
                body: {
                    name : 'toto'
                   }
            })

La requête ci-dessus va envoyer un objet JSON contenat l’attribut « name », via la méthode POST (comme si c’était un formulaire)

Mysql logo

Laragon : passer à MySQL 8

Récemment pour faire des fonction de fenêtrage, j’ai du passer sous Laragon à MySQL 8, version qui supporte cette feature. Pour ceux qui ne le connaissent pas encore, quand vous faites un GROUP BY, vous perdez de l’information en agrégeant une donnée. Pour néanmoins disposer de cette valeur agrégée sur un elisting de résultat non agrégé, c’est là qu’il fuat faire intervenir la fonction de fenêtrage OVER (PARTITION BY).

Passer à MySQL 8 sous Laragon

La plupart des information ont été glanées sur le site de Laragon

Laragon upgrade to MySQL 8 instructions:
https://forum.laragon.org/topic/2017/mysql-8-upgrade-instructions

Après avoir suivi les instruction ci-dessus :
MySQL ne peut démarrer après MAJ à Mysql 8 :

https://forum.laragon.org/topic/1766/laragon-4-0-16-mysql-8-0-18-mysql-cannot-start/3

La page ci-dessus donne les manipulation à faire pour obtenir un nouveau mot de passe :
mot_de_passe_temporaire

"You must reset your password using ALTER USER statement before executing this statement"

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'root'; //syntaxe mysql 8 !!

PHPMYADMIN on ne peut se connecter après mise à jour
https://stackoverflow.com/questions/52364415/php-with-mysql-8-0-error-the-server-requested-authentication-method-unknown-to


Un nouveau répertoire mysql8 vient de se créer dans le sous répertoire de mysql :
C:\laragon\data\mysql-8
N'oubliez pas avant de faire la migration de backuper le dossier mysql.
logo ethereum

Comment staker ses polkadots

Installer

  • Installer l’extension du wallet polkadot.js
  • créer deux accounts, un polkadot stash (le stash est comparable à un cold wallet) et un polkadot controller (comparable à un hot wallet). Ce sotn juste des noms, ils sont identiques dans leur nature, c’est après leur association dans l’interface de polkadot que leur rôle va diverger
  • virer les coin polkadot dans un des accounts, de préférence celui avec le stash.
  • Aller à la page principale de polkadot, aller dans Network > Staking, puis dans Account actions, cliquer sur le signe +à côté de Nominator, il vous faut un être un nominator avant de pouvoir nommer un validator. Nommez 16 validateurs.

Etudiez bien les profil des validateurs avant de le nommer. Choisissez ceux qui sont identifiés, ayant un bon historique (pas de slashing).

Vérifier le hash (checksum) sha1 d’un fichier

Lorsque vous téléchargez un fichier depuis Internet, vous pouvez vérifier le checksum (quand il est donné par le site) d’un fichier pour vérifier qu’il n’est pas corrompu, c’est à dire que que le checksum est identique à celui donné par le site.

Windows

certutil -hashfile nom_fichier SHA256

Linux

sha256sum nom_fichier

Ces commandes ont bien sûr des options mais ici c’est le minimum syndical qui est montré, et c’est ce dont on a le plus souvent besoin.

Retour en haut