Aplicaţie Web pentru gestionarea încadrării şi orarului unei şcoli (iulie 2010)

http://scorar.docere.ro/ demonstrează aplicaţia, pe un caz real.
http://admin.scorar.docere.ro/ permite actualizările şi editările necesare.

http://github.com/vladbazon/scorar oferă codul sursă (PHP symfony).

Script Bash pentru generarea modulelor într-o aplicaţie symfony (iulie 2010)

symfony oferă un script PHP prin care se poate genera automat scheletul de bază pentru proiect, aplicaţie a proiectului, modul al aplicaţiei; de obicei, proiectul angajează o bază de date, iar scriptul respectiv poate genera modulele (desigur, câte unul) în concordanţă cu schema acesteia.

Să presupunem însă un caz "extrem": baza de date conţine câteva zeci de tabele şi relaţii şi vrem să generăm toate modulele de administrare aferente acestora. Atunci, în loc să invocăm direct scriptul menţionat - pentru fiecare tabel, de atâtea ori - va fi preferabil să concepem un script Bash care să ambaleze invocarea php symfony într-un "for lista modulelor de creat".

Introducere elementară în framework-ul PHP symfony (iulie 2010)

Cele patru manuale oferite de symfony constituie după toate aprecierile, cea mai bună documentaţie realizată pentru un proiect "open-source"; dar nu ne propunem aici să traducem documentaţia.

După ce am parcurs sau măcar am răsfoit manualele (şi le-am şi întrebuinţat - vezi încadrare şi orar) am ajuns la ideea că lucrurile se puteau totuşi "prinde" şi pe calea care—oarecum paradoxal—este cea mai obişnuită: nu cu manualul începi, ci instalezi produsul şi frunzăreşti oleacă prin documentaţie, apoi lansezi o aplicaţie "default" şi observi ce se petrece, experimentând şi corelând cu "mici" investigaţii pe codul-sursă.

Lucrând astfel - folosind manualul nu ca pe o carte care trebuie citită în prealabil şi în mod liniar, ci pentru a căuta clarificări şi validări - se poate ajunge la acea înţelegere a principiilor de lucru specifice care este suficientă în fond, pentru a începe să foloseşti produsul conform propriilor necesităţi. Obişnuinţa cu acest stil de lucru se dovedeşte benefică apoi şi pe parcursul dezvoltării propriilor aplicaţii.

Model Web pentru încadrarea şi orarul unei şcoli (iunie 2010)

—imagine bazată pe scriptul JS din the-bazon-fractal (care se referă la <canvas>, animaţie şi anti-aliasing)—

În realitate, încadrarea şcolii e una, orarul e alta, iar "revista şcolii" (de exemplu) e cu totul altceva; o trăsătură comună este în orice caz, faptul că au o existenţă temporară, cel mult anuală.

O aplicaţie Web unifică lucrurile, pe baza faptului că ele aparţin unui aceluiaşi domeniu, fiind bazate sau angajând aceleaşi structuri şi şabloane de date. Încadrarea, orarul, situaţiile şcolare, chiar şi "revista şcolii" ţin toate de: obiecte şi profile de învăţământ, profesori, clase, elevi, schimburi de lucru - indiferent de şcoală sau de an şcolar curent.

Validarea unui CNP (mar 2010)

Aplicaţie PHP pentru operaţii CRUD pe tabelele unei baze de date (ian 2010)

aplicaţie Web care să permită operaţii de listare, updatare, inserare, ştergere (pe scurt: CRUD) pentru oricare tabel existent într-o bază de date precizată.

Există numeroase framework-uri care modelează până la un anumit nivel operaţiile principale într-un anumit context - inclusiv operaţii CRUD în contextul bazelor de date. Vrem însă o aplicaţie cât se poate de simplă, care să nu se ocupe decât de CRUD - similar cu ceea ce oferă phpScaffold. Însă phpScaffold suferă de hard-coding: numele tabelului şi denumirile câmpurilor sunt înscrise direct în formulările SQL - urmarea fiind că fişierele PHP furnizate de phpScaffold sunt destinate operaţiilor CRUD pe un anumit tabel, depinzând direct de numele tabelului şi de denumirile câmpurilor acestuia.

SYNOPSIS
— constituie un VirtualHost pentru aplicaţie;
— copiază în directorul indicat ca DocumentRoot fişierele redate;
— modifică în config.php numele bazei de date, host-ul, userul şi parola;
— aplicaţia poate fi accesată apoi dintr-un browser.

Aplicaţii Web cu Ymacs, "in-browser Emacs-like editor" (nov 2009)

Creem un server PHP (inclusiv pentru Windows cu XAMPP) care foloseşte Ymacs (permiţând în plus, încărcare şi scriere de fişiere de pe disc); el permite dezvoltarea unei aplicaţii Web lucrând numai în browser: într-un tab al browserului se încarcă şi se editează corelativ fişierele necesare (folosind bufferele Ymacs), într-un alt tab se testează starea curentă a aplicaţiei, pe parcursul lucrului.

