Bienvenue sur Forum Puppy Linux - Toutou Linux - Astuces - Aides !
Lorsque vous n'êtes pas connectés vous pouvez visiter la totalité du forum mais avec certaines restrictions : cf le règlement pour les visiteurs non connectés. Vous êtes chaleureusement conviés à vous inscrire afin de bénéficier de toutes les fonctionnalités du forum et de participer aux échanges.
Dernier message par Rantanplan -
.Bonjour toutes et tous,
Chez antiX, il est une tradition de baptiser les distributions d'une personne qui résiste. La version 26 perpétue cette tradition avec Stephen Kapos, survivant de la shoah. Pas d'entrée dans fr.wikipedia.org, ni le wikipédia anglais, pas plus que le hongrois. Pour connaître le bonhomme, il faut passer par son moteur de recherches préféré, puis faire son opinion.
Pour moi, pas de mystère, c'est du 32 bits et la saveur full, soit une ISO de 2 Go. Installation frugale, comme la précédente version. La machine est toujours un Packard-Bell Easynote avec 1 Go de RAM et 2 Go de swap. Un µprocesseur qui va lentement le matin et pas vite l'après-midi. Tout ça pour dire que le démarrage est poussif, mais c'est mon matériel.
Déjà, ça parle une langue que je comprends : le français. Côté applis, on est bien servi :
LibreOffice (sans le gestionnaire de base de données) en version récente puisqu'il s'agit de la 26.2.1.2. ;
Firefox ESR 140.8.0 et Links 2 comme navigateur ;
celluloid, mpv, asunder, xmms, xine entre autres pour le multimédia ;
muPDF et evince pour les pdf ;
sdraw et mtpaint entre autres pour travailler les images ;
mirage et feh entre autres pour regarder ses photos ;
plusieurs gestionnaires de réseau pour se connecter à internet... ;
des utilitaires pour le partage de fichiers ;
la dent bleue n'est pas oubliée ;
le numériseur de doc. est prévu ;
un centre de contrôles bien doté ;
claws-mail, transmission, gFtp, HexChat pour la partie internet ;
gpg[2] version 2.4.7 ;
cherrytree pour la prise de notes ;
yad est là ainsi que dialog (mais pas Xdialog) et gtkdialog ;
ufw comme pare-feu activé à la demande ;
en option firejail qui installe le paquet firetools à la demande ;
etc.
On peut regretter que sqlite3 n'ait pas été inclus compte tenu du volume de l'ISO et ce d'autant plus qu'il n'y a pas de gestionnaire de base de données. Qu'une version plus récente de xmessage n'ait pas été installée.
antiX-26 peut être personnalisé à loisir, cependant soyez attentive ou tif à ce que vous faites .
Billet écrit depuis antix-26 Full Stephen Kapos.
Amusez-vous bien !
PS : je ne vais plus sur le site officiel d'antiX (y compris le forum) qui s'est placé sous la férule de clou-d'flair dont les agissements sont contraires aux directives européennes et notamment au RGPD. Vous ne direz plus que vous ne saviez pas. Na !
En enlevant les " des lignes susnommées, cela fonctionne toujours chez moi. Le code est donc compatible Bash 2013 ? Dommage qu'on ne puisse pas s'enlever les guillemets et rajeunir de treize ans !
Nouvelle explication pour les étourdis qui n'ont pas tout enregistré. Pour le deuxième test du sieur Rantanplan :
pXOT → troisième majuscule dans la chaîne : on remplace le T par un caractère spécial. pXO!
pXOT52Xo → deuxième minuscule dans la chaîne : on remplace le o par un caractère spécial. pXO!52X<
pXOT52Xon4O1 → quatrième chiffre dans la chaîne : on remplace le 1 par un caractère spécial. pXO!52X<n4O(
3 substitutions ont été faites : on garde la suite sans changements.
pXOT52Xon4O1NSUK pXO!52X<n4O(NSUK
Cela m'étonne un peu, mais cela semble fonctionner du premier coup. J'obtiens exactement la même chose que toi pour les deux exemples. Avec les trois chaînes de caractères spéciaux tirées au hasard et un mot de passe général solide, cela devrait sérieusement compliquer la tâche d'un hackeur.
Merci à toi pour ces essais. J'espère que ton coin de coing est aussi frais que mon coin de coing. Pas coin-coin parce que je me méfie des canards.
Dernier message par Rantanplan -
Bonjour les addictos,
un membre du forum qui connaît mon inclinaison pour les base de données (ou BDD) signalait à ma curiosité un article en pas français, et je l'en remercie encore une fois ici. Ce membre me taquinait, car je ne l'avais pas traduit. C'est chose faite grâce à un traducteur un ligne dont je tairais le nom (non, ce n'est pas deepl.com).
SQLite est un logiciel de base de données incroyablement portable, puissant et léger qui fonctionne partout, des serveurs aux smartphones. Ce qui rend SQLite si populaire, c'est qu'il fonctionne avec des fichiers de base de données autonomes qui peuvent être stockés ou transférés n'importe où. De nombreuses technologies de base de données utilisent plusieurs fichiers et nécessitent la mise en place de services réseau pour permettre aux clients d'accéder aux bases de données à distance. Contrairement à cette approche traditionnelle, une base de données SQLite est stockée dans un seul fichier qui peut exister n'importe où et être accessible sans démon dédié. Le projet SQLite fournit des bibliothèques et des outils en ligne de commande pour travailler avec ces fichiers de base de données, ce qui facilite l'accès et le partage de la base de données sans mettre en place d'infrastructure supplémentaire. Cela rend SQLite idéal pour une utilisation dans les applications de bureau, les applications téléphoniques et les petits sites web. Il y a de fortes chances que le navigateur web que vous utilisez pour lire cet article utilise des bibliothèques SQLite et une base de données SQLite.
Le site web de SQLite explique ensuite son logiciel comme suit :
SQLite est une bibliothèque en langage C qui implémente un moteur de base de données SQL petit, rapide, autonome, très fiable et complet. SQLite est le moteur de base de données le plus utilisé dans le monde. SQLite est intégré dans tous les téléphones mobiles et la plupart des ordinateurs, et est inclus dans d'innombrables autres applications que les gens utilisent tous les jours.
Aujourd'hui, je veux parler d'une fonctionnalité de SQLite qui est moins connue, mais étonnamment flexible et pratique dans certaines situations. Plus précisément, je veux parler de la façon dont l'outil en ligne de commande de SQLite peut fonctionner, non seulement avec des fichiers de base de données, mais aussi avec des fichiers ZIP.
Habituellement, lorsque nous travaillons avec des archives ZIP, c'est soit via un simple outil en ligne de commande avec une syntaxe cryptique qui crée et extrait les fichiers ZIP, soit via une application de bureau dédiée à cette tâche. SQLite offre une troisième option : un outil en ligne de commande qui peut utiliser des instructions SQL pour créer des archives, afficher des informations sur les archives et extraire des fichiers.
Je veux partager quelques exemples de SQLite en action, en travaillant avec une archive ZIP simple pour montrer à quel point SQLite est agréablement flexible. De plus, je trouve que l'utilisation des commandes de base de données SQL pour gérer un fichier ZIP est agréablement étrange et que ce genre de chose est tout simplement amusant.
Tout d'abord, créons une archive ZIP super simple à l'ancienne, via la ligne de commande. Je commence par créer quatre fichiers texte : abc, def, xyz et mnop :
Maintenant que nous avons quatre fichiers texte, chacun avec une ligne de texte, nous pouvons créer notre archive ZIP et y stocker les trois premiers fichiers texte. Cela se fait avec la commande zip, comme son nom l'indique :
Nous pouvons confirmer que l'archive a été créée avec succès en listant son contenu dans le terminal avec le programme unzip :
$ unzip -l myarchive.zip Archive: myarchive.zip Length Date Time Name --------- ---------- ----- ---- 9 2025-08-12 15:21 abc 9 2025-08-12 15:21 def 11 2025-08-12 15:21 xyz
Maintenant que nous avons notre petite archive ZIP, explorons comment SQLite peut nous aider à parcourir et gérer cette archive. Nous pouvons le faire en lançant le programme sqlite et en lui passant le nom de notre fichier ZIP :
$ sqlite3 myarchive.zip SQLite version 3.46.1 2024-08-13 09:16:08 Enter ".help" for usage hints. sqlite>
Maintenant, le programme SQLite a ouvert notre archive ZIP et nous pouvons commencer à explorer. Comme nous allons traiter l'archive comme une base de données, SQLite attribue aux différentes fonctionnalités du fichier des noms de champs de base de données, comme nous pouvons le voir ici en utilisant la commande ".schema" :
sqlite> .schema CREATE VIRTUAL TABLE zip USING zipfile('myarchive.zip') /* zip(name,mode,mtime,sz,rawdata,data,method) */;
Comme on peut le voir à partir du résultat de notre commande ".schema", chaque entrée (fichier ou dossier) dans l'archive a un nom, un mode (type de fichier et permissions), une date de modification et une taille. Chaque entrée a aussi des rawdata (les informations compressées), data (les informations décompressées) et method (le niveau de compression). La plupart du temps, nous serons probablement intéressés seulement par les champs nom, taille et données.
Disons que nous voulons voir une liste des fichiers dans l'archive avec la taille décompressée de chaque fichier. Nous pouvons voir tous les fichiers dans l'archive avec leurs tailles (en octets) en utilisant une commande "select" :
sqlite> SELECT name, sz FROM zip; abc|9 def|9 xyz|11
Dans la commande ci-dessus, nous demandons à SQLite de nous montrer (select) le nom et la taille de chaque fichier de notre archive ZIP. Le résultat est une liste des trois fichiers que nous avons placés initialement dans l'archive, avec la taille décompressée de chaque fichier.
Ensuite, que faire si nous voulons voir le contenu d’un seul de nos fichiers texte sans l’extraire de l’archive ? Nous pouvons le faire avec une autre commande "select", en indiquant que nous voulons voir les données contenues dans un fichier. Dans ce cas, nous allons demander le contenu du deuxième fichier, def :
sqlite> SELECT data FROM zip WHERE name='def'; Line two
Le résultat est le texte "Line two" que nous avions initialement mis dans le fichier texte.
Peut-être que nous voulons supprimer un des fichiers de notre archive. Dans ce cas, nous pouvons utiliser la commande SQL "delete" pour l’effacer de notre fichier ZIP. Dans cet exemple, nous supprimons le fichier def de l’archive avec la commande "delete" puis nous vérifions qu’il a disparu avec une commande "select" :
sqlite> DELETE FROM zip WHERE name='def'; sqlite> SELECT name FROM zip; abc xyz
Comme nous pouvons le voir dans la liste des noms ci-dessus, le fichier def a été supprimé avec succès.
Je voudrais mentionner à ce moment que les commandes SQL ne sont pas sensibles à la casse. Cela signifie que la commande "SELECT name FROM zip;" et "select name from zip;" fonctionneront toutes les deux. Les mots-clés comme "select" et "delete" sont souvent affichés en majuscules dans les exemples pour rendre les différents éléments de la commande plus visibles.
Ensuite, que faire si nous voulons ajouter un nouveau fichier à notre archive ? Nous pouvons le faire en spécifiant le nom du nouveau fichier et son contenu. Cela signifie que nous pouvons inventer le contenu sur le moment, mais il est plus probable que ce que nous voulions faire est de lire les données d'un fichier. Nous pouvons charger un fichier dans l'archive en utilisant la fonction "readfile". Ici, nous lisons le fichier mnop en mémoire et l'insérons dans l'archive :
sqlite> INSERT INTO zip(name, data) values('mnop', readfile('mnop'));
La commande ci-dessus indique à SQLite que nous voulons « insérer » un nouveau fichier. Nous lui faisons savoir que nous allons fournir le nom et les données pour la nouvelle entrée dans l'archive. Ensuite, nous devons fournir deux valeurs, le nom du nouveau fichier et son contenu. Le contenu de mnop est chargé en utilisant la fonction "readfile". Nous pouvons confirmer que la nouvelle entrée a été ajoutée en utilisant à nouveau "select" :
sqlite> select name, sz from zip; abc|9 xyz|11 mnop|10
Nous pouvons voir le contenu de la dernière entrée en demandant le champ data de l'archive stockée sous un nom de fichier spécifique :
sqlite> select data from zip where name='mnop'; Line four
Comme nous pouvons le voir ici, le fichier mnop contenait une ligne de texte, qui lit "Line four".
Une des grandes fonctionnalités de SQLite est que l'outil en ligne de commande peut être utilisé comme un client de base de données classique, comme montré ci-dessus où nous lui donnons des commandes de manière interactive. L'outil en ligne de commande peut aussi exécuter une seule requête sur une base de données ou une archive spécifiée. Cela nous permet d'utiliser SQLite dans des scripts non interactifs ou d'extraire des informations d'une archive et de les exporter ailleurs. Par exemple, si nous voulons extraire le contenu du fichier abc de myarchive.zip et le verser dans un nouveau fichier texte, nous pouvons le faire depuis la ligne de commande, en spécifiant le nom de l'archive et la commande SQL que nous voulons exécuter :
$ sqlite3 myarchive.zip "select data from zip where name='abc'" > newabc.txt $ cat newabc.txt Line one
Dans l'exemple ci-dessus, nous utilisons la commande sqlite3 pour exécuter une seule commande SQL sur le fichier myarchive.zip. Cela va afficher le contenu (données) du fichier texte abc stocké dans notre archive. Nous demandons ensuite à notre shell de verser le texte dans un nouveau fichier appelé newabc.txt. Sur la deuxième ligne, nous affichons le contenu du nouveau fichier pour confirmer que cela a fonctionné.
Cette fonctionnalité en ligne de commande nous permet de réaliser des requêtes rapides, soit de manière interactive, soit depuis un script. Par exemple, la commande suivante nous indiquera combien de fichiers se trouvent dans une archive. Cela s'obtient en utilisant la fonction SQL "count" :
$ sqlite3 large-archive.zip "select count(name) from zip;" 240
On peut voir qu'il y a 240 fichiers et répertoires dans l'archive ZIP large-archive.zip. Alternativement, nous pourrions obtenir la taille totale (décompressée) de tous les fichiers dans l'archive en utilisant cette commande pour obtenir la somme de la taille de chaque fichier en octets :
$ sqlite3 large-archive.zip "select sum(sz) from zip;" 235771456
Certains pourraient débattre pour savoir si utiliser SQLite est plus pratique que d'autres outils, comme zip et unzip. Les outils en ligne de commande standard (et les applications de bureau) pour travailler avec les archives sont efficaces et pratiques. Cependant, quand il s'agit de commandes portables et scriptables qui peuvent être utilisées pour interroger ou manipuler le contenu des archives, il est difficile de battre SQLite en termes de formatage fiable et de lisibilité de ses commandes.
Je retiens au moins une chose : c'est que SQLite est presque PARTOUT, selon l'auteur de l'article. C'est comme monsieur Jourdain qui prosait sans le savoir.
J'ai voulu essayé, mais avec la version 3.7.17 2013-05-20 00:56:22 de SQLite impossible d'analyser le conteneur .zip.
root@pctoutou ~ # ./genmdp.sh ybUTPjlHlf5l2LR1 xclip: -r: No such file or directory y(UT!j?Hlf5l2LR1 Le mot de passe est copié dans le presse-papiers de X
# ./genmdp.sh https://augras.eu/puppy_forum pXOT52Xon4O1NSUK xclip: -r: No such file or directory pXO!52X<n4O(NSUK Le mot de passe est copié dans le presse-papiers de X
Dis-moi, si tu obtiens idem pareil également la même choz itou, stp.
Dernier message par petihar -
Bonjour, En date du 16 juin, une nouvelle "Info-Contact" avec deux mises à jour est disponible pour Triton10. Bien cordialement, petihar
Dernier message par Polo l’asticot - Comme dit arpinux : « Pour connaître la météo du jour, ouvrez votre fenêtre ! » Moi je dis, si on n'est pas sûr, on peut utiliser son ordinateur…
Le problème Pour connaître le temps à venir, l'auteur a d'abord essayé de télécharger la page de Météo-France correspondant à son village pour ensuite en extraire les renseignements qui lui semblaient utiles. Malheureusement, ces données se téléchargent une fois sur deux et, certains jours, le site ne veut rien savoir : pas de météo pour l'auteur aujourd'hui. C'est ballot ! (En plus, il ne semble pas légal de s'approprier des données du site sans autorisation.)
Il a ensuite lu la documentation correspondant aux API proposées par le service public. Mais il n'a pas compris grand-chose. Il veut juste une prévision de base, pas l'évolution à la demi-heure d'une quarantaine de facteurs. Pas envie, non plus, d'apprendre à programmer.
Il est tombé ensuite par hasard sur le site https://open-meteo.com/ en pas français comme dirait quelqu'un. Ce site utilise les services météo d'une quinzaine de pays pour fournir gratuitement des renseignements « unifiés ». Oh, miracle, il y a Météo-France dans le panel. Et il suffit de cocher quelques cases pour avoir un résultat. Un service pour les nuls, c'est ce qu'il nous faut.
Avertissement Pour la suite, on a besoin d'une connexion Internet, des utilitaires curl et jq et d'un minimum de curiosité.
Mise en pratique On a d'abord besoin de sa localisation (latitude, longitude). Sur https://www.coordonnees-gps.fr/, on cherche son adresse, par exemple « Place de la Mairie, 81190 Mirandol-Bourgnounac ». Pourquoi cette adresse ? Parce que ce nom sonne super bien avec l'accent du Sud-ouest. Donc Mirandol-Bourgnounac, c'est 44.1432866 pour la latitude et 2.1686849 pour la longitude. (C'est en français avec un séparateur anglais pour les décimales). Petite remarque : le modèle de Météo-France le plus élaboré a une résolution de 1,5 km. Si on n'habite pas en plaine, il est important de ne pas utiliser une ville située à 10 km de son lieu d'habitation, mais de fournir une localisation précise.
On va ensuite sur le site en choisissant le modèle Météo-France soit : https://open-meteo.com/en/docs/meteofrance-api Après quelques secondes de réflexion, Open-meteo crée une page par défaut avec l'évolution de la température prévue par le modèle AROME sur quatre jours avec un pas d'une heure. On change la latitude et la longitude pour celles de son lieu d'habitation. Pour Time Zone, on choisit Automatically detect. On décoche la température qui se trouve dans les prévisions horaires. On descend plus bas sur Current Weather (Météo du jour) et on coche ce qu'on désire obtenir. Par exemple on coche Temperature (température), Wind Speed (vitesse du vent), Wind Guts (rafales), Rain (pluie). (Ceux qui ont du mal avec l'anglais peuvent s'aider du site https://www.deepl.com/fr/translator qui est très performant.) Plus bas sur la page du site à API Response on peut copier la requête dans le champ API URL soit pour cet exemple :
Le service est gratuit, mais on doit se limiter à moins de 10 000 requêtes par jour. Sachant que les paramètres sont actualisés toutes les heures, cela fait vingt-quatre données différentes dans la journée. Avec quatre paramètres, on reste en dessous de cent. Il y a de la marge.
On récupère presque immédiatement : {"latitude":44.14,"longitude":2.17,"generationtime_ms":0.10287761688232422,"utc_offset_seconds":7200,"timezone":"Europe/Paris","timezone_abbreviation":"GMT+2","elevation":402.0,"current_units":{"time":"iso8601","interval":"seconds","temperature_2m":"°C","wind_speed_10m":"km/h","wind_gusts_10m":"km/h","rain":"mm"},"current":{"time":"2026-06-10T09:30","interval":900,"temperature_2m":14.8,"wind_speed_10m":13.5,"wind_gusts_10m":26.6,"rain":0.00}}
Magie de l'informatique : qui se serait douté que Mirandol-Bourgnounac était situé pile-poil à 402 mètres au-dessus du niveau de la mer ? Plus sérieusement, on voit qu'on est bien à l'heure de Paris, en France (GMT+2 en été) et qu'on utilise des unités françaises (sauf le séparateur décimal qui n'est toujours pas une virgule, coquins d'anglophones). L'affichage reste un peu brouillon. Et si on veut afficher seulement la température ?
#!/usr/bin/env bash # # Affichage de la météo de Mirandol-Bourgnounac # Quand on n'est pas Mirandolais, on change latitude et longitude # dans la requête et on adapte éventuellement les données à récupérer.
C'est le petit programme que j'utilise quand mon village (ou mon ordinateur) est bloqué par le site de Météo-France. On peut ajouter assez facilement de nombreux paramètres, le plus long étant de les interpréter ensuite.
En espérant vous avoir donné envie d'aller plus loin, je vous laisse jouer avec vos claviers. Moi par ma fenêtre, pas un nuage : ça va encore taper sévère aujourd'hui !
Dernier message par Polo l’asticot -
Ola Rantanplan et l'univers,
J'ai cherché désespérément à différencier chiffres, minuscules et majuscules dans le mot de passe généré. Les comparaisons directes en Bash ne fonctionnaient pas même quand elles étaient préconisées par certains sites (créations par IA , IA de m…). J'ai bien perdu mon temps là-dessus. Je me suis souvenu du bon temps où je faisais de la programmation en Basic. (Il ne rigole pas le jeunot, s'il ne veut pas se prendre un coup de canne sur la tête !) Il y avait une fonction de conversion en code ASCII qui donnait de bons résultats. Je suis parti sur cette piste. Le programme est beaucoup plus lourd et codé à l'arrache mais cela fonctionne.
#Code dérivé de celui de Mihail Milushev (lanzz : https://github.com/lanzz/bash-supergenpass/blob/master/supergenpass.sh) sous licence MIT
################################################################################ default_password_length="16" ### 16 par défault. Peut être remplacé au cas par cas en ajoutant la longueur ### personnalisée comme deuxième argument après le domaine lors du lancement du script.
default_hashing_algorithm="md5" ### "md5" par défaut. Une valeur alternative serait « sha512 » qui peut être donnée ### au cas par cas comme troisième argument. ################################################################################
i=0 while true do hash=$(echo -n "$hash" | openssl "$hashing_algorithm" -binary | base64 | tr -d '\n' | tr +/= 98A) i=$(($i + 1)) if [ $i -lt 10 ] then continue fi valid=$(echo "${hash:0:$length}" | grep -E '^[[:lower:]]' | grep -E '.[[:upper:]]' | grep -E '.[[:digit:]]') if [ "$valid" != "" ] then break fi done
mdp=${hash:0:$length} echo $mdp
i=0 while true do car=${mdp:$i:1} ; ascii=$(printf "%d" "'$car'")
if [ $ascii -lt 58 ] ; then chiffre=$(($chiffre + 1)) if [ $chiffre -gt 3 ] ; then car=$(echo $car | tr '[:digit:]' '&(_)+#]{|[') mdp=${mdp:0:$i}$car${mdp:"(($i + 1))"} cumul=$(($cumul + 1)) ; chiffre=0 fi elif [ $ascii -lt 91 ] ; then maj=$(($maj + 1)) if [ $maj -gt 2 ] ; then car=$(echo $car | tr '[:upper:]' '&(_)+#{[|]}>?/<!:^&![+<)#]') mdp=${mdp:0:$i}$car${mdp:"(($i + 1))"} cumul=$(($cumul + 1)) ; maj=0 fi else min=$(($min + 1)) if [ $min -gt 1 ] ; then car=$(echo $car | tr '[:lower:]' '&(_)+#{[|]}?>/<!:^&![+<)#]') mdp=${mdp:0:$i}$car${mdp:"(($i + 1))"} cumul=$(($cumul + 1)) ; min=0 fi fi
if [ $cumul -gt 2 ] ; then break ; fi
i=$(($i + 1))
done
if [ -n "$WAYLAND_DISPLAY" ] && command -v wl-copy >/dev/null; then echo -n $mdp | wl-copy echo "Mot de passe copié dans le presse-papiers Wayland" elif [ -n "$DISPLAY" ] && command -v xclip >/dev/null; then echo $mdp | xclip -r -selection "clipboard" echo $mdp echo "Le mot de passe est copié dans le presse-papiers de X" else echo $mdp fi
C'est toujours en développement. Le mot de passe général est toujours en dur dans le script et cela affiche le mot de passe généré sans caractères spéciaux puis en dessous, avec.
Petite explication : Le script compte les chiffres et remplace le quatrième par un caractère spécial. Pour les majuscules, c'est la troisième qui est remplacée. Avec les minuscules, c'est toutes les deux occurrences que le remplacement a lieu. Pourquoi ? Parce que pourquoi pas. Quand il y a eu trois remplacements, on s'arrête et on donne le résultat.
L'avantage, c'est que les caractères spéciaux apparaissent n'importe où, sans régularité. (J'ai réduit l'ensemble des caractères à ceux de code inférieur à 128, les autres provoquant un affichage incorrect avec des points d'interrogation.)
Si tu peux tester et faire un retour, quand tu as du temps.
¡Que la fuerza acompañe a España y a los españoles!