momente şi schiţe de informatică şi matematică
To attain knowledge, write. To attain wisdom, rewrite.

Linux şi aplicaţii Web în 24 de ore

Bash | DOM | LAMP | Linux | MySQL | PHP | javaScript | virtual host
2011 apr

CCD Vaslui mi-a oferit 24 de ore (în martie-aprilie 2011) de introducere în Linux şi iniţiere în dezvoltarea de aplicaţii Web - pentru profesori de informatică, dar care folosesc curent numai Windows şi nu au experienţă de lucru pe Web.
//web24.docere.ro/ prezintă (cu cizelarea cuvenită) lecţiile desfăşurate. Aici prezentăm unele elemente de substrat - motivaţii, tehnici metodologice - ale acestei încercări pe 24 de ore.

Aspecte implicite

Sunt disponibile 25 de calculatoare conectate la Internet, având configuraţia oficializată în şcoli şi în instituţii: s-a instalat pe fiecare Windows XP, pachetele Microsoft Office, programe antivirus, Deep Freeze şi pe fiecare în parte, s-a creat un user "administrator" şi un user obişnuit; faptul că "sunt legate în reţea" este nesemnificativ (serveşte numai pentru a copia fişiere de pe o "staţie" pe alta).
Din fericire, unităţile CD şi porturile USB sunt funcţionale, iar administratorul reţelei permite şi instalarea altor produse; este pus la dispoziţie un retroproiector (se va dovedi "esenţial").

În unele laboratoare şcolare auzim argumentări restrictive: "aşa s-a primit reţeaua de la Minister şi nu avem voie să modificăm", "la Bac se cere Microsoft Access" nu MySQL, "nu toţi ajung programatori"; s-a mai luat şi măsura de a "scoate" CD-ROM şi USB, "ca să împiedice elevii să bage jocuri şi viruşi".

De aceea, este şi acesta unul dintre "lucrurile esenţiale" care trebuie înţelese: configuraţia evocată mai sus poate servi unui funcţionar obişnuit, dar nu oferă nimic unui programator; nici dacă adaugi ca în laboratoarele de informatică, MinGW şi Visual FoxPro - nu poate rezulta un mediu propice dezvoltării de aplicaţii proprii mai complexe decât s-ar cere la "atestat".

Dar acest prim "lucru esenţial" se cuvine să fie neexplicitat - intrând în Linux şi văzând ce şi cum se poate face, fiecare va putea sesiza singur aspectul menţionat (şi dacă va fi să polemizeze asupra afirmaţiei de mai sus, măcar o va putea face în cunoştinţă de cauză).

Experienţa învăţării în 20 de ore

De snooker am auzit acum vreo 10 ani, când am urmărit pentru prima dată campionatul mondial de la Sheffield. Mi-a luat cam o săptămână (în total - vreo 20 de ore de vizionare TV) să prind regulile jocului şi să înţeleg esenţa jocului.

Am prins treptat regulile, văzând ce fac jucătorii şi în al doilea rând, speculând unele comentarii (de obicei, comentatorii se referă la jucători, la eveniment, la împrejurări şi mai puţin la jocul în sine). "Lucrul esenţial" a fost mai greu de prins: tacul trebuie aplicat bilei albe într-un anumit punct (asigurându-i eventual o anumită mişcare de rotaţie proprie, pe parcursul traiectoriei), astfel încât după contactul cu bila ţintă (eventual, trimiterea acesteia în buzunar), bila albă să ajungă într-o poziţie din care să se poată continua jocul în modul cel mai convenabil pentru jucătorul respectiv (dacă a reuşit să introducă bila roşie în buzunar, să poată apoi opera şi asupra unei bile colorate).

Experienţa aceasta ne este acum foarte utilă, redefinind rolurile: "televizorul" trebuie înlocuit cu retroproiectorul pus la dispoziţie; jocurile vizionate la televizor, devin probabil nişte aplicaţii Web prezentate la retroproiector, în dezvoltarea lor pas cu pas; "comentatorul jocurilor" voi fi eu, cel care va explica dezvoltarea aplicaţiilor respective, evidenţiind "traiectoriile" şi legăturile necesare.

Pentru a deprinde lucrurile esenţiale, probabil că 20 de ore ar fi suficient: în fond, se poate miza pe un background rezonabil - doar că plafonat la Windows, la medii de dezvoltare vizuală (IDE pentru C++, sau VFP) şi la calculatorul propriu (click undeva pe Desktop, ca să deschizi VisualFoxPro…).

Dar să înţelegem natura acestor "lucruri esenţiale": eu pot acum înţelege şi pot justifica ce se petrece pe masa de snooker, dar… n-am ţinut niciodată un tac în mână; tot aşa probabil, lecţiile noastre "în 24 de ore" nu pot fi decât o deschidere - care chiar dacă este una consistentă, nu va putea suplini practica proprie pe domeniul respectiv.