Tabelul unic versus "bază de date" (între practică şi teorie) (oct-nov 2009)

Câteva aspecte de practică obişnuită (inclusiv… de practică greşită), legate de "baze de date" şi de teoria "normalizării".

MySQL şi extensia PHP mysqli.

Conceptul general "Model-View-Controller"; framework-uri de dezvoltare a aplicaţiilor Web care angajează baze de date.

Temă de "lucrare de atestat": aplicaţie Web pentru a oferi informaţii despre lucrările de atestat produse de elevii din judeţ (din ţară).

"Toţi se gândesc la bani, nimeni la lumină…" — despre motivare.

Cu Perl, de la ORAR.XLS (orarul şcolii) la Web (oct 2009)

Avem un fişier .XLS conţinând orarul unei şcoli. Pe de altă parte, avem o aplicaţie Web, pentru expunerea în diverse moduri şi pentru întreţinerea orarului, aplicaţie constituită pe o bază de date MySQL, cu o anumită organizare internă. Redăm aici prin secvenţe Perl instructive, diverse prelucrări necesare pentru extragerea şi organizarea convenabilă a datelor din fişierul .XLS iniţial, în vederea încorporării lor în aplicaţia Orarul şcolii.

Plugin jQuery pentru paginarea unui tabel HTML (august 2009)

Ataşează unui tabel HTML o bară de navigare (incluzând şi handlere corespunzătoare), încât tabelul să fie redat pe pagini de câte un anumit număr de rânduri (cu posibilitate de trecere de la o pagină la o alta), părţile de antet/subsol fiind însă menţinute pe fiecare pagină. Tabelele trebuie să poată fi paginate în mod independent (unul faţă de celălalt) şi trebuie avut în vedere (pe cât este firesc) şi cazul tablourilor imbricate.

generarea de tabele HTML, exemple, experimente
folosind jQuery.

Aici s-a generat un tabel abstract, cu antet şi subsol, cu pagini de câte 4 rânduri şi care este paginabil prin acţionarea elementelor din bara de navigare ataşată.

Un bookmarklet pentru calculul dinamic al mediei şcolare (iulie 2009)

Definim un obiect G care în primul rând, conţine trei containere - respectiv pentru Note, Teză şi Medie; acestea sunt ele însele nişte obiecte (şi anume nişte obiecte predefinite), încât putem folosi proprietăţile şi metodele specifice lor (în cadrul obiectului G definit de noi).

Note şi Teză sunt "de tip" <input>; ca obiect, un <input> are predefinite nişte metode de interacţiune - onClick(), onKeypress(), onKeyup(), onMouseover(), etc. iar acestea se pot "redefini" pentru a răspunde în modul dorit unor evenimente precum apăsarea unei taste sau click în cadrul containerului aferent, sau în exteriorul lui, etc.

Redefinim în obiectul G, metodele onKeyup() pentru <input>-urile Note şi Teză, în aşa fel încât fiecare tastare (sau ştergere) de notă/teză să declanşeze procedura de calcul şi înscriere a mediei.

După definirea astfel a obiectului G, adăugăm o funcţie care să-l creeze conform specificaţiilor lui şi să-l anexeze documentului. În final, includem totul în "paranteze de invocare" (...)();, astfel că toate variabilele implicate rămân ne-vizibile din afară şi pe de altă parte, funcţia finală (care şi ea trebuie inclusă în paranteze de invocare) va fi pusă în execuţie imediat după încărcarea scriptului.

După ce o punem la punct astfel, transformăm aplicaţia rezultată într-un bookmarklet: eliminăm comentariile şi spaţiile (folosind un compressor), eventual escapăm şi codificăm URL anumite caractere şi apoi adăugăm scriptul rezultat în Bookmarks (implicând pseudo-protocolul javascript: în loc de obişnuitul http:).

tastaţi fără spaţiu!

Un plugin jQuery pentru calculul dinamic al mediei şcolare (iunie 2009)

Faceţi click pe câte un nume existent în prima coloană:

1. Ionescu George        
2. Popescu Teofil      
... (introduceţi notele fără spaţiu, de exemplu: 91010)

Care este media şcolară pentru notele 9, 10, 10 şi nota în teză 9?
Unele programe/calculatoare dau 9.50, adică media 10 — ceea ce este incorect: media cu două zecimale exacte este 9.49, adică media şcolară este 9 (şi nu 10).

- Modelarea corectă a calculelor cu n zecimale exacte (.49 versus .50)
- Media şcolară ca formular independent (<form>, setTimeout(), onkeypress)
- Media şcolară ca plugin jQuery (de montat pe un tabel de elevi)

