[script] Les news dans le terminal (résolu)

Autres projets et contributions
avi3000
Chu Ko Nu
Messages : 386
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

Re: [script] Les news dans le terminal (résolu)

Message par avi3000 » mer. 20 nov. 2019, 14:13

L'algorithme que j'utilise ne traite que les trois noeuds utilisés par l'affichage.

Les modules pythons traitent une arborescence complète avec tous ses noeuds.
Ils font beaucoup de choses inutiles dans ce cas précis.
Comme disent nos amis de dwm et st : it's sucks
Dernière modification par avi3000 le jeu. 21 nov. 2019, 13:04, modifié 1 fois.

sukolyn
archer
Messages : 106
Inscription : mar. 11 juil. 2017, 09:56

Re: [script] Les news dans le terminal (résolu)

Message par sukolyn » mer. 20 nov. 2019, 14:58

je ne comprends pas.
xml.etree parcourt "l'arbre" XML, puis ne retient et ne traite que les balises indiquées; comme le shell lit tout le fichier pour ne traiter que le motif indiqué, non ?

avi3000
Chu Ko Nu
Messages : 386
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

Re: [script] Les news dans le terminal (résolu)

Message par avi3000 » mer. 20 nov. 2019, 15:48

etree commence par traiter tout le fichier pour constituer son arbre complet (parse ou elementTree).
Ensuite il ne traite que les balises demandées.

sukolyn
archer
Messages : 106
Inscription : mar. 11 juil. 2017, 09:56

Re: [script] Les news dans le terminal (résolu)

Message par sukolyn » mer. 20 nov. 2019, 16:11

d'accord, c'est un peu plus clair.
merci.

je n'arrive pas encore à me défaire de l'idée que traiter un fichier à balises (XML, JSON) avec l'outil "conçu pour exprès" est préférable. :/

avi3000
Chu Ko Nu
Messages : 386
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

Re: [script] Les news dans le terminal (résolu)

Message par avi3000 » mer. 20 nov. 2019, 16:35

Dans ce fichier, il y a 557 balises.
Seule 30 nous intéressent (3 par news, 10 news). Pourquoi s'occuper des 527 restantes.
De plus tous ces analyseurs xml vérifient la conformité de l'arbre.
Ce que l'algorithme que j'utilise ne fait pas. Le lecteur des news verra sur son écran si le fichier téléchargé est conforme.

avi3000
Chu Ko Nu
Messages : 386
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

Re: [script] Les news dans le terminal (résolu)

Message par avi3000 » mer. 20 nov. 2019, 17:04

Voici la version "tout sur une seule ligne à la mode json". Au cas où le taquin voudrait jouer au con.

Code : Tout sélectionner

#!/bin/bash

red="\033[31m"
bleu="\033[34m"
defo="\033[0m"
on_one="\n\t\t>> News Archlinux.fr <<\n$defo"