Lucrurile esenţiale

Asupra metodologiei de desfăşurare am decis aşa cum am explicat mai sus; dar este vreo noutate, aceasta? Cam aşa procedează fiecare, când are de prezentat ceva: foloseşte retroproiectorul, derulând paginile şi explicând lucrurile respective.

Noutatea ar fi totuşi faptul sugerat deja, că nu vom "prezenta" aplicaţii gata făcute, ci le vom dezvolta pas cu pas (plecând chiar de la "ce se dă şi ce se cere"); cu alte cuvinte, vom folosi efectiv calculatorul şi nu-l vom reduce la rolul de buton pentru derularea paginilor pe retroproiector.

Rămâne acum să decidem care ar fi acele "lucruri esenţiale" despre Linux şi aplicaţii Web - de explicitat într-o anumită ordine, în 20 de ore.

Instalare, interfaţa grafică şi principiul separării

Cu siguranţă, trebuie să se plece chiar de la instalarea practică a unui sistem Ubuntu Linux, alegând cea mai simplă manieră: se descarcă Wubi (Windows installer, 1.4 Mb) şi se lansează în execuţie (de pe contul de "administrator") în modul obişnuit pe Windows.

Este de subliniat că Windows-ul existent nu "păţeşte" absolut nimic - apropo de interdicţia stupidă evocată mai sus, de a nu instala altceva decât zice-se, permite Ministerul (să ne amintim eventual de o istorioară privitoare la baronul Epstein).

Intrând apoi (presupunem că pentru prima dată) în Ubuntu Linux este necesară familiarizarea cu interfaţa grafică (meniuri, panel-uri), descoperind întâi (ceea ce este uşor) că se poate folosi tehnica "point-and-click", deprinsă cu siguranţă de pe Windows.

Este de subliniat că de data aceasta (spre deosebire de cazul Windows-ului), interfaţa grafică serveşte în mod real şi interesele programatorului.

Pe de o parte, meniurile pun la dispoziţie câteva aplicaţii fundamentale pentru programator: Terminal (Use the command line), Text editor (implicit, gEdit), browserul implicit Firefox şi eventual (se poate instala folosind meniul "Ubuntu Software Center") GNOME Commander.

Pe de altă parte, există un panel (situat în mod implicit, la baza ferestrei) care permite folosirea mai multor "spaţii de lucru" (purtând mouse-ul peste unul dintre acestea, vedem indicaţia edificatoare Click to switch to "Workspace 2").

Putem deriva de aici următoarea recomandare de "bune practici", valabilă pentru dezvoltarea oricărei aplicaţii: "trage" din meniu în panelul de sus cele patru aplicaţii menţionate (astfel, va fi suficient click pe iconul respectiv, în loc de a mai accesa meniul pentru a căuta şi lansa aplicaţia respectivă); deschide aceste aplicaţii respectiv în câte un "workspace".

Astfel, interfaţa grafică din Ubuntu serveşte foarte bine unui principiu esenţial pentru crearea şi dezvoltarea unei aplicaţii: principiul separării. O aplicaţie Web este constituită de regulă din mai multe fişiere, de diverse tipuri: HTML, CSS, javaScript, PHP, MySQL, etc.; pe parcursul dezvoltării este necesară editarea corelativă a fişierelor (intrăm în "workspace" unde avem deschis gEdit), crearea sau investigarea unor tabele ale unei baze de date (intrăm în "workspace" unde avem deschis un Terminal), acces la un "remote server" pentru a uploada fişierele create (necesitând iarăşi, lucrul în Terminal), precum şi testări sau investigări folosind un browser (şi intrăm în "workspace"-ul corespunzător).

Este deci de subliniat că în Ubuntu Linux este cum nu se poate mai firesc să foloseşti atât interfaţa grafică (meniurile şi "point-and-click"), cât şi linia de comandă (în timp ce sub Windows a devenit chiar nefiresc, să foloseşti "cmd.exe").

Comenzi uzuale şi maniera standard de programare

Practicând exclusiv ca utilizator Windows şi lucrând numai în medii IDE (de exemplu MinGw) - dar şi numai pe deasupra - parcă eşti împins să crezi că pentru a lansa un program trebuie să deschizi întâi IDE-ul respectiv, în care să deschizi apoi "programul" şi în final să faci click pe opţiunea de meniu "Run" (sau să apeşi tasta F9) - facil într-adevăr, dar eronat în principiu.

Dar însuşi acest mecanism - click pe iconul de pe Desktop ca să deschizi IDE-ul, File/Open program (eventual editare), apoi tastezi F9 - are un merit important (dar din păcate, ignorat în tăcere), anume tocmai meritul de a evidenţia trei neînţelegeri: ce este un program în diversele împrejurări, ce este un IDE (că nu se reduce la editor de program-sursă, plus tasta F9) şi desigur, ce este un compilator.

