qcm

Faire des qcm simplement - retour accueil

git clone git://bebou.netlib.re/qcm
Log | Files | Refs | README |

commit ca63340f09d78fcd2ab5dc398bfe9178436f8440
parent 818111652d96348c3d0c25cee5900dda73552236
Auteurice: Arthur Pons <arthur.pons@unistra.fr>
Date:   Fri,  8 Nov 2024 18:05:20 +0100

Factorisation, performance

Factorisation générale de la boucle de résultat et d'affiche. A entre
autre pour effet de meilleures perfs. Il devrait être vraiment rare de
voir l'écran flasher puisque l'appel au layout ne fait presque rien.

Les noms des variables sont confus, faudrait améliorer tout ça.
Aussi peut-être isoler la partie "parsage de logs" pour une modification
plus simple par une autre personne.

Diffstat:
Mqcm.sh | 55++++++++++++++++++++++++++++++-------------------------
1 file changed, 30 insertions(+), 25 deletions(-)

diff --git a/qcm.sh b/qcm.sh @@ -26,49 +26,54 @@ playout() { <<-. cat url : $url/$id - $([ -n "$question" ] && printf "%s" "$question") + $question - $(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" "$opts" \ - || printf "options : %s" "$opts" | tr -d '\n ' - ;; - esac) + $context - $dat + $res total : $tot . } demander() { - possibleanswers="ABCDEFGHIJQLMNOPQRSTUVWXYZ" - [ -n "$options" ] && nbq=$(( $(echo "$options" | grep -o '~' | wc -l) + 1 )) - echo "$possibleanswers" | grep -o '.' | head -n$nbq > $tmpd/o - answers=$(cat $tmpd/o | tr -d '\n') - case "$type" in ( "ouverte" ) pattern=;; ( "regex" ) pattern="${options:-[ABCD] } ";; - ( * ) pattern="[$answers]$choix ";; + ( * ) + possibleanswers="ABCDEFGHIJQLMNOPQRSTUVWXYZ" + [ -n "$options" ] && nbq=$(( $(echo "$options" | grep -o '~' | wc -l) + 1 )) + echo "$possibleanswers" | grep -o '.' | head -n$nbq > $tmpd/o + answers=$(cat $tmpd/o | tr -d '\n') + pattern="[$answers]$choix ";; esac tail -fn0 "$logs" | stdbuf -oL grep -E "GET /$id/$pattern" >> $tmpd/in & tailpid=$! while :;do - dat=$(< $tmpd/in sort $uopt | cut -d ' ' -f7 | cut -d'/' -f3 | + res=$(< $tmpd/in sort $uopt -k1,1 | cut -d ' ' -f1,7 | cut -d'/' -f3 | sed 's,%\([0-9A-F][0-9A-F]\),\\\\\x\1,g' | xargs printf "%b\n" | grep -v "^$" | sort | uniq -c | sort -rn) - [ -n "$dat" ] && tot=$(( $(echo "$dat" | awk '{print $1}' | paste -s -d+ -) )) - opts=$(echo "$options" | tr '~' '\n' | paste $tmpd/o -) + + [ -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 sleep $refresh @@ -92,7 +97,7 @@ logs="${l:-/var/log/nginx/access.log}" file="$f" nbq=4 -uopt="-u -k1,1" +uopt="-u" choix= tmpd=$(mktemp -d XXX) @@ -102,7 +107,7 @@ alias question:=question; question() question="$*" alias type:=type; type() type="$*" alias options:=options; options() options="$*" alias choix:=choix; choix() { [ "$*" = "multiple" ] && choix="+" || choix=; } -alias unique:=unique; unique() { [ "$*" = "non" ] && uopt= || uopt="-u -k1,1"; } +alias unique:=unique; unique() { [ "$*" = "non" ] && uopt= || uopt="-u"; } trap "rm -rf $tmpd;exit" INT TERM trap "kill 0" EXIT