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:
M | qcm.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