Integrarea algoritmului lui Dijkstra (mai 2009)


Obiecte Javascript pentru modelarea grafurilor
     var W = {
               'A': [ ['B', 5], ['C', 3], ['E', 2] ],
               'B': [ ['D', 6], ['C', 2] ],
               ...
     };
     W['A'].dist = 0; // nodul de start
     W['B'].dist = 4; W['B'].prec = 'C'; 
     W['C'].dist = 3; W['C'].prec = 'A';
                

Pe urmele unei aplicaţii web (drumurile sunt pentru călătorii… nu destinaţii)
Crearea şi corelarea fişierelor de bază (HTML, CSS, JS)
Dedesubturile interacţiunii cu utilizatorul
Constituirea obiectului de bază. De la pseudocod la metodă

Elementele client-server ale aplicaţiei
De la obiect JavaScript la şir JSON
De la şir JSON la variabilă Perl
Obţinerea unei imagini a grafului (GraphViz)

Implementarea, de la minimal la eficient (apr 2009)

Manuale şi programator: implementarea unui algoritm de teoria grafurilor.

Povestea arborelui parţial minimal
Implementarea clasică a algoritmului lui Prim (GCC g++/Borland C++)
Compromisuri între stil şi eficienţă
Biblioteci şi interfeţe (strategia evitării impasului)

Saltul recursiv şi alergarea iterativă (mar 2009)

Partenerii mai în vârstă, cu care învăţam să joc şah pe când şcolăream şi eu, foloseau cu un soi de veneraţie, titlurile Cavaler, Ofiţer şi Regină; piesele de şah păreau a fi în mintea lor nişte fiinţe vii, cu responsabilităţi, complicităţi şi pretenţii specifice rangului. Între timp am adoptat toţi, desemnări de faţadă - "cal", "nebun" şi "damă"; dar în franceză încă se zice cavalier şi nu cheval, iar în engleză nu se zice horse, ci knight (e drept că noi nu prea am avut cavaleri…).

Revenim asupra unor construcţii javaScript din Ambiţiile unui Cal; vizam drumuri hamiltoniene pe graful săriturii calului - dar poate fi mulţumit Sir Knight? …cavalerii ăştia erau în stare să susţină o cauză până-n pânzele albe.

Cursivitatea recursivităţii (reformulare "tail recursion")
de la 'too much recursion' la formula iterativă

Ambiţiile unui Cal (feb 2009)

…calul trebuie să viziteze fiecare câmp exact o dată (click pe diagrama alăturată)

Modelarea problemei (ca graf şi ca obiect de memorie) - în javaScript
Reprezentarea vizuală a grafului în fereastra browserului
Modelarea căutării unui drum hamiltonian (backtracking)
Backtracking compus cu algoritmul euristic al lui Warnsdorff

continuă pe acel drum din care vei avea cât mai puţine ramificaţii; acest principiu decurge iterând recomandarea evidentă: dacă ai de ales între a face un ultim pas până la destinaţie şi respectiv a ocoli, atunci alege prima variantă.

Aplicaţia finală: Cal++

PGN chess game parser and viewer (ian-mar 2009)

Aplicaţia de care ne ocupăm aici poate fi accesată prin
http://www.docere.ro/momente/doPGN (sau ../doPGN/25 etc.)
…prezentăm pe scurt funcţionalitatea asigurată.

— articol nefinalizat/amânat… dar vezi doPGN (a Javascript PGN-browser)

Experimente cu factoriale în Javascript (dec 2008)

Câte cifre are n! şi care sunt cifrele iniţiale?
Câte cifre zecimale are 22009 şi care sunt primele câteva cifre?
Există n încât n! să aibă 1000 cifre zecimale?
Există n încât n! să aibă n cifre zecimale?
Există n încât n! să aibă n cifre hexazecimale?

Modelarea calculului n! în baza 10 | 106 | 216 (javaScript)

Cel mai mare număr natural care are Z cifre zecimale este 10Z - 1; cel mai mare număr natural care are T cifre în baza 256 este 256T - 1; ca să vorbim de aceleaşi numere naturale şi într-o bază şi în cealaltă, trebuie să avem 10Z = 256T; aplicând logaritmii zecimali, rezultă: Z = T * lg(256) ≈ T * 2.40824. Adică, reprezentarea în baza 256 necesită de minimum 2.4 ori mai puţine "locaţii" decât cea în baza 10, iar operarea bazată pe reprezentarea în baza 256 necesită de 2.4 ori mai puţine operaţii "cifră cu cifră" decât cea bazată pe reprezentarea zecimală obişnuită.

...dacă avem de împărţit la 10k, noi — care folosim în mod nativ baza 10 — nu facem efectiv împărţirea, ci doar deplasăm cifrele spre dreapta cu k poziţii. Pentru calculator, baza nativă de operare este 2k, k = 8/16/32; modelând operaţiile de exemplu în baza 216, putem evita împărţirile la BAZA (= 65536) - înlocuindu-le cu operaţii "pe biţi" (AND, deplasări de biţi), incomparabil mai rapide decât împărţirea efectivă.

