Faire des qcm simplement - retour accueil
git clone git://bebou.netlib.re/qcm
Log | Files | Refs | README |
commit bba193fd91dce9b1cc7b727063608f00952b26c3 parent 69d3468d643963014de12cb5f4ada44305942cc4 Auteurice: Arthur Pons <arthur.pons@unistra.fr> Date: Fri, 8 Nov 2024 18:59:00 +0100 On calcul le plus gros que quand nécessaire Meilleures perfs. On vérifie s'il y a une ligne supplémentaire dans in avant de se lancer dans tout le blabla. Je réduis le refresh à 0.5 pour la peine. Cela dit on continue de faire un wc -l toutes les demie secondes. On pourrait pas plutôt faire un truc sur la base de "ah ! y'a quelque chose de nouveau dans le pipe, on calcul" ? Intuitivement je l'ai pas fait comme ça parce que je voulais pas coder le nécessaire pour tenir à jour des variables contenant les résultats mahcin chose comme on aurait fait en python ou autre. Cela m'oblige à avoir un fichier avec toutes les réponses sur lequel je peux sort | uniq | sort mais on peut peut-être avoir le meilleur des deux mondes. Diffstat:
M | qcm.sh | | | 65 | +++++++++++++++++++++++++++++++++++++---------------------------- |
1 file changed, 37 insertions(+), 28 deletions(-)
diff --git a/qcm.sh b/qcm.sh @@ -30,7 +30,7 @@ playout() { $context - $res + $groupedres total : $tot . @@ -48,35 +48,44 @@ demander() { pattern="[$answers]$choix ";; esac - tail -fn0 "$logs" | stdbuf -oL grep -E " GET /$id/$pattern" >> $tmpd/in & # PARSAGE DE LOG + tail -fn0 "$logs" | stdbuf -oL grep -E "GET /$id/$pattern" >> $tmpd/in & # PARSAGE DE LOG tailpid=$! + nbold=0 while :;do - res=$(< $tmpd/in sort $uopt -k1,1 | - grep -Eo "/$id/[^ ]+ " | cut -d'/' -f3- | # PARSAGE DE LOG - sed 's,%\([0-9A-F][0-9A-F]\),\\\\\x\1,g' | - xargs printf "%b\n" | grep -v "^$" | - sort | uniq -c | sort -rn) - - [ -n "$res" ] \ - && tot=$(( $(echo "$res" | awk '{print $1}' | paste -s -d+ -) )) \ - || tot=0 - - context=$(case "$type" in - ( "ouverte" ) continue ;; - ( "regex" ) printf "format autorisé : %s" "$options" ;; - ( * ) - [ "$choix" = "+" ] \ - && printf "%s\n" "une ou plusieurs options vraies" \ - || printf "%s\n" "une seule option vraie" - [ -n "$options" ] \ - && printf "%s" "$(echo "$options" | tr '~' '\n' | paste $tmpd/o -)" \ - || printf "options : %s" "$(< $tmpd/o paste -d '\0' -s -)" - ;; - esac) - - clear - playout + nbl=$(< $tmpd/in wc -l) + + if [ "$nbl" -gt "$nbold" -o -z "$passedonce" ] ;then + res=$(< $tmpd/in sort $uopt -k1,1 | + grep -Eo "/$id/[^ ]+ " | cut -d'/' -f3- | # PARSAGE DE LOG + sed 's,%\([0-9A-F][0-9A-F]\),\\\\\x\1,g' | + xargs printf "%b\n" | grep -v "^$") + + if [ -z "$res" ];then tot=0 + else + groupedres=$(echo "$res" | sort | uniq -c | sort -rn) + tot=$(echo "$res" | wc -l) + fi + + context=$(case "$type" in + ( "ouverte" ) continue ;; + ( "regex" ) printf "format autorisé : %s" "$options" ;; + ( * ) + [ "$choix" = "+" ] \ + && printf "%s\n" "une ou plusieurs options vraies" \ + || printf "%s\n" "une seule option vraie" + [ -n "$options" ] \ + && printf "%s" "$(echo "$options" | tr '~' '\n' | paste $tmpd/o -)" \ + || printf "options : %s" "$(< $tmpd/o paste -d '\0' -s -)" + ;; + esac) + + passedonce=1 + clear + playout + fi + + nbold="$nbl" sleep $refresh done & disppid=$! @@ -93,7 +102,7 @@ while getopts "hl:u:n:r:f:" opt; do done url="${u:-http://bebou.netlib.re}" -refresh="${r:-1}" +refresh="${r:-0.5}" logs="${l:-/var/log/nginx/access.log}" file="$f"