Variantele de subiecte de bacalaureat la "matematică" apar pe Internet în diverse locuri, ca fişiere PDF; în [1-7] ne-am ocupat de "formatul PDF" şi am evidenţiat modalităţi de modificare a fişierelor PDF iniţiale, încât rezultatul să faciliteze folosirea variantelor respective drept suport practic pentru "recapitulare" premergătoare examenului: ne interesează conţinutul propriu-zis al variantelor (nu şi antetele sau adnotările publicitare de pe fişierele PDF iniţiale) şi nu neapărat pentru a tipări, cât mai ales pentru a selecta şi extrage problemele în funcţie de un anumit conţinut.
Urmărind acest scop, ne propusesem în [1] să realizăm un site care să înregistreze şi să redea firesc variantele respective (prin text propriu-zis, nu ca stream-uri PDF), permiţând căutarea şi selectarea după conţinut sau criteriu; el fiinţează acum ca subdomeniu "docere.ro" http://bacmath.docere.ro (modificare şi simplificări, în 2018) aplicaţie internă variante_bac_mate şi are în mod voit o exprimare simplă (evitând inclusiv tentaţia ambalării într-un "layout" special), dar cu suficiente valenţe:
Alegând un "Set", o "Variantă" (implicit, prima), un "Subiect" (implicit, "All" - toate cele trei subiecte) şi apoi acţionând prin click butonul "GET" - utilizatorul va obţine enunţurile corespunzătoare:
Aici, link-urile "Next" şi "Prev" permit obţinerea imediată a variantei următoare sau precedente (98 sau 96, în cazul redat); iar "--PrintPrewiev" pur şi simplu elimină formularul şi linkurile, permiţând tipărirea variantei (prin meniul "Print..."), sau salvarea ei ca pagină Web independentă.
"Variantă" nu este o simplă etichetă (precum "Set"), ci este un link pentru o "tragere la sorţi": la click se va genera aleatoriu numărul unei variante, încât click-ul final pe "GET" va reda o variantă aleasă la întâmplare dintre cele existente în cadrul setului respectiv.
Click-dreapta pe una dintre formulele existente în enunţurile redate produce un meniu prin intermediul căruia se poate vedea forma textuală în care este înregistrată formula respectivă:
Formulele matematice sunt scrise folosind limbajul LaTeX şi sunt redate prin intermediul bibliotecii MathJax. De exemplu, pentru problema 1 din imaginea redată ceva mai sus am înregistrat în baza de date următorul text:
Să se ordoneze crescător numerele $3!,\,\sqrt[3]{100},\,\log_2{32}$.
MathJax înlocuieşte fiecare text delimitat de caractere $ cu o secvenţă de coduri (fie HTML+CSS, fie MathML, fie SVG - în funcţie de capabilităţile browserului şi de opţiunile utilizatorului) care permit ca textul LaTeX respectiv să fie redat de către browser sub forma notaţiei matematice uzuale; dacă se doreşte, construcţia realizată astfel de MathJax se poate vizualiza folosind instrumente de investigare asociate browserului (de exemplu, "View Generated Source" în Firefox).
Un exemplu ilustru de folosire a limbajului LaTeX şi a bibliotecii MathJax, pentru redarea în browser a textelor de matematică, fizică, chimie, etc. este wikipedia.
Alegând pentru "Subiect" I, II, sau III (în loc de "All") - va fi extras şi redat numai subiectul respectiv, din cadrul variantei:
iar aici, link-ul "Lista" va extrage acel subiect din toate variantele înregistrate ale setului selectat (fiind apoi posibilă filtrarea problemelor, printr-un mecanism banal de "ascundere" selectivă a unora sau altora dintre enunţurile redate).
Vizăm deocamdată, cele 200 de variante ("MT1" şi "MT2") furnizate publicului în anul 2009; dar în prezent, nu toate sunt şi înregistrate (ca text+LaTeX) în baza de date. Variantele care încă nu au fost înregistrate sunt redate în dependenţă de utilizator.
Utilizatorului anonim îi este redat fişierul PDF conţinând subiectele din varianta respectivă (fişier obţinut din fişierele PDF iniţiale prin transformările arătate în [7]):
Utilizatorul care deţine un anumit cont de acces se poate autentifica prin link-ul "Login" şi i se oferă posibilităţi pentru înscrierea variantelor în baza de date:
Utilizatorul autorizat poate citi enunţurile de pe fişierul PDF redat pentru varianta încă neînregistrată şi poate tasta în caseta de deasupra textul citit şi codurile LaTeX pentru formulele conţinute; în final - după ce a completat cele 10 enunţuri ale problemelor care compun varianta - va acţiona butonul "SAVE", determinând înregistrarea în baza de date a enunţurilor tastate.
Imediat după salvarea în baza de date, varianta respectivă este redată în formatul "text+LaTeX" (fără a mai vizualiza fişierul PDF din care a provenit); dacă este cazul, eventualele corecturi pot fi efectuate prin link-ul "Manage" - acesta deschide o interfaţă de administrare directă a enunţurilor înscrise în baza de date (şi permite deasemenea, înscrierea direct ca "text+LaTeX", a unor noi variante).
"Interfaţa de administrare" pomenită aici este de fapt aplicaţia standard admin, oferită gratuit (neimplicând efort personal) de către Django. Aceasta oferă tot ce ar avea nevoie "super-userul" (vizând crearea şi modificarea grupurilor şi conturilor de utilizator, înscrierea directă de variante, etc.); dar dacă nu este modificată corespunzător, ea ar oferi mult prea mult colaboratorilor.
Restrângerea valenţelor aplicaţiei admin, astfel încât colaboratorul care editează o variantă pentru a o înscrie în baza de date să poată administra numai elementele aferente acelei variante (nu şi conturile de utilizator, nu şi alte variante) - este relativ uşor de implementat (urmând prescripţii Django obişnuite). Dar efectuarea corecturilor folosind link-ul "Manage" înseamnă o comutare chiar sâcâitoare, între aplicaţii: mai întâi, reţine la care problemă ai de corectat; apoi, prin "Manage" deschide (cel mai bine, într-un nou tab) aplicaţia /admin/ (restricţionată la varianta respectivă) şi aici, deschide, editează şi salvează problema corectată - după care trebuie să revii în aplicaţia de bază şi să vezi dacă la problema respectivă, sau la o alta, mai sunt de făcut corecturi, repetând toate aceste comutări de câte ori este necesar.
Soluţia cea mai simplă pentru a împăca toate interesele constă în a permite accesul la /admin/
(prin link-ul "Manage") numai utilizatorilor cu statut special ("Superuser", sau "Staff") şi a asigura celorlalţi colaboratori autorizaţi o posibilitate de corectare directă a enunţurilor:
Utilizatorul "co-worker" a tastat enunţurile din varianta 18 şi a acţionat butonul "SAVE", obţinând în browserul său ceea ceea se am redat mai sus; se vede aici că enunţul problemei 5 trebuie corectat: în loc de "\veci" trebuia scris "\vec i" (\vec este un operator LaTeX care asigură supralinirea cu săgeată a caracterului care îi urmează) - iar pentru efectuarea corectării este furnizată dedesubt o casetă de editare şi un link "EDIT". După fiecare corectură (acţionând link-ul "EDIT"), pagina este reafişată - putând constata dacă mai sunt de făcut corecturi.
În [1] avansasem ideea asocierii unor "tag"-uri, permiţând selectarea problemelor marcate printr-o aceeaşi etichetă (idee tipică pentru "blog"-uri); însă aceasta l-ar încărca prea mult pe cel care înscrie variante: el ar avea nu numai de citit şi de tastat text şi LaTeX (cum am arătat mai sus), dar ar trebui şi să analizeze problemele respective pentru a decide apartenenţa la un tag (semnificativ) sau altul.
Am abandonat ideea înfiinţării de tag-uri, imediat ce am reuşit o soluţionare simplă a sarcinilor caracteristice unui link de căutare în baza de date, "Search":
Pe imaginea tocmai redată se văd (parţial) rezultatele căutării problemelor care conţin formule cu "radicali de ordinul 3" ("\sqrt[3]", în LateX) - obţinute la click pe link-ul "Pick", după înscrierea în caseta vecină a termenului de căutat.
Dar în stadiul actual, "Search" acţionează pe întreaga bază de date; urmează să restrângem căutarea asupra unui anumit set şi subiect (de exemplu, ne-ar fi interesat problemele cu "\sqrt[3]" din cadrul Subiectului III al variantelor din setul "MT-1"). --N.B.: între timp, am şi rezolvat chestiunea.
Însă ceea ce este într-adevăr important (pentru orice aplicaţie) este faptul că nu avem nimic de eliminat (sau de înlocuit), dintre elementele prezentate mai sus; poate fi vorba cel mult, de unele adăugiri - dacă sunt de bun simţ (poate, o rubrică pentru discuţii publice asupra variantelor).
N.B. Cumva (constat în 2018), m-am păcălit: sunt încă de eliminat sau de simplificat anumite lucruri, cum se poate vedea pe versiunea variante_bac_mate a aplicaţiei descrise mai sus.
Am avea adică şi aici, o reflectare a unui principiu general de proiectare, care după Antoine de Saint–Exupéry are următoarea formulare: "A designer knows he has achieved perfection not when there is nothing left to add, but when there is nothing left to take away" - condensată frecvent prin expresia "less is more".
[1] Recapitularea pentru bacalaureat - între PDF-uri şi site utilitar
[2] Investigarea unor fişiere PDF
[3] Experimente cu PDF-uri, iframe şi Google Drive
[4] Trei pagini PDF în una, folosind Python
[6] Modificarea unor pagini PDF, folosind python-pyPdf
[7] Reducerea la regiunea vizibilă şi "împăturirea" unor pagini PDF
vezi Cărţile mele (de programare)