A vedea şi Factoriale (cu implementare în limbaj de asamblare).

Şablonul "if(...) return 0; else return 1;" (mot-à-mot din Pascal în C) (dec 2008)

"deformaţie profesională": De ce greşeşte — elevul/manualul/autorul?

Manualul vizează în paralel limbajul Pascal şi limbajul C/C++ (plus… pseudocodul excesiv). Ideea de a viza împreună mai multe limbaje de programare este excelentă, dar "realizarea" ei în acest manual este… "în paralel": programele redate în C/C++ nu sunt altceva decât traduceri mot-à-mot ale programelor Pascal.

Limbajul Pascal nu are o instrucţiune return. Ca urmare, traducerea mot-à-mot a funcţiilor recursive din Pascal în C duce la formulări principial greşite:
if(...) return 0; else return 1;

Extinderea obiectului Array cu o metodă quickSort() (nov 2008)

Array.prototype.q_sort = function(beg, end) { /* QuickSort */ }
de fapt metoda existentă sort() este tot ceea ce este necesar! restul poate fi (ca aici) un exerciţiu didactic de prezentare a unor aspecte de lucru cu obiecte Javascript.

Obiect javaScript; proprietăţi şi metode ale obiectului
Tablouri în javaScript (obiecte Array())
     ["Foo", "Bar", "bar", "Baz"].sort();
     [30, 7, 300, 31].sort(); // [30, 300, 31, 7];
     [30, 7, 300, 31].sort( function(a,b) { return a - b; } ); // [7, 30, 31, 300].
Extinderea obiectelor javaScript predefinite (folosind .prototype)
metoda quick sort

Implicarea browserului în studiul convergenţei (nov 2008)

Rezolvarea unei probleme de matematică (de exemplu, demonstrarea convergenţei unui şir) poate fi sugerată de rezultatele investigaţiei printr-un program adecvat.

În cadrul documentului HTML ar fi suficient să prevedem următoarele elemente:
— două elemente <input>, pentru a permite utilizatorului să precizeze gama de termeni de calculat (rangul iniţial şi rangul final);
— un element <div> destinat scrierii termenilor şirului, pe măsură ce vor fi calculaţi;
— un <button> a cărui acţionare prin click să declanşeze calculul şi scrierea termenilor respectivi
— un <script> care să modeleze funcţia de calculare a termenilor şirului.

Rangul elementului din mijloc (nov 2008)

Numerele vizate la matematică nu sunt totuna cu numerele vizate într-un limbaj de programare; ca urmare, transcrierea mot-à-mot de la formulă matematică la program atrage de obicei rezultate greşite pentru anumite cazuri.

Greşit: int i_mijloc = (i_st + i_dr) / 2; // variabile C de tip "int"
Corect: int i_mijloc = i_st + (i_dr — i_st) / 2;

Dacă suma i_st + i_dr depăşeşte sizeof(int), atunci rezultatul va fi trunchiat modulo INT_MAX + 1.

Borland C++ compiler 5.5 (nov 2008)

Borland C++ 5.5 it's free… because GNU-GCC is great.

Obţinere şi instalare. Testare; compatibilitate cu GCC.
Un exemplu, folosind STL (Standard Template Library)

Accesaţi http://cc.codegear.com/Free.aspx?id=24778 şi creaţi-vă un cont; după ce veţi activa contul respectiv (prin intermediul serviciului de Mail), veţi putea descărca pachetul freecommandLinetools.exe a cărui execuţie asigură instalarea

Exerciţii de programare în C, C++ (oct 2008)

Putem obţine suma 1 pentru numerele 1..n?
Analiză, ilustrare (backtracking), schema programului,
implementări (cu BCC şi cu GCC).
Observaţii metodice asupra lucrului în laborator.

Cea mai proastă "tehnică" pe care am văzut-o este aceasta: deschide calculatorul (şi aşteaptă să se încarce Windowsul); click pe iconiţa "Borlandc" (se deschide IDE-ul Borland C++ 3.1); între timp, deschide caietul/manualul la programul de "implementat", aşează-l verticat lângă ecran şi începe să scrii (echivalent: unul dictează, celălalt scrie); când ai terminat de copiat programul în calculator, mai tastezi CTRL-F9 şi gata… (trecem la altă problemă, că pe asta am înţeles-o; "algoritmul este important, nu programul; informatică înseamnă algoritmi"-punct).
Cu asemenea obicei şi cu asemenea concepţii reducţioniste, poţi cel mult să înveţi să dactilografiezi (fără caractere româneşti!) - nicidecum nu vei reuşi să înveţi să programezi procedând astfel (punct!).

