Footcow BlogLinux, Base de données Postgresql, développement, Internet, emailing et déliverabilité.2024-03-19T08:57:38+01:00Hervé Piedvache alias Bill Footcow pour les intimesurn:md5:ef5d07bad25e414feca607a3b7f2af11DotclearQu'est-ce que l'effort de minage dans les cryptomonnaies ?urn:md5:d343e5514e29b93ba6ccda8bd529905f2023-05-16T23:08:00+02:002023-05-17T16:41:33+02:00footcowCrypto-monnaiescryptominingpool<p><img src="https://www.footcow.com/public/minage.jpg" alt="Description du fonctionnement du minage, mai 2023" style="display:table; margin:0 auto;" title="Description du fonctionnement du minage, mai 2023" height="675" width="1200" />
<br /></p>
<p>Dans le monde des cryptomonnaies, le minage est le processus par lequel les transactions sont vérifiées et ajoutées à la blockchain publique, le grand livre des transactions passées. C'est aussi le moyen par lequel de nouvelles cryptomonnaies sont libérées. Cela nécessite une grande quantité de calculs, et c'est là que l'"effort de minage" entre en jeu.</p> <p>L'effort de minage, dans son sens le plus fondamental, fait référence à la quantité de travail qu'un ordinateur ou un autre appareil de minage doit effectuer pour résoudre un problème mathématique complexe. Ce problème est essentiellement un puzzle cryptographique, et le résoudre permet d'ajouter un nouveau bloc à la blockchain. La difficulté de ce puzzle est ce qui détermine l'effort de minage nécessaire.<br /></p>
<p>Cela dit, l'effort de minage a deux significations principales :</p>
<p>1. Il représente la somme du travail effectué par le mineur. Plus l'effort de minage est élevé, plus le mineur a travaillé pour résoudre le puzzle.</p>
<p>2. Il définit également la difficulté du puzzle à résoudre. Plus l'effort de minage est élevé, plus le puzzle est difficile à résoudre.</p>
<p>L'effort de minage est une information importante car il permet de mesurer la quantité de travail effectuée par un mineur et, par conséquent, sa contribution à la validation des transactions et à la sécurisation du réseau. En règle générale, plus l'effort de minage est important, plus la récompense est élevée.</p>
<p>Exemple de shares avec leur effort de minage :</p>
<p><img src="https://www.footcow.com/public/estimated-effort.png" alt="P2Pool estimated effort, mai 2023" style="display:table; margin:0 auto;" title="P2Pool estimated effort, mai 2023" height="1502" width="2308" /></p>
<p>Concernant le paiement durant le minage, l'effort de minage joue un rôle crucial. Les mineurs sont récompensés par les nouvelles cryptomonnaies et les frais de transaction inclus dans le nouveau bloc qu'ils ont ajouté à la blockchain. Cependant, comme la difficulté du puzzle augmente avec le temps, l'effort de minage nécessaire pour résoudre le puzzle et obtenir la récompense augmente également. En d'autres termes, le mineur doit travailler plus dur pour obtenir la même récompense. C'est l'un des facteurs qui contribuent à la volatilité des cryptomonnaies.</p>
<p>En résumé, l'effort de minage est une mesure essentielle de la contribution d'un mineur à la blockchain. Il est directement lié à la difficulté du puzzle à résoudre et à la récompense que le mineur reçoit pour son travail. C'est un concept clé pour comprendre le fonctionnement des cryptomonnaies et leur économie sous-jacente.</p>https://www.footcow.com/index.php/post/2023/05/16/Qu-est-ce-que-l-effort-de-minage-dans-les-cryptomonnaies#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/125Dogecoin : L'histoire de la crypto-monnaie du mèmeurn:md5:47a9ee31736e2dc047346eb30b5088772023-05-16T22:26:00+02:002023-05-17T18:27:56+02:00footcowCrypto-monnaiescryptoDOGEmining<p><img src="https://www.footcow.com/public/.DOGE_m.jpg" alt="" style="display:table; margin:0 auto;" height="279" width="448" />
<br /></p>
<p>Nous allons plonger dans l'univers de <a href="https://dogecoin.com/" hreflang="en" title="Dogecoin">Dogecoin</a> (DOGE), la cryptomonnaie qui a commencé comme une blague et qui est maintenant devenue un phénomène mondial.</p> <h4>Qu'est-ce que Dogecoin ?</h4>
<p><a href="https://dogecoin.com/" hreflang="en" title="Dogecoin">Dogecoin</a> est une cryptomonnaie peer-to-peer basée sur le populaire mème "Doge" qui met en scène un <a href="https://www.woopets.fr/chien/race/shiba-inu/" hreflang="fr" title="Shiba Inu">Shiba Inu</a>, une race de chien japonaise. Tout comme d'autres cryptomonnaies, Dogecoin permet des transactions rapides et sécurisées sur un réseau décentralisé.</p>
<h4>Création de Dogecoin</h4>
<p><a href="https://dogecoin.com/" hreflang="en" title="Dogecoin">Dogecoin</a> a été créé en décembre 2013 par <a href="https://billym2k.net/" hreflang="en" title="Billy Markus">Billy Markus</a>, un développeur de Portland, Oregon, et Jackson Palmer, un membre du département marketing d'Adobe. Leur objectif était de créer une cryptomonnaie amusante et moins sérieuse que Bitcoin. Ils n'auraient jamais pu prévoir le succès qui allait suivre.</p>
<h4>Utilisations de Dogecoin</h4>
<p><a href="https://dogecoin.com/" hreflang="en" title="Dogecoin">Dogecoin</a> a commencé comme une blague, mais il a rapidement trouvé une utilité en tant que moyen de donner des pourboires en ligne. Les utilisateurs de <a href="https://www.reddit.com/" hreflang="en" title="Reddit">Reddit</a> et d'autres forums sociaux utilisaient <a href="https://dogecoin.com/" hreflang="en" title="Dogecoin">Dogecoin</a> pour récompenser le contenu ou les commentaires qu'ils appréciaient.</p>
<p>Aujourd'hui, <a href="https://dogecoin.com/" hreflang="en" title="Dogecoin">Dogecoin</a> peut être utilisé pour acheter des biens et des services ou être échangé contre d'autres devises, à la fois d'autres cryptomonnaies et des devises traditionnelles. Il a également été utilisé pour des œuvres caritatives, comme aider à envoyer <a href="https://www.france24.com/fr/20140121-sotchi-dogecoin-bitcoin-rasta-rockets-financement-participatif-bobsleigh-jamaique" hreflang="fr" title="Internet finance les Rasta Rockett pour aller à Sotchi">l'équipe jamaïcaine de bobsleigh aux Jeux olympiques d'hiver de 2014</a>.</p>
<h4>Comment miner du Dogecoin ?</h4>
<p><a href="https://dogecoin.com/" hreflang="en" title="Dogecoin">Dogecoin</a> utilise un algorithme de preuve de travail (PoW) basé sur <a href="https://bitflyer.com/fr-eu/s/glossary/scrypt" hreflang="fr" title="Scrypt">Scrypt</a>, similaire à Litecoin. Cela signifie qu'il peut être miné efficacement avec des ASIC (Application-Specific Integrated Circuits) conçus pour miner des cryptomonnaies basées sur Scrypt.</p>
<p>Parmi les logiciels de minage compatibles, on peut citer <a href="https://cgminer.info/" hreflang="en" title="CGMiner">CGMiner</a> et <a href="https://www.easyminer.net/" hreflang="en" title="EasyMiner">EasyMiner</a>. Il est également possible de rejoindre un pool de minage pour augmenter les chances de gagner des récompenses.</p>
<h4>Rentabilité du minage de Dogecoin</h4>
<p>La rentabilité du minage de <a href="https://dogecoin.com/" hreflang="en" title="Dogecoin">Dogecoin</a> dépend de nombreux facteurs, tels que le coût de l'électricité, le prix actuel de Dogecoin, la difficulté du minage et le coût du matériel de minage. Il est recommandé d'utiliser un calculateur de rentabilité de minage pour estimer vos gains potentiels.</p>
<h4>Où échanger du Dogecoin ?</h4>
<p><a href="https://dogecoin.com/" hreflang="en" title="Dogecoin">Dogecoin</a> peut être échangé sur diverses plateformes de trading de cryptomonnaies, dont <a href="https://www.binance.com/en/activity/referral-entry/CPA?ref=CPA_00I10APUMC" hreflang="fr" title="Binance">Binance</a>, et bien d'autres.</p>
<h4>Dogecoin et Shiba Inu (SHIB)</h4>
<p><a href="https://www.shibatoken.com/" hreflang="en" title="Shiba Inu token">Shiba Inu</a> (SHIB) est une autre cryptomonnaie qui a été lancée en août 2020 et qui est souvent appelée "le Dogecoin killer". Tout comme <a href="https://dogecoin.com/" hreflang="en" title="Dogecoin">Dogecoin</a>, elle s'inspire du mème Doge, mais ce sont deux cryptomonnaies distinctes avec des communautés et des objectifs différents.</p>
<p>En dépit de son nom, <a href="https://www.shibatoken.com/" hreflang="en" title="Shiba Inu token">Shiba Inu</a> a des différences techniques significatives avec <a href="https://dogecoin.com/" hreflang="en" title="Dogecoin">Dogecoin</a>. Par exemple, alors que <a href="https://dogecoin.com/" hreflang="en" title="Dogecoin">Dogecoin</a> est une monnaie inflationniste, ce qui signifie qu'il n'y a pas de limite au nombre de Dogecoins qui peuvent être créés, <a href="https://www.shibatoken.com/" hreflang="en" title="Shiba Inu token">Shiba Inu</a> a une offre maximale fixe de 1 quadrillion de SHIB.</p>
<h4>Conclusion</h4>
<p><a href="https://dogecoin.com/" hreflang="en" title="Dogecoin">Dogecoin</a> est un exemple fascinant de la façon dont une simple blague peut évoluer pour devenir une cryptomonnaie valant des milliards de dollars sur le marché. Elle a une communauté dévouée et passionnée, et bien qu'elle ait été créée en plaisantant, elle a trouvé des utilisations réelles comme moyen de donner des pourboires en ligne et de soutenir des causes charitables. Malgré l'arrivée de prétendants comme <a href="https://www.shibatoken.com/" hreflang="en" title="Shiba Inu token">Shiba Inu</a>, <a href="https://dogecoin.com/" hreflang="en" title="Dogecoin">Dogecoin</a> continue d'être une cryptomonnaie populaire avec une marque reconnaissable dans le monde entier.</p>https://www.footcow.com/index.php/post/2023/05/16/Dogecoin-%3A-L-histoire-de-la-crypto-monnaie-du-m%C3%A8me#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/128Google Nearby Share adapté sur macOSurn:md5:623add473cb8438c1ed9747e8fc2e7082023-05-14T10:40:00+02:002023-05-17T16:35:02+02:00footcowAndroidandroidgooglemacosnearbyshare<p><img src="https://www.footcow.com/public/.Google_Nearby_Share_m.png" alt="" style="display:table; margin:0 auto;" height="307" width="448" /></p>
<p><a href="https://support.google.com/files/answer/10514188" hreflang="en" title="Google Nearby Share">Google Nearby Share</a> est un protocole de partage de fichiers développé par Google pour les appareils Android, similaire à la fonctionnalité AirDrop d'Apple sur iOS et macOS.</p> <h4>Google Nearby Share</h4>
<p>Google Nearby Share est une fonctionnalité qui permet aux utilisateurs de partager des fichiers, des liens, des photos et plus encore entre appareils Android. Il utilise le Bluetooth pour initier une connexion, puis transfère les données via Wi-Fi Direct ou WebRTC pour des transferts rapides. Vous pouvez trouver une description du <a href="https://github.com/grishka/NearDrop/blob/master/PROTOCOL.md" hreflang="en" title="Nearby Share Protocole">protocole</a>. Cela signifie qu'il peut fonctionner même sans connexion Internet. Les utilisateurs peuvent partager du contenu avec des personnes à proximité, même s'ils ne sont pas dans leurs contacts. Il offre également la possibilité de rester anonyme pendant le partage.</p>
<h4>Adaptation de Nearby Share sur macOS</h4>
<p><a href="https://github.com/grishka/NearDrop" hreflang="en" title="NearDrop">NearDrop</a> est une implémentation partielle de Nearby Share de Google pour macOS.</p>
<p>L'application réside dans votre barre de menus et enregistre les fichiers dans votre dossier de téléchargements.
C'est aussi simple que ça, vraiment.</p>
<h4>Limitation</h4>
<ul>
<li>Pour le moment on ne peut <strong>que</strong> recevoir des données depuis un appareil Android.</li>
<li>LAN Wi-Fi uniquement. Votre appareil Android et votre Mac doivent être sur le même réseau pour que cette application fonctionne. L'implémentation de Google prend en charge plusieurs supports, notamment le Wi-Fi Direct, le point d'accès Wi-Fi, le Bluetooth, une sorte de connexion peer-to-peer 5G et même un protocole basé sur WebRTC qui passe sur Internet via les serveurs Google. Le Wi-Fi direct n'est pas pris en charge sur macOS (Apple a son propre truc AWDL incompatible, utilisé dans AirDrop). Bluetooth a besoin d'être plus creusé pour être opérationel.</li>
<li>Vous êtes visible par tout le monde sur votre réseau à tout moment pendant que l'application est en cours d'exécution. Une visibilité limitée (contacts, etc.) nécessiterait de parler aux serveurs de Google, et devenir temporairement visible nécessite d'écouter tout ce qui déclenche la notification que "l'appareil à proximité partage des données".</li>
</ul>
<h4>Conclusion</h4>
<p>L'adaptation de Google Nearby Share pour macOS pourrait être une avancée majeure dans la facilitation du partage de fichiers entre les appareils Android et macOS. Bien que les systèmes d'exploitation de Google et d'Apple aient traditionnellement travaillé dans des écosystèmes séparés, ce genre de développement pourrait contribuer à une plus grande interopérabilité entre les appareils.</p>https://www.footcow.com/index.php/post/2023/05/14/Google-Nearby-Share-adapt%C3%A9-sur-macOS#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/124Kawpow, la réponse de Ravencoin à la centralisation du minageurn:md5:7a800aec004f1df9a54cee1f1d80be072023-05-07T16:50:00+02:002023-05-17T18:52:02+02:00footcowCrypto-monnaies<p><img src="https://www.footcow.com/public/.RavenCoin_m.png" alt="" style="display:table; margin:0 auto;" height="242" width="448" /></p>
<p>Nous allons parler de Kawpow, un algorithme de hachage qui est devenu un sujet brûlant dans l'univers des cryptomonnaies.</p>
<h4>Qu'est-ce que Kawpow ?</h4>
<p>Kawpow est un algorithme de preuve de travail (Proof of Work, PoW) utilisé par la cryptomonnaie <a href="https://ravencoin.org/" hreflang="en" title="Ravencoin">Ravencoin</a> (RVN). L'algorithme a été introduit en 2020 en tant que mise à jour du réseau Ravencoin. Il s'agit d'une adaptation de ProgPoW (Programmatic Proof of Work), conçu pour résister à l'<a href="https://academy.bit2me.com/fr/que-son-mineros-asic/" hreflang="fr" title="ASIC Miner">ASIC</a> (Application-Specific Integrated Circuit), des machines spécialisées dans le minage de cryptomonnaie.</p> <h4>A quoi sert Kawpow ?</h4>
<p>L'objectif principal de Kawpow est de réduire la centralisation du minage. Avec l'essor des ASIC, le minage de cryptomonnaies est devenu de plus en plus centralisé, car seules les organisations avec suffisamment de capital pour investir dans ces machines coûteuses peuvent rivaliser. Kawpow vise à rendre le minage à nouveau accessible aux mineurs individuels en utilisant leur <a href="https://www.futura-sciences.com/tech/definitions/informatique-gpu-5739/" hreflang="fr" title="Qu'est-ce qu'une GPU">GPU</a> (Graphical Processing Unit), réduisant ainsi la centralisation et augmentant la sécurité du réseau.</p>
<h4>Comment fonctionne Kawpow ?</h4>
<p>Techniquement, Kawpow est un algorithme PoW basé sur l'algorithme Ethash, utilisé par Ethereum. Cependant, il inclut des modifications qui changent le mix de calculs à chaque niveau de hachage, rendant ainsi l'ASIC beaucoup moins efficace. Kawpow est conçu pour être plus amical envers les GPU, ce qui signifie que les mineurs utilisant des ordinateurs de bureau ordinaires peuvent concurrencer ceux qui utilisent des ASIC.</p>
<h4>Kawpow vs autres algorithmes</h4>
<p>Kawpow se distingue d'autres algorithmes comme RandomX, EquiHash et Zhash principalement par sa résistance à l'ASIC.</p>
<p>RandomX, utilisé par <a href="https://fr.wikipedia.org/wiki/Monero" hreflang="fr" title="Qu'est-ce que Monero?">Monero</a>, est conçu pour être efficace sur les <a href="https://www.journaldunet.fr/web-tech/dictionnaire-du-webmastering/1203307-cpu-central-processins-unit-definition-traduction-et-acteurs/" hreflang="fr" title="Central Processing Unit">CPU</a> (Central Processing Unit) et est moins favorable aux GPU ou aux ASIC. EquiHash, utilisé par <a href="https://z.cash/" hreflang="en" title="Zcash">ZCash</a>, était initialement résistant à l'ASIC, mais des ASIC ont depuis été développés pour le miner. Zhash, une version plus robuste d'EquiHash, est également résistant à l'ASIC, mais il est moins répandu que Kawpow.</p>
<h4>Quelles cryptomonnaies utilisent Kawpow ?</h4>
<p>Le principal utilisateur de Kawpow est Ravencoin, que vous pouvez trader sur <a href="https://www.binance.com/en/activity/referral-entry/CPA?ref=CPA_00I10APUMC" hreflang="fr" title="Binance">Binance</a>, qui a adopté cet algorithme en 2020 pour résister à la centralisation du minage.</p>
<h4>Matériel et logiciel nécessaires pour miner avec Kawpow</h4>
<p>Pour miner avec Kawpow, vous aurez besoin d'un GPU récent et performant. Les cartes NVIDIA et AMD sont les plus couramment utilisées. En ce qui concerne le logiciel, plusieurs mineurs de GPU supportent Kawpow, dont NBMiner et T-Rex. Vous aurez également besoin d'un portefeuille Ravencoin pour recevoir vos récompenses de minage.</p>
<h4>Conclusion</h4>
<p>Kawpow est un outil puissant pour lutter contre la centralisation du minage de cryptomonnaies. Il offre une alternative aux mineurs individuels qui souhaitent participer à la sécurisation du réseau Ravencoin et d'autres réseaux qui pourraient adopter cet algorithme à l'avenir. En privilégiant l'utilisation de GPU accessibles, Kawpow contribue à maintenir l'esprit d'égalité et de décentralisation qui est au cœur de l'idéologie des cryptomonnaies.</p>https://www.footcow.com/index.php/post/2023/05/07/Kawpow%2C-la-r%C3%A9ponse-de-Ravencoin-%C3%A0-la-centralisation-du-minage#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/126Customisez ChatGPT avec vos données personnellesurn:md5:aa641a679a35508d09292420da762b9f2023-04-13T22:54:00+02:002023-05-17T16:46:41+02:00footcowIntelligence ArtificielleChatGPTIAindexationllama-indexLLMpersonnalisation<p><img src="https://www.footcow.com/public/.chatgtp-mydata_m.webp" alt="" style="display:table; margin:0 auto;" height="252" width="448" /></p>
<p>ChatGPT est un outil puissant, mais qui à l'heure où cet article est rédigé, est limité aux données à fin 2021. Souvent ses réponses peuvent également être peu précises sur certaines informations ou données sur une personne, une société, ou un produit par exemple. Alors si vous avez besoin, pour votre support technique, de puiser dans votre base interne de connaissances mise à jour régulièrement et bien nous allons ajouter ces données personnelles à ChatGPT, et uniquement pour votre usage interne. Rien de ce que vous ajouterez à ce système ne sera publié dans le ChatGPT grand public.</p> <p>Pour réaliser ce POC d'un ChatGPT étendu nous allons travailler dans un environnement <a href="https://www.anaconda.com/" hreflang="en" title="Datascience environment">Anaconda</a>. Avec Anaconda vous aurez tout ce dont vous avez besoin pour vous lancer dans la data science sur votre poste de travail.
Conda est un système de gestion de packages et d'environnement open source qui s'exécute sous Windows, macOS et Linux. Conda installe, exécute et met à jour rapidement les packages et leurs dépendances. Il crée, enregistre, charge et bascule facilement entre les environnements sur votre ordinateur local. Il a été créé pour les programmes Python, mais il peut empaqueter et distribuer des logiciels pour n'importe quel langage.</p>
<p>Commencez par installer <a href="https://www.anaconda.com/products/distribution" hreflang="en" title="Download Anaconda">Anaconda</a>.</p>
<p>Dans notre cas nous sommes sur macOS, mais cela s'appliquera quasi de façon identique sur les autres OS supportés.</p>
<p>Lancez votre terminal pour contrôler votre installation :</p>
<pre>
conda --version
</pre>
<p>Validez que vous avez bien une version 23.x pour être un minimum à jour.</p>
<p>Ensuite nous allons commencer par faire une petite mise à jour de la plateforme, les choses évoluent vite :</p>
<pre>
conda update conda
</pre>
<p>Validez les mises à jour proposées cela ne peut pas vous faire de mal.</p>
<p>Puis nous allons créer un nouvel espace, ou projet dans anaconda, et l'activer :</p>
<pre>
conda create --name mychatbot
conda activate mychatbot
</pre>
<p>Comme pour le moment nous avons une configuration de base d'Anaconda il faut au minimum installer les packages nécéssaires pour travailler et en particulier le gestionnaire de paquets pip pour python.</p>
<pre>
conda install pip
pip install openai
pip install llama-index
</pre>
<p>Votre environnement de travail est fin prêt.
Logiquement votre dossier de travail devrait être : <code>~/anaconda3/envs/mychatbot</code></p>
<p>Vous allez donc vous placer dans ce dossier :</p>
<pre>
cd ~/anaconda3/envs/mychatbot
</pre>
<p>Et nous allons éditer un fichier <code>main.py</code> qui devra avoir ce contenu :</p>
<pre>
# Import necessary packages
import os
import pickle
from llama_index import GPTSimpleVectorIndex, download_loader
# NOTE: for local testing only, do NOT deploy with your key hardcoded
# os.environ['OPENAI_API_KEY'] = "your key here"
# This loader is designed to be used as a way to load data from a directory into LlamaIndex
SimpleDirectoryReader = download_loader("SimpleDirectoryReader")
# Load data in the /data folder with subfolders
loader = SimpleDirectoryReader('./data', recursive=True, exclude_hidden=True)
index = None
index_name = "./index.json"
def initialize_index():
global index
# Load from file if an index already exists
if os.path.exists(index_name):
index = GPTSimpleVectorIndex.load_from_disk(index_name)
else:
# Create the index if is not existing
documents = loader.load_data()
index = GPTSimpleVectorIndex.from_documents(documents)
# Then save the index to disk
index.save_to_disk(index_name)
if __name__ == "__main__":
# init the global index
print("initializing index...")
initialize_index()
# Querying the index
while True:
prompt = input("User: ")
response = index.query(prompt)
print(f'Agent: {response}')
</pre>
<p>Le principe est simple, nous allons dans un premier temps indexer sous le format d'index vectoriel (format de stockage de ChatGPT - GPTSimpleVectorIndex) les fichiers qui se trouvent dans le dossier <code>./data</code>. Pour mon exemple, j'ai simplement placé la sortie PDF de ma page <a href="https://www.linkedin.com/in/piedvache/" hreflang="fr" title="Hervé Piedvache sur Linkedin">Linkedin</a>. Une fois le contenu indexé, il est sauvegardé dans un fichier index.json. Dans un but d'optimisation, nous ne relançons pas l'indexation si le fichier d'index est déjà présent au lancement du ChatBot.
Puis nous lançons le bot qui va donc attendre un Prompt de votre part.</p>
<p>Concernant cette ligne :</p>
<pre>
os.environ['OPENAI_API_KEY'] = "your key here"
</pre>
<p>Pensez à ne jamais mettre votre clé openAI dans un script exécutable, il est toujours préférable de lire cette donnée depuis une variable d'environnement. Sur macOS ou Linux un <code>export OPENAI_API_KEY="you key here"</code> fera parfaitement l'affaire. Pensez à la mettre dans un script lancé au démarrage de votre machine pour automatiquement l'ajouter à vos variables globales.</p>
<p>Maintenant que nous avons rédigé notre script voyons ce que cela donne en terme de résultat.</p>
<p>Bien sûr nous allons voir un avant et un après, avant ChatGPT n'avait aucune information sur moi :</p>
<figure style="display:table; margin:0 auto;"><img src="https://www.footcow.com/public/.ChatGPT-herve-piedvache_m.png" alt="ChatGPT ne connait pas Hervé Piedvache, avr. 2023" title="ChatGPT ne connait pas Hervé Piedvache, avr. 2023" height="115" width="448" /><figcaption>ChatGPT ne connait pas Hervé Piedvache</figcaption></figure>
<p>Puis passons maintenant à notre script Python :</p>
<pre>
python ./from_file.py
initializing index...
User: Qui est Hervé Piedvache ?
INFO:llama_index.token_counter.token_counter:> [query] Total LLM token usage: 1033 tokens
INFO:llama_index.token_counter.token_counter:> [query] Total embedding token usage: 11 tokens
Agent:
Hervé Piedvache est un entrepreneur et un développeur d'applications qui a une vaste expérience dans la gestion de projets, le développement d'applications et l'administration de bases de données dans un environnement Linux. Il est particulièrement intéressé par la conception de bases de données client/serveur et relationnelles à l'aide de PostgreSQL. Il est spécialisé dans les projets open source, PostgreSQL, Linux, PHP, Javascript et le développement Web 2.0. Il a également été le fondateur et le PDG de plusieurs entreprises, dont Bilendi & respondi (CTO), Bilendi Technology (ex Elma), TapPublisher et Mirame.net.
User:
</pre>
<p>Nous avons vu dans un <a href="https://www.footcow.com/index.php/post/2023/04/08/Savez-vous-utiliser-ChatGPT">précédent article</a> que le Prompt avait son importance, en voici une petite démonstration amusante, avec une présentation différente liée au rôle précisé dans le Prompt :</p>
<pre>
User: En temps que journaliste, que tu peux me dire sur Hervé Piedvache ?
INFO:llama_index.token_counter.token_counter:> [query] Total LLM token usage: 1122 tokens
INFO:llama_index.token_counter.token_counter:> [query] Total embedding token usage: 35 tokens
Agent:
Hervé Piedvache est un entrepreneur et un technicien expérimenté. Il a été un gestionnaire de projet, un développeur d'applications et un administrateur de bases de données dans une variété d'applications commerciales sur un environnement Linux. Il est particulièrement intéressé par la conception de bases de données client / serveur et relationnelles à l'aide de PostgreSQL.
Aujourd'hui, il est principalement entrepreneur dans différentes entreprises, responsable des équipes techniques, des choix stratégiques et de la technologie. Il est spécialisé dans les projets open source, PostgreSQL, Linux, PHP, Javascript et le développement Web 2.0.
Il est le CTO de Bilendi et CEO de Bilendi Technology, et a cofondé TapPublisher et Mirame.net. Il a également été le CEO de Sylaps et a travaillé dans le développement de nombreux logiciels.
</pre>
<p>Vous constaterez donc que ChatGTP couplé à Llama-index est donc parfaitement en mesure d'apporter des informations issues de bases externes. Cela laisse donc d'immenses possibilités pour faire votre ChatGTP personnel.</p>
<p>On peut facilement mettre d'autres sources de données pour les indexer, vous trouverez une liste avec un large éventail de choix sur le site <a href="https://llamahub.ai/" hreflang="en" title="Connect custom data sources to your LLM">Llama-Hub</a>.</p>
<p>Voilà un autre exemple si vous travaillez par exemple avec <a href="https://www.zendesk.com" hreflang="fr" title="Zendesk">Zendesk</a> pour votre support client, et que vous voulez puiser dans l'aide en ligne publiée en temps réel depuis votre ChatBot il suffit de brancher ce code par exemple, qui va indexer vos données fraiches sur vos produits ou solutions :</p>
<pre>
# Import necessary packages
import os
import pickle
from llama_index import GPTSimpleVectorIndex, download_loader
# NOTE: for local testing only, do NOT deploy with your key hardcoded
# os.environ['OPENAI_API_KEY'] = "your key here"
# Use the ZendeskReader
ZendeskReader = download_loader("ZendeskReader")
# Configure you Zendesk sub-domain - default Zendesk support itself
loader = ZendeskReader(zendesk_subdomain="support", locale="en-us")
index = None
index_name = "./index.json"
def initialize_index():
global index
if os.path.exists(index_name):
index = GPTSimpleVectorIndex.load_from_disk(index_name)
else:
documents = loader.load_data()
index = GPTSimpleVectorIndex.from_documents(documents)
index.save_to_disk(index_name)
if __name__ == "__main__":
# init the global index
print("initializing index...")
initialize_index()
# Querying the index
while True:
prompt = input("Customer: ")
response = index.query(prompt)
print(f'Agent: {response}')
</pre>
<p>ChatGPT combiné à Llama-Index peut donc aider à créer un chatbot ChatGPT personnalisé qui peut déduire des connaissances basées sur ses propres sources de documents. Bien que ChatGPT et d'autres <a href="https://www.footcow.com/index.php/post/2023/04/14/Qu-est-ce-que-LLM">LLM</a> soient assez puissants, l'extension du modèle LLM offre une expérience beaucoup plus fine et ouvre la possibilité de créer un chatbot de style conversationnel qui peut être utilisé pour créer de véritables cas d'utilisations commerciales comme l'assistance client. Étant donné que nous pouvons alimenter des données en temps réel, nous pouvons combler certaines des limites des modèles ChatGPT toujours alimentés jusqu'à une certaine date.</p>https://www.footcow.com/index.php/post/2023/04/13/Customisez-ChatGPT-avec-vos-donn%C3%A9es-personnelles#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/121Installer Apache Superset sur macOS M1urn:md5:265ff543deb959afd5432bec3a2fe1292023-04-09T17:54:00+02:002023-05-17T16:47:15+02:00footcowGénéralapachechartdashboarddatabasesupersetvisualisation<p><img src="https://www.footcow.com/public/.Superset-logo_m.png" alt="" style="display:table; margin:0 auto;" height="98" width="448" /></p>
<p><a href="https://superset.apache.org/" hreflang="en" title="Apache Superset">Apache Superset</a> est une plateforme de visualisation de données open source, qui permet de créer des tableaux de bord interactifs et de la visualisation de données à partir de différentes sources. Il permet aux utilisateurs d'explorer, d'analyser et de présenter des données de manière visuelle, sans nécessiter de connaissances en programmation ou en statistiques.</p> <p>Superset offre une grande variété de graphiques et de tableaux de bord préconfigurés, ainsi que la possibilité de créer des graphiques personnalisés en utilisant du code Python. Il prend en charge une grande variété de sources de données telles que les bases de données SQL, les fichiers CSV et les sources de données Big Data.</p>
<p>L'interface utilisateur de Superset est intuitive et facile à utiliser, permettant aux utilisateurs de créer rapidement des visualisations de données et de les partager avec d'autres utilisateurs. Il permet également la collaboration, la sécurité et la gouvernance des données pour garantir que les données sont utilisées de manière appropriée et sécurisée.</p>
<p>Nous allons procéder à l'installation sur un MacBook Pro M1 avec macOS v13.3, 16Go de RAM, via un environnement <a href="https://www.anaconda.com/products/distribution" hreflang="en" title="Téléchargez Anaconda pour macOS">Anaconda</a>.</p>
<p>Vous lancez votre terminal, et nous commençons par créer un environnement dédié :</p>
<pre>
conda create --name superset
proceed ([y]/n)? y
conda activate superset
cd ~/anaconda3/envs/superset
</pre>
<p>Puis nous avons besoin d'utiliser le gestionnaire de paquets <code>pip</code> pour Python.</p>
<pre>
conda install pip
</pre>
<p>Une fois <code>pip</code> installé il ne reste plus qu'à installer le package d'apache-Superset :</p>
<pre>
pip install apache-superset
</pre>
<p>Oubli du package (!?), ou quoi qu'il en soit, il faut définir une variable d'environnement pour l'application Flask utilisée par Superset via la commande :</p>
<pre>
export FLASK_APP=superset
</pre>
<p>Pensez à l'ajouter à vos variables d’environnement de votre shell habituel. Sinon il faut lancer la commande manuellement à chaque fois.</p>
<p>Maintenant nous allons créer une clé personnelle pour votre environnement Apache-Superset en lançant la commande suivante :</p>
<pre>
openssl rand -base64 42
</pre>
<p>Une clé va s'affichée à l'écran il faut la copier dans le fichier suivant que nous allons créer. Utilisez l'éditeur qui vous convient, en l’occurrence j'utilise <code>vi</code>.</p>
<pre>
vi ~/anaconda3/envs/superset/lib/python3.11/site-packages/superset/superset_config.py
</pre>
<p>Et vous collez le contenu ci-dessous, en pensant bien à indiquer la clé (<code>SECRET_KEY</code>) que vous venez de générer préalablement :</p>
<pre>
#---------------------------------------------------------
# Superset specific config
#---------------------------------------------------------
ROW_LIMIT = 5000
SUPERSET_WEBSERVER_PORT = 5000
#---------------------------------------------------------
#---------------------------------------------------------
# Flask App Builder configuration
#---------------------------------------------------------
# Your App secret key
SECRET_KEY = 'bzSz_YOUR_SECRET_KEY_XOdV'
# The SQLAlchemy connection string to your database backend
# This connection defines the path to the database that stores your
# superset metadata (slices, connections, tables, dashboards, ...).
# Note that the connection information to connect to the datasources
# you want to explore are managed directly in the web UI
SQLALCHEMY_DATABASE_URI = 'sqlite:////path/to/superset.db'
# Flask-WTF flag for CSRF
WTF_CSRF_ENABLED = True
# Add endpoints that need to be exempt from CSRF protection
WTF_CSRF_EXEMPT_LIST = []
# A CSRF token that expires in 1 year
WTF_CSRF_TIME_LIMIT = 60 * 60 * 24 * 365
# Set this API key to enable Mapbox visualizations
MAPBOX_API_KEY = ''
</pre>
<p>Vous sauvegardez le fichier, et maintenant vous êtes en mesure de poursuivre la configuration de Superset avec la commande suivante qui va initialiser la base de données interne :</p>
<pre>
superset db upgrade
</pre>
<p>Créez un utilisateur administrateur en tapant les commandes ci-dessous, c'est cet utilisateur que vous allez utiliser pour vous identifier sur l'application par la suite :</p>
<pre>
superset fab create-admin
</pre>
<p>Ensuite, vous serez invité à saisir votre nom d'utilisateur, votre nom et prénom, votre identifiant de messagerie et votre mot de passe.</p>
<p>Une fois terminé nous allons charger des données d'exemple en tapant la commande : (être patient c'est assez long)</p>
<pre>
superset load_examples
</pre>
<p>Puis vous créez des rôles et des autorisations par défaut en tapant la commande :</p>
<pre>
superset init
</pre>
<p>Nous en avons terminé de l'installation et de la configuration, vous pouvez lancer Superset en tapant :</p>
<pre>
superset run
</pre>
<p>Désormais, Superset sera disponible sur https://localhost:5000 depuis votre navigateur.
<img src="https://www.footcow.com/public/.superset_-_login_m.png" alt="" style="display:table; margin:0 auto;" height="237" width="448" /></p>
<p>Connectez-vous à Superset avec votre identifiant et mot de passe créés précédemment.</p>
<p>Puis choisissez un Tableau de bord selon votre choix depuis cet écran :
<img src="https://www.footcow.com/public/.superset_-_chooser_m.png" alt="" style="display:table; margin:0 auto;" height="237" width="448" /></p>
<p>Voilà un exemple de Tableau de bord :
<img src="https://www.footcow.com/public/.superset_-_dashboard_m.png" alt="" style="display:table; margin:0 auto;" height="448" width="305" /></p>
<p>Ou encore un gestionnaire de Charts :
<img src="https://www.footcow.com/public/.superset_-_charts_m.png" alt="" style="display:table; margin:0 auto;" height="237" width="448" /></p>
<p>Libre à vous ensuite de connecter vos bases de données et de pouvoir les manipuler comme bon vous semble.</p>
<p>Bon travail à tous.</p>https://www.footcow.com/index.php/post/2023/04/14/Installer-Apache-Superset-sur-macOS-M1#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/123Qu'est-ce que le LLM ?urn:md5:d36135ae87abb5dd09ad4c7d3267d3aa2023-03-25T01:37:00+01:002023-05-17T16:49:56+02:00footcowIntelligence ArtificielleChatGPTIALLMvecteur<p><img src="https://www.footcow.com/public/.llm-visuel_m.jpg" alt="" style="display:table; margin:0 auto;" height="252" width="448" /></p>
<p>Le Large Margin Learning to Rank, ou LLM pour faire court, est une technique d'apprentissage automatique qui peut sembler complexe à première vue, mais qui est en réalité très utile pour améliorer les résultats de recherche sur les sites web.</p> <p>Imaginez que vous faites une recherche sur Google pour trouver un restaurant à proximité. Si Google ne classe pas les résultats de recherche dans le bon ordre, vous risquez de ne pas trouver le restaurant que vous cherchez. C'est là que le LLM entre en jeu.</p>
<p>Le LLM fonctionne en prenant en compte plusieurs facteurs pour classer les résultats de recherche de manière plus efficace. Ces facteurs peuvent inclure des informations sur le contenu de la page, la popularité du site web et la pertinence de la recherche.</p>
<p>Pour classer les résultats de recherche, le LLM utilise une méthode appelée "large margin". Cela signifie que le système essaie de trouver la meilleure séparation possible entre les différents résultats de recherche, de sorte que chaque résultat soit correctement classé. Pour ce faire, il utilise des algorithmes d'apprentissage automatique pour analyser les données et trouver la meilleure méthode de classification.</p>
<p>En utilisant le LLM, Google peut entraîner des modèles d'apprentissage automatique qui prennent en compte plusieurs facteurs de pertinence, tels que la qualité de la page Web, l'autorité du site et la pertinence du contenu pour la requête de recherche. Ces modèles peuvent ensuite être utilisés pour classer les résultats de recherche de manière plus précise et efficace.</p>
<p>Le LLM est utilisé dans de nombreuses applications de recherche, notamment pour classer les résultats de recherche sur les sites web, les résultats de recherche de produits sur les sites de commerce électronique et les résultats de recherche de musique ou de films sur les sites de streaming.</p>
<p>Le LLM est utilisé par ChatGPT par exemple pour améliorer les performances de son modèle de prédiction de texte en classant les candidats de réponse. Concrètement, cela signifie que le LLM aide ChatGPT à sélectionner la meilleure réponse possible parmi un grand nombre de possibilités, en se basant sur des critères de pertinence.</p>
<p>Du point de vue technique, le LLM est mis en œuvre en créant un modèle d'apprentissage automatique capable de classer les réponses (indexation vectorielle) en fonction de leur pertinence par rapport à une question donnée. Ce modèle est entraîné en utilisant un grand nombre de données qui servent d'entraînement, qui sont fournies sous forme de paires de requêtes et de réponses. Le modèle apprend alors à attribuer un score de pertinence à chaque réponse possible pour une question donnée. Le LLM est en effet souvent utilisé avec des données vectorisées, où chaque élément est représenté par un vecteur de caractéristiques. Les vecteurs peuvent être stockés dans une base de données ou dans un système de fichiers distribué pour permettre une manipulation et un accès rapide.</p>
<p>Dans le cas de <a href="https://openai.com/blog/chatgpt" hreflang="en" title="chatGPT">ChatGPT</a>, les données d'apprentissage pour le LLM sont stockées sous forme de vecteurs représentant les caractéristiques des textes, tels que les mots, les phrases, les entités nommées et les relations syntaxiques. Ces vecteurs sont stockés dans un système de fichiers distribué tel que <a href="https://hadoop.apache.org/" hreflang="en" title="Apache Hadoop">Hadoop</a> ou sur une base de données distribuée telle que <a href="https://cassandra.apache.org" hreflang="en" title="Apache Cassandra">Cassandra</a>.</p>
<p>La navigation rapide dans les milliards de données se fait en utilisant des algorithmes de recherche efficaces tels que <a href="https://fr.wikipedia.org/wiki/Arbre_binaire_de_recherche" hreflang="fr" title="Arbre de recherche binaire sur Wikipedia">l'arbre de recherche binaire</a>, qui permet de diviser rapidement l'espace de recherche en segments plus petits et de trouver rapidement le vecteur le plus proche.</p>
<p>En fin de compte, le stockage et l'accès efficaces aux données d'apprentissage sont cruciaux pour les modèles d'apprentissage automatique tels que le LLM, car ils peuvent nécessiter des milliards de vecteurs pour atteindre un haut niveau de précision et de fiabilité.</p>
<p>Lorsqu'une nouvelle question est posée à ChatGPT, le modèle LLM est utilisé pour classer les réponses possibles en fonction de leur pertinence. Les réponses les plus pertinentes sont alors renvoyées à l'utilisateur.</p>
<p>Il convient de noter que l'utilisation du LLM par ChatGPT nécessite des ressources informatiques importantes, en raison de la complexité du modèle et de la taille des ensembles de données d'entraînement. Cependant, les avantages en termes de qualité de réponse et de pertinence pour l'utilisateur peuvent être considérables.</p>https://www.footcow.com/index.php/post/2023/04/14/Qu-est-ce-que-LLM#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/122IA ou humain ? Qui a rédigé cet article ?urn:md5:bac37a18ce2fe8b9aac2990a6be8a0e32023-03-22T23:26:00+01:002023-05-17T16:51:19+02:00footcowIntelligence ArtificielleChatGPTfakeIAPrompt<p><img src="https://www.footcow.com/public/.AI_vs_Humans_m.jpg" alt="" style="display:table; margin:0 auto;" height="268" width="448" /></p>
<p>Nous allons parler de la façon de rédiger des <a href="https://www.lebigdata.fr/prompt-engineer" hreflang="en" title="Qu'est-ce que le Prompt">Prompts</a> pour <a href="https://chat.openai.com/" hreflang="en" title="ChatGPT">ChatGPT</a> qui donnent l'impression que ce sont des humains qui répondent aux demandes, et non pas une <a href="https://fr.wikipedia.org/wiki/Intelligence_artificielle" hreflang="fr" title="Intelligence Artificielle">IA</a>.</p> <p>Voici quelques astuces pour vous aider à formuler des questions à ChatGPT de manière efficace :</p>
<h4>Utilisez un langage naturel</h4>
<p>ChatGPT est capable de produire des résultats qui semblent rédigés par un humain, mais pour cela, il est important que votre question soit rédigée dans un langage naturel et facile à comprendre.
<br /></p>
<blockquote><p>"Pouvez-vous me donner des astuces pour améliorer ma concentration et ma productivité au travail ?"</p>
<p></p></blockquote>
<p>Cette question utilise un langage courant et simple plutôt qu'un jargon technique. En évitant les termes trop spécifiques, cela permet à ChatGPT de comprendre la question de manière plus claire et de fournir une réponse plus naturelle et accessible.</p>
<h4>Évitez les questions simples</h4>
<p>Si vous posez une question qui a une réponse simple ou spécifique, ChatGPT n'aura pas beaucoup de place pour la créativité et les résultats risquent d'être détectables comme provenant d'une IA.
<br /></p>
<blockquote><p>"Comment la technologie pourrait-elle être utilisée pour résoudre les défis les plus pressants auxquels notre société est confrontée ?"</p>
<p></p></blockquote>
<p>Cette question demande une réponse plus approfondie et créative, et ne peut pas être répondu par une simple réponse. Elle encourage également ChatGPT à développer des arguments et à proposer des solutions novatrices et créatives.</p>
<h4>Posez des questions qui demandent de la réflexion</h4>
<p>Pour obtenir des résultats de qualité, posez des questions qui nécessitent une analyse approfondie ou une réflexion plus poussée. Cela permettra à ChatGPT de fournir des réponses plus intéressantes et élaborées.
<br /></p>
<blockquote><p>"Comment pensez-vous que les technologies émergentes vont affecter l'industrie de l'éducation au cours des prochaines années ?"</p>
<p></p></blockquote>
<p>Cette question demande à ChatGPT de réfléchir à l'impact potentiel des technologies émergentes sur l'industrie de l'éducation, en prenant en compte les tendances actuelles et les prévisions futures. Elle encourage ChatGPT à développer une réponse bien pensée, qui va au-delà d'une simple liste de faits ou de prévisions.</p>
<h4>Posez des questions ouvertes</h4>
<p>Les questions qui permettent à ChatGPT d'exprimer ses propres opinions et de développer des arguments sont idéales pour produire des résultats qui ne semblent pas générés par une IA.
<br /></p>
<p>Par exemple une question à la Sherlock Holmes:</p>
<blockquote><p>Mon cher ChatGPT, je suis curieux de savoir comment vous percevez le processus de résolution de problèmes et d'enquêtes, et comment vous pouvez vous adapter à des situations inattendues et complexes. Pourriez-vous me donner des exemples concrets de votre approche pour résoudre des énigmes, et comment vous pouvez appliquer cette approche à des situations de la vie réelle?</p>
<p></p></blockquote>
<h4>Incluez des éléments personnels ou humoristiques</h4>
<p>Pour encourager ChatGPT à être plus créatif et produire des résultats qui ont une touche personnelle, incluez des éléments de personnalisation ou d'humour dans votre question.
Imaginez que vous discutez avec Albert Einstein et que vous souhaitez en savoir plus sur sa théorie de la relativité restreinte. Rédigez une question qui encourage ChatGPT à répondre de manière approfondie et créative, tout en évitant de donner l'impression que la réponse est générée par une IA.
Enfin, il est utile de rappeler à ChatGPT que vous êtes intéressé par une réponse qui dépasse les simples explications techniques de la théorie, mais qui intègre également des éléments historiques, philosophiques ou culturels pour une réponse plus intéressante et approfondie.</p>
<p>Voici un exemple de question qui pourrait permettre de générer un article de blog convaincant et non détectable comme étant d'origine artificielle :</p>
<blockquote><p>"Prends le rôle de Karl Lagarfeld et donne moi à sa façon quelles sont les principales tendances de l'industrie de la mode pour la saison estivale 2022, et comment peuvent-elles être intégrées dans notre garde-robe de manière innovante et amusante ?"</p>
<p></p></blockquote>
<p>En résumé, pour obtenir des résultats de qualité avec ChatGPT, il est important de formuler des questions qui ne sont pas trop spécifiques, qui exigent de la réflexion, qui sont ouvertes à différentes opinions, et qui incluent des éléments personnels ou humoristiques. Utilisez ces astuces pour rédiger des questions efficaces, et vous serez en mesure de produire des articles de blog qui ne seront pas détectables comme ayant été générés par une IA.</p>
<p>Pour vous amuser vous pouvez toujours faire des tests sur cette plateforme reconnue pour ces outils de détection de contenu générés par l'IA chez <a href="https://ai-detector.compilatio.net/" hreflang="fr" title="AI Detector Evaluation">Compilatio</a>.</p>https://www.footcow.com/index.php/post/2023/04/11/IA-ou-humain-Qui-a-r%C3%A9dig%C3%A9-cet-article#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/114Savez-vous utiliser ChatGPT ?urn:md5:e604c03a2f29ee9b5c5f1deee9e990fb2023-03-19T12:05:00+01:002023-05-17T16:37:06+02:00footcowIntelligence ArtificielleChatGPTIAPrompt<p><img src="https://www.footcow.com/public/.chatgpt_m.jpg" alt="" style="display:table; margin:0 auto;" height="272" width="448" /></p>
<p><a href="https://chat.openai.com" hreflang="en" title="ChatGPT">ChatGPT</a> est dans la bouche de tout le monde en ce moment. La mise à disposition de cette Intelligence Artificielle (IA) sous forme de Chat par <a href="https://openai.com/" hreflang="en" title="OpenAI">OpenAI</a> a fait ouvrir les yeux au monde sur les capacités ou potentialités probables des IA dans notre quotidien. Mais savez-vous utiliser ChatGPT efficacement ?</p> <p><strong>La plupart d'entre nous utilise mal ChatGPT</strong></p>
<p>Nous n'incluons pas d'exemples dans nos questions (Prompt en anglais).
Nous ignorons que nous pouvons contrôler le comportement de ChatGPT avec des rôles.
Nous laissons ChatGPT deviner des choses au lieu de lui fournir des informations.</p>
<p>Cela se produit parce que nous utilisons principalement des demandes basiques qui peuvent ponctuellement nous aider à faire le travail, mais pas tout le temps.</p>
<p>Nous devons donc apprendre à créer des questions de meilleure qualité pour obtenir de meilleurs résultats. C'est d'ailleurs un nouveau emploi qui s'ouvre sur le marché du travail : le <a href="https://www.lebigdata.fr/prompt-engineer" hreflang="fr" title="Prompt engineering">Prompt Engineering</a>. Je vous propose de voir 3 techniques pour poser de la bonne façon vos questions à ChatGPT.</p>
<h3>La question par l'exemple</h3>
<p>Il faut savoir poser une question à l'IA mais sur la base d'exemples. Pourquoi des exemples ? Et bien, si vous souhaitez augmenter vos chances d'obtenir le résultat souhaité, vous devez ajouter des exemples dans votre Prompt qui tente d'expliquer la question que vous essayer de résoudre.
La bonne tournure de formulation des questions doit donc se composer d'une description de l'objectif, d'exemples et de la question. Dans ce cas, le Prompt est le début d'un nouvel exemple que le modèle doit compléter en générant le texte manquant.</p>
<p>Voici un exemple de formulation par l'exemple :</p>
<blockquote><p>- Décrire la tache attendue : Traduire du Français en Espagnol
- Donner des exemples : chaise = silla, porte = puerta, salon = sala de estar
- maison = (notre Prompt final)</p>
<p></p></blockquote>
<p>Autre exemple au travers des codes postaux de nos localités françaises.
Par exemple, je demande dans mon Prompt: Quels sont les codes postaux de certaines villes dans le texte "Je veux envoyer un courrier dans la ville de Chaulgnes, et à Nevers".
On peut dans certains cas avoir une réponse satisfaisante. Mais parfois cela n'est pas véritablement satisfaisant. Il est donc préférable de montrer le format attendu:</p>
<blockquote><p>Extraire les codes postaux des villes citées dans ce texte.</p>
<p>
Texte: "Je veux envoyer un courrier à Orléans et à Tours".
Code postaux: 45000, 37000</p>
<p>
Texte: "Je veux envoyer un courrier à Laval et à Nantes".
Code postaux: 53000, 44000</p>
<p>
Texte: "Je veux envoyer un courrier à Chaulgnes et à Nevers".
Code postaux:</p>
<p></p></blockquote>
<p>La réponse de ChatGPT sera :
58400 (pour Chaulgnes) et 58000 (pour Nevers)</p>
<p>Gardez à l'esprit que les recherches antérieures ont révélé que les réponses réelles dans les exemples ne sont pas importantes, mais que la façon de présenter les réponses attendues l'est. Le masque de réponse est un masque qui va servir à montrer le modèle de réponse attendu pour un Prompt. Vous pouvez améliorer les résultats de vos Prompts en fournissant même des réponses aléatoires à partir des masques de réponses que vous donnez.</p>
<p>Testons cela en tapant des codes postaux aléatoires dans nos exemples :</p>
<blockquote><p>Extraire les codes postaux des villes citées dans ce texte.</p>
<p>
Texte: "Je veux envoyer un courrier à Orléans et à Tours".
Code postaux: 35000, 47000</p>
<p>
Texte: "Je veux envoyer un courrier à Laval et à Nantes".
Code postaux: 63000, 23000</p>
<p>
Texte: "Je veux envoyer un courrier à Chaulgnes et à Nevers".
Code postaux:</p>
<p></p></blockquote>
<p>Si vous avez essayé l'invite précédente sur ChatGPT, vous obtiendrez toujours les bons codes postaux.</p>
<p>Que vos exemples soient corrects ou non, incluez des masques de réponses dans votre préparation au Prompt final. Cela vous aidera à améliorer les résultats et à donner des instructions au modèle sur la façon de formater la réponse.</p>
<h3>Utiliser un rôle dans votre Prompt</h3>
<p>Parfois, le comportement par défaut de ChatGPT ne suffit pas à obtenir ce que vous voulez. C'est à ce moment-là que vous devez faire jouer un rôle à ChatGPT.</p>
<p>Dites que vous voulez vous entraîner pour un entretien d'embauche. En disant à ChatGPT « d'agir en tant que responsable du recrutement » et en ajoutant plus de détails à l'invite, vous serez en mesure de simuler un entretien d'embauche pour n'importe quel poste.</p>
<figure style="display:table; margin:0 auto;"><img src="https://www.footcow.com/public/.ChatGPT-Interview_m.png" alt="Interview ChatGPT, avr. 2023" title="Interview ChatGPT, avr. 2023" height="318" width="448" /><figcaption>Interview ChatGPT</figcaption></figure>
<p>Comme vous pouvez le voir, ChatGPT se comporte comme s'il m'interviewait pour un recrutement.</p>
<p>Facilement, vous pouvez transformer ChatGPT en un professeur de langue étrangère pour apprendre une nouvelle langue comme l'espagnol ou un professeur de Français pour préparer votre oral du Baccalauréat.</p>
<p>Il vous suffit de commencer votre demande par les mots « Joue le rôle de ... » et ensuite ajouter autant de détails que possible. Si vous avez besoin d'inspiration, consultez <a href="https://prompts.chat/" hreflang="en" title="Prompts ChatGPT">ce dépôt</a> où vous trouverez des instructions pour faire en sorte que ChatGPT se comporte comme un professeur de Philosophie, un professeur de mathématiques, une console JavaScript et plus encore.</p>
<h3>Ajoutez de la personnalité à vos Prompts et générez du style</h3>
<p>Ces deux approches d'incitation sont bonnes lorsqu'il s'agit de générer du texte pour les e-mails, les blogs, les histoires, les articles, etc.</p>
<p>Tout d'abord, en « ajoutant de la personnalité à vos Prompts », je veux dire ajouter un style et des descriptions. L'ajout d'un style peut aider votre texte à obtenir un ton spécifique, une forme, un ton d'écrivain, et plus encore.</p>
<blockquote><p>Écrire <em>thème de sujet</em> dans le style d'un expert en <em>domaine d'expertise</em>, avec 10 ans d'expérience.</p></blockquote>
<p>Pour personnaliser encore plus le résultat, nous pouvons ajouter des descriptions. Une description est simplement un adjectif que vous pouvez ajouter pour améliorer votre Prompt.</p>
<p>Dites que vous voulez écrire un billet de blog sur la façon dont l'IA remplacera les humains. Si vous créez un Prompt standard avec les mots « écrivez un billet de blogs sur la façon dont l'IA remplacera les humains », vous obtiendriez probablement un billet très générique.</p>
<p>Cependant, si vous ajoutez les adjectifs tels que inspirant, sarcastique, intrigant et divertissant, la sortie changera considérablement.</p>
<p>Ajoutons des descriptions à notre prompt précédent:</p>
<blockquote><p>Rédige un article plein d'esprit pour mon blogs expliquant pourquoi l'IA ne remplacera pas les humains. Écrit dans le style d'un expert en intelligence artificielle avec plus de 10 ans d'expérience. Donne des explications à l'aide d'exemples amusants.</p>
<p></p></blockquote>
<p>Dans notre exemple, le style d'un expert en IA et des adjectifs tels que avec de l'esprit et de l'humour ajoutent une touche différente au texte généré par ChatGPT. Un effet secondaire de ceci est que notre texte sera difficile à détecter par les détecteurs d'IA.</p>
<p>Enfin, nous pouvons utiliser l'approche de la connaissance générée pour améliorer le billet du blog. Cela consiste à générer des informations potentiellement utiles sur un sujet avant de générer une réponse finale.</p>
<p>Par exemple, avant de générer le billet avec le Prompt précédent, nous pourrions d'abord générer des connaissances et seulement ensuite écrire le billet.</p>
<blockquote><p>Génère 5 faits sur le thème de « l'IA ne remplacera pas les humains »</p>
<p></p></blockquote>
<p>Une fois que nous avons les 5 faits, nous pouvons alimenter ces informations à l'autre demande afin d'écrire un meilleur billet pour mon blog.</p>
<p><img src="https://www.footcow.com/public/.IA_vs_humains_m.png" alt="IA vs humains.png, avr. 2023" style="display:table; margin:0 auto;" title="IA vs humains.png, avr. 2023" height="274" width="448" /></p>
<blockquote><p>Utilise les faits ci-dessus pour écrire un article pour mon blog, avec de l'esprit, sur les raisons pour lesquelles l'IA ne remplacera pas les humains. Écrit dans le style d'un expert en intelligence artificielle avec plus de 10 ans d'expérience. Donne des explications à l'aide d'exemples amusants.</p>
<p></p></blockquote>
<p>Vous verrez que le résultat est radicalement différent.</p>
<h3>Conclusion</h3>
<p>Voilà nous venons de faire un petite tour et surtout de simples démonstrations que le Prompt nécessite une bonne réflexion afin d'obtenir des résultats ou des réactions de l'IA plus évoluée que l'utilisation que vous en avez fait jusque là.</p>
<p>Amusez-vous bien avec ChatGPT.</p>https://www.footcow.com/index.php/post/2023/04/08/Savez-vous-utiliser-ChatGPT#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/113Coup d'oeil au Query Parallelismurn:md5:546e9b36f357f667075bc41513a065352022-10-09T16:55:00+02:002023-05-17T16:40:14+02:00footcowPostgreSQLoptimisationparallelismpostgresqlquery<p><img src="https://www.footcow.com/public/.Parallel_query_plan_m.png" alt="" style="display:table; margin:0 auto;" height="300" width="448" /></p>
<p>Le query parallelism est une fonctionnalité intégrée dans PostgreSQL depuis la <a href="https://www.postgresql.org/docs/9.6/release-9-6.html#AEN136292" hreflang="en" title="Parallelism annoucement">version 9.6</a> qui permet de diviser une requête complexe en plusieurs tâches parallèles qui sont exécutées simultanément. Cette fonctionnalité permet d'améliorer les performances en répartissant la charge de travail sur plusieurs cœurs de processeur.</p> <p>Supposons que nous avons une table "<code>orders</code>" contenant des commandes passées par des clients, avec une colonne "<code>total_amount</code>" contenant le montant total de la commande. Nous pouvons utiliser la fonction d'agrégation "<code>SUM</code>" pour calculer la somme de tous les montants de commande :</p>
<pre>
SELECT SUM(total_amount)
FROM orders;
</pre>
<p>Si la table contient des millions de lignes, le temps d'exécution peut être considérable. Cependant, si nous activons le query parallelism dans la configuration de PostgreSQL, la requête sera divisée en plusieurs tâches parallèles qui seront exécutées simultanément sur différents processeurs ou threads.</p>
<p>Pour activer le query parallelism dans PostgreSQL, nous devons définir la valeur du paramètre "<code>max_parallel_workers_per_gather</code>" dans le fichier postgresql.conf. Par exemple, si nous voulons utiliser jusqu'à 4 travailleurs parallèles, nous pouvons définir la valeur comme suit :</p>
<pre>
max_parallel_workers_per_gather = 4
</pre>
<p>Après avoir redémarré le serveur PostgreSQL, nous pouvons exécuter la même requête :</p>
<pre>
SELECT SUM(total_amount)
FROM orders;
</pre>
<p>Cette fois-ci, la requête sera divisée en plusieurs tâches parallèles qui seront exécutées simultanément sur différents processeurs ou threads, ce qui permettra d'obtenir des résultats beaucoup plus rapidement que si la requête avait été exécutée séquentiellement.</p>
<p>Depuis psql vous pouvez également au besoin, modifier la valeur du max_parallel_workers_per_gather via la commande :</p>
<pre>
SET max_parallel_workers_per_gather=6;
</pre>
<p>Ce changement ne sera en revanche pris en compte pour que la session en cours sur votre console psql, mais pas pour l'intégralité du serveur. Il faut impérativement passer par le fichier postgresql.conf et un reload de la configuration pour la prise en compte globale du réglage.</p>
<p>De nombreuses évolution ont été apportées au features du parallélisme sur les releases de PostgreSQL comme le support des parcours des index B-Tree, les merges des jointures peuvent s'appuyer également sur cette feature ou encore la création des index depuis la version 11, la version 14 apportant des optimisations incroyables.</p>
<p>Il est important de noter que le query parallelism ne peut pas être appliqué à toutes les requêtes et qu'il peut y avoir des coûts supplémentaires associés à la synchronisation des résultats des tâches parallèles. Cependant, dans de nombreux cas, l'utilisation du query parallelism peut grandement améliorer les performances des requêtes sur de grandes tables de données.</p>https://www.footcow.com/index.php/post/2022/10/09/Coup-d-oeil-au-Query-Parallelism#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/120Comment configurer un pool de minage XMR avec p2pool : un guide détailléurn:md5:a7b3cf2981c9b89ee2ffb0cd72b98b9f2022-10-02T20:25:00+02:002023-05-17T23:25:18+02:00footcowCrypto-monnaiesmonerop2poolXMRxmrig<p><img src="https://www.footcow.com/public/p2pool.jpg" alt="" style="display:table; margin:0 auto;" height="187" width="270" />
Dans l'univers du minage de cryptomonnaies, le terme "pool de minage" fait référence à un groupe de mineurs qui combinent leur puissance de calcul pour augmenter leurs chances de gagner des récompenses de minage. Aujourd'hui, nous allons examiner comment configurer votre propre pool de minage en utilisant l'application p2pool pour miner du Monero (XMR).</p> <p><br /></p>
<h4>Pourquoi un pool de minage ?</h4>
<p>Le minage de cryptomonnaies est un processus compétitif. Plus la puissance de calcul (ou hashrate) d'un mineur est élevée, plus ses chances de résoudre le prochain bloc et de gagner la récompense sont grandes. Cependant, pour le mineur individuel, la probabilité de résoudre un bloc avant tout le reste du réseau est généralement assez faible. C'est là que les pools de minage entrent en jeu. En combinant leur <a href="https://coinacademy.fr/academie/bitcoin-hashrate-niveau-difficulte-difficulty/" hreflang="fr" title="Hasrate">hashrate</a>, les mineurs augmentent leurs chances de résoudre des blocs, et les récompenses sont ensuite partagées entre les membres du pool en fonction de la puissance de calcul qu'ils ont contribué.</p>
<p><br /></p>
<h4>Mise en place technique d'un pool de minage avec p2pool</h4>
<p>1. <strong>Installation de monerod</strong> : monerod est un démon, une application incluse dans la suite Monero. C'est un programme en ligne de commande qui gère la chaîne de blocs. Tandis que le portefeuille Bitcoin gère à la fois un compte et la chaîne de blocs, Monero sépare ces composants : monerod gère la chaîne de blocs, et <a href="https://www.getmonero.org/fr/resources/user-guides/monero-wallet-cli.html" hreflang="en" title="Monero Wallet">monero-wallet-cli</a> gère le compte.
Il faut donc installer cet outil depuis le site <a href="https://github.com/monero-project/monero/releases/tag/v0.18.2.2" hreflang="en" title="monerod">GitHub de Monero</a>. Vous téléchargez la version qui correspond à votre OS. Ouvrez une fenêtre de terminal et naviguez jusqu'au répertoire où vous avez téléchargé monero. Puis décompressez l'archive dans un répertoire de votre choix. Et vous exécutez la commande suivante :</p>
<pre>
./monerod --zmq-pub tcp://127.0.0.1:18083 --out-peers 64 --in-peers 32 --add-priority-node=node.supportxmr.com:18080 --add-priority-node=nodes.hashvault.pro:18080 --disable-dns-checkpoints --enable-dns-blocklist
</pre>
<p><code>out-peers 64 et in-peers 32</code>sont nécessaires pour le premier avoir de nombreuses connexions à d'autres nœuds et le second pour limiter le nombre de connexions entrantes car il peut croître de manière incontrôlable et causer des problèmes lorsqu'il dépasse 1000 (limite de fichiers ouverts sous Linux). Si la bande passante de téléchargement de votre connexion réseau est inférieure à 10 Mbit, utilisez <code>out-peers 16 et in-peers 8</code> à la place.</p>
<p><code>add-priority-node=node.supportxmr.com:18080 et add-priority-node=nodes.hashvault.pro:18080</code> sont nécessaires pour garantir le bon fonctionnement des nœuds dans vos pairs connectés.</p>
<p><code>disable-dns-checkpoints</code> est nécessaire pour éviter les décalages périodiques lors de la mise à jour du DNS (il n'est pas nécessaire lors de l'extraction).
<code>enable-dns-blocklist</code> est nécessaire pour interdire les nœuds défectueux connus.</p>
<p>2. <strong>Installation de p2pool</strong> : L'étape suivante consiste à installer p2pool sur votre ordinateur. Vous pouvez télécharger le logiciel sur le dépôt GitHub de <a href="https://github.com/SChernykh/p2pool" hreflang="en" title="p2pool">p2pool</a>. Une fois le téléchargement terminé, vous devrez extraire le fichier gz ou zip dans un répertoire de votre choix et correspondant à votre système d'exploitation Linux, Windows, freeBSD, ou enfin macOS.</p>
<p>Ensuite, vous devrez exécuter p2pool avec la commande appropriée :</p>
<pre>
./p2pool --host 127.0.0.1 --wallet ADRESSE_DE_VOTRE_WALLET
</pre>
<p>Et le tour est joué, votre pool XMR est fonctionnel. Il va commencé par mettre à jour votre environnement avec la blockchain, ce qui pour le premier lancement peut prendre quelques longues minutes.</p>
<p>3. <strong>Configuration du client de minage</strong> : Vous devrez ensuite configurer votre logiciel de minage pour se connecter à p2pool. Les détails spécifiques varient en fonction du logiciel de minage que vous utilisez, mais en général, vous devrez entrer l'adresse IP de votre ordinateur. Personnellement j'utilise xmrig que vous pouvez télécharger sur son <a href="https://github.com/xmrig/xmrig" hreflang="en" title="xmrig">GitHub</a>. Comme précédemment, vous choisissez la version qui correspond à votre OS. Une fois le téléchargement terminé et décompressé dans un 3e terminal et exécutez :</p>
<pre>
./xmrig -o 127.0.0.1:3333
</pre>
<p>Vous pouvez définir une difficulté personnalisée pour votre mineur afin d'obtenir des statistiques plus précises du côté p2pool :</p>
<pre>
./xmrig -o 127.0.0.1:3333 -u x+50000
</pre>
<p>(cela n'affecte en rien les récompenses minières)</p>
<p><br /></p>
<h4>Recommandations</h4>
<ul>
<li>Il est fortement recommandé de créer un compte d'utilisateur restreint séparé (dans votre système d'exploitation) pour l'exploitation minière. Bien que p2pool ait été testé depuis longtemps, tout logiciel peut avoir des bogues/vulnérabilités inconnus.</li>
<li>Vous devez utiliser une adresse de portefeuille principale pour le minage. Les sous-adresses et les adresses intégrées ne sont pas prises en charge, tout comme avec l'extraction en solo de monerod.</li>
<li>Vous pouvez ajouter le paramètre <code>--mini</code> à votre commande P2Pool pour vous connecter à la sidechain p2pool-mini. Notez que cela changera également le port p2p par défaut de 37889 à 37888.</li>
<li>Vérifiez que les ports 18080 (port Monero p2p) et 37889/37888 (port P2Pool/P2Pool mini p2p) sont ouverts dans votre pare-feu pour assurer une meilleure connectivité. Si vous exploitez un ordinateur derrière un NAT (comme un routeur), vous pouvez envisager de transférer les ports vers votre ordinateur local.</li>
<li>Vous pouvez connecter plusieurs mineurs au même nœud p2pool. Plus il y en a, mieux c'est !</li>
<li>Les étapes ci-dessous supposent que vous exécutez tout sur la même machine. Si ce n'est pas le cas, remplacez 127.0.0.1 par les adresses IP appropriées pour votre configuration.</li>
<li>Il est fortement recommandé de créer un nouveau portefeuille principal pour le minage p2pool car les adresses de portefeuille sont publiques sur p2pool.</li>
</ul>
<p><br /></p>
<h4>Outils de supervision et de suivi des gains</h4>
<p>Pour suivre les gains de votre minage, vous pouvez utiliser un explorateur de blocs pour la cryptomonnaie que vous minez. Il vous suffit d'entrer l'adresse de votre portefeuille, et l'explorateur de blocs affichera toutes les transactions entrantes. Visitez Monero <a href="https://mini.p2pool.observer/" hreflang="en">MINI.P2Pool.Observer</a>, recommandé pour les pools avec peu de miners ou <a href="https://p2pool.observer/" hreflang="en">P2Pool.Observer</a>.</p>
<p>Pour rendre votre pool de minage public, vous devrez configurer votre routeur pour rediriger les connexions entrantes sur le port p2pool vers votre ordinateur. Cette opération, appelée "port forwarding", varie en fonction de votre routeur, donc vous devrez consulter le manuel de votre routeur pour des instructions spécifiques.
<br /></p>
<h4>Quelle crypto-monnaie miner sur des ordinateurs de bureau classiques ?</h4>
<p>Si vous utilisez des ordinateurs de bureau classiques pour miner, il serait plus judicieux de vous concentrer sur des cryptomonnaies qui peuvent être minées efficacement avec des processeurs (CPU) ou des cartes graphiques (GPU). Monero (XMR) est un exemple de cryptomonnaie qui peut être minée efficacement avec des CPU. Pour le minage avec des GPU, des cryptomonnaies comme DOGE ou Ravencoin (RVN) peuvent être de bons choix.
<br /></p>
<h4>Conseils supplémentaires</h4>
<ul>
<li>Considérez l'électricité : Le minage de cryptomonnaies consomme beaucoup d'électricité. Assurez-vous de prendre en compte le coût de l'électricité lors du calcul de la rentabilité du minage.</li>
</ul>
<ul>
<li>Sécurité : Assurez-vous que votre système est sécurisé. Cela comprend la mise en place de pare-feu, la mise à jour régulière de vos logiciels et la vérification de l'intégrité de vos logiciels de minage.</li>
</ul>
<ul>
<li>Participation à la communauté : La participation à la communauté de minage peut être très bénéfique. Vous pouvez apprendre de l'expérience des autres mineurs et obtenir de l'aide en cas de problème.</li>
</ul>
<p>En conclusion, la mise en place d'un pool de minage peut être un projet passionnant et potentiellement rentable si vous êtes prêt à investir le temps et les ressources nécessaires. Comme toujours, faites vos propres recherches et assurez-vous de comprendre ce que vous faites avant de vous lancer. Bon minage !</p>https://www.footcow.com/index.php/post/2023/05/17/Comment-configurer-un-pool-de-minage-avec-p2pool-%3A-un-guide-d%C3%A9taill%C3%A9#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/129La réplication logique dans PostgreSQLurn:md5:2fd402d3453ceebd9ac6b5bb16b87ab42022-09-25T19:30:00+02:002023-05-17T16:54:30+02:00footcowPostgreSQLpg_logicalpostgresqlreplication<p><img src="https://www.footcow.com/public/.logical_replication_m.png" alt="" style="display:table; margin:0 auto;" height="321" width="448" /></p>
<p>PostgreSQL intègre depuis la version 9.4 un système de réplication logique, elle l'a rendu accessible à tous véritablement depuis la <a href="https://www.postgresql.org/docs/10/release-10.html" hreflang="en" title="Postgresql 10 release note">version 10</a> avec les fonctions de publication et d'abonnement. Mais avant tout, qu'est-ce que la réplication logique ?</p> <p>La réplication logique dans PostgreSQL est un processus qui permet de copier les modifications de données d'un serveur PostgreSQL à un autre serveur PostgreSQL de manière sélective. Cette technique utilise le journal de transactions de la base de données pour capturer toutes les modifications apportées à la base de données, puis les réplique sur un autre serveur de base de données.</p>
<p>Le principal avantage de la réplication logique est sa flexibilité. Contrairement à la réplication physique, qui copie l'intégralité des données d'une base de données à une autre, la réplication logique permet de sélectionner les tables et les colonnes spécifiques à répliquer, en fonction des besoins de l'application.</p>
<p>Pour mettre en œuvre la réplication logique, PostgreSQL utilise des fonctionnalités appelées publications et abonnements. Les publications définissent les tables et les colonnes à répliquer, tandis que les abonnements spécifient les serveurs cibles de la réplication.</p>
<p>Voici un exemple concret d'utilisation de la réplication logique dans PostgreSQL :</p>
<p>Supposons que vous ayez une application web qui utilise une base de données PostgreSQL pour stocker les données des utilisateurs. Vous souhaitez mettre en place une réplication logique pour copier les données utilisateur vers un autre serveur PostgreSQL, qui servira de serveur de sauvegarde.</p>
<p>Dans PostgreSQL, vous pouvez créer une publication pour sélectionner les tables utilisateur à répliquer, ainsi que les colonnes spécifiques telles que le nom, l'adresse e-mail et le numéro de téléphone. Vous pouvez ensuite créer un abonnement sur le serveur de sauvegarde pour recevoir les modifications apportées aux données utilisateur.</p>
<p>En cas de défaillance du serveur principal, vous pouvez alors basculer vers le serveur de sauvegarde pour continuer à fournir des services à vos utilisateurs, en utilisant les données de sauvegarde les plus récentes.</p>
<p>En résumé, la réplication logique est une fonctionnalité puissante et flexible de PostgreSQL qui permet de répliquer sélectivement les données d'un serveur PostgreSQL à un autre. Elle offre une haute disponibilité et une tolérance aux pannes, ainsi qu'une méthode efficace pour la sauvegarde des données. J'espère que cette explication vous a été utile pour comprendre le principe de la réplication logique dans PostgreSQL.</p>https://www.footcow.com/index.php/post/2022/09/25/La-r%C3%A9plication-logique-dans-PostgreSQL#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/119Monero : la cryptomonnaie reine de la confidentialitéurn:md5:edadd7b5e8d87ecb58d364f8f10e29142022-08-28T17:30:00+02:002023-05-17T16:56:06+02:00footcowCrypto-monnaiescryptominingmonero<p><img src="https://www.footcow.com/public/.monero-symbol-on-white-480_m.png" alt="" style="display:table; margin:0 auto;" height="448" width="448" /></p>
<p>Permettez-moi de vous présenter <a href="https://www.getmonero.org/" hreflang="en" title="Monero">Monero</a> (XMR), une cryptomonnaie qui se distingue par son engagement en faveur de la confidentialité et de l'anonymat.</p> <h4>Qu'est-ce que Monero ?</h4>
<p>Monero est une cryptomonnaie open-source axée sur la confidentialité, l'anonymat et la décentralisation. Elle utilise une technologie appelée "cryptographie à preuve à divulgation nulle de connaissance" pour garantir que toutes les transactions sont 100% intraçables. Contrairement à Bitcoin, où les transactions sont transparentes et peuvent être tracées à leur source, Monero brouille les pistes, rendant la source, la destination et le montant de chaque transaction privés.</p>
<h4>Création de Monero</h4>
<p>Monero a été créé en avril 2014. Il a été lancé par un utilisateur de Bitcointalk connu sous le pseudonyme de "thankful_for_today". Il s'agit d'un fork d'un projet appelé <a href="https://bytecoin.org/" hreflang="en" title="Bytecoin">Bytecoin</a>, qui était le premier à utiliser l'algorithme CryptoNote pour garantir l'anonymat des transactions. Après quelques désaccords au sein de la communauté Bytecoin, le projet a été forké et renommé "Bitmonero", qui a ensuite été raccourci en "Monero".</p>
<h4>Utilisations de Monero</h4>
<p>Les utilisations de Monero sont essentiellement les mêmes que celles de toutes autres cryptomonnaies : vous pouvez l'utiliser pour acheter des biens et des services, l'envoyer à d'autres utilisateurs, l'échanger contre d'autres monnaies, etc. Là où Monero se distingue, c'est dans les situations où la confidentialité est une priorité. Par exemple, les utilisateurs qui souhaitent faire des dons à des organisations controversées peuvent choisir de le faire en Monero pour garder leur identité secrète.</p>
<h4>Comment miner du Monero ?</h4>
<p>Monero utilise un algorithme de preuve de travail appelé <a href="https://academy.bit2me.com/fr/que-algoritmo-mineria-randomx-monero/" hreflang="fr" title="RandomX">RandomX</a>, qui est optimisé pour être miné sur des processeurs centraux (CPU). Cela signifie que vous pouvez miner du Monero sur un ordinateur ordinaire, bien que l'utilisation de serveurs avec plusieurs processeurs puissants soit plus efficace.</p>
<p>Il existe plusieurs logiciels de minage compatibles avec Monero, dont <a href="https://xmrig.com/" hreflang="en" title="Xmrig">XMRig</a> et <a href="https://github.com/fireice-uk/xmr-stak/releases" hreflang="en" title="XMR-Stak">XMR-Stak</a>. Vous pouvez miner en solo ou rejoindre un pool de minage, ce dernier étant généralement plus rentable pour les mineurs avec moins de matériel.</p>
<h4>Rentabilité du minage de Monero</h4>
<p>La rentabilité du minage de Monero dépend de plusieurs facteurs, dont le coût de l'électricité, la puissance de votre matériel de minage et le taux de hachage du réseau Monero. En général, le minage de Monero est moins rentable que le minage de cryptomonnaies plus populaires comme Bitcoin ou Ethereum, mais il est aussi plus accessible.</p>
<h4>Où échanger du Monero ?</h4>
<p>Monero est disponible sur plusieurs plateformes d'échange de cryptomonnaies, dont <a href="https://www.binance.com/en/activity/referral-entry/CPA?ref=CPA_00I10APUMC" hreflang="fr" title="Binance">Binance</a>. Cependant, en raison de sa nature axée sur la confidentialité, Monero a parfois été associé à des activités illicites, ce qui a conduit certaines plateformes à hésiter à le lister.</p>
<p>Toutefois, il est important de noter que la confidentialité offerte par Monero a de nombreuses utilisations légitimes. Pour de nombreux utilisateurs, la possibilité de faire des transactions privées est simplement une question de liberté personnelle. De plus, dans des régions du monde où les gouvernements sont instables ou oppressifs, Monero peut offrir un moyen sécurisé de transfert de valeur.</p>
<h4>Conclusion</h4>
<p>Monero est une cryptomonnaie unique qui offre une véritable confidentialité et anonymat à ses utilisateurs. Alors que la plupart des autres cryptomonnaies sont transparentes, Monero assure la confidentialité des transactions, ce qui en fait un outil puissant pour quiconque valorise la vie privée financière. Que vous souhaitiez miner du Monero, l'échanger, ou simplement l'utiliser pour préserver votre confidentialité, Monero est une option à considérer dans le paysage des cryptomonnaies.</p>https://www.footcow.com/index.php/post/2022/08/28/Monero-%3A-la-cryptomonnaie-reine-de-la-confidentialit%C3%A9#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/127Les Common Table Expressions (CTE)urn:md5:3f18d90a9d103939800714583e161f902022-05-08T22:46:00+02:002023-05-17T16:57:32+02:00footcowPostgreSQLctepostgresqlselect<p><img src="https://www.footcow.com/public/.What-is-CTE-in-PostgreSQL_m.png" alt="" style="display:table; margin:0 auto;" height="242" width="448" /></p>
<p>Les CTE sont un moyen pratique de définir des sous-requêtes réutilisables dans une requête principale. Les CTE sont similaires aux vues, mais contrairement aux vues, elles ne sont pas stockées en permanence dans la base de données. Au lieu de cela, elles sont définies dans la requête elle-même et ne peuvent être référencées que dans la requête qui les contient.</p> <p>L'objectif principal des CTE est de simplifier la requête et de la rendre plus facile à comprendre en divisant la requête en parties plus petites. Les CTE sont particulièrement utiles pour les requêtes complexes impliquant des jointures multiples, des filtres et des regroupements.</p>
<p>Voici un exemple concret d'utilisation de CTE : supposons que vous ayez une table de ventes avec des colonnes pour les dates de vente, le produit vendu et le chiffre d'affaires de chaque vente. Vous voulez créer une requête qui renvoie le chiffre d'affaires total pour chaque produit, mais vous voulez également inclure une colonne qui montre le pourcentage de chiffre d'affaires que chaque produit représente pour l'ensemble des ventes.</p>
<p>Voici la requête que vous pouvez utiliser avec une CTE pour accomplir cela :</p>
<pre>
WITH total_sales AS (
SELECT SUM(sales_amount) as total_sales
FROM sales
)
SELECT product, SUM(sales_amount) as product_sales,
(SUM(sales_amount) / total_sales.total_sales) * 100 as percentage_total_sales
FROM sales, total_sales
WHERE sales.date >= '2022-01-01'
GROUP BY product, total_sales.total_sales
ORDER BY percentage_total_sales DESC;
</pre>
<p>Dans cet exemple, la CTE est la première partie de la requête qui calcule le chiffre d'affaires total de toutes les ventes. Cette CTE est ensuite utilisée dans la requête principale pour calculer le chiffre d'affaires pour chaque produit, ainsi que le pourcentage de chiffre d'affaires qu'il représente pour l'ensemble des ventes.</p>
<p>Il est également possible d'enchainer plusieurs CTE dans une même requête :</p>
<pre>
WITH
cte1 AS (
SELECT id, name
FROM table1
WHERE id > 100
),
cte2 AS (
SELECT id, value
FROM table2
WHERE value > 50
)
SELECT cte1.name, cte2.value
FROM cte1
JOIN cte2 ON cte1.id = cte2.id;
</pre>
<p>Dans cet exemple, simple, nous créons deux CTE, cte1 et cte2. cte1 sélectionne toutes les lignes de table1 avec un id supérieur à 100 et renvoie les colonnes id et name. cte2 sélectionne toutes les lignes de table2 avec une valeur supérieure à 50 et renvoie les colonnes id et value.</p>
<p>Ensuite, nous effectuons une jointure entre cte1 et cte2 sur la colonne id pour récupérer les noms de table1 et les valeurs de table2 qui correspondent aux mêmes identifiants.</p>
<p>L'utilisation de plusieurs CTE dans la même requête peut être utile pour diviser une requête complexe en plusieurs parties plus gérables et réutilisables. Cela peut également améliorer la lisibilité de la requête en la rendant plus modulaire.</p>
<p>En résumé, les CTE sont une fonctionnalité utile pour les requêtes complexes qui nécessitent des sous-requêtes réutilisables. Elles peuvent simplifier la requête, la rendre plus facile à comprendre et à maintenir, et vous permettre de diviser une requête en parties plus petites pour une meilleure organisation.</p>https://www.footcow.com/index.php/post/2022/05/08/Les-Common-Table-Expressions-%28CTE%29#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/116la clause SEARCH dans un SELECT récursifurn:md5:92f2085b7a5905a849c83e9ee43f30fb2021-11-21T12:01:00+01:002023-04-12T11:14:34+02:00footcowPostgreSQLpostgresqlrecursivesearch<p>Toujours dans les nouvelles syntaxes apparues dans la <a href="https://www.postgresql.org/docs/14/release-14.html" hreflang="en" title="Postgresql 14 release note">release 14</a> de PostgreSQL autour de la récursivité et après avoir vu la clause <a href="https://www.footcow.com/index.php/post/2021/11/11/La-clause-optionnelle-CYCLE-dans-un-SELECT-r%C3%A9cursif" hreflang="fr" title="Clause CYCLE">CYCLE</a> dans un précédent article, nous allons étudier la clause <code>SEARCH</code>.</p> <p>La clause <code>SEARCH</code> est une clause optionnelle que l'on peut ajouter à un <code>SELECT</code> récursif pour spécifier une condition de recherche. Elle permet de filtrer les résultats de la requête en utilisant une condition supplémentaire.</p>
<p>L'objectif de la clause <code>SEARCH</code> est de permettre de limiter les résultats d'un <code>SELECT</code> récursif. Elle permet de spécifier une condition qui doit être vérifiée pour que les résultats soient inclus dans la requête.</p>
<p>Voici un exemple concret d'utilisation de la clause <code>SEARCH</code> dans un <code>SELECT</code> récursif :</p>
<p>Supposons que nous ayons une table "<code>employees</code>" qui contient les informations sur les employés d'une entreprise. Cette table contient une colonne "<code>manager_id</code>" qui indique le manager de chaque employé.</p>
<p>Nous pouvons utiliser un <code>SELECT</code> récursif pour récupérer tous les employés qui sont gérés par un certain manager. Nous pouvons également utiliser la clause <code>SEARCH</code> pour filtrer les résultats afin de ne récupérer que les employés qui ont un certain titre.</p>
<p>Voici un exemple de requête qui utilise la clause <code>SEARCH</code> :</p>
<pre>
WITH RECURSIVE employee_tree AS (
SELECT id, name, manager_id, title
FROM employees
WHERE id = 1
UNION ALL
SELECT e.id, e.name, e.manager_id, e.title
FROM employees e
JOIN employee_tree et ON e.manager_id = et.id
WHERE e.title SEARCH 'Manager'
)
SELECT *
FROM employee_tree;
</pre>
<p>Dans cet exemple, nous utilisons la clause <code>SEARCH</code> pour filtrer les résultats de la requête pour ne récupérer que les employés qui ont un titre qui contient le mot "<code>Manager</code>". Cette clause est ajoutée à la deuxième partie de la requête <code>SELECT</code> récursive.</p>
<p>En conclusion, la clause <code>SEARCH</code> est une option utile pour limiter les résultats d'un <code>SELECT</code> récursif en utilisant une condition supplémentaire. Elle permet de filtrer les résultats de la requête en fonction de critères spécifiques, ce qui peut être très utile dans les requêtes complexes sur des hiérarchies ou des arbres de données.</p>https://www.footcow.com/index.php/post/2021/11/21/la-clause-SEARCH-dans-un-SELECT-r%C3%A9cursif#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/118La clause optionnelle CYCLE dans un SELECT récursifurn:md5:3359a1cc7096a02d10a9eb357d2d60bd2021-11-11T20:54:00+01:002023-05-17T17:01:03+02:00footcowPostgreSQLcyclepostgresqlrecursive<p><img src="https://www.footcow.com/public/.postgresql-cycle_m.png" alt="" style="display:table; margin:0 auto;" height="299" width="448" /></p>
<p>Tout d'abord, voyons ce qu'est un <code>SELECT</code> récursif. Il s'agit d'une requête qui se réfère à elle-même dans la clause <code>FROM</code> pour produire une série de résultats itératifs. Cette fonctionnalité est souvent utilisée pour parcourir des structures de données hiérarchiques telles que les arbres.</p> <p>Maintenant, parlons de la clause <code>CYCLE</code> disponible depuis <a href="https://www.postgresql.org/docs/14/release-14.html" hreflang="en" title="PostgreSQL 14 release note">PostgreSQL 14</a>. Elle est optionnelle et peut être utilisée dans les <code>SELECT</code> récursifs pour détecter les cycles dans la hiérarchie des données. En d'autres termes, si une boucle se produit dans la hiérarchie, la clause <code>CYCLE</code> permet de signaler l'erreur et d'empêcher la requête de boucler indéfiniment.</p>
<p>Supposons que nous avons une table "<code>employees</code>" avec une colonne "<code>manager_id</code>" qui fait référence à l'ID du manager de chaque employé. Nous voulons récupérer tous les managers et leurs subordonnés, en utilisant un <code>SELECT</code> récursif.</p>
<p>Voici la requête que nous pourrions utiliser :</p>
<pre>
WITH RECURSIVE manager_tree AS (
SELECT id, name, manager_id
FROM employees
WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, e.manager_id
FROM employees e
JOIN manager_tree m ON e.manager_id = m.id
CYCLE id
)
SELECT *
FROM manager_tree;
</pre>
<p>Dans cette requête, la clause <code>CYCLE</code> est utilisée pour empêcher une boucle infinie. Si nous n'utilisions pas la clause <code>CYCLE</code>, la requête bouclerait indéfiniment car elle essaierait de récupérer les employés dont les managers sont leurs propres subordonnés.</p>
<p>En ajoutant la clause <code>CYCLE</code>, nous spécifions que la colonne "<code>id</code>" doit être vérifiée pour détecter les cycles dans la hiérarchie des managers. Si un cycle est détecté, la requête s'arrête à ce niveau-là.</p>
<p>En utilisant cette requête, nous obtenons une liste de tous les managers et de leurs subordonnés, avec une colonne supplémentaire "<code>id</code>" qui indique si un cycle a été détecté dans la hiérarchie des managers.</p>
<p>J'espère que cette explication a été utile pour comprendre le fonctionnement de la clause <code>CYCLE</code> dans un <code>SELECT</code> récursif de PostgreSQL.</p>https://www.footcow.com/index.php/post/2021/11/11/La-clause-optionnelle-CYCLE-dans-un-SELECT-r%C3%A9cursif#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/117Mieux comprendre le principe du LATERAL JOINurn:md5:c264b311762cd116b47dedd7bb3bc4672021-09-24T21:15:00+02:002023-05-17T17:04:24+02:00footcowPostgreSQLjointurelateralpostgresql<p><img src="https://www.footcow.com/public/lateral-join.webp" alt="" style="display:table; margin:0 auto;" height="239" width="239" /></p>
<p>Le <code>LATERAL JOIN</code> est une extension puissante de la clause <code>JOIN</code> standard dans PostgreSQL. Contrairement à un <code>JOIN</code> normal, qui combine les lignes de deux tables en fonction d'une condition de jointure, un <code>LATERAL JOIN</code> permet de combiner les lignes d'une table avec les résultats d'une requête sur une autre table.</p> <p>L'objectif du <code>LATERAL JOIN</code> est d'effectuer une requête sur une table qui peut utiliser des données de la table précédente. Cela peut être utile lorsque vous avez besoin de calculer des agrégats pour chaque ligne d'une table, ou lorsque vous avez besoin de faire une jointure qui dépend des données d'une table précédente.</p>
<p>Voici un exemple simple pour illustrer cela.
Supposons que vous ayez deux tables : une table "<code>employees</code>" qui contient les informations de base sur chaque employé, et une table "<code>sales</code>" qui contient les données de vente pour chaque employé. Vous souhaitez obtenir le nombre de ventes pour chaque employé.</p>
<p>Une requête de jointure normale ne suffirait pas, car vous avez besoin d'effectuer une agrégation pour chaque employé. C'est là que le <code>LATERAL JOIN</code> intervient. Voici comment vous pouvez utiliser le <code>LATERAL JOIN</code> pour obtenir le nombre de ventes pour chaque employé :</p>
<pre>
SELECT employees.name, sales.num_sales
FROM employees
LEFT JOIN LATERAL (
SELECT COUNT(*) AS num_sales
FROM sales
WHERE sales.employee_id = employees.id
) AS sales ON true;
</pre>
<p>Dans cet exemple, nous utilisons un <code>LATERAL JOIN</code> pour exécuter une requête sur la table "<code>sales</code>" pour chaque employé dans la table "<code>employees</code>". La requête retourne le nombre de ventes pour chaque employé, qui est ensuite joint à la table "<code>employees</code>".</p>
<p>Un autre exemple d'utilisation courante du <code>LATERAL JOIN</code> est lors de l'utilisation de fonctions qui renvoient des ensembles de résultats. Supposons que vous ayez une table "<code>orders</code>" qui contient des informations sur les commandes, et une fonction "<code>get_items(order_id)</code>" qui renvoie tous les articles pour une commande donnée. Vous pouvez utiliser un <code>LATERAL JOIN</code> pour joindre les résultats de la fonction "<code>get_items</code>" à chaque ligne de la table "<code>orders</code>".</p>
<pre>
SELECT *
FROM orders
LEFT JOIN LATERAL get_items(order_id) AS items ON true;
</pre>
<p>Ceci renvoie une table contenant toutes les commandes, avec une ligne pour chaque article associé à chaque commande.</p>
<p>En conclusion, le <code>LATERAL JOIN</code> est un outil puissant et flexible pour effectuer des requêtes complexes dans PostgreSQL. Il vous permet de combiner les résultats d'une requête avec les données d'une autre table, ce qui peut être utile pour calculer des agrégats pour chaque ligne d'une table ou pour effectuer une jointure qui dépend des données d'une table précédente.</p>https://www.footcow.com/index.php/post/2021/09/24/Mieux-comprendre-le-principe-du-LATERAL-JOIN#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/115D'où proviennent les index INVALID ?urn:md5:2d4093f05030775d239ba061f8148fc92020-05-17T14:41:00+02:002023-05-17T17:07:10+02:00footcowPostgreSQL<p><img src="https://www.footcow.com/public/.indexes-postgres_m.jpg" alt="" style="display:table; margin:0 auto;" height="298" width="448" /></p>
<p>Cela ne vous est peut-être pas encore arrivé, ou vous lisez peut-être cet article pour juste chercher à comprendre ce que sont ces index INVALID car vous venez de les découvrir sur votre environnement.</p>
<p>Après de longues années d'utilisation de PostgreSQL je n'avais pas encore été confronté à ce phénomène. Il m'est apparu dans plusieurs cas de figure que nous allons rapidement détailler et surtout solutionner, enfin par les méthodes que j'ai pu trouver de mon côté.</p> <h3>Premier cas de figure qui se croisent également avec un autre cas de figure sur une table en production.</h3>
<p>J'ai récupéré un fichier de plusieurs To de données à importer en base, avec des contenus par fois un peu fantasques. Une fois ces données importées, j'ai voulu indexer certains champs, et je me suis trouvé confronté au refus de PostgreSQL de créer tout simplement ces index. La taille des données dans le champ de type <code>TEXT</code> dépassant les <strong>8191 octets</strong> autorisés.</p>
<p>Sur mon autre base en production, j'ai également eu le souci, mais cette fois après coup ... Je stocke dans cette table une énorme chaine de caractère qui me permet de monter dynamiquement des requêtes SQL croisées. Un index à double entrée utilisait ce champ. Et j'ai vu un jour mes performances baisser et la charge de ma base de données tout à coup augmenter. Après analyse, il s'avérait que des index étaient devenus <strong>INVALID</strong>.</p>
<p>Alors pourquoi je vous parle de ces deux exemples différents, l'un a l'indexation, l'autre sur une index existant ? Tout simplement parce que la cause en est la même: les données dépassent la taille maximale en octet soit <strong>8191 octets</strong>.</p>
<p>Comment donc faire pour trouver les enregistrements qui posent problème :</p>
<pre>
SELECT id_my_table
FROM my_table
WHERE octet_length(label) > 8191;
</pre>
<p>Cette requête va donc nous donner tous les enregistrement qui dépassent la taille autorisée.</p>
<p>Ensuite, libre à vous en fonction de l'importance des données d'agir comme bon vous semble. Soit en supprimant ces enregistrement, ce que j'ai fait dans mon premier cas, mais parce que ces données étaient véritablement inexploitables.</p>
<p>Soit comme pour mon deuxième cas, en conservant les données, mais en indexant non plus son contenu, mais un nouveau champ ajouté à la table qui contient le <strong>hash MD5</strong> de ces données. Cela permet de toujours garder la données en elle-même, mais de supprimer radicalement cet index, et de le déplacer sur une chaine plus efficace pour PostgreSQL.</p>
<h3>Autre cas de figure plus malicieux je trouve, car lié à un nouvelle fonctionnalité de PostgreSQL, le cas de la création d'un index unique concurrent.</h3>
<p>Vous pouvez depuis quelque temps déjà créer des index sans bloquer l'accès à la table sur laquel vous apposez cet index.</p>
<p>Par une commande du type :</p>
<pre>
CREATE UNIQUE INDEX CONCURRENTLY ON my_table (login)
</pre>
<p>PostgreSQL va alors dans un premier temps faire un passage sur toute la table pour créer l'index, puis lancer une seconde passe pour les données ajoutées ou modifiées depuis la fin du premier passage. Cela fonctionne dans la majorité des cas, mais si on ajoute une données qui pourrait faire doublon de cette clé entre les deux étapes, que va-t-il se passer ? PostgreSQL va arrêter la création de l'index et il sera donc marqué <strong>INVALID</strong>.</p>
<p>Un point important à comprendre c'est que dès lors que votre index est marqué comme <strong>INVALID</strong>, PostgreSQL ne s'en servira plus du tout, mais il sera toujours mis à jour comme les autres index.</p>
<p>La solution pour ce cas sera donc, soit de lancer un <code>REINDEX</code>, mais qui va bloquer l'accès à votre table en écriture. La meilleure solution serait de supprimer l'index via <code>DROP INDEX</code>, corriger le problème d'unicité de la base de données, puis recréer votre index de la concurrente, en croisant les doigts pour qu'aucune données potentiellement dupliquée n'arrive dans cet espace temps.</p>
<h3>Comment détecter les index INVALID</h3>
<p>Voilà une requête qui vous permettra d'un seul coup d'oeil de trouver tous les index qui sont invalides dans votre base de données :</p>
<pre>
SELECT *
FROM pg_class
JOIN pg_index ON (pg_index.indexrelid = pg_class.oid)
WHERE pg_index.indisvalid = false;
</pre>
<p>En espérant avoir répondu à votre problématique sur PostgreSQL.</p>https://www.footcow.com/index.php/post/2020/05/17/D-o%C3%B9-provienne-les-index-INVALID#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/112Trouver si toutes vos clés étrangères sont indexéesurn:md5:3a25c4fa596b08050a729398ee6b583a2019-08-08T16:20:00+02:002023-05-17T17:08:52+02:00footcowPostgreSQL<p><img src="https://www.footcow.com/public/.foreign-key1_m.webp" alt="" style="display:table; margin:0 auto;" height="218" width="448" /></p>
<p>PostgreSQL comme toutes les bases de données modernes, permet de lier une table à une autre pour valider son intégrité. Ainsi vous n'aurez pas une table qui s'appuie sur les données d'une autre table sans cohérence. Vous ne pourrez donc écrire dans le champ utilisé en référence d'une autre table que des données qui existent bien dans la table de référence.
Cette possibilité est pratique, rassurante et surtout preuve d'une conception cohérente du modèle de données.
Mais, elle n'est pas sans impacte sur la vitesse de la base de données si les bons index ne sont pas placés sur ces champs. PostgreSQL vous laisse cette liberté. Cela peut donc engendrer parfois des surprises, en particulier quand on efface des données de la table de référence. L'absence d'index va engendrer un ralentissement considérable au moment du DELETE et donc vous pénaliser.</p> <p>J'ai donc trouvé une méthode qui permet de scanner toutes les tables et d'analyser tous les index manquants sur les clés étrangères de la base données.
Le résultat est classé par la taille des tables et donc les plus importantes à traiter en urgence :</p>
<pre>
--Trouver les index manquants
SELECT c.conrelid::regclass AS table,
/* liste des colonnes */
string_agg(a.attname, ',' ORDER BY x.n) AS columns,
pg_catalog.pg_size_pretty(pg_catalog.pg_relation_size(c.conrelid)) AS size,
c.conname AS constraint,
c.confrelid::regclass AS referenced_table
FROM pg_catalog.pg_constraint c
/* liste des clés par clés étrangères */
CROSS JOIN LATERAL unnest(c.conkey) WITH ORDINALITY AS x(attnum, n)
/* nom de chaque clé */
JOIN pg_catalog.pg_attribute a ON (a.attnum = x.attnum AND a.attrelid = c.conrelid) /* y-a-t-il un index qui correspond ? */
WHERE NOT EXISTS (SELECT 1
FROM pg_catalog.pg_index i
WHERE i.indrelid = c.conrelid
AND (i.indkey::smallint[])[0:cardinality(c.conkey)-1] @> c.conkey)
AND c.contype = 'f'
GROUP BY c.conrelid, c.conname, c.confrelid
ORDER BY pg_catalog.pg_relation_size(c.conrelid) DESC;
</pre>
<p><strong>Note:</strong> Vous n'êtes pas obligé de mettre un index quand la table de référence est trop petite, car l'index ne serait pas utilisé.</p>
<p>Merci à Laurenz Albe pour son aide précieuse sur ce sujet.</p>https://www.footcow.com/index.php/post/2019/08/08/Trouver-les-si-toutes-vos-cl%C3%A9s-%C3%A9trang%C3%A8res-sont-ind%C3%A9x%C3%A9es#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/111Effacer un gros volume de données sans tout bloquerurn:md5:52b2cf97b11878b1ca3d2af0d1fb524b2018-11-03T16:45:00+01:002023-05-17T17:10:37+02:00footcowPostgreSQLdeletepostgresqltransaction<p><img src="https://www.footcow.com/public/.Effacer-des-donnees_m.jpg" alt="" style="display:table; margin:0 auto;" height="336" width="448" /></p>
<p>Si vous possédez comme moi des tables contenant des dizaines de millions de données, et qui surtout pour certaines contiennent plus de 20 clefs étrangères, vouloir effacer quelques 4 millions de lignes peut engendrer quelques blocages sur votre production. Une solution consiste donc à effacer les données par blocs de tailles raisonnables pour ne pas bloquer l'accès en écriture à cette table.</p> <p>Pour cela PostgreSQL possède une astuce qui permet de contourner l'absence de transaction dans une fonction plPgsql, qui est elle même une transaction.</p>
<p><a href="https://www.postgresql.org/docs/10/static/contrib-dblink-connect.html" hreflang="en" title="DBLink">DBLink</a> Cette extension de PostgreSQL permet de se connecter à votre base de données depuis elle-même et de faire une transaction depuis cette connexion.</p>
<p>Ainsi, voilà un petit exemple de script qui va faire une boucle sur le volume de données à effacer, par lot de 100 records sans bloquer constamment l'accès en écriture à votre table, pour cela j'ai d'abord créé une table avec les identifiants uniques des données à effacer, avec un serial qui permettra de faire la boucle sur le volume de données :</p>
<pre>
DO
$do$
DECLARE _counter int := 1;
BEGIN
WHILE _counter < 3813142
LOOP
PERFORM dblink_connect('dblink_trans','dbname=mydb port=5432 user=postgres');
PERFORM dblink('dblink_trans','DELETE FROM mytable WHERE iduser IN (SELECT iduser FROM tablewithidtodelete where id between '|| _counter || ' and ' || _counter || ' + 100)');
PERFORM dblink('dblink_trans','COMMIT;');
PERFORM dblink_disconnect('dblink_trans');
_counter := _counter + 100;
RAISE NOTICE 'Delete users from ID : %', _counter;
END LOOP;
END
$do$;
</pre>
<p><strong>Attention</strong>, pas moyen de travailler sur une table temporaire dans ce genre de cas de figure puisqu'avec une nouvelle connexion via DBLink, elle ne serait pas accessible.</p>
<p>Cela va prendre pas mal de temps, mais vous ne serez pas bloqué.</p>
<p>Une fois le principe intégré, voyons comment faire pour que cette requête soit plus rapide.</p>
<p>Le <code><strong>IN</strong></code> c'est bien, mais si vous avez un index sur la table pour laquelle vous voulez effacer des données, et en fonction de son volume, l'index ne sera peut-être pas utilisé.</p>
<p>Pour cela j'ai trouvé une astuce bien pratique qui permet une véritable optimisation :</p>
<pre>
DO
$do$
DECLARE _counter int := 1;
BEGIN
WHILE _counter < 3813142
LOOP
PERFORM dblink_connect('dblink_trans','dbname=mydb port=5432 user=postgres');
PERFORM dblink('dblink_trans','WITH list_to_delete AS (SELECT unnest(array_agg(iduser)) AS iduser FROM tablewithidtodelete WHERE id BETWEEN '|| _counter || ' AND ' || _counter || ' + 100) DELETE FROM mytable USING list WHERE list.iduser = mytable.iduser');
PERFORM dblink('dblink_trans','COMMIT;');
PERFORM dblink_disconnect('dblink_trans');
_counter := _counter + 100;
RAISE NOTICE 'Delete users from ID : %', _counter;
END LOOP;
END
$do$;
</pre>
<p>Que se passe-t-il ?</p>
<p>Déjà nous utilisons une CTE qui permet de préparer les données des iduser comme nous le faisions dans le premier exemple. Mais cette fois nous allons les chercher pour les placer dans un tableau (<code><strong>ARRAY</strong></code>) grâce à la commande <code><strong>array_agg()</strong></code>, puis nous étendons le tableau en un ensemble de lignes de résultats, via la commande <code><strong>unnest()</strong></code>. Ceci permet alors de faire une jointure sur cette CTE avec le DELETE directement sur le champ concerné. Dès lors l'index de la table avec les données à effacer est utilisé et par conséquent la vitesse d'exécution est grandement améliorée.</p>
<p>Dans mon exemple, nous passons de 5 à 10 secondes sur une table de plus de 180 millions d'enregistrements, à moins de 100ms. Un résultats très appréciable.</p>https://www.footcow.com/index.php/post/2017/11/03/Effacer-un-gros-volume-de-donn%C3%A9es-sans-tout-bloquer#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/109