[{"content":"La commande find\n1 find . -name \u0026#34;main.c\u0026#34; -print les parametres de recherche :\n-name XXX : le nom du fichier recherche -path XXX : recherche sur le chemin complet c-a-d le nom du fichier et le répertoire -maxdepth n: rechercher sur une profondeur maximale de n les parametres action :\n-print : affiche le résultat. si aucune action n\u0026rsquo;est renseigné -exec XXX : execute la commande sur chaque fichier retrouvé, le parametre est {}. par exemple : find /home/debianos -user debianos -type f -exec ls -l {} \\; ","date":"2025-07-19T00:00:00Z","permalink":"/blogprog/p/commande-find/","title":"Commande find"},{"content":"Pour créer un environnement Python, il faut exeucter la commande\n1 python3 -m venv ./path-to-new-venv Sous windows, la commande est\n1 py -m venv ./path-to-new-venv ","date":"2025-07-19T00:00:00Z","permalink":"/blogprog/p/cr%C3%A9ation-dun-environnement-python/","title":"Création d'un environnement python"},{"content":"Commande grep Recherche le text void sur les fichiers du répertoire courant\n1 grep void Recherche dans le sous répertoire les fichiers avec l\u0026rsquo;extension c\n1 grep void src/*.c Affiche les numéro de lignes\n1 grep -n void *.c Recherche dans les sous répertoire\n1 grep -r void *.c Options interressante :\nA n : affiche n lignes avant B n : affcihe n lignes apres C n : affiche n lignes avant et apres n : affiche le numéro de ligne e regex : recherche suivant une regex ","date":"2025-07-17T00:00:00Z","permalink":"/blogprog/p/description-de-grep/","title":"description de grep"},{"content":"Pour désactiver la led du raspberry pi zero 2, il faut lancer la commande :\n1 shell\u0026gt; echo 0 | sudo tee /sys/class/leds/ACT/brightness pour qu\u0026rsquo;il soit lancer au démarrage, il faut l\u0026rsquo;ajouter dans le /etc/profile.d :\n1 2 3 4 5 6 shell\u0026gt; sudo echo \u0026gt;/etc/profile.d/stopled.sh \u0026lt;\u0026lt;EOL # eteint la led du raspberry pi zero 2 echo 0 | sudo tee /sys/class/leds/ACT/brightness EOL ","date":"2025-07-16T00:00:00Z","permalink":"/blogprog/p/d%C3%A9sactivation-de-la-led-pour-le-raspberry-pi-zero-2/","title":"Désactivation de la led pour le raspberry pi zero 2"},{"content":"Commandes Linux équivalentes sous Windows Recehrche de fichiers contenant un texte 1 2 3 4 DOS\u0026gt; findstr text *.* DOS\u0026gt; findstr text c:\\repertoire\\*.txt # dans les sous répertoires DOS\u0026gt; findstr /S text *.* 1 2 PowerShell\u0026gt; Select-String -Path \u0026#34;C:\\repertoire\\*.csv\u0026#34; -Pattern \u0026#34;texte\u0026#34; PowerShell\u0026gt; Get-ChildItem -Path C:\\repertoire\\*.txt -Recurse | Select-String -Pattern \u0026#39;Texte\u0026#39; -CaseSensitive Recherche de fichiers par le nom 1 2 DOS\u0026gt; dir /b/s *.txt DOS\u0026gt; dir /s *foo* 1 2 3 4 5 PowerShell\u0026gt; Get-ChildItem -Path .\\* -Include *.mp4 -Recurse PowerShell\u0026gt; Get-ChildItem -Recurse -Path C:\\ | Where-Object {$_.Length gt 1MB} PowerShell\u0026gt; Get-ChildItem -Path .\\* -Include *.mp4 -Recurse | Where-Object { $_.CreationTime -lt \u0026#39;2024-01-01\u0026#39; } # exclu des fichiers. Semble ne fonctionner que pour les fichiers, et pas pour les répertoires PowerShell\u0026gt; Get-ChildItem -Path . -Recurse -Exclude (\u0026#39;node_modules\u0026#39;, \u0026#39;node\u0026#39;, \u0026#39;target\u0026#39;,\u0026#39;*.jar\u0026#39;) -File Appel url / telechargement de fichiers 1 2 3 4 5 6 PowerShell\u0026gt; Invoke-WebRequest https://www.google.fr PowerShell\u0026gt; Invoke-WebRequest -Proxy \u0026#34;http://proxy.hostname:8090/\u0026#34; https://www.google.fr PowerShell\u0026gt; Invoke-WebRequest -NoProxy https://www.google.fr PowerShell\u0026gt; Invoke-WebRequest -SkipCertificateCheck https://www.google.fr PowerShell\u0026gt; Invoke-WebRequest [$myDownloadUrl](https://www.google.fr) -OutFile c:\\temp\\file.html PowerShell\u0026gt; Invoke-WebRequest \u0026#34;https://httpbin.org/ip\u0026#34; Commandes équilavantes à jq 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # curl \u0026#34;https://api.example.com/data\u0026#34; | jq \u0026#39;.someField\u0026#39; # URL de l\u0026#39;API $url = \u0026#34;https://api.example.com/data\u0026#34; # Appeler l\u0026#39;API et obtenir l\u0026#39;objet JSON # Invoke-RestMethod convertit automatiquement la réponse JSON en un objet PowerShell $jsonData = Invoke-RestMethod -Uri $url # Accéder au champ souhaité (remplacez \u0026#39;someField\u0026#39; par le nom de votre champ) $fieldValue = $jsonData.someField # Afficher la valeur du champ Write-Host \u0026#34;La valeur du champ est : $fieldValue\u0026#34; # Si le champ est imbriqué, par exemple .data.item # $fieldValue = $jsonData.data.item 1 PowerShell\u0026gt; (Invoke-RestMethod -Uri \u0026#34;https://api.example.com/data\u0026#34;).someField(Invoke-RestMethod -Uri \u0026#34;https://api.example.com/data\u0026#34;).someField ","date":"2025-05-31T00:00:00Z","permalink":"/blogprog/p/commandes-%C3%A9quivalentes-aux-commandes-linux-sous-windows/","title":"Commandes équivalentes aux commandes Linux sous Windows"},{"content":"Mercredi 16 avril Hibernate batch size à mettre entre 20 et 50 ajouter l\u0026rsquo;ordre sur les requetes sql si plusieurs entités faire plusieurs requetes sur les mêmes objets, en mettant une jointure différente pour éviter un produit cartesien pour le in, si pas trop gros, gérer le boublement de la requete. Faire attention à la limite de taille désactiver les open in view activer les statistics Hibernate et performance : reprenez la main https://www.youtube.com/watch?v=E2P4rB5YNlQ\nMemory Memory API : Patterns, Performance et Cas d\u0026rsquo;Utilisation https://www.youtube.com/watch?v=l9ZPkVBxOSU\nGaterer C\u0026rsquo;est très souple\nL\u0026rsquo;API Gatherer : l\u0026rsquo;outil qui manquait à vos Streams https://www.youtube.com/watch?v=__piR-N9pXA\nOpen Rewrite permet de gérer les transformations en yml. S\u0026rsquo;il faut le faire en java, c\u0026rsquo;est pas trop compliqué\nÉcrire l’avenir de son code avec OpenRewrite https://www.youtube.com/watch?v=cEJcrlcshiE\nNull Safety C\u0026rsquo;est implémenté pour spring boot 4 c\u0026rsquo;est pas trop complexe à utiliser\nNull Safety en Java avec JSpecify et NullAway https://www.youtube.com/watch?v=F_Qyo1cCpvY\nJeudi 17 avril Architecture C\u0026rsquo;est toujours en modification faire simple\nLes clés de l’architecture pour les devs https://www.youtube.com/watch?v=ZoYDxF_7LoI\nOpenid Connect toujours vérifier l\u0026rsquo;audience il existe des librairies en javascript utiliser le worker plutot que faire les appel directe. Cela permet que le token n\u0026rsquo;est pas exposé directement dans le javascript. Par contre, il y a un risque qu\u0026rsquo;il soit supprimer et qu\u0026rsquo;il faille recréer le token Explication du token jwt, d\u0026rsquo;id token, d\u0026rsquo;id access, et d\u0026rsquo;id refresh\nGestion des incidents Page de status interne et aussi externe pour les clients incident manager incident.io\nAlerte, tout brûle ! Maîtrisez les incidents techniques https://www.youtube.com/watch?v=Xjn2rfKC9cA\nMockoon intégration de fichier open api en yml Génération de donnée faker proxy crud\nMockoon : Les bouchons contre-attaquent ! https://www.youtube.com/watch?v=p_nz22-2VXU\nAutorisation nouveau standard\nKeycloak utilisation des attributs ils peuvent être attaché à l\u0026rsquo;utilisateur ou au groupe s\u0026rsquo;il y a beaucoups de valeurs, il faut mieux le récupérer avec le user info, et pas dans le jwt\nElasticsearch nouveau langage ES QL à partir de 8.17 ou 9.0 select jointure d\u0026rsquo;index semble puissant et souple kibana faire de l\u0026rsquo;autocompletion\nElasticsearch Query Language: ES|QL https://www.youtube.com/watch?v=8bw81NIkH60\nVendrdi 18 avril Open Rewrite Semble facile à utiliser\nOpenRewrite: Refactoring as code https://www.youtube.com/watch?v=aYHb7sLhsoQ\nSignal explication sur l\u0026rsquo;implémentation dans Angular et les autres framework (VueJS, React, etc\u0026hellip;)\nOrdinateur Quantique A tester Il faut comprendre pour tester dans la course\nIA Problèmes de sécurité avec les MCP, mais très puissant\nConstruire une IA agentique avec les Structured Outputs, Function Calling et MCP https://www.youtube.com/watch?v=sZOFEEhR4QY\nvu :\na voir :\nL\u0026rsquo;API viewTransition : une révolution pour le web ? https://www.youtube.com/watch?v=gVYEjvEWPgI\nNo Estimate: Créer une culture d\u0026rsquo;équipe favorisant son adoption naturellement https://www.youtube.com/watch?v=cFOelvnNROI\nÀ la découverte du code golf ⛳ https://www.youtube.com/watch?v=8GabGdiIrA8\nFlakiness : Quand tester, c’est vraiment douter https://www.youtube.com/watch?v=CFXMYZmXfAc\nEt si Git n’était pas toujours la réponse ? Alternatives avec Pijul et Darcs https://www.youtube.com/watch?v=DoksVwNnmdk\nGo sans fioritures : quand le standard suffit https://www.youtube.com/watch?v=5zqkv24IdOg\nDagger Modules : un couteau suisse pour moderniser vos pipelines de CI/CD https://www.youtube.com/watch?v=4kgzeexVZo4\nSi l’enfer existe, on y trouve des devs qui gérent des clés de chiffrement https://www.youtube.com/watch?v=hVgVzLP7x4c\nUne revue de code qui traîne ?\u0026hellip;.Ship, Show, Ask https://www.youtube.com/watch?v=acS1tVScTyc\nUne identité pour les fédérer toutes ! https://www.youtube.com/watch?v=aN4rvdbDMy8\nJib : Osez le Dockerless pour vos projets Java ! https://www.youtube.com/watch?v=uRb_ZHz9KT8\nJohn Doe et Jhon Doe sont dans un bateau : la magie derrière l\u0026rsquo;Entity Resolution https://www.youtube.com/watch?v=mseWbw7SAwg\nPour une autre idée de la CI, sur la machine du développeur, avec Dagger https://www.youtube.com/watch?v=odL8ehCnS58\nNoEstimates vs Story Points : fact-checking dessiné https://www.youtube.com/watch?v=xHs6vqIuBtE\n403 Forbidden - Panorama de la gestion des autorisations https://www.youtube.com/watch?v=Yz2cY7K_qdM\nMaîtriser les Tests de Code Asynchrone https://www.youtube.com/watch?v=xEqH9ETy9JM\nAstro GitOps - Press ⓧ to start https://www.youtube.com/watch?v=nIW_VN3-QDw\nVos requêtes SQL jusqu\u0026rsquo;à 10000 fois plus rapides, durablement. https://www.youtube.com/watch?v=TAJKNBPv4Wc\nHTMX, ou le retour de l\u0026rsquo;AJAX dans le développement Web https://www.youtube.com/watch?v=O0LQuErwxho\nGitflow c\u0026rsquo;est bien, Gitbutler c\u0026rsquo;est mieux ! https://www.youtube.com/watch?v=KPmyngwPQKU\nTestez en end-to-end ce qui compte vraiment pour vos utilisateurs avec Gravity https://www.youtube.com/watch?v=4jFXU16knK4\nSoyez plus productif avec IntelliJ IDEA https://www.youtube.com/watch?v=8YWD9tcoZPc\n","date":"2025-04-27T00:00:00Z","permalink":"/blogprog/p/devoxx-du-16-au-18-avril-2025/","title":"Devoxx du 16 au 18 avril 2025"},{"content":" 1 2 3 4 5 6 7 8 9 10 11 12 DECLARE v_max_id NUMBER; BEGIN -- Récupèrer le dernier ID utilisé dans la table SELECT COALESCE(MAX(id), 0) INTO v_max_id FROM mon_schema.ma_table; -- Repositionner la séquence pour démarrer au bon endroit EXECUTE IMMEDIATE \u0026#39;ALTER SEQUENCE mon_schema.SEQ_ma_sequence RESTART START WITH \u0026#39; || (v_max_id + 1) ; DBMS_OUTPUT.PUT_LINE(\u0026#39;Séquence repositionnée à \u0026#39; || (v_max_id + 1)); END; / ","date":"2025-03-22T00:00:00Z","permalink":"/blogprog/p/r%C3%A9initialisation-dune-sequence-par-rapport-%C3%A0-lid-dune-table/","title":"Réinitialisation d'une sequence par rapport à l'id d'une table"},{"content":" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 -- suppression de la contrainte not null du champs mon_schema.ma_table.mon_champs declare fName varchar2(255 char); begin SELECT x.constraint_name into fName FROM all_constraints x JOIN all_cons_columns c ON c.table_name = x.table_name AND c.constraint_name = x.constraint_name WHERE x.table_name = \u0026#39;ma_table\u0026#39; AND x.OWNER=\u0026#39;mon_schema\u0026#39; AND x.constraint_type = \u0026#39;C\u0026#39; AND c.column_name =\u0026#39;mon_champs\u0026#39;; if fName is not null THEN execute immediate \u0026#39;ALTER TABLE \u0026#34;mon_schema\u0026#34;.\u0026#34;ma_table\u0026#34; DROP CONSTRAINT \u0026#39; || fName; end if; end; / ","date":"2025-03-22T00:00:00Z","permalink":"/blogprog/p/supprime-la-contrainte-not-null-dune-colonne-dont-le-nom-de-la-contrainte-nest-pas-connue.-sp%C3%A9cifique-%C3%A0-oracle/","title":"Supprime la contrainte not null d'une colonne dont le nom de la contrainte n'est pas connue. Spécifique à Oracle"},{"content":"import json import os import subprocess import sys import xml.etree.ElementTree as ET from datetime import date, datetime import time\nfrom boltons.iterutils import remap\n\u0026rsquo;''\njq . projet_240928_182342.json\njq .[].nom projet_240928_182342.json\njq .[].nom,.[].modules[].name projet_240928_182342.json\njq \u0026ldquo;[ .[] | {nom_module: .modules[].name} ]\u0026rdquo; projet_240928_182342.json\njq \u0026ldquo;[ .[] | . as $parent | {nom_module: .modules[].name, projet: $parent.nom} ]\u0026rdquo; projet_240928_182342.json\nPour lister le nom des produits : jq \u0026ldquo;[ .[] | . as $parent | {nom_module: .modules[].name, projet: $parent.nom} ]\u0026rdquo; projet_240929_131613.json\nPour lister la version d\u0026rsquo;angular : jq \u0026ldquo;[ .[] | . as $parent | {nom_module: .modules[].name, projet: $parent.nom, angular: .modules[].packageJson.dependencies.\u0026quot;@angular/core\u0026quot;} ]\u0026rdquo; projet_240929_131613.json\nPour lister la version de java : jq \u0026ldquo;[ .[] | . as $parent | {nom_module: .modules[].name, projet: $parent.nom, java: .modules[].pom.properties.\u0026quot;java.version\u0026quot;} ]\u0026rdquo; projet_240929_131613.json\nPour lister la version du projet : jq \u0026ldquo;[ .[] | . as $parent | {nom_module: .modules[].name, projet: $parent.nom, version_projet: .modules[].pom.effectivePom.version.version} ]\u0026rdquo; projet_240929_131613.json\nPour lister le groupId, l\u0026rsquo;artifactId et la version des projets : jq \u0026ldquo;[ .[] | . as $parent | {nom_module: .modules[].name, projet: $parent.nom, version_projet: ( .modules[].pom.effectivePom.version.groupId + \u0026quot;:\u0026quot; + .modules[].pom.effectivePom.version.artifactId + \u0026quot;:\u0026quot; + .modules[].pom.effectivePom.version.version ) } ]\u0026rdquo; projet_240929_131613.json\n\u0026rsquo;''\nclass Parametres:\ndef __init__(self):\rself.repertoires = []\rself.repertoires_ignore = []\rself.debug = False\rclass ErreurRunMvnException(Exception): pass\nclass ErreurRunGitException(Exception): pass\ndef is_git_repo(path): \u0026ldquo;\u0026ldquo;\u0026ldquo;Vérifie si un répertoire est un repo git.\u0026rdquo;\u0026rdquo;\u0026rdquo; return os.path.isdir(os.path.join(path, \u0026ldquo;.git\u0026rdquo;))\ndef parse_pom(pom_path): tree = ET.parse(pom_path) root = tree.getroot()\n# Espaces de noms (pour éviter les erreurs lors de la recherche d'éléments dans le fichier XML)\rnamespaces = {'maven': 'http://maven.apache.org/POM/4.0.0'}\r# Récupérer les informations du parent s'il existe\rparent = root.find('maven:parent', namespaces)\rparent_info = {}\rif parent is not None:\rif parent.find('maven:groupId', namespaces) is not None:\rparent_info['groupId'] = parent.find('maven:groupId', namespaces).text\rif parent.find('maven:artifactId', namespaces) is not None:\rparent_info['artifactId'] = parent.find('maven:artifactId', namespaces).text\rif parent.find('maven:version', namespaces) is not None:\rparent_info['version'] = parent.find('maven:version', namespaces).text\rversion_projet = {}\rroot.find('maven:parent', namespaces)\rif root.find('maven:groupId', namespaces) is not None:\rversion_projet['groupId'] = root.find('maven:groupId', namespaces).text\rif root.find('maven:artifactId', namespaces) is not None:\rversion_projet['artifactId'] = root.find('maven:artifactId', namespaces).text\rif root.find('maven:version', namespaces) is not None:\rversion_projet['version'] = root.find('maven:version', namespaces).text\r# Récupérer les propriétés s'il existe\rproperties = root.find('maven:properties', namespaces)\rprops = {}\rif properties is not None:\rfor prop in properties:\rprops[prop.tag.split('}')[-1]] = prop.text\rreturn parent_info, props, version_projet\rdef parse_pom_xml(pom_path, debug): \u0026ldquo;\u0026ldquo;\u0026ldquo;Parse le fichier pom.xml et extrait les informations du parent et des propriétés.\u0026rdquo;\u0026rdquo;\u0026rdquo;\nparent_info, props, version_projet = parse_pom(pom_path)\r# les dépendances\rdependances = None\reffectivePom = None\rtry:\rcurrentDir = os.getcwd()\routpoutFile = f'{currentDir}/data/dependency.json'\rcommand = f\u0026quot;mvn dependency:3.8.0:tree -DoutputType=json -DoutputFile={currentDir}/data/dependency.json -DoutputEncoding=utf8\u0026quot;\rrepo_path = os.path.dirname(pom_path)\rresult = subprocess.run(command, cwd=repo_path, shell=True, capture_output=True, text=True)\rif debug or result.returncode != 0:\rprint(\u0026quot;dependancy tree output:\u0026quot; + result.stdout)\rprint(\u0026quot;dependancy tree error:\u0026quot; + result.stderr)\rif result.returncode != 0:\rraise ErreurRunMvnException(f\u0026quot;Erreur lors de l'exécution de la commande {command}: {result.stderr}\u0026quot;)\rif os.path.isfile(outpoutFile):\rwith open(outpoutFile, 'r', encoding='utf-8') as file:\rdata = json.load(file)\rif data is not None:\rbad_keys = {'classifier', 'type', 'classifier', 'optional'}\rdrop_keys = lambda path, key, value: key not in bad_keys\rclean = remap(data, visit=drop_keys)\rif clean is not None:\rdependances = clean\r# analyse effective pom\routpoutFile = f'{currentDir}/data/effectivePom.xml'\rcommand = f\u0026quot;mvn help:effective-pom -Doutput={outpoutFile}\u0026quot;\rrepo_path = os.path.dirname(pom_path)\rresult = subprocess.run(command, cwd=repo_path, shell=True, capture_output=True, text=True)\rif debug or result.returncode != 0:\rprint(\u0026quot;effective-pom output:\u0026quot; + result.stdout)\rprint(\u0026quot;effective-pom error:\u0026quot; + result.stderr)\rif result.returncode != 0:\rraise ErreurRunMvnException(f\u0026quot;Erreur lors de l'exécution de la commande {command}: {result.stderr}\u0026quot;)\rif os.path.isfile(outpoutFile):\rparent_info_effective, props_effective, version_projet_effective = parse_pom(outpoutFile)\rif parent_info_effective is not None or props_effective is not None or version_projet_effective is not None:\reffectivePom = {}\rif parent_info_effective is not None:\reffectivePom['parent_info'] = parent_info_effective\rif version_projet_effective is not None:\reffectivePom['version'] = version_projet_effective\rif props_effective is not None:\reffectivePom['properties'] = props_effective\rexcept ErreurRunMvnException as e:\rdetails = e.args[0]\rprint(f\u0026quot;Erreur pour analyser le pom {pom_path} : {details}\u0026quot;)\rreturn parent_info, props, version_projet, dependances, effectivePom\rdef parse_package_json(package_path): \u0026ldquo;\u0026ldquo;\u0026ldquo;Parse le fichier package.json et extrait la version d\u0026rsquo;Angular/CLI s\u0026rsquo;il existe.\u0026rdquo;\u0026rdquo;\u0026rdquo; mapVersion = {} with open(package_path, \u0026lsquo;r\u0026rsquo;, encoding=\u0026lsquo;utf-8\u0026rsquo;) as file: data = json.load(file) dependencies = data.get(\u0026lsquo;dependencies\u0026rsquo;, {}) devDependencies = data.get(\u0026lsquo;devDependencies\u0026rsquo;, {}) if dependencies is not None: mapVersion[\u0026lsquo;dependencies\u0026rsquo;] = dependencies if devDependencies is not None: mapVersion[\u0026lsquo;devDependencies\u0026rsquo;] = devDependencies name = data.get(\u0026rsquo;name\u0026rsquo;, {}) if name is not None: mapVersion[\u0026rsquo;name\u0026rsquo;] = name version = data.get(\u0026lsquo;version\u0026rsquo;, {}) if version is not None: mapVersion[\u0026lsquo;version\u0026rsquo;] = version scripts = data.get(\u0026lsquo;scripts\u0026rsquo;, {}) if scripts is not None: mapVersion[\u0026lsquo;scripts\u0026rsquo;] = scripts\nreturn mapVersion\rdef run_git_command(command, repo_path): \u0026ldquo;\u0026ldquo;\u0026ldquo;Exécute une commande git et retourne la sortie.\u0026rdquo;\u0026rdquo;\u0026rdquo; result = subprocess.run(command, cwd=repo_path, shell=True, capture_output=True, text=True) if result.returncode != 0: raise ErreurRunGitException(f\u0026quot;Erreur lors de l\u0026rsquo;exécution de la commande {command}: {result.stderr}\u0026quot;) return result.stdout\ndef get_branch_info(branch): \u0026ldquo;\u0026ldquo;\u0026ldquo;Extrait les informations d\u0026rsquo;une branche (nom, date, hash court, message de commit).\u0026rdquo;\u0026rdquo;\u0026rdquo; parts = branch.split(maxsplit=5) short_commit = parts[0] date_str = parts[1] + \u0026quot; \u0026quot; + parts[2] + \u0026quot; \u0026quot; + parts[3] if len(parts) \u0026gt; 3 else \u0026quot;\u0026quot; # print(f\u0026quot;{short_commit}: {date_str}!{parts}\u0026quot;) date = datetime.strptime(date_str, \u0026ldquo;%Y-%m-%d %H:%M:%S %z\u0026rdquo;) if len(date_str) \u0026gt; 0 else None name = parts[4] if len(parts) \u0026gt; 3 else \u0026quot;\u0026quot; message = parts[5] if len(parts) \u0026gt; 4 else \u0026quot;\u0026quot; return short_commit, date, message, name\ndef has_uncommitted_changes(repo_path): \u0026ldquo;\u0026ldquo;\u0026ldquo;Vérifie s\u0026rsquo;il y a des fichiers non commités dans le dépôt.\u0026rdquo;\u0026rdquo;\u0026rdquo; status_output = run_git_command(\u0026ldquo;git status \u0026ndash;porcelain\u0026rdquo;, repo_path) if status_output.strip(): # Si la sortie n\u0026rsquo;est pas vide, il y a des changements non commités return True return False\ndef get_local_branche(repo_path) -\u0026gt; str: \u0026ldquo;\u0026ldquo;\u0026ldquo;Vérifie s\u0026rsquo;il y a des fichiers non commités dans le dépôt.\u0026rdquo;\u0026rdquo;\u0026rdquo; status_output = run_git_command(\u0026ldquo;git rev-parse \u0026ndash;abbrev-ref HEAD\u0026rdquo;, repo_path) res = status_output.strip() if res: # Si la sortie n\u0026rsquo;est pas vide, il y a des changements non commités return res return None\ndef fetch_and_list_branches(repo_path): # Étape 1: Faire un git fetch try: run_git_command(\u0026ldquo;git fetch \u0026ndash;all\u0026rdquo;, repo_path) except ErreurRunGitException as e: details = e.args[0] print(f\u0026quot;Erreur pour executer git {repo_path} : {details}\u0026quot;) return None, None, None, None\nlocalBranche = get_local_branche(repo_path)\r# Étape 3: Obtenir les 5 dernières branches distantes\rremote_branches_output = run_git_command(\r\u0026quot;git for-each-ref --sort=-committerdate --format=\\\u0026quot;%(objectname:short) %(committerdate:iso8601) %(refname:short) %(contents:subject)\\\u0026quot; refs/remotes --count=5\u0026quot;,\rrepo_path\r)\rremote_branches = []\r# list_remote_branche=[]\rfor line in remote_branches_output.strip().split(\u0026quot;\\n\u0026quot;):\rif line:\rshort_commit, date, message, nameBranche2 = get_branch_info(line)\rliste = line.split()\rif len(liste) \u0026gt;= 2:\rbranch_name = nameBranche2 # liste[2]\rremote_branches.append({\r\u0026quot;name\u0026quot;: branch_name,\r\u0026quot;commit\u0026quot;: short_commit,\r\u0026quot;date\u0026quot;: date.isoformat(),\r\u0026quot;message\u0026quot;: message\r})\r# list_remote_branche.append(branch_name)\r# Étape 2: Obtenir les 5 dernières branches locales\rlocal_branches_output = run_git_command(\r\u0026quot;git for-each-ref --sort=-committerdate --format=\\\u0026quot;%(objectname:short) %(committerdate:iso8601) %(refname:short) %(contents:subject)\\\u0026quot; refs/heads --count=5\u0026quot;,\rrepo_path\r)\r# print(local_branches_output)\rlocal_branches = []\rfor line in local_branches_output.strip().split(\u0026quot;\\n\u0026quot;):\rif line:\r# print(f'line: {line}')\rshort_commit, date, message, nameBranche = get_branch_info(line)\rliste = line.split()\rif len(liste) \u0026gt;= 2:\rbranch_name = nameBranche # liste[2]\rbranche_module = {\r\u0026quot;name\u0026quot;: branch_name,\r\u0026quot;commit\u0026quot;: short_commit,\r\u0026quot;date\u0026quot;: date.isoformat(),\r\u0026quot;message\u0026quot;: message\r}\rlocal_branches.append(branche_module)\rif localBranche is not None and localBranche == branch_name:\rbranche_module[\u0026quot;current\u0026quot;] = True\rliste_remote = [item for item in remote_branches if item[\u0026quot;name\u0026quot;] == \u0026quot;origin/\u0026quot; + branch_name]\rif liste_remote:\rbranche_module[\u0026quot;remote_exists\u0026quot;] = True\rbranche_module[\u0026quot;remote_eq\u0026quot;] = liste_remote[0]['commit'] == short_commit\relse:\rbranche_module[\u0026quot;remote_exists\u0026quot;] = False\rfichierNonCommite = has_uncommitted_changes(repo_path)\r# Étape 4: Retourner un objet structuré avec les branches locales et distantes\rreturn local_branches, remote_branches, fichierNonCommite, localBranche\rdef find_repos_and_parse_files(parametre: Parametres): \u0026ldquo;\u0026ldquo;\u0026ldquo;Cherche dans les sous-répertoires pour identifier les repos git ou ceux contenant pom.xml ou package.json.\u0026rdquo;\u0026rdquo;\u0026rdquo;\n# start_dir_list, debug, ignoreProjet\rlisteGlobal = []\r# nomFichierGlobal=f\u0026quot;{start_dir}/.git\u0026quot;\rtoday = datetime.today()\rfilename = today.strftime(\u0026quot;projet_%y%m%d_%H%M%S.json\u0026quot;)\rfor start_dir in parametre.repertoires:\rfor root, dirs, files in os.walk(start_dir):\rif is_git_repo(root) or \u0026quot;pom.xml\u0026quot; in files or \u0026quot;package.json\u0026quot; in files:\r# print(f\u0026quot;\\nDépôt Git trouvé dans : {root}\u0026quot;)\rpathFile = os.path.basename(root)\rdirs[:] = []\rif parametre.repertoires_ignore is not None and pathFile in parametre.repertoires_ignore:\rprint(f\u0026quot;projet ignore {pathFile} : {root}\u0026quot;)\rcontinue\rprint(f\u0026quot;projet {pathFile} : {root}\u0026quot;)\rprojet = {\r'nom': pathFile,\r'rep': root,\r'modules': []\r}\rlisteGlobal.append(projet)\rroot0 = root\rfor root2, dirs2, files2 in os.walk(root0):\rdepotGit = is_git_repo(root2)\rdirs2[:] = [d for d in dirs2 if d not in {'node', 'node_modules', 'target', '.venv', '.git'}]\rif \u0026quot;pom.xml\u0026quot; in files2 or \u0026quot;package.json\u0026quot; in files2:\r# print(f\u0026quot;\\nProjet : {root}\u0026quot;)\rliste = []\rname = '.'\rif root2 != root0:\rname = os.path.basename(root2)\rmodule = {\r'name': name,\r'path': root2\r}\rprojet['modules'].append(module)\rif \u0026quot;pom.xml\u0026quot; in files2:\rpom_path = os.path.join(root2, \u0026quot;pom.xml\u0026quot;)\rparent_info, properties, version_projet, dependances, effectivePom = parse_pom_xml(pom_path,\rparametre.debug)\rpom = {\r}\rif parent_info is not None:\rpom['parent_info'] = parent_info\rif version_projet is not None:\rpom['version'] = version_projet\rif properties is not None:\rpom['properties'] = properties\rif dependances is not None:\rpom['dependances'] = dependances\rif effectivePom is not None:\rpom['effectivePom'] = effectivePom\rmodule['pom'] = pom\rif \u0026quot;package.json\u0026quot; in files2:\rpackage_path = os.path.join(root2, \u0026quot;package.json\u0026quot;)\rmap = parse_package_json(package_path)\rif map is not None:\rmodule['packageJson'] = map\rif depotGit:\rlocal_branches, remote_branches, fichierNonCommite, localBranche = fetch_and_list_branches(\rroot2)\rgitModule = {\r'localBranches': local_branches,\r'remoteBranches': remote_branches,\r'fichierNonCommite': fichierNonCommite,\r'localBranche': localBranche\r}\rmodule['git'] = gitModule\rwith open(f\u0026quot;data/{filename}\u0026quot;, \u0026quot;w\u0026quot;) as outfile:\rjson.dump(listeGlobal, outfile)\rprint(\u0026ldquo;date de debut : \u0026quot; + datetime.now().strftime(\u0026quot;%Y-%m-%d %H:%M:%S\u0026rdquo;)) start = datetime.now()\nparam = sys.argv\nparametres = Parametres()\ndebut_parametre = \u0026lsquo;\u0026ndash;parametre=\u0026rsquo; debut_ignore = \u0026lsquo;\u0026ndash;ignore=\u0026rsquo; debut_debug = \u0026lsquo;\u0026ndash;debug\u0026rsquo;\nfor p in param[1:]: if p.startswith(debut_parametre): s = p[len(debut_parametre):] parametres.repertoires = s.split(\u0026rsquo;,\u0026rsquo;) elif p.startswith(debut_ignore): s = p[len(debut_ignore):] parametres.repertoires_ignore = s.split(\u0026rsquo;,\u0026rsquo;) elif p == debut_debug: parametres.debug = True else: raise Exception(\u0026ldquo;Parametre invalide : \u0026quot; + p)\nif not parametres.repertoires: raise Exception(\u0026ldquo;Liste des répertoires absente\u0026rdquo;)\nfind_repos_and_parse_files(parametres)\nprint(\u0026ldquo;date de fin : \u0026quot; + datetime.now().strftime(\u0026quot;%Y-%m-%d %H:%M:%S\u0026rdquo;)) delta = datetime.now() - start ms = delta.total_seconds() * 1000 milli = int(ms % 1000) seconds = (ms / 1000) % 60 seconds = int(seconds) minutes = (ms / (1000 * 60)) % 60 minutes = int(minutes) hours = int(ms / (1000 * 60 * 60)) % 24 print(f\u0026quot;duree d\u0026rsquo;execution : {hours:02d}:{minutes:02d}:{seconds:02d}.{milli:03d} ({ms} ms)\u0026rdquo;)\n","date":"2024-09-29T00:00:00Z","permalink":"/blogprog/p/analyse-une-liste-de-projets/","title":"Analyse une liste de projets"},{"content":"Liste d\u0026rsquo;outils Web :\nhttps://it-tools.tech/ : outils généraliste, très complet https://devtools.best/ : outils généraliste https://calculis.net/calcul-heure : pour les calculs de dates ","date":"2024-06-03T00:00:00Z","permalink":"/blogprog/p/liste-doutils-web/","title":"Liste d'outils web"},{"content":" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 $url = \u0026#34;https://jsonplaceholder.typicode.com/posts\u0026#34; $n=0 $val=0 $res = @() while($val -ne 100) { $val++ Write-Host $val $url2=$url+\u0026#34;?_start=\u0026#34;+$n+\u0026#34;\u0026amp;_limit=5\u0026#34; Write-Host $url2 $result = Invoke-RestMethod -uri \u0026#34;$url2\u0026#34; -UseDefaultCredentials -Method Get -ContentType \u0026#34;application/json\u0026#34; if($result.Count -eq 0) { break } $res += $result Write-Host \u0026#34;count\u0026#34;, $res.Count $n=$n+5 } Write-Host \u0026#34;res\u0026#34; $res ","date":"2024-05-11T00:00:00Z","permalink":"/blogprog/p/r%C3%A9cup%C3%A9ration-dune-liste-avec-des-appels-rest/","title":"Récupération d'une liste avec des appels rest"},{"content":"Liste de librairie Java Guava Apache Common Lang Apache Common IO Apache Common Compress Apache Common CSV Resilience4j Bucket4j JUnit5 AssertJ OpenFeign Liste de framework Spring boot Vertx Micronaute Quarkus Jakarta JEE ","date":"2024-03-30T00:00:00Z","permalink":"/blogprog/p/liste-des-librairies-en-java/","title":"Liste des librairies en Java"},{"content":"Liste d\u0026rsquo;outils de proxy Http Mockoon mitmproxy OWASP Zed Attack Proxy (ZAP) ","date":"2024-03-27T00:00:00Z","permalink":"/blogprog/p/liste-doutils-de-proxy-pour-le-navigateur/","title":"Liste d'outils de proxy pour le navigateur"},{"content":"Outils de formatage de code Spotless outils de formatage de code : fonctionne avec Maven, gradle, prettier, mais le plugin IntelliJ ne fonctionne qu\u0026rsquo;avec Gradle Biome outils de formatage pur le front (Javascript, Json, etc\u0026hellip;) Prettier outils de formatage qui fonctionne avec beaucoup de langage (Javascript, Java, etc\u0026hellip;), mais necessite nodeJs. Fonctionne bien avec IntelliJ google-java-format outils de formatage de Java. Il a un plugin IntelliJ Palantir-Java-Formater : pour formater le Java. A un plugin IntelliJ. Basé sur le code de Google-Java-Formater eslint outils pour vérifier le code Javascript et TypeScript. Il peut le reformater. Fmt-Maven-Plugin plugin maven pour reformater le code Java avec le stye de google ","date":"2024-03-24T00:00:00Z","permalink":"/blogprog/p/formatage-code/","title":"Outils de formatage de code (Java, Javascript, Yaml, ect...)"},{"content":"Configuration logback Exemple simple Utilisation en Java avec SLF4J\n1 2 3 4 5 6 7 8 9 10 public class Slf4jExample { private static final Logger LOGGER = LoggerFactory.getLogger(Slf4jExample.class); public static void main(String[] args) { LOGGER.debug(\u0026#34;Debug log message\u0026#34;); LOGGER.info(\u0026#34;Info log message\u0026#34;); LOGGER.error(\u0026#34;Error log message\u0026#34;); } } Configuration simple sur la console\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 \u0026lt;configuration\u0026gt; \u0026lt;appender name=\u0026#34;CONSOLE\u0026#34; class=\u0026#34;ch.qos.logback.core.ConsoleAppender\u0026#34;\u0026gt; \u0026lt;layout class=\u0026#34;ch.qos.logback.classic.PatternLayout\u0026#34;\u0026gt; \u0026lt;Pattern\u0026gt; %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n \u0026lt;/Pattern\u0026gt; \u0026lt;/layout\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;logger name=\u0026#34;com.mkyong\u0026#34; level=\u0026#34;debug\u0026#34; additivity=\u0026#34;false\u0026#34;\u0026gt; \u0026lt;appender-ref ref=\u0026#34;CONSOLE\u0026#34;/\u0026gt; \u0026lt;/logger\u0026gt; \u0026lt;root level=\u0026#34;error\u0026#34;\u0026gt; \u0026lt;appender-ref ref=\u0026#34;CONSOLE\u0026#34;/\u0026gt; \u0026lt;/root\u0026gt; \u0026lt;/configuration\u0026gt; Configuration en reprenant le pattern de spring boot 1 2 3 4 5 6 7 8 9 10 11 12 13 \u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;configuration scan=\u0026#34;true\u0026#34;\u0026gt; \u0026lt;!-- use Spring default values --\u0026gt; \u0026lt;include resource=\u0026#34;org/springframework/boot/logging/logback/defaults.xml\u0026#34;/\u0026gt; \u0026lt;appender name=\u0026#34;CONSOLE\u0026#34; class=\u0026#34;ch.qos.logback.core.ConsoleAppender\u0026#34;\u0026gt; \u0026lt;encoder\u0026gt; \u0026lt;pattern\u0026gt;${CONSOLE_LOG_PATTERN}\u0026lt;/pattern\u0026gt; \u0026lt;charset\u0026gt;utf8\u0026lt;/charset\u0026gt; \u0026lt;/encoder\u0026gt; \u0026lt;/appender\u0026gt; … \u0026lt;/configuration\u0026gt; Séparation de certains log dans un fichier séparé Pour mettre les logs dans un fichier séparé :\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 \u0026lt;?xml version=\u0026#34;1.0\u0026#34;?\u0026gt; \u0026lt;configuration\u0026gt; \u0026lt;appender name=\u0026#34;FILE\u0026#34; class=\u0026#34;ch.qos.logback.core.FileAppender\u0026#34;\u0026gt; \u0026lt;file\u0026gt;logfile.log\u0026lt;/file\u0026gt; \u0026lt;append\u0026gt;true\u0026lt;/append\u0026gt; \u0026lt;encoder\u0026gt; \u0026lt;pattern\u0026gt;%-4relative [%thread] %-5level %logger{35} - %msg %n\u0026lt;/pattern\u0026gt; \u0026lt;/encoder\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;appender name=\u0026#34;ANALYTICS-FILE\u0026#34; class=\u0026#34;ch.qos.logback.core.FileAppender\u0026#34;\u0026gt; \u0026lt;file\u0026gt;analytics.log\u0026lt;/file\u0026gt; \u0026lt;append\u0026gt;true\u0026lt;/append\u0026gt; \u0026lt;encoder\u0026gt; \u0026lt;pattern\u0026gt;%-4relative [%thread] %-5level %logger{35} - %msg %n\u0026lt;/pattern\u0026gt; \u0026lt;/encoder\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;!-- additivity=false ensures analytics data only goes to the analytics log --\u0026gt; \u0026lt;logger name=\u0026#34;analytics\u0026#34; level=\u0026#34;DEBUG\u0026#34; additivity=\u0026#34;false\u0026#34;\u0026gt; \u0026lt;appender-ref ref=\u0026#34;ANALYTICS-FILE\u0026#34;/\u0026gt; \u0026lt;/logger\u0026gt; \u0026lt;root\u0026gt; \u0026lt;appender-ref ref=\u0026#34;FILE\u0026#34;/\u0026gt; \u0026lt;/root\u0026gt; \u0026lt;/configuration\u0026gt; Pour l\u0026rsquo;utiliser\n1 Logger analytics = LoggerFactory.getLogger(\u0026#34;analytics\u0026#34;); Pour indiquer ou se trouve le fichier de log 1 -Dlogging.config=file:///your/file/location/logback.xml Configuration d\u0026rsquo;un appender dans un fichier avec rollback 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 \u0026lt;configuration\u0026gt; \u0026lt;appender name=\u0026#34;FILE\u0026#34; class=\u0026#34;ch.qos.logback.core.rolling.RollingFileAppender\u0026#34;\u0026gt; \u0026lt;file\u0026gt;logFile.log\u0026lt;/file\u0026gt; \u0026lt;rollingPolicy class=\u0026#34;ch.qos.logback.core.rolling.TimeBasedRollingPolicy\u0026#34;\u0026gt; \u0026lt;!-- daily rollover --\u0026gt; \u0026lt;fileNamePattern\u0026gt;logFile.%d{yyyy-MM-dd}.log\u0026lt;/fileNamePattern\u0026gt; \u0026lt;!-- keep 30 days\u0026#39; worth of history capped at 3GB total size --\u0026gt; \u0026lt;maxHistory\u0026gt;30\u0026lt;/maxHistory\u0026gt; \u0026lt;totalSizeCap\u0026gt;3GB\u0026lt;/totalSizeCap\u0026gt; \u0026lt;/rollingPolicy\u0026gt; \u0026lt;encoder\u0026gt; \u0026lt;pattern\u0026gt;%-4relative [%thread] %-5level %logger{35} -%kvp- %msg%n\u0026lt;/pattern\u0026gt; \u0026lt;/encoder\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;root level=\u0026#34;DEBUG\u0026#34;\u0026gt; \u0026lt;appender-ref ref=\u0026#34;FILE\u0026#34; /\u0026gt; \u0026lt;/root\u0026gt; \u0026lt;/configuration\u0026gt; syntaxe des pattern La documentation est ici\n%X{ABC} : pour afficher un MDC. Si le {} n\u0026rsquo;est pas présent, c\u0026rsquo;est pour le MDC qui est affiché ${PID} : le pid du processus. C\u0026rsquo;est spécifique à Spring Boot ","date":"2024-03-17T00:00:00Z","permalink":"/blogprog/p/configuration-logback/","title":"Configuration logback"},{"content":"Recherche windows DOS (cmd) Pour recherche les fichiers contenants une chaine de caractère, la commande est :\n1 findstr \u0026#34;machaine\u0026#34; *.* L\u0026rsquo;option /I permet de faaire une recherche insensible à la casse.\nPowershell Pour rechercher les fichiers contenant une chaine de caractère :\n1 Get-ChildItem C:\\temp -Filter *.log -Recurse | Select-String \u0026#34;machaine\u0026#34; Cela fait une recherche récursive. Si ce n\u0026rsquo;est pas récursif, la commande est :\n1 Select-String -Path C:\\temp\\*.log -Pattern \u0026#34;machaine\u0026#34; Pour rechercher les fichiers qui ont une extention de façon récursive :\n1 Get-ChildItem -Path \u0026#34;C:\\code\\\u0026#34; -Filter *.js -r -File Outils RipGrep RipGrep permet de faire les recherches. L\u0026rsquo;outils est ici.\n1 rg \u0026#34;machaine\u0026#34; -g \u0026#39;*.java\u0026#39; \u0026#34;C:\\code\\\u0026#34; Pour rechercher par nom de fichier :\n1 rg --files | rg -i \u0026#34;.java$\u0026#34; FD La recherche avec FD peut être fait sur le nom du fichier. L\u0026rsquo;outils est ici.\nExemple :\n1 fd \u0026#34;\\.java$\u0026#34; C:\\code\\ La recherche est une expression régulière.\n","date":"2024-03-17T00:00:00Z","permalink":"/blogprog/p/recherche-dune-chaine-de-caract%C3%A8re-sous-windows-en-bat-et-en-powershell-ou-avec-des-outils/","title":"Recherche d'une chaine de caractère sous windows en bat et en Powershell ou avec des outils"},{"content":"Exemple de configuration pour lancer un service sous Linux 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [Unit] Description=Mon service server daemon After=network.target [Service] #Type=simple #Type=exec Type=forking EnvironmentFile=/etc/sysconfig/monservice ExecStart=/usr/sbin/monservice #Restart= always User=monuser KillMode=process Environment=MON_SERVICE_HOME=/usr/share/monservice Environment=MON_SERVICE_CONF=/etc/monservice/conf Environment=LOCAL_JMX=false [Install] WantedBy=multi-user.target Ensuite pour l\u0026rsquo;installer :\n1 2 3 4 5 6 7 8 # installer sudo cp curator/mon-service.service /etc/systemd/system/mon-service.service sudo systemctl enable mon-service.service sudo systemctl start mon-service.service # voir l\u0026#39;état sudo systemctl status mon-service.service # voir les logs journalctl -u mon-service.service Pour la commande pour lancer le processus\n1 2 3 #!/bin/bash nohup java -jar /home/monservice/mon-service-webapp-1.0.0-SNAPSHOT.jar --spring.config.location=/home/monservice/config/application.yml \u0026gt; /dev/null 2\u0026gt;\u0026amp;1 \u0026amp; ","date":"2024-03-10T00:00:00Z","permalink":"/blogprog/p/installation-dun-service-sous-linux/","title":"Installation d'un service sous Linux"},{"content":"Génération du code xml à partir d\u0026rsquo;un XSD Pour générer du XML à partir du XSD, il faut utiliser la librairie Apache XML Bean. Voici le code :\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 import org.apache.xmlbeans.SchemaType; import org.apache.xmlbeans.SchemaTypeSystem; import org.apache.xmlbeans.XmlBeans; import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlObject; import org.apache.xmlbeans.XmlOptions; import org.apache.xmlbeans.impl.xsd2inst.SampleXmlUtil; import org.apache.xmlbeans.impl.xsd2inst.SchemaInstanceGenerator; import java.util.ArrayList; import java.util.List; public class XmlInstanceGeneratorImpl { private static final Logger logger = LogManager.getLogger(XmlInstanceGeneratorImpl.class); /** * Specifies if network downloads are enabled for imports and includes. * Default value is {@code false} */ private static final boolean ENABLE_NETWORK_DOWNLOADS = false; /** * disable particle valid (restriction) rule * Default value is {@code false} */ private static final boolean NO_PVR = false; /** * disable unique particle attribution rule. * Default value is {@code false} */ private static final boolean NO_UPA = false; public String generateXmlInstance(String xsdAsString, String elementToGenerate){ return generateXmlInstance(xsdAsString, elementToGenerate, ENABLE_NETWORK_DOWNLOADS, NO_PVR, NO_UPA); } public String generateXmlInstance(String xsAsString, String elementToGenerate, boolean enableDownloads, boolean noPvr, boolean noUpa){ List\u0026lt;XmlObject\u0026gt; schemaXmlObjects = new ArrayList\u0026lt;\u0026gt;(); try { schemaXmlObjects.add(XmlObject.Factory.parse(xsAsString)); } catch (XmlException e) { logger.error(\u0026#34;Error Occured while Parsing Schema\u0026#34;,e); } XmlObject[] xmlObjects = schemaXmlObjects.toArray(new XmlObject[1]); SchemaInstanceGenerator.Xsd2InstOptions options = new SchemaInstanceGenerator.Xsd2InstOptions(); options.setNetworkDownloads(enableDownloads); options.setNopvr(noPvr); options.setNoupa(noUpa); return xsd2inst(xmlObjects, elementToGenerate, options); } private String xsd2inst(XmlObject[] schemas, String rootName, SchemaInstanceGenerator.Xsd2InstOptions options){ SchemaTypeSystem schemaTypeSystem = null; if (schemas.length \u0026gt; 0) { XmlOptions compileOptions = new XmlOptions(); if (options.isNetworkDownloads()) compileOptions.setCompileDownloadUrls(); if (options.isNopvr()) compileOptions.setCompileNoPvrRule(); if (options.isNoupa()) compileOptions.setCompileNoUpaRule(); try { schemaTypeSystem = XmlBeans.compileXsd(schemas, XmlBeans.getBuiltinTypeSystem(), compileOptions); } catch (XmlException e) { logger.error(\u0026#34;Error occurred while compiling XSD\u0026#34;,e); } } if (schemaTypeSystem == null) { throw new RuntimeException(\u0026#34;No Schemas to process.\u0026#34;); } SchemaType[] globalElements = schemaTypeSystem.documentTypes(); SchemaType elem = null; for (SchemaType globalElement : globalElements) { if (rootName.equals(globalElement.getDocumentElementName().getLocalPart())) { elem = globalElement; break; } } if (elem == null) { throw new RuntimeException(\u0026#34;Could not find a global element with name \\\u0026#34;\u0026#34; + rootName + \u0026#34;\\\u0026#34;\u0026#34;); } // Now generate it and return the result return SampleXmlUtil.createSampleForType(elem); } } Code trouvé ici\nPour le faire avec maven :\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 \u0026lt;project\u0026gt; \u0026lt;!-- ... --\u0026gt; \u0026lt;build\u0026gt; \u0026lt;plugins\u0026gt; \u0026lt;plugin\u0026gt; \u0026lt;groupId\u0026gt;org.codehaus.mojo\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;exec-maven-plugin\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;3.0.0\u0026lt;/version\u0026gt; \u0026lt;executions\u0026gt; \u0026lt;execution\u0026gt; \u0026lt;goals\u0026gt; \u0026lt;goal\u0026gt;java\u0026lt;/goal\u0026gt; \u0026lt;/goals\u0026gt; \u0026lt;/execution\u0026gt; \u0026lt;/executions\u0026gt; \u0026lt;configuration\u0026gt; \u0026lt;includeProjectDependencies\u0026gt;false\u0026lt;/includeProjectDependencies\u0026gt; \u0026lt;includePluginDependencies\u0026gt;true\u0026lt;/includePluginDependencies\u0026gt; \u0026lt;mainClass\u0026gt;org.apache.xmlbeans.impl.inst2xsd.Inst2Xsd\u0026lt;/mainClass\u0026gt; \u0026lt;arguments\u0026gt; \u0026lt;!-- Add as many arguments as you need --\u0026gt; \u0026lt;argument\u0026gt;-outDir\u0026lt;/argument\u0026gt; \u0026lt;argument\u0026gt;${project.build.outputDirectory}\u0026lt;/argument\u0026gt; \u0026lt;argument\u0026gt;-validate\u0026lt;/argument\u0026gt; \u0026lt;argument\u0026gt;${project.basedir}/src/main/resources/food-menu.xml\u0026lt;/argument\u0026gt; \u0026lt;/arguments\u0026gt; \u0026lt;/configuration\u0026gt; \u0026lt;dependencies\u0026gt; \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;org.apache.xmlbeans\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;xmlbeans\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;3.1.0\u0026lt;/version\u0026gt; \u0026lt;/dependency\u0026gt; \u0026lt;/dependencies\u0026gt; \u0026lt;/plugin\u0026gt; \u0026lt;/plugins\u0026gt; \u0026lt;/build\u0026gt; \u0026lt;!-- ... --\u0026gt; \u0026lt;/project\u0026gt; Code trouvé ici\n","date":"2024-03-09T00:00:00Z","permalink":"/blogprog/p/g%C3%A9n%C3%A9ration-du-xml-%C3%A0-partir-du-xsd/","title":"Génération du xml à partir du XSD"},{"content":"Heritage de type en XSD En XSD, il est possible d\u0026rsquo;utiliser l\u0026rsquo;heritage de type.\nPar exemple :\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 \u0026lt;xs:complexType name=\u0026#34;AddressType\u0026#34;\u0026gt; \u0026lt;xs:sequence\u0026gt; \u0026lt;xs:element name=\u0026#34;Line1\u0026#34; type=\u0026#34;xs:string\u0026#34; /\u0026gt; \u0026lt;xs:element name=\u0026#34;Line2\u0026#34; type=\u0026#34;xs:string\u0026#34; /\u0026gt; \u0026lt;/xs:sequence\u0026gt; \u0026lt;/xs:complexType\u0026gt; \u0026lt;xs:complexType name=\u0026#34;UKAddressType\u0026#34;\u0026gt; \u0026lt;xs:complexContent\u0026gt; \u0026lt;xs:extension base=\u0026#34;AddressType\u0026#34;\u0026gt; \u0026lt;xs:sequence\u0026gt; \u0026lt;xs:element name=\u0026#34;County\u0026#34; type=\u0026#34;xs:string\u0026#34; /\u0026gt; \u0026lt;xs:element name=\u0026#34;Postcode\u0026#34; type=\u0026#34;xs:string\u0026#34; /\u0026gt; \u0026lt;/xs:sequence\u0026gt; \u0026lt;/xs:extension\u0026gt; \u0026lt;/xs:complexContent\u0026gt; \u0026lt;/xs:complexType\u0026gt; \u0026lt;xs:complexType name=\u0026#34;USAddressType\u0026#34;\u0026gt; \u0026lt;xs:complexContent\u0026gt; \u0026lt;xs:extension base=\u0026#34;AddressType\u0026#34;\u0026gt; \u0026lt;xs:sequence\u0026gt; \u0026lt;xs:element name=\u0026#34;State\u0026#34; type=\u0026#34;xs:string\u0026#34; /\u0026gt; \u0026lt;xs:element name=\u0026#34;Zipcode\u0026#34; type=\u0026#34;xs:string\u0026#34; /\u0026gt; \u0026lt;/xs:sequence\u0026gt; \u0026lt;/xs:extension\u0026gt; \u0026lt;/xs:complexContent\u0026gt; \u0026lt;/xs:complexType\u0026gt; Le type UKAddressType contient les champs Line1, Line2, Country et Postcode, alors que le type USAddressType contient les champs Line1, Line2, Stat et Zipcode.\nLe type AddressType peut tre abstract avec l\u0026rsquo;attribut abstract=\u0026quot;true\u0026quot;\nUtilisation dans du XSD Pour utiliser dans du xsd l\u0026rsquo;un ou l\u0026rsquo;autre, il faut indiquer le type :\n1 2 \u0026lt;xs:element name=\u0026#34;UKAddress\u0026#34; type=\u0026#34;UKAddressType\u0026#34; /\u0026gt; \u0026lt;xs:element name=\u0026#34;USAddress\u0026#34; type=\u0026#34;USAddressType\u0026#34; /\u0026gt; Utilisation dans du XML Pour l\u0026rsquo;utiliser dans du xml, il faut ajouter l\u0026rsquo;attribut xsi:type.\nPar exemple pour le type suivant\n1 2 3 4 5 6 7 8 \u0026lt;xs:element name=\u0026#34;Person\u0026#34;\u0026gt; \u0026lt;xs:complexType\u0026gt; \u0026lt;xs:sequence\u0026gt; \u0026lt;xs:element name=\u0026#34;Name\u0026#34; type=\u0026#34;xs:string\u0026#34; /\u0026gt; \u0026lt;xs:element name=\u0026#34;HomeAddress\u0026#34; type=\u0026#34;AddressType\u0026#34; /\u0026gt; \u0026lt;/xs:sequence\u0026gt; \u0026lt;/xs:complexType\u0026gt; \u0026lt;/xs:element\u0026gt; Il peut tre utilis comme a :\n1 2 3 4 5 6 7 8 \u0026lt;?xml version=\u0026#34;1.0\u0026#34; ?\u0026gt; \u0026lt;Person\u0026gt; \u0026lt;Name\u0026gt;Fred\u0026lt;/Name\u0026gt; \u0026lt;HomeAddress\u0026gt; \u0026lt;Line1\u0026gt;22 whatever place, someplace\u0026lt;/Line1\u0026gt; \u0026lt;Line2\u0026gt;sometown, ss1 6gy \u0026lt;/Line2\u0026gt; \u0026lt;/HomeAddress\u0026gt; \u0026lt;/Person\u0026gt; ou comme a :\n1 2 3 4 5 6 7 8 9 10 \u0026lt;?xml version=\u0026#34;1.0\u0026#34; ?\u0026gt; \u0026lt;Person xmlns:xsi=\u0026#34;http://www.w3.org/2001/XMLSchema-instance\u0026#34;\u0026gt; \u0026lt;Name\u0026gt;Fred\u0026lt;/Name\u0026gt; \u0026lt;HomeAddress xsi:type=\u0026#34;USAddressType\u0026#34;\u0026gt; \u0026lt;Line1\u0026gt;234 Lancaseter Av\u0026lt;/Line1\u0026gt; \u0026lt;Line2\u0026gt;SmallsVille\u0026lt;/Line2\u0026gt; \u0026lt;State\u0026gt;Florida\u0026lt;/State\u0026gt; \u0026lt;Zipcode\u0026gt;34543\u0026lt;/Zipcode\u0026gt; \u0026lt;/HomeAddress\u0026gt; \u0026lt;/Person\u0026gt; Information trouv ici\n","date":"2024-03-09T00:00:00Z","permalink":"/blogprog/p/heritage-de-type-en-xsd/","title":"Heritage de type en xsd"},{"content":"Liste des transactions ouvertes en Oracle Pour lister les sessions Oracle, il faut executer la requete suivante :\n1 2 3 4 5 6 7 select s.inst_id, s.sid, s.serial#, s.username, s.program, s.osuser, s.status session_status, s.sql_id, t.status tran_status, t.start_time tran_start, t.used_ublk used_undo_blocks, t.used_urec used_undo_recs from gv$session s, gv$transaction t where t.addr = s.taddr; ","date":"2024-03-09T00:00:00Z","permalink":"/blogprog/p/lister-les-transactions-ouvertes-en-oracle/","title":"Lister les transactions ouvertes en Oracle"},{"content":"Table locké Pour vérifier si une table est locké en Oracle, il faut executer la requete sql avec un compte system :\n1 2 3 4 -- Query to Get List of all locked objects SELECT B.Owner, B.Object_Name, A.Oracle_Username, A.OS_User_Name FROM V$Locked_Object A, All_Objects B WHERE A.Object_ID = B.Object_ID ; Ensuite il faut récupérer les identifants avec la requete suivante, en remplacant NOM_DU_SCHEMA par le nom du schéma concerné :\n1 2 -- Query to Get List of locked sessions select SID,SERIAL#,INST_ID from gv$session a where schemaname = \u0026#39;NOM_DU_SCHEMA\u0026#39;; Enfin, il faut arreter le lock, en utilisant le résultat de la requete précédente :\n1 2 -- Statement to Kill the session [pass values in the same order and append @ for inst_id] alter system kill session \u0026#39;314,26513,@1\u0026#39;; Code trouvé ici\n","date":"2024-03-09T00:00:00Z","permalink":"/blogprog/p/suppression-du-lock-sur-une-table-oracle/","title":"Suppression du lock sur une table Oracle"},{"content":"Supprimer balise XML avec une Regex Pour supprimer une balise et son contenu dans un document xml en utilisant une regex :\n1 xmlRequest=xmlRequest.replaceAll(\u0026#34;\u0026lt;Address\u0026gt;[\\\\s\\\\S]*?\u0026lt;/Address\u0026gt;\u0026#34;,\u0026#34;\u0026#34;); C\u0026rsquo;est en Java, mais cela fonctionne dans d\u0026rsquo;autres langages. Si la balise est présente plusieurs fois, ça les suppriment tous. Code trouvé ici\n","date":"2024-03-09T00:00:00Z","permalink":"/blogprog/p/supprimer-une-balise-xml-et-son-contenu-grace-a-une-regex-en-java/","title":"Supprimer une balise xml et son contenu grace a une regex en Java"},{"content":"Suppression des répertoires La suppression d\u0026rsquo;une grande arborescence de répetroire est très lente avec l\u0026rsquo;explorateur. Pour supprimer des répertoires, de façon plus rapide, il y a la commande robocopy. Pour supprimer le répertoire c:\\test, il faut créer un répertoire vide c:\\empty, puis lancer :\n1 robocopy c:\\empty c:\\test /purge ou\n1 robocopy c:\\empty c:\\test /MIR La différence est que si le répertoire c:\\test existe, les ACL ne seront pas modifiés avec la commande /MIR\n","date":"2024-02-27T00:00:00Z","permalink":"/blogprog/p/suppression-dune-grand-arborescence-sous-windows-rapidement-robocopy/","title":"suppression d'une grand arborescence sous windows rapidement (robocopy)"},{"content":"Formation Angular Ne jamais faire de subscrib dans un subscrib Il ne faut jamais faire de :\n1 2 3 4 5 6 7 8 this._bookRepository.getBookList() this._bookRepository.getBookList() .subscribe(bookList =\u0026gt; { this.bookList = bookList let autre=this.other.get().subscribe(bookList =\u0026gt; { // autre traitement }); }) Si on fait comme ça, on n\u0026rsquo;est pas sur de l\u0026rsquo;ordre des appels. Exemple ici. Il faut utiliser un switchMap pour ne prendre que le dernier, et faire un seul appel. Il faut aussi penser à retourner quelque chose s\u0026rsquo;il y a une erreur pour éviter d\u0026rsquo;arreter le flux.\nLibération d\u0026rsquo;un observable Pour liberer un observable, il faut utiliser takeUntileDestroy().\n","date":"2024-02-15T00:00:00Z","permalink":"/blogprog/p/formation-angular-17-02/2024/","title":"Formation Angular 17 (02/2024)"},{"content":"Liste de logiciels de backup Nom OS VSS Cryptage Cloud Job Cronné Payant Cobian Backup Windows Oui(symetrique) Oui Non Oui Non Restic Windows/Linux Oui Oui(symetrique) Oui Oui(resticProfile) Non Duplicacy Windows/Linux Oui(Asymetrique) Oui Oui Oui ","date":"2024-02-04T00:00:00Z","permalink":"/blogprog/p/liste-de-logiciels-de-backup/","title":"Liste de logiciels de backup"},{"content":"les IA de chat ChatGPT : L\u0026rsquo;IA ChatGPT d\u0026rsquo;OpenIA en version 3.5 Bard : L\u0026rsquo;IA de Google Bing : L\u0026rsquo;IA Bing de Microsoft, basé sur ChatGPT 4 Mistral : model de donnée de Mistral IA LLama : model de donnée de LLama 2 de Facebook les IA qui génère des images Midjourney : outils pour générer une image Dall-E : outils de génération d\u0026rsquo;image de OpenIA Stable-Diffusion : Outils pour générer des images. En ligne. Il est possible de l\u0026rsquo;installer sur son poste Leonardo : génération d\u0026rsquo;image impressionante, mais payant les outils LLama Index : outils pour ingérer des données dans un LLM Git LangChain : permet de traiter la réponse d\u0026rsquo;un LLM pour faire des actions Git LM Studio : outils pour utiliser les LLM sur le bureau sans internet OpenCV : outils pour la reconnaissance à partir d\u0026rsquo;image les outils sur internet huggingface : Contient des modles d\u0026rsquo;IA Google Colab : Pour faire des tutoriaux d\u0026rsquo;IA Awesome Colab : Une grande liste de Notebook pour apprendre l\u0026rsquo;IA les tutoriels Les bases : https://www.youtube.com/watch?v=QWVZUEBU11s Utilisation de LM Studio : https://www.youtube.com/watch?v=jshgEkO6MhI ","date":"2024-01-02T00:00:00Z","permalink":"/blogprog/p/les-outils-pour-lia/","title":"Les outils pour l'ia"},{"content":"Stack has built-in support for math typesetting using KaTeX.\nIt\u0026rsquo;s not enabled by default side-wide, but you can enable it for individual posts by adding math: true to the front matter. Or you can enable it side-wide by adding math = true to the params.article section in config.toml.\nInline math This is an inline mathematical expression: $\\varphi = \\dfrac{1+\\sqrt5}{2}= 1.6180339887…$\n1 $\\varphi = \\dfrac{1+\\sqrt5}{2}= 1.6180339887…$ Block math $$\r\\varphi = 1+\\frac{1} {1+\\frac{1} {1+\\frac{1} {1+\\cdots} } } $$ 1 2 3 $$ \\varphi = 1+\\frac{1} {1+\\frac{1} {1+\\frac{1} {1+\\cdots} } } $$ $$\rf(x) = \\int_{-\\infty}^\\infty\\hat f(\\xi)\\,e^{2 \\pi i \\xi x}\\,d\\xi\r$$ 1 2 3 $$ f(x) = \\int_{-\\infty}^\\infty\\hat f(\\xi)\\,e^{2 \\pi i \\xi x}\\,d\\xi $$ ","date":"2023-08-24T00:00:00Z","permalink":"/blogprog/p/math-typesetting/","title":"Math Typesetting"},{"content":"Pour executer un fichier jar dans le répertoire courant, en prenant le premier jar trouvé, il faut faire\n1 2 3 4 5 6 7 8 9 10 SET mypath=%~dp0 rem echo %mypath:~0,-1% SET REP=%mypath:~0,-1% set filename=monjar-1.0.jar FOR %%F IN (*.jar) DO ( set filename=%%F goto next ) :next java -jar %REP%\\%filename% ","date":"2023-06-07T00:00:00Z","permalink":"/blogprog/p/execution-du-premier-jar-trouv%C3%A9/","title":"Execution du premier jar trouvé"},{"content":"Pour trier un objet sur 2 champs, il faut faire une fonction spéciale de trie :\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 interface Person { name: string; age: number; } const personnes: Person[] = [ { name: \u0026#34;Alice\u0026#34;, age: 25 }, { name: \u0026#34;Bob\u0026#34;, age: 30 }, { name: \u0026#34;Charlie\u0026#34;, age: 20 }, { name: \u0026#34;Alice\u0026#34;, age: 30 } ]; personnes.sort((a, b) =\u0026gt; { if (a.age !== b.age) { return a.age - b.age; // Trie par âge en ordre croissant } else { return a.name.localeCompare(b.name); // Trie par nom en ordre alphabétique } }); ","date":"2023-06-05T00:00:00Z","permalink":"/blogprog/p/trie-en-typescript-dun-objet-sur-2-champs/","title":"Trie en Typescript d'un objet sur 2 champs"},{"content":"Toutes les commandes doivent être executé en administrateur.\nListe Pour lister les shadow copy : vssadmin list shadows\n1 2 3 4 5 6 7 8 9 10 11 12 13 vssadmin 1.1 - Outil ligne de commande d’administration du service de cliché instantané de volume (C) Copyright 2001-2013 Microsoft Corp. Contenu du jeu de clichés instantanés n° : {s2acebd3-14e3-4786-a53e-5ae3c8c62eba} Contenait 1 clichés instantanés à la date de création : 19/05/2023 18:58:50 ID du cliché instantané : {81c4df18-1af6-1b8c-b29d-04e981ed970c} Volume original : (D:)\\\\?\\Volume{c6cccf4b-dd16-4240-8bbd-5fbf9c080b2e}\\ Volume de cliché instantané : \\\\?\\GLOBALROOT\\Device\\HarddiskVolumeShadowCopy41 Ordinateur d’origine : SERVER Ordinateur de service : SERVER Fournisseur : \u0026#39;Microsoft Software Shadow Copy provider 1.0\u0026#39; Type : ClientAccessible Attributs : Persistent, Accessible par client, Pas de libération automatique, Aucun rédacteur, Différentielle Creer powershell.exe -Command \u0026quot;(gwmi -list win32_shadowcopy).Create('E:\\','ClientAccessible')\u0026quot;\n1 2 3 4 5 6 7 8 9 10 11 12 13 __GENUS : 2 __CLASS : __PARAMETERS __SUPERCLASS : __DYNASTY : __PARAMETERS __RELPATH : __PROPERTY_COUNT : 2 __DERIVATION : {} __SERVER : __NAMESPACE : __PATH : ReturnValue : 0 ShadowID : {42A5CD56-3DCA-C57A-C38C-04E981ED970C} PSComputerName : Supprimer Pour supprimer, la commande est : vssadmin delete shadows /for=C:\n1 2 3 4 5 6 vssadmin 1.1 - Outil ligne de commande d’administration du service de cliché instantané de volume (C) Copyright 2001-2013 Microsoft Corp. Voulez-vous vraiment supprimer 1 clichés instantanés (O/N) : [N] ? o 1 clichés instantanés ont été supprimés. Il est aussi possible de supprimer en indiquer l\u0026rsquo;ID du cliché : vssadmin delete shadows /Shadow=c6cccf4b-dd16-4240-8bbd-5fbf9c080b2e\nLien https://stackoverflow.com/a/14213304/6577778\nLien symbolique Pour manipuler les fichiers, il faut utiliser un lien symbolique :\n1 mklink /d C:\\shadowcopy \u0026#34;\\\\?\\GLOBALROOT\\Device\\HarddiskVolumeShadowCopy41\\\u0026#34; Il faut mettre un \\ à la fin, sinon c\u0026rsquo;est un lien vers un fichier.\nPopur supprimer le lien, il faut executer :\n1 rmdir C:\\shadowcopy ","date":"2023-05-19T00:00:00Z","permalink":"/blogprog/p/gestion-des-shadow-copy-vss-sous-windows/","title":"gestion des shadow copy (vss) sous windows"},{"content":" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 package main import( \u0026#34;bufio\u0026#34; \u0026#34;fmt\u0026#34; \u0026#34;log\u0026#34; \u0026#34;os\u0026#34; \u0026#34;regexp\u0026#34; ) func handleLine(line string) { matched, err := regexp.MatchString(os.Args[1], line) if err != nil { log.Fatal(err) } else if matched { fmt.Println(line) } } func main() { scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { handleLine(scanner.Text()) } if err := scanner.Err(); err != nil { log.Fatal(err) } } ","date":"2023-05-07T00:00:00Z","permalink":"/blogprog/p/a-simple-grep-implementation-in-go/","title":"A simple grep implementation in Go"},{"content":"A curated list of command-line utilities written in Rust Note: I have moved this list to a proper repository. I\u0026rsquo;ll leave this gist up, but it won\u0026rsquo;t be updated. To submit an idea, open a PR on the repo.\nNote that I have not tried all of these personally, and cannot and do not vouch for all of the tools listed here. In most cases, the descriptions here are copied directly from their code repos. Some may have been abandoned. Investigate before installing/using.\nThe ones I use regularly include: bat, dust, fd, fend, hyperfine, miniserve, ripgrep, just, cargo-audit and cargo-wipe.\natuin: \u0026ldquo;Magical shell history\u0026rdquo; bandwhich: Terminal bandwidth utilization tool bat: A replacement for cat that provides syntax highlighting and other features. bottom: Yet another cross-platform graphical process/system monitor. broot: A new way to see and navigate directory trees counts: \u0026ldquo;A tool for ad hoc profiling\u0026rdquo; choose: A human-friendly and fast alternative to cut and (sometimes) awk delta: A syntax-highlighting pager for git, diff, and grep output difftastic: A syntax-aware diff dog: A command-line DNS client dua: \u0026ldquo;View disk space usage and delete unwanted data, fast.\u0026rdquo; dust: \u0026ldquo;a more intuitive version of du in Rust\u0026rdquo; exa: \u0026ldquo;A modern version of ls\u0026rdquo;. Note: latest release is from April 2021. See discussion re: maintenance. fclones: an \u0026ldquo;efficient duplicate file finder\u0026rdquo; fd: \u0026ldquo;A simple, fast and user-friendly alternative to find\u0026rdquo; felix: tui file manager with vim-like key mapping ffsend: \u0026ldquo;Easily and securely share files from the command line. A fully featured Firefox Send client.\u0026rdquo; frum: A modern Ruby version manager written in Rust fselect: \u0026ldquo;Find files with SQL-like queries\u0026rdquo; git-cliff: \u0026ldquo;A highly customizable Changelog Generator that follows Conventional Commit specifications\u0026rdquo; gptman: \u0026ldquo;A GPT manager that allows you to copy partitions from one disk to another and more\u0026rdquo; grex: A command-line tool and library for generating regular expressions from user-provided test cases Himalaya: Command-line interface for email management htmlq: Like jq, but for HTML. Uses CSS selectors to extract bits of content from HTML files. hyperfine: Command-line benchmarking tool inlyne: \u0026ldquo;GPU powered yet browsless tool to help you quickly view markdown files\u0026rdquo; jless: \u0026ldquo;command-line JSON viewer designed for reading, exploring, and searching through JSON data.\u0026rdquo; jql: A JSON query language CLI tool just: Just a command runner (seems like an alternative to make) legdur: A \u0026ldquo;simple CLI program to compute hashes of large sets of files in large directory structures and compare them with a previous snapshot.\u0026rdquo; lemmeknow: Identify mysterious text or analyze hard-coded strings from captured network packets, malwares, and more. lfs: A Linux utility to get information on filesystems; like df but better lsd: The next generation ls command (though personally I prefer exa) macchina: Fast, minimal and customizable system information frontend. mdBook: Create books from markdown files. Like Gitbook but implemented in Rust mdcat: Fancy cat for Markdown miniserve is \u0026ldquo;a CLI tool to serve files and dirs over HTTP\u0026rdquo;. I use this as a replacement for python -m SimpleHTTPServer, or whatever the latest version of that command is. monolith: Save complete web pages as a single HTML file ouch: \u0026ldquo;Painless compression and decompression for your terminal\u0026rdquo; pastel: A command-line tool to generate, analyze, convert and manipulate colors. pipr: \u0026ldquo;A tool to interactively write shell pipelines.\u0026rdquo; procs: A modern replacement for ps written in Rust qsv: CSVs sliced, diced \u0026amp; analyzed. (A fork of xsv) rargs: xargs + awk with pattern matching support. rip: A safe and ergonomic alternative to rm ripgrep: A faster replacement for GNU’s grep command. This tool is very good. See ripgrep-all to search PDFs, E-Books, Office documents, zip, tar.gz, etc. ripsecrets: Find secret keys in your code before commiting them to git. I\u0026rsquo;ve contributed to this one! rnr: \u0026ldquo;A command-line tool to batch rename files and directories\u0026rdquo; sd: Intuitive find \u0026amp; replace CLI (sed alternative). skim: A command-line fuzzy finder. tealdear: A very fast implementation of tldr in Rust. teehee: \u0026ldquo;A modal terminal hex editor\u0026rdquo; tin-summer: Find build artifacts that are taking up disk space tokei: Count your (lines of) code, quickly topgrade: Upgrade all of your tools watchexec: Execute commands in response to file modifications. (Note: See cargo watch if you want to watch a Rust project.) xcp: An extended cp xh: \u0026ldquo;Friendly and fast tool for sending HTTP requests\u0026rdquo; xsv: A fast CSV command line toolkit written in Rust. (Last updated in 2018) zoxide: A smarter cd command. Calculators eva: \u0026ldquo;a calculator REPL, similar to bc(1)\u0026rdquo; (be sure to check out fend as well) fend: \u0026ldquo;Arbitrary-precision unit-aware calculator\u0026rdquo; (Documentation) Kalker: \u0026ldquo;a calculator with math syntax that supports user-defined variables and functions, complex numbers, and estimation of derivatives and integrals\u0026rdquo; printfn: \u0026ldquo;Arbitrary-precision unit-aware calculator\u0026rdquo; Tools to help working with Rust lang itself cargo-audit: Audit Cargo.lock files for crates with security vulnerabilities reported to the RustSec Advisory Database. See also: cargo-deny. cargo-geiger: Detects usage of unsafe Rust in a Rust crate and its dependencies. cargo-wipe: Cargo subcommand that recursively finds and optionally wipes all \u0026ldquo;target\u0026rdquo; or \u0026ldquo;node_modules\u0026rdquo; folders that are found in the current path. See also: kondo. cargo-crev: A cryptographically verifiable code review system for the cargo (Rust) package manager. bacon: A background Rust code checker cargo watch: Watches over your Cargo project\u0026rsquo;s source. cargo-binstall: \u0026ldquo;Binary installation for [R]ust projects\u0026rdquo; kani-verifier: A \u0026ldquo;bit-precise model checker for Rust.\u0026rdquo; Terminal emulators / terminal-related Alacritty: A cross-platform, OpenGL terminal emulator. Wezterm: A GPU-accelerated cross-platform terminal emulator and multiplexer written by @wez and implemented in Rust Starship: Customizable prompt for any shell. Zellij: A terminal workspace with batteries included. Text editors written in Rust amp helix kibi: \u0026ldquo;A text editor in ≤1024 lines of code, written in Rust\u0026rdquo; lapce pepper xi zee See this \u0026ldquo;Battle of the [Rust] text editors\u0026rdquo; post from 2022.\nEmail clients himalaya: \u0026ldquo;Command-line interface for email management\u0026rdquo; Other lists of Rust command line utilities lib.rs\u0026rsquo;s list \u0026ldquo;Awesome Rust\u0026rdquo; Awesome Alternatives in Rust Tips exa aliases I use in my ~/.bashrc 1 2 3 4 5 6 7 8 9 10 11 12 if hash exa 2\u0026gt;/dev/null; then alias ls=\u0026#39;exa\u0026#39; alias l=\u0026#39;exa -l --all --group-directories-first --git\u0026#39; alias ll=\u0026#39;exa -l --all --all --group-directories-first --git\u0026#39; alias lt=\u0026#39;exa -T --git-ignore --level=2 --group-directories-first\u0026#39; alias llt=\u0026#39;exa -lT --git-ignore --level=2 --group-directories-first\u0026#39; alias lT=\u0026#39;exa -T --git-ignore --level=4 --group-directories-first\u0026#39; else alias l=\u0026#39;ls -lah\u0026#39; alias ll=\u0026#39;ls -alF\u0026#39; alias la=\u0026#39;ls -A\u0026#39; fi Shameless plug: Tools that I\u0026rsquo;ve written in Rust Tidy: A command-line tool for combining and cleaning large word list files. Medic: Check the \u0026ldquo;health\u0026rdquo; of passwords in a KeePass database Know a good one that I don\u0026rsquo;t have listed here? Let me know in the comments, a PR, on Mastodon or Twitter.\nLicensing This document is licensed under CC0 1.0 Universal (CC0 1.0) Public Domain Dedication.\n","date":"2023-04-30T00:00:00Z","permalink":"/blogprog/p/a-curated-list-of-command-line-utilities-written-in-rust/","title":"A curated list of command-line utilities written in Rust"},{"content":"DEVOXX du 12 au 14 avril Programme Video\nMecredi 12 avril Value types et Pattern matching : 1 partout, données au centre Video\nLes value types devrait être dans Java 21, pour le Patern Matching, c\u0026rsquo;est pas avant fin 2024 Comprendre et utiliser les modèles de langage d\u0026rsquo;IA Video\nPrésentation d\u0026rsquo;un REX sur les LLM. Historique de l\u0026rsquo;IA dans le domaine des LLM (fine tuning, prompting, etc\u0026hellip;). Il dit aussi que c\u0026rsquo;est pas très bien maitrisé.\nDétectez et corrigez automatiquement les problèmes les plus fréquents avec Apache Kafka Video\nIls proposent de mettre leur outils entre les client et Kafka pour obliger à bien utiliser Kafka. Ils donnent une liste de mauvaises utilisation de Kafka.\nPlaywright : l\u0026rsquo;outil qui va révolutionner les tests end-to-end Video\nPrésentation de l\u0026rsquo;outils Playwright. L\u0026rsquo;outils semble permettre de ne pas casser les tests si l\u0026rsquo;ihm change. Il permet aussi d\u0026rsquo;éviter les problèmes ou il faut attendre que le bouton s\u0026rsquo;affiche.\nJeudi 13 avril L’IA va-t-elle changer notre métier de développeur ? Video\nPrésentation de copilote. Ca a de gros potentiel, mais le fonctionnement n\u0026rsquo;est pas identique à chaque execution. Il peut refactoriser, générer des commentaires, expliquer du code, générer le code du controleur à partir d\u0026rsquo;une liste, etc\u0026hellip; pendant la demo, plusieurs fois, copilote a supprimer tout le code au lieux de faire ce qu\u0026rsquo;on lui demander.\nAlice au pays d\u0026rsquo;OpenTelemetry Video\nREX sur l\u0026rsquo;utilisation d\u0026rsquo;open telemetry. Il a eu pas mal de difficultés. Il a réussi pour les metrics, et les traces, mais pas pour les logs. Pour les logs, il a utiliser un autre outils.\nStorybook, une vraie bonne idée ? Video\nPrésentation de storybook. Ca a fonctionner pour eux.\nLoi de Conway : lorsque les bonnes pratiques ne suffisent pas Video\nPrésentation des problèmes d\u0026rsquo;organisation dans les entreprises qui peuvent avoir un impacte sur la construction des produits.\nLes nouveautés de Java 19 et 20 Video\nLes fonctionnalités de Java 19 et Java 20.\nGestion de la dette d\u0026rsquo;architecture dans un contexte d\u0026rsquo;hypercroissance Video\nExplication pour gérer la dette d\u0026rsquo;architecture.\nVendredi 14 avril Clean as You Code your projects Video\nPour eux, le mieux, c\u0026rsquo;est de corriger les code au fur et a mesure c-a-d que si tu corrige un bug dans une fonction, et qu\u0026rsquo;il y a d\u0026rsquo;autres problèmes dans cette fonctione, le mieux c\u0026rsquo;est de corriger ces autres problèmes en même temps.\nBootiful Spring Boot 3 Video\nPrésentationde quelques fonctionnalités de Spring boot 3. L\u0026rsquo;auteur, Josh long, a proposer d\u0026rsquo;ajouter une musique d\u0026rsquo;ascensseur pour les buils de graalvm, mais ça n\u0026rsquo;a pas été accepté.\nLes tests de charge sans être à côté de la plaque Video\nPrésentation des bonnes pratiques pour faire des tests de charges.\nLe Craft : des concepts au déploiement à l\u0026rsquo;échelle Video\nPrésentation de la mise en place du DDD. Semble trop succin. On est parti avant la fin.\nAutre Le chiffrement symétrique de A à Z (Laurent GRANGEAU et Mickael ROGER) Video\nLe chiffrement symetrique\nKubernetes, dépassionné et pour les ultra débutants Video\nLoki: Comme Prometheus Mais Pour Les Logs Video\nRésoudre AdventOfCode avec Github Copilot et OpenAI ChatGTP Video\nLincheck: Testing concurrency on the JVM par Maria Sokolova\nFoundationDB : le secret le mieux gardé des nouvelles architectures distribuées ! par Pierre Zemb et Steven Le Roux\nImproving your skills with the Debugger par Bouke Nijuis\nHidden security features of the JVM – everything you didn’t know and more par Steve Poole\n","date":"2023-04-15T00:00:00Z","permalink":"/blogprog/p/devoxx-2023-du-12-au-14-avril/","title":"Devoxx 2023 du 12 au 14 avril"},{"content":"Répertoire du script BAT Pour récupérer le répertoire du script en cours en BAT, la variable est %~dp0. pour enlever le \\ à la fin, la variable est %~dp0:~0,-1%\nExemple :\n1 2 SET mypath=%~dp0 echo %mypath:~0,-1% ","date":"2023-03-09T00:00:00Z","permalink":"/blogprog/p/r%C3%A9cup%C3%A9ration-du-r%C3%A9pertoire-du-script-bat/","title":"Récupération du répertoire du script BAT"},{"content":"Renommage de fichiers 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 find . -name \u0026#39;node_modules\u0026#39; -type d -prune find . -name \u0026#39;node_modules\u0026#39; -type d -prune -exec rm -rf \u0026#39;{}\u0026#39; + find . -name \u0026#39;node_modules\u0026#39; -o -name \u0026#39;target\u0026#39; -type d -prune find . -name \u0026#39;node_modules\u0026#39; -o -name \u0026#39;target\u0026#39; -type d -prune -exec rm -rf \u0026#39;{}\u0026#39; + find . -name \u0026#39;node_modules\u0026#39; -o -name \u0026#39;target\u0026#39; -o -name \u0026#39;.angular\u0026#39; -type d -prune -exec rm -rf \u0026#39;{}\u0026#39; + find . -name \u0026#39;node_modules\u0026#39; -type d -prune -exec rm -rf \u0026#39;{}\u0026#39; + find . -type f -name \u0026#34;*.zip\u0026#34; -exec sh -c \u0026#39;x=\u0026#34;{}\u0026#34;; mv \u0026#34;$x\u0026#34; \u0026#34;${x}_renamed.txt\u0026#34;\u0026#39; \\; find . -type f -name \u0026#34;*.7z\u0026#34; \u0026gt;liste_7z_files.txt find . -type f -name \u0026#34;*.7z\u0026#34; -exec sh -c \u0026#39;x=\u0026#34;{}\u0026#34;; mv \u0026#34;$x\u0026#34; \u0026#34;${x}_renamed.txt\u0026#34;\u0026#39; \\; find . -type f -exec rename -n -e \u0026#39;s/(.*)\\-DESKTOP\\-9EI0FN7(.*)/$1$2/\u0026#39; {} \\; ","date":"2023-02-10T00:00:00Z","permalink":"/blogprog/p/renommage-de-fichiers/","title":"Renommage de fichiers"},{"content":"Liste de Design Pattern https://learn.microsoft.com/en-us/azure/architecture/patterns/ https://learn.microsoft.com/en-us/azure/architecture/patterns/category/design-implementation https://refactoring.guru/fr/design-patterns https://fr.wikipedia.org/wiki/Patron_de_conception https://en.wikipedia.org/wiki/Software_design_pattern ","date":"2022-12-29T00:00:00Z","permalink":"/blogprog/p/liste-de-design-patterns/","title":"Liste de Design Patterns"},{"content":"Liste d\u0026rsquo;outils en CSS https://dev.to/lissy93/super-useful-css-resources-1ba3\nListe d\u0026rsquo;images gratuites https://dev.to/namangarg/best-free-images-website-for-development-3idi\n","date":"2022-12-07T00:00:00Z","permalink":"/blogprog/p/liste-doutils-css/","title":"Liste d'outils CSS"},{"content":"Devenir propriété d\u0026rsquo;un répertoire sous windows pour devenir propriétaire du répertoire c:\\monrepertoire sous windows, il faut executer la commande :\n1 takeown.exe /f c:\\monrepertoire /r Cela permet de régler les erreur avec git du style :\n1 2 3 4 fatal: unsafe repository (\u0026#39;c:/monrepertoire\u0026#39; is owned by someone else) To add an exception for this directory, call: git config --global --add safe.directory c:/monrepertoire ","date":"2022-11-27T00:00:00Z","permalink":"/blogprog/p/devenir-propri%C3%A9t%C3%A9-dun-r%C3%A9pertoire-sous-windows/","title":"Devenir propriété d'un répertoire sous windows"},{"content":"Exemple 1 1 2 echo \u0026#39;{\u0026#34;key1\u0026#34;:\u0026#34;val1\u0026#34;, \u0026#34;myarray\u0026#34;:[\u0026#34;abc\u0026#34;, \u0026#34;def\u0026#34;, \u0026#34;ghi\u0026#34;]}\u0026#39; | jq -r \u0026#39;[.key1, .myarray[0]] | @csv\u0026#39; \u0026#34;val1\u0026#34;,\u0026#34;abc\u0026#34; Exemple 2 1 jq -r \u0026#39;.results[] | ( .properties |map(select(.key[] contains (\u0026#34;prod\u0026#34;)) \u0026#39; ","date":"2022-11-17T00:00:00Z","permalink":"/blogprog/p/extraction-dune-table-%C3%A0-partir-de-json/","title":"Extraction d'une table à partir de json"},{"content":" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 # This is a sample Python script. import datetime import os import pandas as pd from io import StringIO import plotly.express as px import plotly.graph_objects as go # pd.DataFrame({\u0026#39;A\u0026#39;: [1, 2, 3]}) # # print(f\u0026#39;test: {pd.DataFrame}\u0026#39;) # # index = pd.date_range(\u0026#34;1/1/2000\u0026#34;, periods=8) # # print(index) class FileSize: def __init__(self, df, filename, date): self.df = df self.filename = filename self.date = date def parse(file): colnames = [\u0026#39;size\u0026#39;, \u0026#39;directory\u0026#39;] df = pd.read_csv(filepath_or_buffer=file, sep=\u0026#39;\\t\u0026#39;, skipinitialspace=True, names=colnames) df3 = df.query(\u0026#39;size.str.isnumeric()\u0026#39;) df3 = df3.astype({\u0026#39;size\u0026#39;: \u0026#39;int64\u0026#39;}) df4 = df3.sort_values(\u0026#39;size\u0026#39;) filename = os.path.basename(file) df4[\u0026#39;filename\u0026#39;] = filename s = filename s = s.removesuffix(\u0026#39;.txt\u0026#39;) s = s.removeprefix(\u0026#39;res_\u0026#39;) d = datetime.datetime.strptime(s, \u0026#39;%Y-%m-%d_%H-%M-%S\u0026#39;) df4[\u0026#39;date\u0026#39;] = d f = FileSize(df4, filename, d) return f def regroupe(f, f2, name): f.df[name] = 0 for index, row in f2.df.iterrows(): dir0 = row[\u0026#39;directory\u0026#39;] tmp = f.df.loc[f.df[\u0026#39;directory\u0026#39;] == dir0].index # print(\u0026#39;tmp\u0026#39;, tmp) if not tmp.empty: # tmp[\u0026#39;size2\u0026#39;]=row[\u0026#39;size\u0026#39;] # tmp.at[0,\u0026#39;size2\u0026#39;]=row[\u0026#39;size\u0026#39;] # print(\u0026#39;trouve\u0026#39;, tmp, tmp[0]) # print(\u0026#39;tmp\u0026#39;, tmp) f.df.at[tmp[0], name] = row[\u0026#39;size\u0026#39;] def supprimeLignesIdentiques(df, diff): # np.where((df[\u0026#39;Salary_in_1000\u0026#39;]\u0026gt;=100) \u0026amp; (df[\u0026#39;Age\u0026#39;]\u0026lt; 60) \u0026amp; (df[\u0026#39;FT_Team\u0026#39;].str.startswith(\u0026#39;S\u0026#39;))) # df.query(\u0026#39;Salary_in_1000 \u0026gt;= 100 \u0026amp; Age \u0026lt; 60 \u0026amp; FT_Team.str.startswith(\u0026#34;S\u0026#34;).values\u0026#39;) if diff == 0: df3 = df.query(\u0026#39;size != size2\u0026#39;) else: # df3 = df.query(\u0026#39;((size-size2) \u0026gt;\u0026#39;+diff+\u0026#39;) and \u0026#39;) # df3 = df.query(\u0026#39;(abs(size-size2) \u0026gt;\u0026#39; + str(diff) + \u0026#39;) | ((size-size2) \u0026lt; -\u0026#39; + str(diff) + \u0026#39;) \u0026#39;) df3 = df.query(\u0026#39;abs(size-size2) \u0026gt;\u0026#39; + str(diff) + \u0026#39; \u0026#39;) return df3 def main(): dir = \u0026#39;dir/\u0026#39; f1 = parse(dir + \u0026#39;res_2022-11-10_15-25-30.txt\u0026#39;) print(f1.df) f2 = parse(dir + \u0026#39;res_2022-10-31_11-24-46.txt\u0026#39;) print(f2.df) regroupe(f1, f2, \u0026#39;size2\u0026#39;) print(\u0026#39;df modifie\u0026#39;, f1.df) diffMax = 1_000_000 diffMax = 100_000_000 max = 0 listX = [] listY = [] listY2 = [] listYdiff = [] for index, row in f1.df.iterrows(): diff = abs(row[\u0026#39;size\u0026#39;] - row[\u0026#39;size2\u0026#39;]) if (diff \u0026gt; max): max = diff if diff \u0026gt;= diffMax: listX.append(row[\u0026#39;directory\u0026#39;]) listY.append(row[\u0026#39;size\u0026#39;]) listY2.append(row[\u0026#39;size2\u0026#39;]) listYdiff.append(abs(row[\u0026#39;size\u0026#39;] - row[\u0026#39;size2\u0026#39;])) print(\u0026#39;max\u0026#39;, max) # fig = px.line(x=listX, y=listY, title=\u0026#34;sample figure\u0026#34;) # print(fig) fig = go.Figure() # Create and style traces fig.add_trace(go.Scatter(x=listX, y=listY, name=\u0026#39;val_\u0026#39; + str(f1.date), line=dict(color=\u0026#39;firebrick\u0026#39;, width=2))) fig.add_trace(go.Scatter(x=listX, y=listY2, name=\u0026#39;val_\u0026#39; + str(f2.date), line=dict(color=\u0026#39;green\u0026#39;, width=2))) fig.add_trace(go.Scatter(x=listX, y=listY2, name=\u0026#39;diff\u0026#39;, line=dict(color=\u0026#39;blue\u0026#39;, width=2))) fig.show() # Press the green button in the gutter to run the script. if __name__ == \u0026#39;__main__\u0026#39;: main() ","date":"2022-11-13T00:00:00Z","permalink":"/blogprog/p/calcul-la-taille-des-r%C3%A9pertoires/","title":"Calcul la taille des répertoires"},{"content":"Liste de site pour tester les technologies web StackBlitz : HelloWorld React CodePen : HelloWorld React CodeSandbox : HelloWorld React Glitch : HelloWorld React ","date":"2022-10-09T00:00:00Z","permalink":"/blogprog/p/liste-de-sites-pour-g%C3%A9n%C3%A9rer-tester-les-technologies-web/","title":"Liste de sites pour générer tester les technologies web"},{"content":"Liste des fichiers superieurs à une certaine taille Batch 1 forfiles /P C:\\ /M *.* /S /C \u0026#34;CMD /C if @fsize gtr 524288000 echo @PATH @FSIZE\u0026#34; Powershell 1 Get-ChildItem C:\\ -recurse | where-object {$_.length -gt 524288000} | Sort-Object length | ft fullname, length -auto Nushell 1 ls | where size \u0026gt; 10mb | sort modified ","date":"2022-09-25T00:00:00Z","permalink":"/blogprog/p/liste-les-fichiers-plus-grands-quune-certaine-taille/","title":"Liste les fichiers plus grands qu'une certaine taille"},{"content":" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 ECHO OFF CLS REM https://www.sevenforums.com/tutorials/78083-batch-files-create-menu-execute-commands.html :MENU ECHO. ECHO ............................................... ECHO PRESS 1, 2 OR 3 to select your task, or 4 to EXIT. ECHO ............................................... ECHO. ECHO 1 - Open Notepad ECHO 2 - Open Calculator ECHO 3 - Open Notepad AND Calculator ECHO 4 - EXIT ECHO. SET /P M=Type 1, 2, 3, or 4 then press ENTER: IF %M%==1 GOTO NOTE IF %M%==2 GOTO CALC IF %M%==3 GOTO BOTH IF %M%==4 GOTO EOF :NOTE cd %windir%\\system32\\notepad.exe start notepad.exe GOTO MENU :CALC cd %windir%\\system32\\calc.exe start calc.exe GOTO MENU :BOTH cd %windir%\\system32\\notepad.exe start notepad.exe cd %windir%\\system32\\calc.exe start calc.exe GOTO MENU :EOF echo exit ","date":"2022-09-21T00:00:00Z","permalink":"/blogprog/p/cr%C3%A9ation-dun-menu-en-bat/","title":"Création d'un menu en bat"},{"content":"Exemple de commandes Tar 1 2 3 4 5 6 7 8 9 10 11 # Deflate / Compress $ tar -czf archive.tar.gz /path/files # Inflate / Uncompress $ tar -xzf archive.tar.gz # Extract file to a defined directory $ tar -xzf archive.tar.gz -C /target/directory # Append a file to an existing archive $ tar -zu archive.tar.gz -C /target/file Common options z :\tcompress with gzip c :\tcreate an archive u :\tappend files which are newer than the corresponding copy ibn the archive f :\tfilename of the archive v :\tverbose, display what is inflated or deflated a :\tunlike of z, determine compression based on file extension ","date":"2022-09-08T00:00:00Z","permalink":"/blogprog/p/description-of-tar-command/","title":"Description of tar command"},{"content":"JQuery 1 \u0026lt;button type=\u0026#34;submit\u0026#34; class=\u0026#34;btn btn-sm btn-primary\u0026#34; disabled\u0026gt;Upload file\u0026lt;/button\u0026gt; 1 2 3 4 5 6 7 8 $(\u0026#39;input[type=file]\u0026#39;).change(function(){ if($(\u0026#39;input[type=file]\u0026#39;).val()==\u0026#39;\u0026#39;){ $(\u0026#39;button\u0026#39;).attr(\u0026#39;disabled\u0026#39;,true) } else{ $(\u0026#39;button\u0026#39;).attr(\u0026#39;disabled\u0026#39;,false); } }) src\nVanilla Javascript 1 2 \u0026lt;input placeholder=\u0026#34;Enter some text\u0026#34; name=\u0026#34;name\u0026#34; id=\u0026#39;input\u0026#39;/\u0026gt; \u0026lt;button id=\u0026#39;button\u0026#39; disabled\u0026gt;Réserver\u0026lt;/button\u0026gt; 1 2 3 4 5 6 let inputElt = document.getElementById(\u0026#39;input\u0026#39;); let btn = document.getElementById(\u0026#39;button\u0026#39;); inputElt.addEventListener(\u0026#34;input\u0026#34;, function(){ btn.disabled = (this.value === \u0026#39;\u0026#39;); }) src\n","date":"2022-09-06T00:00:00Z","permalink":"/blogprog/p/disable-button-if-input-is-empty/","title":"Disable button if input is empty"},{"content":"Pour executer la commande dependency-tree en fixant la version, il faut executer la commande :\n1 mvn org.apache.maven.plugins:maven-dependency-plugin:3.3.0:tree ","date":"2022-08-21T00:00:00Z","permalink":"/blogprog/p/execution-du-plugin-maven-dependancy-tree-en-indiquant-la-version/","title":"Execution du plugin maven dependancy tree en indiquant la version"},{"content":"State of JS State of JS\n2021 2020 Stack Overflow Developer Survey 2021 2020 2022 Index Toibe Dernier index\n","date":"2022-08-21T00:00:00Z","permalink":"/blogprog/p/statistique-de-codage/","title":"Statistique de codage"},{"content":"Elasticsearch Explications Il y a 2 types de recherche :\nType de recherche Score Cache Query Variable Non Filter Fixe Oui Exemple :\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 GET /_search { \u0026#34;query\u0026#34;: { \u0026#34;bool\u0026#34;: { \u0026#34;must\u0026#34;: { \u0026#34;match\u0026#34;: { \u0026#34;message\u0026#34;: \u0026#34;this is a test\u0026#34; } }, \u0026#34;filter\u0026#34;: [ { \u0026#34;term\u0026#34;: { \u0026#34;user\u0026#34;: \u0026#34;kimchy\u0026#34; } }, { \u0026#34;term\u0026#34;: { \u0026#34;user\u0026#34;: \u0026#34;herald\u0026#34; } } ], \u0026#34;must_not\u0026#34;: { \u0026#34;term\u0026#34;: { \u0026#34;user\u0026#34;: \u0026#34;cassie\u0026#34; } }, \u0026#34;should\u0026#34;: { \u0026#34;term\u0026#34;: { \u0026#34;user\u0026#34;: \u0026#34;johnny\u0026#34; } } } }, \u0026#34;aggs\u0026#34;: { \u0026#34;user_terms\u0026#34;: { \u0026#34;terms\u0026#34;: { \u0026#34;field\u0026#34;: \u0026#34;user\u0026#34; } } } } Query String Exemple :\n1 2 3 4 5 6 7 8 9 GET /_search { \u0026#34;query\u0026#34;: { \u0026#34;query_string\u0026#34;: { \u0026#34;query\u0026#34;: \u0026#34;(new york city) OR (big apple)\u0026#34;, \u0026#34;default_field\u0026#34;: \u0026#34;content\u0026#34; } } } les AND et les OR doivent être en majuscule\nhttps://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html\nSimple Query https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html\nRequetes Url Signification GET _cat Information generale GET /_cat/indices Liste tous les indexes GET /_cat/health L\u0026rsquo;etat du cluster Elasticsearch GET / La version d\u0026rsquo;elasticsearch GET _cat/aliases La liste des alias GET //_mapping Le mapping de l\u0026rsquo;index POST //_search recherche sur l\u0026rsquo;index POST //_search recherche sur l\u0026rsquo;index POST //_count comptage sur l\u0026rsquo;index les operateurs de recherche https://coralogix.com/blog/42-elasticsearch-query-examples-hands-on-tutorial/\nExemples Exemple de requete en ElasticSearch :\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 POST /my-index-000001/_search { \u0026#34;query\u0026#34;: { \u0026#34;match\u0026#34;: { \u0026#34;[user.id](http://user.id/)\u0026#34;: \u0026#34;kimchy\u0026#34; } }, \u0026#34;fields\u0026#34;: [ \u0026#34;[user.id](http://user.id/)\u0026#34;, \u0026#34;http.response.*\u0026#34;, { \u0026#34;field\u0026#34;: \u0026#34;@timestamp\u0026#34;, \u0026#34;format\u0026#34;: \u0026#34;epoch_millis\u0026#34; } ], \u0026#34;_source\u0026#34;: false } Exemple trouvé ici\n1 2 3 4 5 6 7 8 9 10 GET /_search { \u0026#34;query\u0026#34;: { \u0026#34;simple_query_string\u0026#34; : { \u0026#34;query\u0026#34;: \u0026#34;\\\u0026#34;fried eggs\\\u0026#34; +(eggplant | potato) -frittata\u0026#34;, \u0026#34;fields\u0026#34;: [\u0026#34;title^5\u0026#34;, \u0026#34;body\u0026#34;], \u0026#34;default_operator\u0026#34;: \u0026#34;and\u0026#34; } } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { \u0026#34;query\u0026#34;: { \u0026#34;match\u0026#34;: { \u0026#34;my_field\u0026#34;: \u0026#34;meaning\u0026#34; } }, \u0026#34;fields\u0026#34;: [ \u0026#34;name\u0026#34;, \u0026#34;surname\u0026#34;, \u0026#34;age\u0026#34; ], \u0026#34;from\u0026#34;: 100, \u0026#34;size\u0026#34;: 20 } 1 curl \u0026#34;localhost:9200/_search?q=name:john~1 AND (age:[30 TO 40} OR surname:K*) AND -city\u0026#34; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 % curl \u0026#39;localhost:9200/_cat/indices?format=json\u0026amp;pretty\u0026#39; [ { \u0026#34;pri.store.size\u0026#34;: \u0026#34;650b\u0026#34;, \u0026#34;health\u0026#34;: \u0026#34;yellow\u0026#34;, \u0026#34;status\u0026#34;: \u0026#34;open\u0026#34;, \u0026#34;index\u0026#34;: \u0026#34;my-index-000001\u0026#34;, \u0026#34;pri\u0026#34;: \u0026#34;5\u0026#34;, \u0026#34;rep\u0026#34;: \u0026#34;1\u0026#34;, \u0026#34;docs.count\u0026#34;: \u0026#34;0\u0026#34;, \u0026#34;docs.deleted\u0026#34;: \u0026#34;0\u0026#34;, \u0026#34;store.size\u0026#34;: \u0026#34;650b\u0026#34; } ] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 curl -X PUT \u0026#39;http://localhost:9200/students\u0026#39; -d \u0026#39;{ \u0026#34;mappings\u0026#34;: { \u0026#34;student\u0026#34;: { \u0026#34;properties\u0026#34;: { \u0026#34;name\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;keyword\u0026#34; }, \u0026#34;degree\u0026#34; { \u0026#34;type\u0026#34;: \u0026#34;keyword\u0026#34; }, \u0026#34;age\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;integer\u0026#34; } }, \u0026#34;properties\u0026#34;: { \u0026#34;performance\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;keyword\u0026#34; } } } } }\u0026#39; 1 2 3 4 5 6 7 8 9 GET /my-index-000001/_search { \u0026#34;timeout\u0026#34;: \u0026#34;2s\u0026#34;, \u0026#34;query\u0026#34;: { \u0026#34;match\u0026#34;: { \u0026#34;user.id\u0026#34;: \u0026#34;kimchy\u0026#34; } } } 1 2 3 4 5 6 7 8 9 GET /my-index-000001/_search { \u0026#34;track_total_hits\u0026#34;: true, \u0026#34;query\u0026#34;: { \u0026#34;match\u0026#34; : { \u0026#34;user.id\u0026#34; : \u0026#34;elkbee\u0026#34; } } } Des sites avec d\u0026rsquo;autres exemples:\nhttps://gist.github.com/ruanbekker/e8a09604b14f37e8d2f743a87b930f93 https://www.bmc.com/blogs/elasticsearch-commands/ https://lzone.de/cheat-sheet/ElasticSearch https://elasticsearch-cheatsheet.jolicode.com/ ","date":"2022-08-10T00:00:00Z","permalink":"/blogprog/p/exemple-de-requete-en-elasticsearch/","title":"Exemple de requete en elasticsearch"},{"content":"Librairie pour usage standard en Golang Log log standard : C\u0026rsquo;est la librairie standard glog : gestion des logs logrus : gestion des logs structurée Tests Testify : gestion des assertions dans les tests go-spew : permet de loguer les structures pour le débogage pretty : affichage de façon lisible pour le debugage Configuration Viper : gestion de la configuration gestion des paramètres CLI Cobra : Gestion des paramètres CLI Top Gopher\n","date":"2022-08-04T00:00:00Z","permalink":"/blogprog/p/librairie-pour-usage-standard-en-golang/","title":"Librairie pour usage standard en Golang"},{"content":"Java Code analyser Checkstyle : Vérification du formatage du code Error Prone : Détection des bugs. Il y a un systeme d\u0026rsquo;extension Infer : jQAssistant : permet de vérifier des règles de codage, par exemple entre package NullAway : Détecte les pointeurs null PMD : Sonar : outils d\u0026rsquo;analyse des codes sources Java et C/C++ etc\u0026hellip; Spoon : il peut transformer le code. Il gère jusqu\u0026rsquo;a Java 16 Spotbugs : C\u0026rsquo;est le successeur de findbug Semmle : langage QL pour rechercher des bugs dans les sources bddbddb : analyse de bytecode de la JVM Reason : ajout d\u0026rsquo;un systeme de type à la ocaml au javascript ","date":"2022-07-31T00:00:00Z","permalink":"/blogprog/p/java-code-analyser/","title":"Java Code analyser"},{"content":" langage C like Typage Commentaire C Oui Oui Difficile à programmer. Facile de faire des bug C++ Oui Oui Difficile à programmer. Facile de faire des bug Java Oui Oui Simple à utiliser. Détecte pas mal de bugs à la compilation C# Oui Oui Go Non Oui Rust Non Oui Carbon Non Oui Haskell Non Oui V Non Oui Pascal Non Oui Eiffel Non Oui Prolog Non Non OCaml Non Oui Javascript Non faible (au runtime) Typescript Non Oui Python Non faible Ruby Non faible Nim Non faible Perl Non faible Dart Oui fort Zig Non faible datalog Non faible minikraken Non faible kotlin Non fort ","date":"2022-07-23T00:00:00Z","permalink":"/blogprog/p/liste-de-langages/","title":"Liste de langages"},{"content":"Memory library MSS: Memory Supervision System sourceforge\nYet another debugging malloc git\nDebugger Softice : debugger noyau wikipedia\nBoundsChecker : débuggeur mémoire wikipedia\nPurifyPlus : débuggeur mémoire wikipedia\nValgrind : débuggeur mémoire wikipedia\ndmalloc : débuggeur mémoire wikipedia\n","date":"2022-07-16T00:00:00Z","permalink":"/blogprog/p/c-library-and-tools/","title":"C library and tools"},{"content":"Gestion du positionnement en CSS Grid Flex\n","date":"2022-05-29T00:00:00Z","permalink":"/blogprog/p/tutoriel-sur-la-gestion-du-positionnement-en-css-avec-grid-et-flex/","title":"Tutoriel sur la gestion du positionnement en CSS avec Grid et Flex"},{"content":"Il faut penser à unsubscribe les observables.\n1 2 3 4 5 6 7 8 9 10 11 12 13 import { interval } from \u0026#39;rxjs\u0026#39;; const data$ = interval(1000); const subscription = data$.subscribe({ next: value =\u0026gt; console.log(value), error: error =\u0026gt; console.error(error), complete: () =\u0026gt; console.log(\u0026#39;DONE!\u0026#39;) }); // dans le ngOnDestroy() subscription.unsubscribe(); Une façon simple de le gérer, c\u0026rsquo;est d\u0026rsquo;utiliser takeUntil\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import { Component, OnInit, OnDestroy } from \u0026#39;@angular/core\u0026#39;; import { Subject, interval } from \u0026#39;rxjs\u0026#39;; import { takeUntil } from \u0026#39;rxjs/operators\u0026#39;; @Component({ ... }) export class AppComponent implements OnInit, OnDestroy { isOver$: Subject\u0026lt;boolean\u0026gt; = new Subject\u0026lt;boolean\u0026gt;(); constructor(private apollo: Apollo) {} ngOnInit() { this.myService.getAll() .pipe(takeUntil(this.isOver$)) .subscribe(data =\u0026gt; { console.info(data); },(e)=\u0026gt;{ console.error(\u0026#34;Error\u0026#34;, e); }); } ngOnDestroy() { this.isOver$.next(true); this.isOver$.unsubscribe(); } } ","date":"2022-05-27T00:00:00Z","permalink":"/blogprog/p/unsubscribe-des-observables/","title":"Unsubscribe des observables"},{"content":"Injection d\u0026rsquo;un fichier (Methode 1) 1 jq -Rn \u0026#39;.instances[0].image.b64 = inputs\u0026#39; \u0026lt; \u0026lt;(base64 volunteers.jpg | tr -d \\\\n) \u0026gt; input.json cf stakoverflow\nInjection d\u0026rsquo;un fichier (Methode 2) 1 jq -Rs --rawfile pub id_rsa.pub \u0026#39;{pem: ., pub: $pub}\u0026#39; id_rsa cf stakoverflow\nEncodage en base 64 1 jq \u0026#39;\u0026#34;Basic \u0026#34; + (\u0026#34;\\(.user):\\(.pass)\u0026#34;|@base64)\u0026#39; \u0026lt;basic.json cf stakoverflow\n","date":"2022-05-14T00:00:00Z","permalink":"/blogprog/p/injection-un-fichier-dans-du-json-en-lencodant-en-base64/","title":"Injection un fichier dans du json en l'encodant en base64"},{"content":"Commandes :\npowercfg –energy powercfg /batteryreport /output \u0026ldquo;C:\\temp\\diagnostic_batterie.html\u0026rdquo; HWRMonitor HWiNFO (Payant) BatteryCare Quelques site qui donnes des explications générales :\nComment tester la batterie de son ordinateur portable sous Windows (Windows 10, Windows 8…) ? Tester la batterie d\u0026rsquo;un PC portable sous Windows Tuto: logiciel pour tester la batterie sur ordinateur portable – Windows 10 ","date":"2022-05-12T00:00:00Z","permalink":"/blogprog/p/gestion-de-la-batterie-sous-windows/","title":"Gestion de la batterie sous Windows"},{"content":"Devoxx 2022 du 20 au 22 avril Mercredi 20 avril Programme Videos\nSpring Security - décodage et démystification Il faut mieux créer un bean plutot que de dériver de WebSecurityConfiguration Il est possible d\u0026rsquo;ajouter une methode dans la configuration du http Pour débuger, on peut augmenter le niveau de log ou mettre des points d\u0026rsquo;arret pour débuger Video\nLoom nous Protègera-t-il du Braquage Temporel ? C\u0026rsquo;est des taches qui ne sont pas des vrai thread. On peut en créer des millions sans problème, et sans utiliser 2Mo de stack par thread. Par contre cela pose problème si dans le code il y a des accès IO ou avec du code C. Ne sera pas pret avant Java 20 au moins.\nVidéo\nGitpod: la fin des frictions inutiles pour contribuer à un projet OSS ? L\u0026rsquo;idée, c\u0026rsquo;est de créer un contener distant qui peut être utiliser pour travailler avec un environnement pret à être utilisé. La version gratuite permet d\u0026rsquo;utiliser 50 heure par mois. Il faut penser à fermer la session pour ne pas utiliser inutilement des ressources.\nVidéo\nBien maîtriser les Dev Tools de vos navigateurs Il y a l\u0026rsquo;outils Lighthouse qui permet en un clique de savoir s\u0026rsquo;il y a des problèmes dans la page, et si elle est mal conçu. Voir les recommendations d\u0026rsquo;accessibilité de chrome (il existe une norme). Afficher l\u0026rsquo;ordre des composants pour voir s\u0026rsquo;il est correcte et s\u0026rsquo;il existe. Voir le temps de chargement des pages. Modifier les elements flex. Enregistrer les modification pour les garder quand la page est rechargée. Enregistrer les actions et les rejouer.\nVidéo\nConstruisons ensemble une application Micro-Frontend multi-frameworks avec Webpack 5 Module Federation Ca a l\u0026rsquo;air assez simple de le mettre en place. Il faut voir la vidéo pour voir comment faire.\nVidéo\nJeudi 21 avril Programme\nOAUTH 2.1 expliqué simplement (même si tu n\u0026rsquo;es pas dev) ! Il y a peut de différence entre OAuth 2.0 et OAuth 2.1.\nIl faut mettre l\u0026rsquo;url complete pour la page de redirection Il faut utiliser implicite flow avec PKCE Vidéo\nLe (dés)amour des tests web Le property based testing permet de tester des cas complexe (problème de latence) Il faut mocker les appels distants. Il y a un librairie qui permet de faire ça bien. Il faut essayer de faire des tests indépendant de l\u0026rsquo;odre d\u0026rsquo;affichage. Il faut que les tests soit rapides, sinon ils ne seront pas lancées. Si le propertie based testing trouve un bug interressant, il faut mieux faire un testpour ce cas. Il n\u0026rsquo;est pas conseillé de faire la pyramide de test pour les tests du front. Pour les TU, il ne doit pas y en avoir trop. Il faut mieux se concentrer soit sur les tests d\u0026rsquo;intégrations, soit les tests fonctionnelles. Voir fast-check pour faire des tests web. Voir la video vers 27min pour des tests property based testing sur les traitements concurents et détecter les races conditions.\nVidéo\nFuzzing en Go Le fussing est une nouvauté de golang 1.18; Il est fait en prenant en compte la structure du code, c-a-d qu\u0026rsquo;il va essayer de parcourir toutes les branches. Il permet de détecter les problèmes de sécurités.\nVidéo\nWhat\u0026rsquo;s cooking in Maven? Les maven warpeur permet de gérer la version au niveau du projet. Cela fixe la version de maven. par contre, les dépendances maven (jar) sont aussi dans le répertoire du projet. Cela fonctionne déja en maven 3.x Build/Consum POM permet de mettre à jour la version du pom au moment du déploiement. Cela permet que si un projet a la version que dans le pom du parent, au moment du deploiement la version est ajouté dans le pom enfant, ce qui posera moins de problème pour l\u0026rsquo;utilisation de la dépendance. Ce sera implémenté pour maven 4.x Maven Deamon sont un deamon qui va accélerer le build. Il a montré un exemple ou le premier build met 13 secondes et les suivants 0.0 secondes. Cela build de facon paralèle. Cela fonctionne déjà en maven 3.x Vidéo\nCloud public, mais données privées ! C\u0026rsquo;est un outils pour cripter avant d\u0026rsquo;envoyer les données sur des clouds.\nSave the date ! Il faut stoquer la date avec le décalage de date dans les bases de données.\nVidéo\nVendredi 22 avril Programme\nKafka Streams @ Carrefour : du big data à la vitesse de l\u0026rsquo;éclair Il faut penser à netoyer les topics interns et les consumer groups qui ne sont plus utilisées.\nVideo\nÀ la découverte des Docker Dev Environments C\u0026rsquo;est des contener sur le poste du dev. Permet de partager facilement le projet et l\u0026rsquo;environnement entre dev.\nVideo\nTests Cucumber: légendes et réalité Les tests cumcumber sont bien pour faire des tests fonctionnelles. Ils peuvent être fait en collaboration entre ceux qui spec et les dev. En general, ils sont lisibles par des non dev, et ça permet d\u0026rsquo;être sur de ce qui est testé correspond aux fonctions demandé par le client.\nVideo\nMieux maitriser TLS, OpenSSL et les certificats Description du protocole TLS et des certificats.\nVideo\nAutre Pour voir les nouveautés d\u0026rsquo;ElasticSearch entre les versions : https://github.com/blookot/elastic-releases\nL\u0026rsquo;outils Tournesole App permet de juger la pertinance des sites web. C\u0026rsquo;est un travail collaboratif.\n","date":"2022-04-23T00:00:00Z","permalink":"/blogprog/p/devoxx-2022/","title":"Devoxx 2022"},{"content":"Linux Encode :\n1 base64 data.txt \u0026gt; data.b64 Décode :\n1 base64 -d data.b64 \u0026gt; data.txt Windows Encode :\n1 certutil -encode data.txt tmp.b64 \u0026amp;\u0026amp; findstr /v /c:- tmp.b64 \u0026gt; data.b64 Décode :\n1 certutil -decode data.b64 data.txt ","date":"2022-04-11T00:00:00Z","permalink":"/blogprog/p/encode-et-d%C3%A9code-en-base64/","title":"Encode et décode en Base64"},{"content":"Enum dans un Template Pour utilisation d\u0026rsquo;une enum dans un template, il faut ajouter le code suivant dans le composant :\n1 public readonly myEnum : typeof MyEnum = MyEnum; Apres on peut l\u0026rsquo;utiliser dans le template MyEnum.VALUE1\nCommunication parent/enfant Le parent appel l\u0026rsquo;enfant : Parent.component.ts :\n1 2 3 4 5 6 7 8 9 import {Subject} from \u0026#39;rxjs/Subject\u0026#39;; ... export class ParentComp { changingValue: Subject\u0026lt;boolean\u0026gt; = new Subject(); tellChild() { this.changingValue.next(true); } } Parent.component.html\n1 \u0026lt;my-comp [changing]=\u0026#34;changingValue\u0026#34;\u0026gt;\u0026lt;/my-comp\u0026gt; Child.component.ts\n1 2 3 4 5 6 7 8 9 10 ... export class ChildComp implements OnInit{ @Input() changing: Subject\u0026lt;boolean\u0026gt;; ngOnInit(){ this.changing.subscribe(v =\u0026gt; { console.log(\u0026#39;value is changing\u0026#39;, v); }); } } Fermer un observable Pour fermer un observable de façon automatique\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 @Component({...}) export class AppComponent implements OnInit, OnDestroy { over$ = new Subject(); ngOnInit () { var observable$ = Rx.Observable.interval(1000); observable$ .pipe(takeUntil(this.over$)) .subscribe(x =\u0026gt; console.log(x)); } ngOnDestroy() { this.over$.next(); this.over$.complete(); } } Pour d\u0026rsquo;autres façon de le faire, voir ici : StackOverflow\n","date":"2022-04-03T00:00:00Z","permalink":"/blogprog/p/angular-cheatsheet/","title":"Angular cheatsheet"},{"content":" Loading an executable into current process\u0026rsquo;s memory, then executing it Awesome Compilers A Bestiary of Single-File Implementations of Programming Languages awesome-internals ","date":"2022-03-27T00:00:00Z","permalink":"/blogprog/p/internal-programming/","title":"Internal Programming"},{"content":"Page bundles are an optional way to organize page resources within Hugo.\nYou can opt-in to using page bundles in Hugo Clarity with usePageBundles in your site configuration or in a page\u0026rsquo;s front matter. Read more about usePageBundles.\nWith page bundles, resources for a page or section, like images or attached files, live in the same directory as the content itself rather than in your static directory.\nHugo Clarity supports the use of leaf bundles, which are any directories within the content directory that contain an index.md file. Hugo\u0026rsquo;s documentation gives this example:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 content ├── about │ ├── index.md ├── posts │ ├── my-post │ │ ├── content1.md │ │ ├── content2.md │ │ ├── image1.jpg │ │ ├── image2.png │ │ └── index.md │ └── my-other-post │ └── index.md │ └── another-section ├── .. └── not-a-leaf-bundle ├── .. └── another-leaf-bundle └── index.md In the above example `content` directory, there are four leaf\rbundles:\rabout: This leaf bundle is at the root level (directly under content directory) and has only the index.md.\nmy-post: This leaf bundle has the index.md, two other content Markdown files and two image files. image1 is a page resource of my-post and only available in my-post/index.md resources. image2 is a page resource of my-post and only available in my-post/index.md resources.\nmy-other-post: This leaf bundle has only the index.md.\nanother-leaf-bundle: This leaf bundle is nested under couple of directories. This bundle also has only the index.md.\nThe hierarchy depth at which a leaf bundle is created does not matter, as long as it is not inside another leaf bundle.\nAdvantages to using page bundles The image below is part of the bundle of this page, and is located at content/post/bundle/building.png. Because it\u0026rsquo;s within this page\u0026rsquo;s bundle, the markup for the image only has to specify the image\u0026rsquo;s filename, building.png.\nIf you ever change the name of the directory in which this Markdown file and the image reside, the reference to the image would not need to be updated.\nIn addition to more cleanly organizing your content and related assets, when using page bundles, Hugo Clarity will automatically generate markup for modern image formats, which are smaller in file size.\nFor instance, when you reference an image like building.png, Hugo Clarity will check to see if the same image (based on filename) exists in WebP, AVIF or JXL formats. If you inspect the image above, you\u0026rsquo;ll see a \u0026lt;source\u0026gt; element for building.webp, because that file is also present. Hugo Clarity will only include the markup if these images exist.\nBrowsers that support these formats and the \u0026lt;picture\u0026gt; element will load them, while browsers that do not will fall-back to the default image. Read more about this process.\nFinally, note that page assets can be further managed and refined within the page\u0026rsquo;s front matter if you wish, and are not limited to images alone.\nDisadvantages to using page bundles Page resources in a bundle are only available to the page with which they are bundled — that means you can\u0026rsquo;t include an image with one page and then reference it from another.\nImages that are being used in multiple places are more appropriate for your Hugo assets directory. Unlike files in the Hugo static directory, files in the assets directory can be run through Hugo Pipes, which includes image processing.\n","date":"2022-03-24T00:00:00Z","permalink":"/blogprog/p/using-hugo-page-bundles/","title":"Using Hugo page bundles"},{"content":"Pour lister les répertoires qui ont des fichiers jpeg :\n1 find / -iname \u0026#34;*.jpg\u0026#34; -exec dirname \u0026#39;{}\u0026#39; \\; | uniq -c \u0026gt;res.txt Apres, pour trié cette liste, c\u0026rsquo;est :\n1 cat res.txt | sort -n ","date":"2022-03-20T00:00:00Z","permalink":"/blogprog/p/compter-les-fichiers-jpeg-par-r%C3%A9pertoire/","title":"Compter les fichiers jpeg par répertoire"},{"content":"Linux Fetch pour mettre à jour les branches\n1 git fetch -p Suppression des branches locales\n1 git branch --merged | grep -v \u0026#39;\\*\\|master\\|main\\|develop\u0026#39; | xargs -n 1 git branch -d Suppression des branches distantes\n1 git branch -r --merged | grep -v \u0026#39;\\*\\|master\\|main\\|develop\u0026#39; | sed \u0026#39;s/origin\\///\u0026#39; | xargs -n 1 git push --delete origin Windows Suppression des branches locales mergées\n1 git branch --format \u0026#34;%(refname:short)\u0026#34; --merged develop | Select-String \u0026#34;develop|master|HEAD\u0026#34; -notMatch | where{$_ -ne \u0026#34;\u0026#34;} | Out-GridView -PassThru | % { git branch -d $_ } Suppression des branches distantes mergées\n1 git branch --format \u0026#34;%(refname:short)\u0026#34; -r --merged develop | Select-String \u0026#34;develop|master|HEAD\u0026#34; -notMatch | Out-String -Stream | where{$_ -ne \u0026#34;\u0026#34;} | Out-GridView -PassThru | Foreach-Object { ($_) -replace \u0026#34;origin\\/\u0026#34;,\u0026#34;\u0026#34; } | where{$_ -ne \u0026#34;\u0026#34;} | % { git push origin --delete $_ } cf : StackOverflow PowerShell\n","date":"2022-03-20T00:00:00Z","permalink":"/blogprog/p/suppression-des-branches-merg%C3%A9es/","title":"Suppression des branches mergées"},{"content":"Le plus simple c\u0026rsquo;est de lire le fichier version.properties dans le classpath.\n1 2 3 4 5 6 try(InputStream inputStream = getClass().getClassLoader().getResourceAsStream(\u0026#34;version.properties\u0026#34;)){ Properties prop = new Properties(); prop.load(inputStream); String version=prop.get(\u0026#34;version\u0026#34;,\u0026#34;1.0.0\u0026#34;); return version; } Il existe d\u0026rsquo;autres façons de faire :\nutiliser la classe BuildProperties lire le manifest ajouter la version dans la configuration Autres solutions:\n[https://stackoverflow.com/questions/3697449/retrieve-version-from-maven-pom-xml-in-code] [https://www.baeldung.com/spring-boot-build-properties] ","date":"2022-02-20T00:00:00Z","permalink":"/blogprog/p/r%C3%A9cup%C3%A9rer-la-version-avec-spring-boot/","title":"Récupérer la version avec spring boot"},{"content":"Liste d\u0026rsquo;outils en ligne de commande Voici une liste d\u0026rsquo;outils :\nOutils généraux Httpie : curl like jq : manipulate json Kafkahq : manage kafka bat : cat en rust exa : ls en rust fd : find en rust procs : ps en rust sd : find \u0026amp; replace en rust dust : du en rust starship : shell en rust ripgrep : grep en rust tokei : analyse du code source (nombre de lignes, nombre de fichiers, etc\u0026hellip;) hyperfine : pour faire des benchmark ytop : équivalent de top en Rust tealdeer : tldr en rust bandwhich : affichage des informations sur le réseau (débit, processus, etc\u0026hellip;) grex : génération d\u0026rsquo;expression régulière en fonction d\u0026rsquo;exemple rmesg : dmesg en rust zoxide : cd en rust delta : disualisation de diff git nushell : shell en rust angle-grinder : recherche dans les fichiers de logs visidata : visualisation de données tabulaires lnav : visualisation des logs dans un terminal coreutils : réimplémentation des outils unix en rust q : faire une requete sql en en ligne de commande sur du csv broot : affichage arborescent des répertoire, avec possibilité de faire des opérations rebond : recherche la stacktrace dans stackoverflow speed-test : test la connexion internet graphtage : comparaison de json jc : convertie en json la sortie des commandes unix rq : transformation entre différents formats (json, csv, etc\u0026hellip;) iredis : client redis gnuplot : Pour faire des graphiques en ligne de commandes (Hitogramme, courbes 2Det 3D, etc\u0026hellip;). La sortie peut être une image. ploticus : permet de générer des graphiques. age : cryptage de fichiers avec cryptage asymétrique rage : age en rust scrypt : cryptage symetrique de fichiers sops : stokage de secrets mkcert : création de certificat local ugrep : recherche dans les archives zip/gz/etc\u0026hellip; csvkit : traitement de fichier CSV fzf : outils pour filter les fichiers à traiter Analyses des logs angle-grinder : recherche des les logs avec une expression lnav : analyse dans les logs en mode texte sumoshell : recherche dans les logs avec une expression manipulation du json/xml Pour extraire du json, il y a les outils :\njq : outils pour extraire des données en json github. Il y a une page pour teste en ligne jqplay Pour extraire du xml :\nxidel : outils pur extraire du xml avec aussi du json github. Il peut aussi transformer du json. Il gère le XPath, le XQuery, etc\u0026hellip; Une page qui recense des outils pour extraire du xml : Baeldung\nOutils en ligne https://rawgraphs.io/ : outils de visualisation des données https://www.geogebra.org/ : visualisation de graphe et résolutation de formule mathématique en ligne Outils Windows WinMerge windirstat masscode : gestionnaire de bout de code (code snippets manager) Quiver : notebook pour developpeur cacher : gestionnaire de code qalculate : calculatrice windows/linux avec GUI et en ligne de commande Autre outils en rust : https://zaiste.net/posts/shell-commands-rust/ une autre liste d\u0026rsquo;outils : https://github.com/trimstray/the-book-of-secret-knowledge Analyse des logs : https://gist.github.com/abarhub/0ace4e9f2d9d82029f7347aed14f2ad3 Liste d\u0026rsquo;outils pour l\u0026rsquo;éducation : https://linuxfr.org/users/space_e_man/journaux/dual-oschool-free-software-pack age : https://linuxfr.org/news/sortie-de-la-version-1-0-0-de-age liste d\u0026rsquo;outils modernes en lignes de commandes : https://github.com/ibraheemdev/modern-unix liste d\u0026rsquo;outils open source : https://github.com/RunaCapital/awesome-oss-alternatives ","date":"2022-01-10T00:00:00Z","permalink":"/blogprog/p/liste-doutils/","title":"Liste d'outils "},{"content":" 1 2 3 4 5 6 7 8 9 10 \u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html lang=\u0026#34;en\u0026#34;\u0026gt; \u0026lt;head\u0026gt; \u0026lt;meta charset=\u0026#34;UTF-8\u0026#34;\u0026gt; \u0026lt;title\u0026gt;Example of HTML Hello world\u0026lt;/title\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;p\u0026gt;Hello World\u0026lt;/p\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; ","date":"2021-12-19T00:00:00Z","permalink":"/blogprog/p/hello-world-en-html/","title":"Hello world en HTML"},{"content":"Installation de node et npm avec maven Il faut utiliser l\u0026rsquo;outils : frontend-maven-plugin\nExemple :\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 \u0026lt;plugin\u0026gt; ... \u0026lt;executions\u0026gt; \u0026lt;execution\u0026gt; \u0026lt;!-- optional: you don\u0026#39;t really need execution ids, but it looks nice in your build log. --\u0026gt; \u0026lt;id\u0026gt;install node and npm\u0026lt;/id\u0026gt; \u0026lt;goals\u0026gt; \u0026lt;goal\u0026gt;install-node-and-npm\u0026lt;/goal\u0026gt; \u0026lt;/goals\u0026gt; \u0026lt;!-- optional: default phase is \u0026#34;generate-resources\u0026#34; --\u0026gt; \u0026lt;phase\u0026gt;generate-resources\u0026lt;/phase\u0026gt; \u0026lt;/execution\u0026gt; \u0026lt;/executions\u0026gt; \u0026lt;configuration\u0026gt; \u0026lt;nodeVersion\u0026gt;v4.6.0\u0026lt;/nodeVersion\u0026gt; \u0026lt;!-- optional: with node version greater than 4.0.0 will use npm provided by node distribution --\u0026gt; \u0026lt;npmVersion\u0026gt;2.15.9\u0026lt;/npmVersion\u0026gt; \u0026lt;!-- optional: where to download node and npm from. Defaults to https://nodejs.org/dist/ --\u0026gt; \u0026lt;downloadRoot\u0026gt;http://myproxy.example.org/nodejs/\u0026lt;/downloadRoot\u0026gt; \u0026lt;/configuration\u0026gt; \u0026lt;/plugin\u0026gt; ","date":"2021-10-09T00:00:00Z","permalink":"/blogprog/p/installation-de-node-et-npm-avec-maven/","title":"Installation de node et npm avec maven"},{"content":" 1 2 3 4 5 def main(): print(\u0026#34;Hello World!\u0026#34;) if __name__ == \u0026#34;__main__\u0026#34;: main() ","date":"2021-09-12T00:00:00Z","permalink":"/blogprog/p/hello-world-en-python/","title":"Hello world en Python"},{"content":"Il faut implementer l\u0026rsquo;interface LSResourceResolver\n1 2 3 4 5 6 7 8 9 10 11 12 public class ResourceResolver implements LSResourceResolver { public LSInput resolveResource(String type, String namespaceURI, String publicId, String systemId, String baseURI) { // note: in this sample, the XSD\u0026#39;s are expected to be in the root of the classpath InputStream resourceAsStream = this.getClass().getClassLoader() .getResourceAsStream(systemId); return new Input(publicId, systemId, resourceAsStream); } } Ensuite, l\u0026rsquo;appel se fait comme cela :\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 // note that if your XML already declares the XSD to which it has to conform, then there\u0026#39;s no need to declare the schemaName here void validate(String xml, String schemaName) throws Exception { DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); builderFactory.setNamespaceAware(true); DocumentBuilder parser = builderFactory .newDocumentBuilder(); // parse the XML into a document object Document document = parser.parse(new StringInputStream(xml)); SchemaFactory factory = SchemaFactory .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); // associate the schema factory with the resource resolver, which is responsible for resolving the imported XSD\u0026#39;s factory.setResourceResolver(new ResourceResolver()); // note that if your XML already declares the XSD to which it has to conform, then there\u0026#39;s no need to create a validator from a Schema object Source schemaFile = new StreamSource(getClass().getClassLoader() .getResourceAsStream(schemaName)); Schema schema = factory.newSchema(schemaFile); Validator validator = schema.newValidator(); validator.validate(new DOMSource(document)); } Pour la source (new StreamSource(...)), il faut utiliser un InputStream. Si on met à la place un File, la résolution est faites sans passer par le ressourceResolver\n","date":"2021-08-29T00:00:00Z","permalink":"/blogprog/p/validation-xsd-en-g%C3%A9rant-la-r%C3%A9solution-des-xsd/","title":"Validation xsd en gérant la résolution des xsd"},{"content":" Descriptinon générale du change detection d\u0026rsquo;Angular : https://guide-angular.wishtack.io/angular/change-detection/fonctionnement-de-la-change-detection\nDifférentes façon d\u0026rsquo;implémenter le change detection : https://dzone.com/articles/how-to-use-change-detection-in-angular\nDescription du fonctionnement interne : https://blog.angular-university.io/how-does-angular-2-change-detection-really-work/\nDescription de la classe ChangeDetectorRef https://angular.io/api/core/ChangeDetectorRef\nUtilisation de l\u0026rsquo;immutable : https://levelup.gitconnected.com/the-complete-guide-to-immutability-in-typescript-99154f859fdb https://stackoverflow.com/questions/43120022/i-want-totally-immutable-object-in-ts https://immutable-js.com/\nExemple d\u0026rsquo;utilisation du onPush : https://blog.angular-university.io/onpush-change-detection-how-it-works/\n","date":"2021-08-15T00:00:00Z","permalink":"/blogprog/p/d%C3%A9tection-du-changement-sur-angular/","title":"Détection du changement sur Angular"},{"content":"Liste d\u0026rsquo;outils en ligne de commande Outils généraux Httpie : curl like jq : manipulate json Kafkahq : manage kafka bat : cat en rust exa : ls en rust fd : find en rust procs : ps en rust sd : find \u0026amp; replace en rust dust : du en rust starship : shell en rust ripgrep : grep en rust tokei : analyse du code source (nombre de lignes, nombre de fichiers, etc\u0026hellip;) hyperfine : pour faire des benchmark ytop : équivalent de top en Rust tealdeer : tldr en rust bandwhich : affichage des informations sur le réseau (débit, processus, etc\u0026hellip;) grex : génération d\u0026rsquo;expression régulière en fonction d\u0026rsquo;exemple rmesg : dmesg en rust zoxide : cd en rust delta : disualisation de diff git nushell : shell en rust angle-grinder : recherche dans les fichiers de logs visidata : visualisation de données tabulaires lnav : visualisation des logs dans un terminal coreutils : réimplémentation des outils unix en rust q : faire une requete sql en en ligne de commande sur du csv broot : affichage arborescent des répertoire, avec possibilité de faire des opérations rebond : recherche la stacktrace dans stackoverflow speed-test : test la connexion internet graphtage : comparaison de json jc : convertie en json la sortie des commandes unix rq : transformation entre différents formats (json, csv, etc\u0026hellip;) iredis : client redis gnuplot : Pour faire des graphiques en ligne de commandes (Hitogramme, courbes 2Det 3D, etc\u0026hellip;). La sortie peut être une image. ploticus : permet de générer des graphiques. age : cryptage de fichiers avec cryptage asymétrique rage : age en rust scrypt : cryptage symetrique de fichiers sops : stokage de secrets mkcert : création de certificat local ugrep : recherche dans les archives zip/gz/etc\u0026hellip; csvkit : traitement de fichier CSV fzf : outils pour filter les fichiers à traiter nushell : shell évolué avec possibilité de manipuler des data (csv,json, etc\u0026hellip;) graphviz : outils pour afficher des graphes Analyses des logs angle-grinder : recherche des les logs avec une expression lnav : analyse dans les logs en mode texte sumoshell : recherche dans les logs avec une expression manipulation du json/xml Pour extraire du json, il y a les outils :\njq : outils pour extraire des données en json github. Il y a une page pour teste en ligne jqplay Pour extraire du xml :\nxidel : outils pur extraire du xml avec aussi du json github. Il peut aussi transformer du json. Il gère le XPath, le XQuery, etc\u0026hellip; Une page qui recense des outils pour extraire du xml : Baeldung\nOutils en ligne https://rawgraphs.io/ : outils de visualisation des données https://www.geogebra.org/ : visualisation de graphe et résolutation de formule mathématique en ligne https://10015.io/ : liste d\u0026rsquo;outils pour le developpement Outils Windows WinMerge windirstat masscode : gestionnaire de bout de code (code snippets manager) Quiver : notebook pour developpeur cacher : gestionnaire de code qalculate : calculatrice windows/linux avec GUI et en ligne de commande Zealdocs : aide mémoire pour plein d\u0026rsquo;outils (équivalent de Dash) ","date":"2021-08-11T00:00:00Z","permalink":"/blogprog/p/liste-doutils/","title":"Liste d'outils"},{"content":"Pour récupérer les dépendances d\u0026rsquo;un projet maven : mvn dependency:tree\nPour récupérer les dépendances d\u0026rsquo;un projet maven, et mettre le résultat dans un fichier : mvn dependency:tree -DoutputFile=/path/to/file\nPour que le résultat soit dans un format spécial : mvn dependency:tree -DoutputFile=/path/to/file.graphml -DoutputType=graphml\nLes sortie possibles sont :\ntext dot graphml tgf ","date":"2021-07-18T16:21:12+01:00","permalink":"/blogprog/p/maven-dependancy/","title":"Maven Dependancy"},{"content":" Exemple avec le paramtre spring.config.location : 1 java -jar app.jar --spring.config.location=file:///Users/home/config/jdbc.properties Autre exemple avec les paramètres spring.config.location et spring.config.name : 1 java -jar app.jar --spring.config.name=application,jdbc --spring.config.location=file:///Users/home/config Exemple avec une variable d\u0026rsquo;environnement : 1 2 export SPRING_CONFIG_LOCATION=file:///Users/home/config java -jar app.jar Exemple avec spring.config.import : 1 spring.config.import=file:./additional.properties,optional:file:/Users/home/config/jdbc.properties Exemple avec spring.config.additional-location : 1 java -jar app.jar --spring.config.additional-location=file:///Users/home/config/ Voir ici : https://www.baeldung.com/spring-properties-file-outside-jar https://docs.spring.io/spring-boot/docs/1.0.1.RELEASE/reference/html/boot-features-external-config.html\n","date":"2021-06-29T00:00:00Z","permalink":"/blogprog/p/externalisation-de-la-configuration-avec-spring-boot/","title":"Externalisation de la configuration avec spring boot"},{"content":"Debugage avec Angular :\nEverything you need to know about debugging Angular applications A Guide To Debugging Angular Applications Augury Debug Angular 9 in 60 Seconds Debug Angular 9: Interacting with Components Définition ng Exemple de code :\n1 2 ng.getComponent($0); ng.getContext($0); ","date":"2021-05-08T00:00:00Z","permalink":"/blogprog/p/d%C3%A9bugage-avec-angular/","title":"Débugage avec Angular"},{"content":"Exemple de shell en c :\nTutorial - Write a Shell in C Making your own Linux Shell in C Simple shell in C Tutorial to code a simple shell in C ","date":"2021-05-02T00:00:00Z","permalink":"/blogprog/p/exemple-de-shell-en-c/","title":"Exemple de shell en c"},{"content":"Documentation officielle de Java Java 8 : Documentation Javadoc JDK JRE Java 11 : Documentation Javadoc JDK Java 17 : Documentation Javadoc JDK Java 21 : Documentation Javadoc JDK Autre Liste des JDK à telecharger ","date":"2021-04-25T00:00:00Z","permalink":"/blogprog/p/documentation-officiel-de-java/","title":"Documentation Officiel de Java"},{"content":"Exemple de ngclass : 1 2 3 4 5 6 7 8 9 \u0026lt;p [ngClass]=\u0026#34;\u0026#39;first second\u0026#39;\u0026#34;\u0026gt;...\u0026lt;/p\u0026gt; \u0026lt;p [ngClass]=\u0026#34;[\u0026#39;first\u0026#39;, \u0026#39;second\u0026#39;]\u0026#34;\u0026gt;...\u0026lt;/p\u0026gt; \u0026lt;p [ngClass]=\u0026#34;{\u0026#39;first\u0026#39;: true, \u0026#39;second\u0026#39;: false}\u0026#34;\u0026gt;...\u0026lt;/p\u0026gt; \u0026lt;p [ngClass]=\u0026#34;stringExp|arrayExp|objExp\u0026#34;\u0026gt;...\u0026lt;/p\u0026gt; \u0026lt;p [ngClass]=\u0026#34;{\u0026#39;class1 class2 class3\u0026#39; : true}\u0026#34;\u0026gt;...\u0026lt;/p\u0026gt; Pour d\u0026rsquo;autres exemples, voir ici ou ici\n","date":"2021-04-25T00:00:00Z","permalink":"/blogprog/p/exemple-de-ngclass/","title":"Exemple de ngclass"},{"content":"Sytaxe de markdow pour les gist : Lien 1 Lien 2 (plus complet) Lien officiel ","date":"2021-04-25T00:00:00Z","permalink":"/blogprog/p/sytaxe-de-markdow/","title":"Sytaxe de markdow"},{"content":"Pour débuguer Spring boot, il y a 2 options :\n\u0026ndash;debug : affiche les modules de spring boot activés ou pas activé \u0026ndash;trace : affiche plus d\u0026rsquo;information, notemment la recherche de fichiers et les paramètres de configuration Exemple d\u0026rsquo;utilisation :\n1 java -Ddebug monjar.jar ou\n1 java monjar.jar --debug On peut aussi augmenter le niveau de log (a mettre dans application.properties) :\n1 logging.level.org.springframework=DEBUG pour spring security, c\u0026rsquo;est dans le code :\n1 2 3 4 5 // par annotation : @EnableWebSecurity(debug = true) public class SecurityConfiguration extends WebSecurityConfigurerAdapter { // etc... } 1 2 3 4 5 6 7 8 9 // par code : @EnableWebSecurity public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) throws Exception { web.debug(true); } } et au niveau log :\n1 logging.level.org.springframework.security=DEBUG ","date":"2021-03-06T00:00:00Z","permalink":"/blogprog/p/d%C3%A9bugage-spring/","title":"Débugage spring"},{"content":" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 rem Pour extraire une partie du contenu d\u0026#39;une variable, la syntaxe est : echo %date:~6,4% rem résultat: rem 2021 rem pour remplacer un caractere par un autre : echo %time: =0% rem résultat: rem 08:48:50,13 rem Pour récupérer la date du jour (ne fonctionne qu\u0026#39;en france) : echo %date:~6,4%%date:~3,2%%date:~0,2% rem résultat: rem 20210131 rem Pour récupérer l\u0026#39;heure (il faut remplacer l\u0026#39;espace par un 0 si l\u0026#39;heure est inferieure à 10) : set heure=%time:~0,2%-%time:~3,2%-%time:~6,2% echo %heure: =0% rem résultat: rem 08-52-01 rem Pour mettre dans une variable la date et l\u0026#39;heure avec un format compatible pour un nom de fichier : set dateheure=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%-%time:~3,2%-%time:~6,2% set dateheure=%dateheure: =0% echo %dateheure% rem résultat: rem 2021-01-31_08-54-57 ","date":"2021-03-05T00:00:00Z","permalink":"/blogprog/p/commandes-sous-dos/","title":"Commandes sous dos"},{"content":" Les versions de spring security La liste des documentations Le guide du developpeur Le guide de migration La documentation détaillée Comment l\u0026rsquo;implementé avec un SPA Implicit Flow La liste des librairies certifiée Open Id Connect ","date":"2021-01-31T00:00:00Z","permalink":"/blogprog/p/spring-security-oauth-2-documentation/","title":"Spring security OAuth 2 documentation"},{"content":"Exemple de requete sql pour détruire toutes les tables d\u0026rsquo;un schéma :\n1 select \u0026#39;drop table \u0026#39;||table_name||\u0026#39; cascade constraints;\u0026#39; from user_tables; ","date":"2021-01-07T00:00:00Z","permalink":"/blogprog/p/exemple-de-requete-sql-pour-d%C3%A9truire-toutes-les-tables-dun-sch%C3%A9ma/","title":"Exemple de requete sql pour détruire toutes les tables d'un schéma"},{"content":"Exemple d\u0026rsquo;url jdbc pour se connecter à une base de données sur le schéma monschema :\n1 jdbc:mysql://localhost:3306/monschema?useUnicode=true\u0026amp;useJDBCCompliantTimezoneShift=true\u0026amp;useLegacyDatetimeCode=false\u0026amp;serverTimezone=UTC ","date":"2021-01-01T00:00:00Z","permalink":"/blogprog/p/lurl-jdbc-pour-se-connecter-%C3%A0-une-base-mysql/","title":"L'url jdbc pour se connecter à une base MySQL"},{"content":"Voici un exemple pour créer un utiliser MySQL et le schéma associé :\n1 2 3 4 5 6 CREATE USER \u0026#39;monutilisateur\u0026#39;@\u0026#39;localhost\u0026#39; IDENTIFIED BY \u0026#39;1234\u0026#39;; CREATE DATABASE monschema CHARACTER SET utf8 COLLATE utf8_unicode_ci; GRANT ALL PRIVILEGES ON monschema.* TO \u0026#39;monutilisateur\u0026#39;@\u0026#39;localhost\u0026#39;; FLUSH PRIVILEGES; ","date":"2021-01-01T00:00:00Z","permalink":"/blogprog/p/script-de-cr%C3%A9ation-dun-sch%C3%A9ma-mysql-avec-lutilisateur/","title":"Script de création d'un schéma Mysql avec l'utilisateur"},{"content":"Exemple de test paramétré :\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class ParametreTest { @ParameterizedTest @MethodSource(\u0026#34;provideStringsForIsBlank\u0026#34;) void isBlank_ShouldReturnTrueForNullOrBlankStrings(String input, boolean expected) { assertEquals(expected, Strings.isBlank(input)); } private static Stream\u0026lt;Arguments\u0026gt; provideStringsForIsBlank() { return Stream.of( Arguments.of(null, true), Arguments.of(\u0026#34;\u0026#34;, true), Arguments.of(\u0026#34; \u0026#34;, true), Arguments.of(\u0026#34;not blank\u0026#34;, false) ); } } Code basé sur le site Baeldung\n","date":"2020-10-30T00:00:00Z","permalink":"/blogprog/p/exemple-de-test-param%C3%A9tr%C3%A9/","title":"Exemple de test paramétré"},{"content":"Pour avoir les jar dans les exceptions, il faut mettre \u0026lsquo;packagingData=\u0026ldquo;true\u0026rdquo;\u0026rsquo; dans la configuration :\n1 2 3 \u0026lt;configuration packagingData=\u0026#34;true\u0026#34;\u0026gt; ... \u0026lt;/configuration\u0026gt; Cela donne des exceptions de la forme :\n1 2 3 4 5 6 7 8 9 10 11 12 13 14:28:48.835 [btpool0-7] INFO c.q.l.demo.prime.PrimeAction - 99 is not a valid value java.lang.Exception: 99 is invalid at ch.qos.logback.demo.prime.PrimeAction.execute(PrimeAction.java:28) [classes/:na] at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) [struts-1.2.9.jar:1.2.9] at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236) [struts-1.2.9.jar:1.2.9] at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) [struts-1.2.9.jar:1.2.9] at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) [servlet-api-2.5-6.1.12.jar:6.1.12] at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:502) [jetty-6.1.12.jar:6.1.12] at ch.qos.logback.demo.UserServletFilter.doFilter(UserServletFilter.java:44) [classes/:na] at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) [jetty-6.1.12.jar:6.1.12] at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:361) [jetty-6.1.12.jar:6.1.12] at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417) [jetty-6.1.12.jar:6.1.12] at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) [jetty-6.1.12.jar:6.1.12] Voir ici plus plus d\u0026rsquo;information : http://logback.qos.ch/manual/layouts.html#xThrowable\n","date":"2020-10-08T00:00:00Z","permalink":"/blogprog/p/ajout-des-jar-dans-la-stacktrace-pour-logback/","title":"Ajout des jar dans la stacktrace pour LogBack"},{"content":" 1 2 3 4 5 6 7 8 9 10 11 -- affichage de dates select to_char( mon_champs, \u0026#39;dd-mm-yyyy hh24:mi:ss\u0026#39; ) from ma_table; -- affichage de la date et de l\u0026#39;heure de la session ALTER SESSION SET NLS_DATE_FORMAT = \u0026#39;dd-mm-yyyy hh24:mi:ss\u0026#39;; -- insertion d\u0026#39;une date dans un champs insert into ma_table(ID, START_DATE) values (3,TO_DATE(\u0026#39;20200301\u0026#39;,\u0026#39;YYYYMMDD\u0026#39;)); -- recherche de données entre deux dates select * from ma_table where START_DATE BETWEEN TO_DATE(\u0026#39;28-02-2014 10:15:00\u0026#39;, \u0026#39;dd-mm-yyyy hh24:mi:ss\u0026#39;) AND TO_DATE(\u0026#39;20-06-2014 16:34:00\u0026#39;, \u0026#39;dd-mm-yyyy hh24:mi:ss\u0026#39;); ","date":"2020-10-05T00:00:00Z","permalink":"/blogprog/p/gestion-des-dates-en-oracle/","title":"Gestion des dates en oracle"},{"content":"Classe pour logguer toutes les propriétés avec Spring boot :\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 package com.toto.myapp.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.context.event.ApplicationPreparedEvent; import org.springframework.context.ApplicationListener; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.EnumerablePropertySource; import org.springframework.core.env.PropertySource; import java.util.LinkedList; import java.util.List; public class PropertiesLogger implements ApplicationListener\u0026lt;ApplicationPreparedEvent\u0026gt; { private static final Logger log = LoggerFactory.getLogger(PropertiesLogger.class); private ConfigurableEnvironment environment; private boolean isFirstRun = true; @Override public void onApplicationEvent(ApplicationPreparedEvent event) { if (isFirstRun) { environment = event.getApplicationContext().getEnvironment(); printProperties(); } isFirstRun = false; } public void printProperties() { for (EnumerablePropertySource propertySource : findPropertiesPropertySources()) { log.info(\u0026#34;******* \u0026#34; + propertySource.getName() + \u0026#34; *******\u0026#34;); String[] propertyNames = propertySource.getPropertyNames(); Arrays.sort(propertyNames); for (String propertyName : propertyNames) { String resolvedProperty = environment.getProperty(propertyName); String sourceProperty = propertySource.getProperty(propertyName).toString(); if(resolvedProperty.equals(sourceProperty)) { log.info(\u0026#34;{}={}\u0026#34;, propertyName, resolvedProperty); }else { log.info(\u0026#34;{}={} OVERRIDDEN to {}\u0026#34;, propertyName, sourceProperty, resolvedProperty); } } } } private List\u0026lt;EnumerablePropertySource\u0026gt; findPropertiesPropertySources() { List\u0026lt;EnumerablePropertySource\u0026gt; propertiesPropertySources = new LinkedList\u0026lt;\u0026gt;(); for (PropertySource\u0026lt;?\u0026gt; propertySource : environment.getPropertySources()) { if (propertySource instanceof EnumerablePropertySource) { propertiesPropertySources.add((EnumerablePropertySource) propertySource); } } return propertiesPropertySources; } } Classe permettant de lister toutes les propriétés Pour l\u0026rsquo;utiliser, il faut utiliser : Java public static void main(String[] args) { SpringApplication springApplication = new SpringApplication(MyApplication.class); springApplication.addListeners(new PropertiesLogger()); springApplication.run(args); } ou alors : `Java @SpringBootApplication public class Application extends SpringBootServletInitializer { private static Class applicationClass = Application.class; @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(applicationClass).listeners(myListener()); }\nprivate ApplicationListener\u0026lt; ApplicationStartedEvent\u0026gt; myListener() { .... } }`\nvoir : code ou code avec un war\n","date":"2020-10-05T00:00:00Z","permalink":"/blogprog/p/logger-toutes-les-propri%C3%A9t%C3%A9s-de-spring-boot/","title":"Logger toutes les propriétés de Spring Boot"},{"content":"Voici les commandes pour installer ou désinstaller un module python :\n1 2 3 4 5 6 7 8 # install module python : pip install flask # desinstalle module python : pip uninstall flask # recré le fichier requirements.txt : pip3 freeze \u0026gt; requirements.txt ","date":"2020-09-20T00:00:00Z","permalink":"/blogprog/p/installation-ou-d%C3%A9sinstallation-dun-module-python.-cr%C3%A9ation-du-fichier-requirements.txt-avec-les-d%C3%A9pendances/","title":"Installation ou désinstallation d'un module Python. Création du fichier requirements.txt avec les dépendances"},{"content":"Voici les commandes pour créer un module, puis un composant associé a ce module :\n1 2 ng generate module app/modules/monmodule --routing=true ng generate component app/modules/monmodule/moncomposant -m=app/modules/monmodule ","date":"2020-09-16T00:00:00Z","permalink":"/blogprog/p/cr%C3%A9ation-dun-composant-avec-un-module-et-une-route/","title":"Création d'un composant avec un module et une route"},{"content":"tutorial https://mdbootstrap.com/docs/jquery/utilities/borders/\nhttps://www.w3schools.com/bootstrap4/bootstrap_ref_all_classes.asp\nhttps://getbootstrap.com/docs/4.5/getting-started/browsers-devices/#supported-browsers\nhttps://getbootstrap.com/docs/4.0/components/card/\nng bootstrap https://github.com/ng-bootstrap/ng-bootstrap\nawesome bootstrap https://github.com/therebelrobot/awesome-bootstrap\ncheat sheet https://hackerthemes.com/bootstrap-cheatsheet/\nhttps://websitesetup.org/bootstrap-cheat-sheet/\nhttps://bootstrapcreative.com/resources/bootstrap-4-css-classes-index/\nhttps://www.creative-tim.com/cheatsheet/bootstrap4\n","date":"2020-07-25T00:00:00Z","permalink":"/blogprog/p/tutoriel-bootstrap-4/","title":"Tutoriel bootstrap 4"},{"content":" 1 2 3 4 5 6 7 8 public class ExempleLogger { private static final Logger LOGGER = LoggerFactory.getLogger(ExempleLogger.class); public void exemple(){ LOGGER.info(\u0026#34;test {}\u0026#34;, 52); } } ","date":"2020-06-24T00:00:00Z","permalink":"/blogprog/p/exemple-de-loggeur-avec-slf4j/","title":"Exemple de loggeur avec slf4j"},{"content":"Accès à un fichier de ressource :\n1 2 3 4 5 6 7 // récupération du répertoire d\u0026#39;un fichier ressource File file = new File(getClass().getClassLoader().getResource(\u0026#34;database.properties\u0026#34;).getFile()); // lecture d\u0026#39;un fichier ressource InputStream inputStream = getClass().getClassLoader().getResourceAsStream(\u0026#34;database.properties\u0026#34;); // Dans les 2 cas, le fichier doit être src/main/resources/database.properties Des exemples pour récupérérer le chemin : https://stackoverflow.com/questions/15713119/java-nio-file-path-for-a-classpath-resource\n","date":"2020-06-18T00:00:00Z","permalink":"/blogprog/p/acc%C3%A8s-%C3%A0-un-fichier-de-ressource/","title":"Accès à un fichier de ressource"},{"content":"Aide mémoires des requetes ElasticSearch : https://elasticsearch-cheatsheet.jolicode.com/ https://gist.github.com/ruanbekker/e8a09604b14f37e8d2f743a87b930f93 https://github.com/adelean/elasticsearch-cheatsheet https://www.bmc.com/blogs/elasticsearch-commands/\n","date":"2020-06-18T00:00:00Z","permalink":"/blogprog/p/aide-m%C3%A9moire-sur-elasticsearch/","title":"Aide mémoire sur ElasticSearch"},{"content":"calcul de date : https://icalendrier.fr/outils/ajouter-retirer-date\nrécupération de la date en epoch : https://www.epochconverter.com/\n","date":"2020-06-18T00:00:00Z","permalink":"/blogprog/p/calcul-de-dates/","title":"Calcul de dates"},{"content":" 1 2 3 4 5 6 ArgumentCapto\u0026lt;Person\u0026gt; peopleCaptor = ArgumentCaptor.forClass(Person.class); verify(mock, times(2)).doSomething(peopleCaptor.capture()); List\u0026lt;Person\u0026gt; capturedPeople = peopleCaptor.getAllValues(); assertEquals(\u0026#34;John\u0026#34;, capturedPeople.get(0).getName()); assertEquals(\u0026#34;Jane\u0026#34;, capturedPeople.get(1).getName()); ","date":"2020-06-18T00:00:00Z","permalink":"/blogprog/p/capture-des-param%C3%A8tres-avec-mockito/","title":"Capture des paramètres avec Mockito"},{"content":" 1 2 3 4 5 # changement de version des pom mvn versions:set -DnewVersion=1.0.0.0-SNAPSHOT # changement de version des pom sans backup mvn versions:set -DnewVersion=1.0.0.0-SNAPSHOT -DgenerateBackupPoms=false ","date":"2020-06-18T00:00:00Z","permalink":"/blogprog/p/changement-de-version-des-pom/","title":"Changement de version des pom"},{"content":"site sur spring :\nhttps://spring.io/\nhttps://www.baeldung.com/spring-tutorial\n","date":"2020-06-18T00:00:00Z","permalink":"/blogprog/p/sites-sur-spring/","title":"Sites sur Spring"},{"content":" 1 2 3 -- pour stoper l\u0026#39;execution à la première erreur -- a utiliser au début d\u0026#39;un script WHENEVER SQLERROR EXIT FAILURE ","date":"2020-06-18T00:00:00Z","permalink":"/blogprog/p/stopper-lexecution-dun-script-%C3%A0-la-premi%C3%A8re-erreur-en-oracle/","title":"Stopper l'execution d'un script à la première erreur en Oracle"}]