Modelarea unor probleme clasice folosind Javascript (oct 2008)

n =    diagramă (click pentru o nouă poziţie)
(sau, click pe diagrama cu dame alăturată)

Problema damelor. Trei metode: randomizare, backtracking, reducere la o problemă de grafuri. Elemente de DOM (Document Object Model) necesare pentru reprezentarea în browser a soluţiilor.

Matrice pătratice - modelare C++ (sep 2008)

O mică ilustrare de OOP (Object Oriented Programming) în C++
(postat în oct. 2006; re-postare în sept. 2008)

// exemplu de folosire a clasei 'matricep'

#include "matricep.cpp"
#include <iomanip.h> // pentru formatarea scrierii valorilor 'double'

matricep A(3), E(' ',3);

// determină puterea n a unei matrice pătratice (algoritm Al-Kashî)
matricep alan(matricep& A, int n) {
   if(n == 0) return E;
   if(n % 2) return A * alan(A, n-1);
   matricep S = alan(A, n / 2);
   return S * S;
}

void main() {
   cin>>A;
   ofstream co("con");
   co << setiosflags(ios::fixed);
   co << alan(A,10);
}

Limbaje şi calculator (apr-mai 2008)

Deducerea treptată şi motivarea structurii şi funcţionării unui microprocesor, plecând de la evidenţierea necesităţilor care ar decurge logic din cerinţa ca microprocesorul să execute codul; limbaje de asamblare; instrumente de investigare a memoriei (debug); asambloarele Gas şi Nasm; apeluri de sistem INT 0x21 (funcţii DOS), INT 0x80 (apeluri Linux); coduri ASCII; generarea graficelor caracterelor BIOS; programe în limbaje de asamblare

Se împlinesc 10 ani de când s-a publicat Limbaje şi calculator (Ed. PETRION 1998); a fost prima încercare metodologică de a susţine că limbajele nu sunt izolate faţă de calculator - dimpotrivă, scheletul de bază al oricărui limbaj corespunde structurii tipice de CPU, precum şi posibilităţilor de corelare cu un sistem de operare.

Linia metodologică intuitivă pe care o lansam acolo avea ca idee interpretarea continuă a binecunoscutei teze programe = algoritmi + structuri de date.

Evidenţiind cu instrumentele adecvate, codul furnizat de compilator (pentru programe simple în Pascal, C, etc.), ajungem la formula (de memorie+CPU) program = zonă de cod (CS; IP) + zonă de date (DS); angajând apoi subprograme şi analizând implicaţiile către CPU, ale realizării transferului bidirecţional de control şi de parametri - se prelungeşte formula cu + zonă-stivă (SS; SP/ESP) + cadru-stivă (BP/EBP), unde valorile de bază DS, CS, SS rezultă prin corelare - asigurată de către sistemul de operare - cu mediul de execuţie

Informatica evoluează, învăţământul nu! (apr 2008)

Sintagma Păi aşa a zis…, if( ... ) return 0; else return ...; şi un fals: Informatică = Windows + produse Microsoft (point-and-click) + pseudocod.

Sintagma "se citeşte de la tastatură, să se scrie pe ecran", interpretoarele de comenzi şi editoarele de text. Reducerea grosolană la point-and-click şi faţetele unui program (-sursă, -obiect, -executabil; proces)

Documente Web - tutorial (mar-sep 2008)

Principiul separării:
    program = text-Sursă—Compilare—Editare-legături
    document Web = Conţinut—Prezentare—Interacţiune
Conţinut: limbaje de marcare (HTML, XML, etc.); modele de reprezentare ierarhică în memorie (DOM)
Prezentare: asocierea elementelor de conţinut cu atribute de vizualizare (CSS)
Interacţiune: javaScript, DOM; modelul de evenimente
    aplicaţie Web = Model—View—Controller

Pentru crearea oricărui document (inclusiv, a unui program executabil) există o strategie unitară, bazată pe folosirea unui editor de text, împreună cu instrumente pe care le presupune orice sistem de operare: un shell, un compilator sau altul, un editor de legături; împreună de asemenea, cu un browser sau altul.

Exemplificăm printr-o pagină Web statică (fişier HTML, fişier CSS) pentru orarul clasei (… temă dată de elevi); într-o a doua versiune, orarul este generat (dinamic) folosind javascript. Se lucrează apoi o aplicaţie Web: situaţia şcolară finală a clasei sau elevului (cu ordonarea interactivă - printr-o funcţie Javascript - a unui tabel şi implicând Google Chart).

Înlocuirea unor porţiuni dintr-un tabel MySql (mar 2008)

Aplicaţia noastră de salarizare are ca idee de bază refolosirea datelor. Descriem aici concepţia aplicaţiei şi soluţia cu MySql a uneia dintre problemele concrete pe care le-am avut de rezolvat în legătură cu baza de date existentă.