parse_z () {
    z=${z//&#8216;/\\x27}
    z=${z//&#8217;/\\x27}
    z=${z//&#8211;/-}
    z=${z//&#8230;/...}
    z=${z//&gt;/>}
}

while read -d '<' z; do
    case ${z:0:1} in
    't')
        parse_z
        [ "$on_one" = '' ] && titre=${z:6} || echo -e "$red$on_one";;
    'p')
        [ "${z:0:8}" = 'pubDate>' ] && echo -e "$bleu${z:13:((-15))}$defo  $titre" ;;
    'd')
        [ "${z:0:12}" = 'description>' ] && {
            read -d '<' z
            z=${z#*A[}
            z=${z%]]>*}
            parse_z
            [ "$on_one" = '' ] && echo -e "$z\n"
            on_one=''
        }
        ;;
    esac
done < <(curl -s ${@:-https://archlinux.fr/feed})
echo
# vim: ts=4 sw=4 :
Ca reste décent au niveau performance.

Code : Tout sélectionner

time for (( i=100; i>0; i-- )); do ./news.sh >/dev/null;done
real    0m2,019s  user    0m1,388s  sys     0m0,635s
Pour faire court, je n'aime pas python. C'est un langage pour les gens intelligents qui ont fait de longues études.

sukolyn
archer
Messages : 106
Inscription : mar. 11 juil. 2017, 09:56

Re: [script] Les news dans le terminal (résolu)

Message par sukolyn » mer. 20 nov. 2019, 17:28

pov' python.

je suis entrain de commencer à regarder la doc de zsh, et je m'en dis la même chose, l'inimitié en moins. 8O

benjarobin
Maître du Kyudo
Messages : 15899
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [script] Les news dans le terminal (résolu)

Message par benjarobin » mer. 20 nov. 2019, 20:26

@avi3000 Il faudrait être de mauvaise fois pour dire que la version de python est moins lisible que toutes les autres versions.
De plus le temps d’exécution du script est négligeable par rapport au temps de téléchargement.

Note: Ce n'est pas le script python qui est lent (le décodage du XML est super rapide), mais le fait de lancer l’interpréteur python.
Attention de ne pas tirer des raccourcis !

PS: Oui le XML est bien trop lourd comme format, c'est lent à parser (mais ici totalement négligeable !)
Zsh | KDE | PC fixe : core i7, carte nvidia | Portable : Asus ul80vt
Titre d'un sujet : [Thème] Sujet (état)

Avatar de l’utilisateur
papajoke
Elfe
Messages : 584
Inscription : sam. 30 août 2014, 19:54
Contact :

Re: [script] Les news dans le terminal (résolu)

Message par papajoke » mer. 20 nov. 2019, 21:24

Tout à fait d'accord, python ou bash, la vitesse et l’empreinte mémoire est ici insignifiante - compte plus les dépendances

Me suis permis quelques modification à sukolyn
- requests, non : pour moi il faut utiliser le moins possible de dépendances
- wrap auto et decode html avec bibliothèque incluse dans python
- test des dates : pas d’intérêt d'afficher tout le flux (sinon on va directement à l’accueil du site) - pourrait être passé comme paramètre optionnel ...

ps: du coup plus lent que l'original :wink:

Code : Tout sélectionner

#!/usr/bin/python

import os
import urllib.request
import html
from xml.etree import ElementTree as ET
import textwrap
import datetime

max_jours = 40  # limiter l'historique à ...

try:
    with urllib.request.urlopen('https://archlinux.fr/feed') as f_url:
        news = f_url.read()
except urllib.error.HTTPError:
    exit(1)
root = ET.fromstring(news)

aujourdhui = datetime.datetime.today().date()
cols, _ = os.get_terminal_size(0)

for t in root.findall("channel/item"):
    title = t.find('title').text
    odate = datetime.datetime.strptime(t.find('pubDate').text, '%a, %d %b %Y %H:%M:%S %z').date()
    delta = aujourdhui - odate
    if delta.days > max_jours:
        break
    date = f"{odate.strftime('%d/%m/%Y')} \t({delta.days} jours)"
    desc = html.unescape(t.find('description').text)
    print("%s\n\033[01;31m%s\n\033[00;36m%s\033[00m\n"%(date, title, textwrap.fill(desc, width=cols-5, initial_indent="  ", subsequent_indent="  ")))
print("https://archlinux.fr/")   
Dernière modification par papajoke le jeu. 21 nov. 2019, 00:21, modifié 1 fois.
Arch stable - Kde 5 / zsh - btrfs/mbr - Intel Core i3 - 6Go RAM - GeForce 405 video-nouveau

avi3000
Chu Ko Nu
Messages : 386
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

Re: [script] Les news dans le terminal (résolu)

Message par avi3000 » mer. 20 nov. 2019, 21:48

@benjarobin la version de python est moins lisible que toutes les autres versions.
Je ne crois pas avoir écrit ce genre de chose. Quand tu veux programmer en python, Il faut juste aller à la pêche dans des doc modules rédigés par des gens instruits et intelligents, pour des gens instruits et intelligents.
Ce que je ne suis pas.

Lancer l'interpréteur fait partie de temps de traitement.
J'ai effectués des tests de rapidité avec un fichier local, pour éviter de fausser les résultats avec des vitesses de téléchargement aléatoires.

Avec le lancement de l'interpréteur tcc à chaque boucle, python est dans les cordes.

Code : Tout sélectionner

time for (( i= 100; i >0; i-- )); do cat feed | ./news.c > /dev/null; done
real    0m0,291s  user    0m0,288s  sys     0m0,081s
En 2014, les pythonistes de developpez.com, avaient fait les mêmes analyses que toi.
J'ai donc fait des tests avec un seul chargement d'interpréteur et une grosse boucle interne sur des traitements simples de chaînes de caractères.
J'ai fait la même chose sur de simples calculs arithmétiques.
bash ne faisait pas partie de ce test, il aurait terminé bon dernier.

Les résultats étaient également parlants du plus rapide au plus lent :
C compilé glibc
tcc interprété
Perl
Php
Python 2
Python 3

Python a des avantages que je ne nie pas, notamment la rapidité d'écriture quand on le pratique régulièrement, mais pour moi ses défauts sont rédhibitoires.
Dernière modification par avi3000 le jeu. 21 nov. 2019, 12:22, modifié 1 fois.

avi3000
Chu Ko Nu
Messages : 386
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

Re: [script] Les news dans le terminal (résolu)

Message par avi3000 » mer. 20 nov. 2019, 22:00

@papajoke question lisibilité, il y a mieux

Code : Tout sélectionner

print("%s\n\033[01;31m%s\n\033[00;36m%s\033[00m\n"%(date, title, textwrap.fill(desc, width=cols-5, initial_indent="  ", subsequent_indent="  ")))
La page html ne contient que 10 news pourquoi tester la date ?

benjarobin
Maître du Kyudo
Messages : 15899
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [script] Les news dans le terminal (résolu)

Message par benjarobin » mer. 20 nov. 2019, 22:44

:!: @avi3000 Je n'ai jamais remis en cause le fait que python soit plus lent a être lancé qu'une application native. Je dis juste, pour être plus clair, que tu "encules les mouches par pack de centaines" (désolé ne le prend pas mal). Dans ce cas précis les performances du parsing du résultat n'ont aucune importance, il faut bien plus longtemps pour télécharger la chose.
Tu ne tiens pas en compte les critères suivant : maintenabilité, lisibilité et rapidité d'écriture du code.

PS: Je suis un développeur en système embarqué, donc je fais du C très bas niveau tous les jours, c'est ma spécialité, et je pense très sérieusement que je me débrouille très bien (mes chevilles vont très bien :-) ). Et bien je peux te garantir que personnellement jamais j’irai écrire la chose en C natif. C'est bien plus rapide à écrire dans un langage de script (après peut importe le choix du langage tant que c'est adapté et lisible...)

Ici tu critique python sans aucune raison, je ne comprend pas pourquoi tu dis que c'est compliqué, c'est bien plus simple que bash (la syntaxe est horrible et illisible, après je peux comprendre que c'est très personnel comme vision).
De plus je peux te dire que dans mon boulot, à choisir entre bash, perl, php ou python, tout le monde va choisir ce dernier (surtout pour faire quelque chose comme cela).
avi3000 a écrit :
mer. 20 nov. 2019, 22:00
La page html ne contient que 10 news pourquoi tester la date ?
Pour ne pas afficher des news de 2018 ?
Essaye de coder simplement ce qu'il a fait en bash / perl :mrgreen:

Il faut avouer que la version de papajoke, bien que améliorable sur le style / lisibilité, cela reste 1000 fois plus lisible, bien plus robuste, gère tous les caractères d’échappement du html sans essayer de réinventer la roue en la faisant carrée :copain:
Zsh | KDE | PC fixe : core i7, carte nvidia | Portable : Asus ul80vt
Titre d'un sujet : [Thème] Sujet (état)

Avatar de l’utilisateur
papajoke
Elfe
Messages : 584
Inscription : sam. 30 août 2014, 19:54
Contact :

Re: [script] Les news dans le terminal (résolu)

Message par papajoke » mer. 20 nov. 2019, 23:02

oui, ici la syntaxe n'est pas top mais pas liée à python
on peut comme en bash utiliser des constantes

Code : Tout sélectionner

c_title = '\033[00;31m'
c_txt   = '\033[00;36m'
c_none  = '\33[0m'
...
print(f"{date}\n{c_title}{title}{c_none}\n{c_txt}{desc}{c_none}\n")
------------
Comme dit plus haut, quel intérêt que l'un prend 0.5 seconde et l'autre 2 secondes ? pour l'utilisateur c'est complètement transparent !

Perso, je pense que ton script bash sera toujours valable dans 5 ans alors que le script python pourrait être à retoucher dans 5 ans. Donc bon point pour bash (mais ici on est dans du scripting donc changer 2..3 mots tous les 3 ans ne pose pas de problème)

Pourquoi les dates ?
Justement pour optimiser le temps (mais de l'utilisateur) !!!! quel est l’intérêt d'avoir un script qui s'exécute en 0.1 seconde si je suis obligé de scroller pour voir si une chose m’intéresse ?
Ou alors afficher les news dans le sens inverse :wink:
Moi, je me soucis avant tout de l'utilisateur du script et pas du code ou de l'interpréteur (bash ou python, pour moi les 2 sont excellents pour faire des scripts console). Lorsque j'ai modifié le code de sukolyn, je n'est pas hésité 10 secondes sur une seule ligne de son code ; ton bash ...
Arch stable - Kde 5 / zsh - btrfs/mbr - Intel Core i3 - 6Go RAM - GeForce 405 video-nouveau

avi3000
Chu Ko Nu
Messages : 386
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

Re: [script] Les news dans le terminal (résolu)

Message par avi3000 » jeu. 21 nov. 2019, 00:07

@papajoke
10 news = 63 lignes de 109 colonnes sur mon écran, pas de pagination
tu peux aussi compter les news pour limiter l'affichage et la pagination si nécessaire
Comme tu le dis, afficher les news en sens chronologique croissant règle le problème de pagination, mais c'est plus lourd à programmer.

@benjarobin Je dis juste, pour être plus clair, que tu "encules les mouches par pack de centaines"
D'une part ce n'est pas un argument, d'autre part je ne me suis pas permis ce genre de réflexion.

Ton expérience professionnelle est éminemment respectable. La mienne ne l'est pas moins.

32 ans d'informatique professionnelle en tant que développeur. Du cobol au C, en passant par le gap, le pl1 et bien d'autres.
J'ai également pratiqué en tant qu'ingénieur système (un peu) et administrateur de base de données.
A la retraite depuis quelques années, je pratique, comme je l'ai écrit plus haut, le codage récréatif.

Chacun peut utiliser le langage qu'il veut.
Il me semble que cette partie du forum, intitulée "autres contributions", est l'endroit adéquat pour débattre, proposer et échanger des idées, des pratiques bonnes ou mauvaises, éventuellement des solutions.
Je ne pense pas que l'invective y ait sa place.

sukolyn nous a présenté une solution python qui est propre.
J'ai donné les raisons pour lesquelles, personnellement je ne l'aimais pas (9 modules, 5 Mo à installer, pour remplacer 35 lignes de script).

Le reste était un échange de point de vue, qui ne justifie en rien une telle réaction. Tu m'avais habitué à mieux.

benjarobin
Maître du Kyudo
Messages : 15899
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [script] Les news dans le terminal (résolu)

Message par benjarobin » jeu. 21 nov. 2019, 00:43

Je ne voulais pas faire d’attaque personnelle ni être méchant, juste un peu d'humour...
Je le répète encore, "après peut importe le choix du langage tant que c'est adapté et lisible". Donc je ne critique pas les autres langages :-)
J'ai essayé de défendre python, car tu étais très virulent envers ce dernier (alors que de mon point de vue il n'y avait pas de bonne raison) !!!
Zsh | KDE | PC fixe : core i7, carte nvidia | Portable : Asus ul80vt
Titre d'un sujet : [Thème] Sujet (état)

avi3000
Chu Ko Nu
Messages : 386
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

Re: [script] Les news dans le terminal (résolu)

Message par avi3000 » jeu. 21 nov. 2019, 12:44

La tempête tropicale ayant été rétrogradée au niveau d'une simple averse, nous allons repasser aux choses sérieuses et divertissantes.

Nouvelle version bash avec :
le traitement du fichier 'feed' avec ou sans sauts de ligne;
le remplacement des 'html entities' figurant dans ce fichier.
l'affichage des nouvelles en ordre chronologique croissant (plus de problèmes de pagination)
la gestion de la largeur d'affichage pour la description.

Pour que les pythonistes puissent modifier ce code, les sous-traitements ont été isolés dans 3 petites fonctions :
parse_z, print_reverse, textwrap.

Code : Tout sélectionner

#!/bin/bash

IFS=$'\n'
WRAPMIN=80
WRAPMAX=100
INDENT='   '
red="\033[31m"
bleu="\033[34m"
defo="\033[0m"
les_news="\t\t>> News Archlinux.fr <<\n$defo"

textwrap () {
	local l=${#1} i=0 j=$WRAPMAX lf=''
	while (( j < l )); do
		while (( j-- > i )); do
			[ "${1:j:1}" = ' ' ] && break
		done
		(( j - i < WRAPMIN )) && j=$(( i + WRAPMAX ))
		printf "$lf$INDENT${1:i:j - i + 1}"
		i=$(( j + 1 ))
		(( j+=WRAPMAX ))
		lf='\n'
	done
	printf "$lf$INDENT${1:i}\n"
}

print_reverse () {
	local i=${#tit[*]}
	while (( i-- )); do
		echo -e "${tit[i]}"
		textwrap "${dsc[i]}"
	done
}

parse_z () {
	z=${z//&#8216;/\\x27}
	z=${z//&#8217;/\'}
	z=${z//’/\'}            # pour les TTY
	z=${z//&#8211;/-}
	z=${z//&#8230;/...}
	z=${z//&gt;/>}
}

echo -e "$red$les_news"
while read -d '<' z; do
	case ${z:0:1} in
	't')
		parse_z
		[ -z "$on_one" ] || titre=${z:6};;
	'p')
		[ "${z:0:8}" = 'pubDate>' ] && tit+=("$bleu${z:13:((-15))}$defo  $titre");;
	'd')
		[ "${z:0:12}" = 'description>' ] && {
			read -d '<' z
			z=${z#*CDATA[}
			z=${z%]]>*}
			parse_z
			[ -z "$on_one" ] || dsc+=("$z\n")
			on_one='no'
		};;
	esac
done < <(curl -s ${@:-https://archlinux.fr/feed})

print_reverse
echo -e "$red$les_news"

# vim: ts=4 sw=4 :
et voila.
Si vous voulez la version C, je l'ai aussi.
faut pas faire chier le marin.

sukolyn
archer
Messages : 106
Inscription : mar. 11 juil. 2017, 09:56

Re: [script] Les news dans le terminal (résolu)

Message par sukolyn » jeu. 21 nov. 2019, 13:12

j'aime bien l'idée d'un dictionnaire (tableau associatif en bash) traité par une boucle :

Code : Tout sélectionner

#!/bin/bash

declare -A entities=( ["&#8216;"]="'" ["&#8217;"]="'" ["&#8211;"]="-" ["&#8230;"]="..." ["&gt;"]=">" )
#...
parse_z()
(
   for e in "${!entities[@]}"; do set -- "${@//$e/${entities["$e"]}}"; done
   echo "$@"
)
#...
Dernière modification par sukolyn le jeu. 21 nov. 2019, 14:32, modifié 1 fois.

avi3000
Chu Ko Nu
Messages : 386
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

Re: [script] Les news dans le terminal (résolu)

Message par avi3000 » jeu. 21 nov. 2019, 13:34

C'est vrai que l'idée est intéressante. Je n'ai pas toujours le réflexe en bash, car l'ajout de cette fonctionnalité est relativement récent.
Il me semble que tu as laissé une coquille dans ton copier/coller text au lieu de @.

Le dictionnaire est plus facile à maintenir si l'on doit gérer une grosse quantité de remplacements.
La version directe que j'utilise est plus rapide à l'exécution.

J'ai ajouté un remplacement pour les TTY.

sukolyn
archer
Messages : 106
Inscription : mar. 11 juil. 2017, 09:56

Re: [script] Les news dans le terminal (résolu)

Message par sukolyn » jeu. 21 nov. 2019, 14:31

ah, oui. j'édite.

laurent85
Elfe
Messages : 585
Inscription : mar. 16 oct. 2018, 21:05

Re: [script] Les news dans le terminal (résolu)

Message par laurent85 » jeu. 21 nov. 2019, 17:47

Autre approche avec elinks et sed, fonction shell :

version fr

Code : Tout sélectionner

lesnews() {elinks https://www.archlinux.fr/feed -dump | sed -n '/^\s\s\shttps/ {1d; s/^\s\s\s//; h; $!N; s/.*\n//; s/^\s\s\s//; G; s/^...,\s//; s/..:..:..\s+0000.*\n//; p}' | tac}
version en

Code : Tout sélectionner

thenews() {elinks https://www.archlinux.org/feeds/news -dump | sed -n '/^\s\s\s+0000tag/ {s/^.*:\(.*\),\(.*\):/\2 \1/; p}' | tac}
Quelles sont les news ?

Code : Tout sélectionner

lesnews 
05 May 2018 https://archlinux.fr/news/la-mise-a-jour-de-js52-52-7-3-2-requiert-une-intervention-manuelle
14 Jul 2018 https://archlinux.fr/accueil/la-mise-a-jour-de-libutf8proc2-1-1-3-requiert-une-intervention-manuelle
27 Jun 2019 https://archlinux.fr/news/la-mise-a-jour-de-mariadb-10-4-x-requiert-une-intervention-manuelle
11 Jul 2019 https://archlinux.fr/news/la-mise-a-jour-de-libbloom1-6-2-requiert-une-intervention-manuelle
21 Aug 2019 https://archlinux.fr/non-classe/la-mise-a-jour-de-tensorflow1-14-0-5-requiert-une-intervention-manuelle
26 Aug 2019 https://archlinux.fr/news/la-mise-a-jour-de-astyle3-1-2-requiert-une-intervention-manuelle
07 Oct 2019 https://archlinux.fr/news/remplacement-du-groupe-base-par-le-paquet-obligatoire-base-intervention-manuelle-requise
16 Oct 2019 https://archlinux.fr/accueil/mise-a-jour-requise-vers-une-version-recente-de-libarchive
26 Oct 2019 https://archlinux.fr/accueil/clarification-concernant-lactivite-recente-sur-la-liste-arch-announce
14 Nov 2019 https://archlinux.fr/news/nouveaux-paquets-kernel-et-hooks-mkinitcpio Thu,

Code : Tout sélectionner

thenews
2018-05-04 www.archlinux.org/news/js52-5273-2-upgrade-requires-intervention/
2018-07-14 www.archlinux.org/news/libutf8proc211-3-update-requires-manual-intervention/
2019-06-27 www.archlinux.org/news/mariadb-104x-update-requires-manual-intervention/
2019-07-11 www.archlinux.org/news/libbloom16-2-update-requires-manual-intervention/
2019-08-20 www.archlinux.org/news/tensorflow1140-5-update-requires-manual-intervention/
2019-08-26 www.archlinux.org/news/astyle31-2-update-requires-manual-intervention/
2019-10-06 www.archlinux.org/news/base-group-replaced-by-mandatory-base-package-manual-intervention-required/
2019-10-16 www.archlinux.org/news/required-update-to-recent-libarchive/
2019-10-25 www.archlinux.org/news/clarification-regarding-recent-email-activity-on-the-arch-announce-list/
2019-11-10 www.archlinux.org/news/new-kernel-packages-and-mkinitcpio-hooks/
Et éventuellement clic droit sur la news pour ouvrir le lien.
Tuto Kde Plasma + gestionnaire de fenêtres i3
Mon développement en cours Archuseriso

Répondre