Mecanismele simplificate de genul evocat mai sus (de tip point-and-click) au devenit (din nefericire) un fel de "instituţie" a practicii şcolăreşti de programare. Astfel că acum dificultatea cea mai mare este (re)obişnuirea cu posibilitatea şi cu valenţele folosirii naturale a liniei de comandă.

Cum ar trebui tratată această reală dificultate (în contextul lecţiilor mele)? Cel mai simplu dar şi cel mai bine este de a ignora substratul evidenţiat mai sus şi a evita chiar şi cuvântul "dificultate"; pur şi simplu deschizi un Terminal, tastezi pe linia de comandă o comandă dintre cele mai frecvent utilizate, vezi efectul şi explici cum se petrec lucrurile.

Ecoul a ceea ce voi face eu (în rol de "jucător" şi "comentator") se vede pe ecranul retroproiectorului, dar este important ca fiecare să tasteze comenzile respective pe propriul calculator; apar astfel diverse erori individuale, care vor putea fi speculate pentru lămuriri şi sublinieri.

Se poate contura astfel, formatul general de comandă: nume de comandă, opţiuni, opţiuni general întâlnite (-l pentru "list", -a pentru "all", -r pentru "recursiv", etc.), parametrii comenzii (de exemplu, nume de fişiere); desigur, elementele comenzii trebuie separate prin spaţiu.

În principiu, maniera standard de realizare a unui program - indiferent de limbajul implicat - constă în următoarele: se creează un fişier pentru programul-sursă (putem folosi comanda touch); se deschide fişierul respectiv în gEdit (sau într-un alt editor de cod-sursă, după preferinţă), se scrie programul şi se salvează; apoi se intră într-un Terminal şi de pe linia de comandă, se lansează compilatorul sau interpretorul implicat, precizând ca parametru fişierul care conţine programul-sursă.

Trebuie exemplificat în primul rând printr-un program C++ (de exemplu, pentru "cel mai mare divizor comun"), pentru a clarifica faptul că nu este necesară intermedierea vreunui IDE (precum MinGW) nici pentru editare, nici pentru compilare şi nici pentru execuţie.

Apoi, se cuvine dat un exemplu de program folosind interpretorul Bash - eventual, versiunea corespunzătoare pentru "cel mai mare divizor comun"; dar şi mai instructiv ar fi un script Bash folosind de exemplu "comanda" wget - evidenţiind că folosind linia de comandă (şi programe utilitare GNU), putem face "într-un pas" ceea ce ne-ar lua multe operaţii manuale dacă am folosi căi obişnuite (în speţă, ar fi vorba de download-area unui ansamblu de fişiere - folosind operaţii manuale în browser şi respectiv, folosind wget în cadrul unui script adecvat).

Celelalte lucruri esenţiale

Subliniem încă o dată, indiferent în ce limbaje s-ar lucra un program sau o aplicaţie Web - metoda de dezvoltare este aceeaşi: foloseşte un editor de cod-sursă pentru a scrie într-o manieră standard fişierele necesare, foloseşte Terminalul (linia de comandă) pentru a invoca interpretorul sau compilatorul corespunzător, foloseşte browserul (Firefox, sau Chrome) pentru a testa aplicaţia Web pe parcursul dezvoltării ei, sau pentru a te documenta, foloseşte linia de comandă şi diversele utilitare GNU pentru a defini host-uri virtuale, a uploada fişiere pe un server, etc.

Ceea ce am dezvăluit mai sus constituie suportul primeia dintre lecţiile propuse (estimată la 4 ore), dar bineînţeles şi contextul principial pentru desfăşurarea celorlalte câteva lecţii.

Celelalte "lucruri esenţiale" pot fi deduse din "sitemap"-ul anexat alături şi desigur, se poate accesa direct //sites.google.com/site/ccd24h.
Notă (septembrie 2011) Am eliminat totuşi site-ul menţionat, reluând lecţiile respective pe //web24.docere.ro.

Instrumentele oferite de Google - folosite pentru crearea site-ului menţionat - te obligă să regândeşti valenţele tehnicii "point-and-click" (la care adesea, m-am referit negativ); iată că oricine (indiferent de pregătire) poate să producă foarte uşor un site şi să-l întreţină, concentrându-se numai pe conţinut.

Desigur, dacă vrei mai mult atunci - tocmai datorită faptului că aceste instrumente sunt concepute pentru oricine - eşti obligat să cauţi şi să încerci tehnici sofisticate, în locul celor normale.

De exemplu, s-ar pune problema de a permite utilizatorilor să insereze comentarii sau întrebări; dacă nu ai o idee de rezolvare mai bună, atunci ai de ales între idei pe care le-am putea califica drept "disperate" (vezi google.com/support/forum).

vezi Cărţile mele (de programare)

docerpro | Prev | Next