CHESS - intenţii, un prim experiment (dec 2007 - ian 2008)

Începem from scratch o aplicaţie de tip "server de şah prin corespondenţă" (perl + javascript). Aici - o aplicaţie minimală: generarea tablei de şah şi o funcţie de mutare a piesei. Sunt prezentate elemente de HTML, CSS, javascript, prototype.js, DOM precum şi posibilităţi de verificare a conţinutului generat de funcţii în cadrul documentului.

N.B. (20.02.08) Finalizare, într-o primă versiune: click "ŞAH prin corespondenţă" în coloana din dreapta.

de la HTML la PDF (cu Perl şi LaTex) (dec 2007)

Transformări cu Google Docs. Varianta PDF a unui document HTML, cu perl HTML::Latex şi LaTeX.

Esenţială pentru WEB este posibilitatea de interconectare; documentele de pe Web nu au în vedere "formatul A4" (nu vizează operaţia de tipărire pe hârtie), pentru motivul evident că de pe hârtie nu este posibilă interconectarea cu alte documente.

Pentru reprezentarea pe hârtie avem două categorii de instrumente: aşa numitele "procesoare de text" What You See Is What You Get de exemplu, binecunoscutul Word din pachetul comercial Microsoft-Office, sau aplicaţia "free" OpenOffice.org-Writer; respectiv, limbaje de marcare/programare (TeX, cu varianta LaTeX) şi formate de reprezentare "independente de dispozitiv", precum PDF.

Instituţiile (funcţionarii acestora) folosesc de regulă produsele de tip point-and-click, în principal Word (în general, instituţiile nu produc documente interconectate, ci doar documente tipărite (.DOC), de îndosariat). Iar în cadrul sistemului de învăţământ se studiază în mod extensiv (şi exclusiv), produsele point-and-click, de parcă scopul ar fi acela de a forma funcţionari…

Evidenţiem necesitatea deprinderii de a folosi un editor de text obişnuit (nu Word!) şi prezentăm elementele necesare pentru a folosi LaTex.

Substratul problemei (inside-out) (nov 2007)

Atitudinea funcţionărească şi atitudinea creatoare, faţă de "probleme"; pe dos despre raportul anarmonic.
A ignora legăturile posibile înseamnă a scăpa şansa de "a reinventa roata", adică şansa de a învăţa regândind lucrurile.

Cele 24 de rapoarte anarmonice iau câte 12, valorile imaginare ε, ε-1 (unde ε3 = -1, ε ≠ -1) şi se numesc rapoarte echianarmonice. Ecuaţia µ2 - µ + 1 = 0 provine din (abcd) = (acdb) sau (abcd) = (adbc); deci un raport este echianarmonic dacă şi numai dacă el se păstrează în urma unei permutări circulare între trei numere... coeficienţii sunt funcţii simetrice de a, b, c - deci se vor putea exprima prin coeficienţii ecuaţiei de gradul trei care are ca rădăcini numerele a, b, c; această observaţie este speculată, regăsind pe această cale elementară - "reinventând roata", aşa-i? - condiţia în care o ecuaţie de gradul trei are rădăcini reale (o teoremă a lui Joachimsthal) şi restabilind elementar, o metodă (dată de Cayley) de rezolvare a ecuaţiilor de gradul trei.

O aplicaţie pentru browser, cu determinanţi şi sisteme liniare (nov 2007)

Cineva ne solicită… idei de lucru. Despre lipsa de idei… Exemple fireşti de "idei de lucru" (aplicaţie javascript+HTML pentru "regula lui Cramer"; biblioteca prototype.js).

Am întâlnit elevi pasionaţi de informatică, dar care nu învaţă decât la "Informatică". Mai bine zis, deşi sunt pasionaţi de informatică, nu învaţă decât la "Informatică". Această atitudine este principial greşită: informatica vizează mai toate domeniile şi în plus, se bazează cam pe toate domeniile (inclusiv şi cel mai mult, pe matematică). Iar această atitudine greşită conduce de obicei la starea de lipsă de idei

Distribuirea calculului factorialului: CGI şi Javascript (oct-nov 2007)

Anterior (a vedea "Hello World!" şi Subrutină performantă pentru calculul factorialelor, în această ordine) am realizat o subrutină în limbaj de asamblare pentru n!. Într-o primă etapă, factorialul se obţine în forma binară (în baza 2^32); în a doua etapă, se converteşte la baza 10^9 şi implicit la forma zecimală uzuală. Forma binară se obţine în 0-5 secunde (pentru valori până la n = 100000; factorialul lui 100000 are cam 0.5 MB cifre zecimale), însă conversia la forma zecimală durează cam de cinci ori mai mult.

Este posibilă optimizarea secvenţei de conversie… dar de ce să se ocupe serverul de conversie? (şi nu browserul).

Cererea http://sitsco.com/cgi-bin/amifac.cgi?1234 primeşte de la server factorialul numărului 1234, în hexazecimal. Aplicaţia rezultată este pusă la dispoziţie on-line: click pe link-ul Factoriale din coloana dreaptă; interfaţa conţine şi o funcţie javascript de conversie la baza 10 a unui şir de cifre hexazecimale de orice lungime (folosind schema lui Horner).

Extinderea funcţionalităţii serverului, prin CGI (oct 2007)

scriere nu înseamnă neapărat "scriere pe ecran", ci comunicare (între procese); parametrii pot fi transmişi prin intermediul "variabilelor de mediu" (de ex., prin QUERY_STRING).

CGI extinde funcţionalitatea clasică a serverului; browserul cere serverului nu un anumit fişier, ci rezultatul execuţiei unui anumit program; serverul lansează programul respectiv şi transmite browserului ceea ce "scrie" la STDOUT programul executat. Acest program poate să fie cam în orice limbaj (fie ca script, fie ca "executabil"), dar trebuie să fie locat într-un anumit director (/cgi-bin/) şi trebuie să-şi formuleze "outputul" prefixându-l cu anumite headere HTTP ('Content-type').

Se prezintă exemple de programe CGI: mimeTeX analizează o expresie matematică primită ca parametru şi returnează imaginea GIF corespunzătoare; programe în C, în perl, în limbaj de asamblare pentru lista de "environment variables".

Subrutină performantă pentru calculul factorialului (oct 2007)

Optimizări (faţă de programul în limbaj de asamblare pentru n!, realizat în "Hello World!") asupra algoritmului, asupra conversiei (baza 10^9) şi asupra folosirii instrucţiunii de împărţire DIV.

Se înlocuieşte înmulţirea cu fiecare factor, prin înmulţire cu produs de factori; în plus, operaţiile sunt modelate acum în baza 2^32 (în loc de modelul iniţial, care era bazat pe reprezentarea în baza 2^16). Conversia la forma zecimală este realizată acum prin intermediul bazei 109 (fiind cea mai mare bază—putere a lui 10—ale cărei cifre - numerele 0..109-1 - "încap" pe 32 biţi), în loc de 10^4, din varianta precedentă.

Instrucţiunea microprocesorului DIV necesită cel puţin 16/24/40 tacţi pe I80486 şi 17/25/41 tacţi pe Pentium, după cum împărţitorul are 8/16/32 biţi; se rescrie programul, înlocuind împărţirea la operand (cu DIV) prin înmulţirea cu inversul operandului (MUL fiind mai rapidă ca DIV).

Fişierul în limbaj de asamblare are 245 rânduri (inclusiv linii albe şi comentarii), dar fişierul executabil rezultat măsoară doar 2.3 kB. Timpii rezultaţi printr-un program C care implică pentru obţinerea factorialului biblioteca GMP (a vedea "Hello world!", secţiunea Programul de factoriale, folosind GMP) sunt totuşi, cam de două ori mai buni... Inserând o secvenţă suplimentară de scriere a unui mesaj şi executând programul pentru 100000!, am putut vedea că în forma binară n! se obţine în 4 - 5 secunde, în timp ce rezultatul în forma zecimală este afişat după încă 25 secunde; deci ar fi necesară încă o optimizare (asupra conversiei la baza 10^9 şi apoi la baza 10).

"Hello World!" (aug-oct 2007)

În 2008 se împlinesc 30 de ani de la apariţia primei cărţi de C; cărţile de limbaje au adoptat stilul "hello, world!". Imităm ideea de a formula în diverse limbaje, soluţionarea unei aceleiaşi probleme—calculul factorialului (recursiv). Vizăm aspecte de elaborare, aspectele algoritmice necesare şi corelaţii fireşti între limbaje.

Câte cifre are numărul n! (logaritmare); aplicaţie on-line (javascript + HTML) bazată pe logaritmi. Aplicaţie on-line pentru compararea numărului de operaţii cifră-cu-cifră necesare calculului n! în baza 10, respectiv în baza 256.

n! în limbajele bc şi PHP; aplicaţie on-line în javascript (iterativ); modelare OOP în javascript folosind baza 106; program Python; program perl folosind modulul Math::BigInt; modelare OOP în perl folosind baza 106; program C folosind biblioteca GMP; modelare OOP în C++ (GCC g++) folosind baza 216 (şi conversie la baza 104); program în limbaj de asamblare GNU as (cu linker-ul GNU ld şi cu GNU make; elemente de programare în limbaj de asamblare sub Linux: transmiterea parametrilor; folosirea instrucţiunilor FPU; folosirea apelurilor de sistem; mmap(), instrucţiunea int 0x80; informaţii asupra fişierului executabil - objdump, readelf).

Adăugarea cuprinsului, folosind XML::Twig (aug 2007)

Se generează TOC cu javascript şi CSS, respectiv transformând cu perl fişierul-sursă iniţial.

Elementele HTML <h1>, <h2>, etc. sunt folosite pentru a marca secţiunile (conţin titlurile); printr-o funcţie javascript se colectează elementele "heading" din cadrul documentului; fiecăruia dintre elementele colectate, i se adaugă un atribut ID (secţiunea va fi referită ulterior prin acest ID); apoi, se creează elemente <a> având ca valoare a atributului href tocmai id-ul fixat anterior şi se inserează link-urile rezultate, drept conţinut al elementului TOC.

Se prezintă elemente de perl şi de Linux; perl prevede trei categorii de variabile: scalari, liste (sau "array") şi hash; distincţia se face prin prefixarea numelui variabilei cu $ (pentru variabile scalare), @ (pentru array) şi % (pentru hash).

Pentru transformarea fişierului sursă este folosit modulul XML::Twig. my $tw = new XML::Twig(); construieşte un obiect de memorie conţinând datele şi "pointeri" la metodele specifice modulului XML::Twig iar variabila $tw reţine o referinţă la obiectul construit; $tw->parsefile($f); va deschide fişierul cu numele indicat de $f şi va analiza conţinutul fişierului pentru a construi în memorie arborele corespunzător iar în final (după crearea subarborelui TOC), se va înscrie în variabila internă $tw->root o referinţă la rădăcina arborelui construit (prin intermediul căreia se scrie apoi fişierul transformat).

Grila coeficienţilor - introducere practică în XML şi XSLT (iul 2007)

Funcţie/Studii/Grad/Tranşa/Coeficient / Salariul de încadrare; XML pentru date, XSLT pentru prezentare.
Plecând de la necesităţile apărute într-o aplicaţie concretă de salarizare, se concepe un DOCTYPE şi se construieşte un document XML; se prezintă apoi elemente de perl pentru extragerea/actualizarea datelor dintr-un document XML, elemente de limbaj XSLT şi un program în XSLT pentru prezentarea documentului (a "Grilei de salarizare").

Cu Centralizatorul Educaţiei Naţionale, de la SQL la XML (iun-aug 2007)

Documente tabelare mari... cu Microsoft-Word? Se încalcă principiul clasic: separă datele de prezentare!. Evidenţiem—dar cam întortochiat!—posibilitatea de a folosi tehnologii moderne: XML (reprezentarea datelor) şi XSLT (prezentare). Cam "întortochiat", fiindcă e vorba de un act oficial fundamental pentru sistemul de învăţământ şi se pune măcar problema consistenţei, dacă nu şi chestiunea mai generală a restricţiilor pe care le poate suporta un sistem (până să fie sufocat) din partea unui aparat birocratic externalizat (în raport cu procesul de învăţământ) şi amplificat continuu.

"Centralizatorul" e un monument de competenţă funcţionărească... Pe diploma lui CTP scrie "Automatizări şi Calculatoare" şi conform Centralizatorului, CTP are dreptul de a concura pe o catedră de Informatică; probabil că nu va reuşi la concurs (CTP n-a practicat de loc în domeniu), dar pentru Minister este "calificat". Însă degeaba vei fi scris 3 cărţi de informatică (nebanale, trebuie precizat...), vreo 15 articole de matematică şi de informatică (nebanale, desigur) şi vei fi realizat vreo câteva aplicaţii informatice (nebanale), ba ai şi predat (... nebanal!) 15 ani informatică din cei vreo 25 de când tot te ocupi de informatică — dacă înscrisul de pe Diplomă nu figurează identic în locul corespunzător din Centralizator, atunci (începând din 2007) Ministerul te consideră... necalificat pentru a preda Informatică!

Dar profesorul de Informatică ajunge să fie "calificat", nu fiindcă aşa scrie pe Diplomă şi pe Centralizator; înveţi ceva informatică şi înveţi să programezi cam în 10 ani iar ca să înveţi pe alţii este necesar să ai tu însuţi o anumită experienţă nebanală (şi continuă!) de realizare a unor aplicaţii mai complexe.

Centralizatorul Educaţiei Naţionale este o operă meschină, generată de "Statutul personalului didactic" şi nu de conţinutul intrinsec al procesului de învăţământ. Datorită prestaţiei funcţionăreşti, sistemul de învăţământ tinde să devină un sistem închis, fără perspective reale de evoluţie; începe să se bazeze pe birocraţie, pe standarde mediocre şi pe "dascăli", nu pe profesori iar scopul ajunge să fie acela de a produce/reproduce funcţionari (de tip point-and-click).

Lecţie de istorie: birocraţia instituită extensiv deasupra unui sistem oarecare, conduce în timp la blocarea sistemului (regula a fost formulată nu de vreun mare istoric, ci de însuşi nenea Iancu: "de-aicea nu mai ieşiiii...").