26 decembrie 2012

Soft educational: OrarApp

Aplicatia particularizeaza orarul general pentru o scoala, generand orare pentru fiecare clasa si fiecare profesor.

Pasii de folosire:

1. Se scrie orarul scolii intr-un fisier Excel, in 5 spreadsheet-uri corespunzatoare fiecarei zile a saptamanii.
Este important sa se respecte formatul , pentru aceasta se poate descarca si completa un sablon pe care il gasiti mai jos [1].
* in fiecare celula, formatul trebuie sa fie exact: MATERIE - NumeProfesor. Daca la o anumita ora, o clasa poate avea 2 sau mai multe materii (care se fac prin rotatie din 2 in 2 saptamani de exemplu), se pune o bara / care indica cealalta optiune, in acelasi format. Exemplu:
DESEN - Popescu / MUZICA - Ionescu
* in partea stanga (coloana A) se afla lista tuturor claselor, care se poate modifica dupa plac - se pot adauga sau sterge numele claselor, incepand de la A3 in jos;
* deasupra, pe linia 2, se afla intervalele de timp in care se desfasoara orele, acestea de asemenea pot fi schimbate, cu conditia sa existe aceeasi lista de ore, in aceeasi ordine, in fiecare din cele 5 spreadsheet-uri;
* numele spreadsheet-urilor (luni, marti, ...) nu se pot modifica - daca nu exista orar pentru o zi, nu se va sterge spreadsheet-ul ci se va lasa gol.


2. Se deschide Orare.jar , si se selecteaza Excel-ul in care se afla orarul realizat conform specificatiilor de mai sus.


3. Va aparea un formular cu listele gasite, de clase si profesori. Apasand "genereaza" in dreptul unei clase sau profesor selectat are ca efect crearea unui nou Excel cu numele acestuia si cu orarul aferent . "Genereaza tot" salveaza orarele particulare ale tuturor claselor si tuturor profesorilor.




4. Si acum orarele sunt gata de printat si impartit claselor / profesorilor .

Important!
- aveti nevoie de un JDK (java development kit) pentru a putea executa programul - se instaleaza, in functie de sistemul de operare, de aici [2]
- aplicatia se deschide cu "Java platform SE binary" (click pe fisierul jar -> Properties -> Opens with.. -> Java platform SE binary)

Descarcare aplicatie:  link

[1] https://www.dropbox.com/s/u8rm1lx6p9d64bt/Orare-Template.xls
[2] http://www.oracle.com/technetwork/java/javase/downloads/java-se-jdk-7-download-432154.html

Pentru sugestii & intrebari, nu ezitati sa lasati un comentariu sau email la adresa afisata in chenarul din partea dreapta a blogului!

03 decembrie 2012

Graduate studies in the USA

De ce in USA?
Sunt mai multe motive pentru care studiul in SUA este preferat. Lasand la o parte distanta, costul zborului dar si necesitatea vizei, studiile de absolvent (graduate studies) dispun de mult mai multa finantare decat cele din Europa, in sensul ca se pot obtine destul de multe burse - plata taxei anuale si un job de asistent în departament.
Un al doilea motiv este ca SUA reprezinta tara cu cei mai multi studenti internationali, asadar daca vrei o Experienta cu adevarat internationala, in SUA gasesti oameni de toate natiile. Viata de student este foarte diferita (cel putin in raport cu viata la Poli!) - studentii au parte de foarte multe facilitati, activitati, petreceri - de exemplu acces la gym, tot felul de festivaluri, zile culturale, etc...
In al treilea rand, admiterea la facultati in SUA poate fi mult mai accesibila decat in Europa. Daca in Europa legea nescrisa este ca trebuie sa ai o medie de cel putin 8,50 in anii de licenta ca sa poti sa aplici, evaluarea la o facultate in SUA tine cont de mult mai multe aspecte decat aceasta medie, asa cum urmeaza sa aflati in continuare.
Si nu in ultimul rand, e America... si America e o alta civilizatie. In Europa toata lumea ajunge mai devreme sau mai tarziu, este foarte usor, insa cu siguranta America nu este chiar atat de accesibila si in opinia mea nici nu este pentru oricine.


"General requirements"
Cele mai multe admiteri la un master in SUA se fac pe baza de dosar, care in general trebuie sa cuprinda:
- (evident) copie a diplomei de licenta (sau mai bine zis traducere in lb engleza, legalizata a diplomei)
- copie legalizata dupa foaia matricola (daca nu este in engleza, va trebui sa fie tradusa)
- rezultatele oficiale la 2 examene foarte importante care conteaza pentru bursa: GRE & TOEFL
GRE contine 3 parti principale: Verbal , Quantitative si Essays . Daca profilul care te intereseaza este real (inginerie, stiinte, etc) atunci Quantitative este cel mai important, altfel va trebui sa insisti cel mai mult pe Verbal si Essays. Sectiunea de Verbal este destul de dificila (peste Toefl sau alte examene), de obicei va trebui sa inveti foarte multe cuvinte noi si sa exersezi reading comprehension pe texte stiintifice, sa faci analogii, deductii si inferente pe text. Sectiunea Quantitative reprezinta exercitii de matematica de nivel pana in clasa a 10-a, dar care trebuiesc tratate serios pentru ca timpul avut la dispozitie este destul de putin. In fine, scopul GRE-ului este testarea in conditii de stress (datorita faptului ca timpul este limitat) si este important pentru evaluator pentru ca il ajuta sa compare 2 studenti care vin din medii diferite prin prisma unui test unic standardizat.
TOEFL in varianta iBT (internet based) contine 4 sectiuni: Reading, Listening, Speaking, Writing. Este un test care dureaza nu mai putin de 4 ore jumate si catalogat de multi ca fiind usor (cel putin in comparatie cu GRE verbal). De aceea TOEFL se va da dupa GRE. Totusi, si TOEFL trebuie tratat cu seriozitate pentru ca este unul din criteriile pentru obtinerea bursei si a unui post de asistent. Daca nu ai luat un scor bun la GRE Verbal, TOEFL este revansa ta.
- SOP (statement of purpose) -un document foarte important, foarte personal - scrisoarea de intentie. Aici spui despre tine - ce ai realizat pana acum, ce planuri ai, de ce vrei sa studiezi ce ti-ai ales, ce implicatii de viitor va avea masterul - intr-un cuvant toata motivatia ta pentru a fi admis la acea facultate. Despre asta voi detalia putin mai jos.
- scrisorile de recomandare - in general in numar de 3, de la persoane din mediul academic (dar e ok si daca e vorba de un angajator). In ultima vreme au aparut formularele online, in care doar introduci adresa de email a profesorului, iar acesta il primeste pe adresa lui si il poate completa acasa - chestia asta te scapa de multe dureri de cap.
- CV-ul (resume) - cu accentul pe diplome, certificari, experienta profesionala detaliata, concursuri, etc . Si activitatile de voluntariat sunt binevenite.
- (optional) adeverinta medicala - unele facultati o cer, altele doar dupa admitere
- (optional) Bank statement/Affidavit of support - prin aceasta demonstrezi ca in cazul in care ai fi admis, te poti intretine cel putin un an, adica dispui de o anumita suma (care depinde de la facultate la alta) pentru acest scop. De obicei este o adeverinta care spune ca ai in cont acesti bani. Affidavit of support este o adeverinta din partea cuiva (ex. parinte) ca te poate sponsoriza in primul an de master. Daca nu ai banii...si nici sponsor... poti aplica fara aceste documente, daca specifici ca ai nevoie de sponsorizare (funding) in cazul in care esti admis.
- (optional) alte formulare specificate de fiecare facultate in parte, dintre care cel mai important este cererea pt bursa


Lucruri care conteaza
La facultatile din SUA, evaluarea este holistica - media din anii de licenta nu este singurul lucru care conteaza. Ceea ce inseamna ca este acceptabil daca ai o medie mai mica (GPA), dar o poti compensa prin rezultate bune la testele standardizate, un CV impresionant, sau un SOP convingator. Multe facultati precizeaza ca GPA-ul minim acceptat este 3, 2.75 sau chiar mai putin (medii de 7.50, 6.87 sau mai putin). In plus, conteaza foarte mult trendul notelor tale - daca media a crescut sau a scazut in cei 4 ani de licenta si cum - , de asemenea se ia in considerare si media ultimului an.
In ceea ce priveste GRE, conteaza scorul total, urmat de scorul partii celei mai importante care intereseaza (ex. Quantitative), cat si ranking-ul tau (~percentile) care spune ce procent din ceilalti care au dat testul are un scor mai mic decat tine.

Si acum despre Statement Of Purpose, un al treilea element foarte important. In SOP trebuie sa scrii cele mai bune lucruri posibile despre tine. Citind foarte multe modele ale unor studenti care au fost admisi cu succes, am ajuns la urmatoarele puncte care cred ca nu ar trebui sa lipseasca dintr-un SOP:

- poti spune povestea pasiunii tale pentru domeniul in care planuiesti sa-ti continui studiile - cum a inceput totul, primele sentimente de satisfactie pe care le-ai avut, de ce ai ales acest domeniu, ce dilema a vietii tale crezi ca va putea fi rezolvata prin cercetare in domeniul respectiv (ex. consider ca filozofia ma va ajuta sa aflu sensul vietii), etc.

- poti scrie cate ceva despre mediul in care vii - Romania. Gandeste-te ca in America nu sunt chiar atat de multi romani precum alte natii (ex. indieni), in unele state romanii pot fi chiar in numar foarte mic, relativ necunoscuti. In consecinta poti adauga o fraza despre tara ta, sistemul de educatie de aici, in particular daca ai absolvit o facultate de top trebuie sa specifici acest lucru. Daca planuiesti sa te intorci in Romania dupa studii, este frumos sa mentionezi cum visezi sa iti schimbi tara (in bine) prin cunostintele si experienta acumulata in SUA.

- toate performantele pe care le-ai avut relative la domeniul ales: media (GPA), faptul ca te-ai aflat in top X studenti la un moment dat, concursuri in care ai castigat premii. Poti mentiona daca ai participat la cursuri din afara facultatii dar care au legatura cu domeniul ales (de exemplu acum au inceput sa apara foarte multe cursuri online gratuite, da bine daca vorbesti despre unul de acest gen, arata interesul). Poti mentiona performante la locul de munca (daca exista), participari la workshop-uri, scoli de vara, etc, evident in contextul potrivit. Daca nu ai participat la o scoala de vara, workshop sau training pana acum, ai putea sa te gandesti sa o faci.

- contra-performante: daca e ceva care te deranjeaza din foaia ta matricola (ex. media dintr-un an sub asteptari) este foarte bine daca ai putea justifica de ce s-a intamplat acest lucru si mai ales sa subliniezi felul in care ai evoluat si ai depasit acea situatie.

- mentionarea a catorva cursuri de interes din facultate & carti de specialitate citite care au sporit curiozitatea si cunoasterea in domeniul ales. Daca nu ai rasfoit nicio carte de specialitate, ai putea sa incepi sa o faci, arata dorinta de aprofundare, de asemenea poti consulta si lucrari ale profesorilor din departamentul vizat, despre care iti poti exprima pareri in discutiile pe mail cu acestia.

- pentru obtinerea unui teacher assistantship trebuie sa mentionezi orice fel de experienta de predare pe care ai avut-o: fie ca ai fost asistent la facultate, sau doar ca ai absolvit cursul de pedagogie (si in consecinta trebuie sa ai o minima de experienta practica), sau chiar faptul ca ai dat meditatii la materia X vecinului din bloc. Daca esti inca in facultate si te gandesti sa sari peste cursul de pedagogie, eu zic sa te mai gandesti o data...

- pentru obtinerea unui research assistantship trebuie sa scrii despre proiectele de cercetare la care ai participat. Lucrarea de licenta poate reprezenta un subiect bun, dar si orice fel de paper/lucrare publicata. Daca esti inca in facultate si te nu gandesti sa participi la sesiunea de comunicari stiintifice, eu cred ca ar trebui sa te gandesti serios sa participi pentru ca acest lucru ar putea conta foarte mult.

- discutia despre orice fel de proiect personal este binevenita mai ales daca este in legatura cu domeniul pt care aplici (ex. am un blog cu tutoriale despre programare sau am realizat situri pentru companii, sau mi-am construit propriul robot acasa, etc). Daca nu ai asa ceva, poate ar fi bine sa ai ceva, cat de mic.

- bineinteles, trebuie sa precizezi ce anume te atrage la facultatea la care ai aplicat - cu alte cuvinte, de ce crezi ca esti persoana potrivita la locul potrivit. Ce asteptari ai de la facultate si cum crezi ca vor fi indeplinite.

- trebuie sa explici cum se potriveste planul educational ales (master) cu planul vietii tale. Ce vei face dupa ce termini masterul si in ce masura acesta te propulseaza mai departe. Ai de gand sa continui cu un PhD si apoi cu predare/cercetare sau vrei sa intri in industrie/sa te angajezi?

- poti scrie despre activitati extracurriculare - sunt apreciate cele care implica oameni sau activitati de mediu (gen voluntariate, ONG) si cele care te-au ajutat sa dobandesti anumite competente (ex. competente organizatorice, sociale/interpersonale, lucru in echipa). Poti scrie mai mult sau mai putin despre astea in functie de programul ales - de exemplu lucrul in echipa este apreciat aproape oriunde, iar activitatile de mediu pot fi apreciate mai mult intr-un program de Ingineria Mediului, dar depinde. Poti mentiona daca ai participat la schimburi de experienta si ce ai invatat din ele (important!!!). Daca te gandesti sa intri in AIESEC, BEST sau alta organizatie si inca eziti, incearca sa gandesti cu mintea unui absolvent care regreta ca nu a facut acest lucru cat timp era student.

- daca ai purtat o discutie in prealabil pe mail cu unul dintre profesorii departamentului vizat, nu uita sa amintesti acest lucru in SOP, si mai ales daca ai primit incurajari de la acesti profesori. De asemenea trebuie sa reamintesti subtil faptul ca ai nevoie de suport financiar pentru a putea incepe studiile (spre sfarsit).

Toate aceste informatii trebuie sa fie bine inchegate intr-un eseu perfect dpdv logic, gramatical si al vocabularului. Un alt lucru pe care l-am observat a fost abundenta de cuvinte GRE din SOP, ceea ce creeaza o imagine foarte buna pentru candidat. La finalul redactarii, poti folosi serviciul gratuit de la FEAC prin care primesti feedback in legatura cu SOP-ul tau.

In concluzie, in procesul de selectie conteaza mult mai multe lucruri decat o simpla medie din anii de licenta, conteaza intreaga implicare, creativitatea, si cel mai important vointa.

In timpul admiterii
Pentru fiecare facultate aleasa, trebuie sa tii cont de termenul limita al trimiterii aplicatiei - de obicei exista un termen limita pt. admitere cu bursa, cum ar fi ianuarie/februarie pentru semestrul de toamna, sau chiar luna mai pentru admiterea fara bursa.
In timpul admiterii trebuie sa tii legatura cu secretarele de la Graduate School, care te vor informa cu privire la starea procesarii aplicatiei - mai intai este etapa de autentificare si inregistrare a datelor, dupa care, daca totul este ok, aplicatia este trimisa mai departe la departamentul specializat, care va decide in legatura cu admiterea.
Este ideal daca ai afla cand se petrece acest lucru si ai atrage atentia profesorilor vizati asupra aplicatiei tale, spunand ca vrei sa lucrezi cu ei si amintind cateva lucruri despre tine. Este posibil ca ei sa-ti ofere un raspuns prompt de incurajare, sau un raspuns de interes partial, sau niciun raspuns.
In caz favorabil, departamentul trimite o recomandare catre Graduate School si in cateva saptamani vei primi o scrisoare de acceptare, eventual insotita de o oferta de asistent (daca ai aplicat pentru asa ceva si ti s-a dat).

Te decizi sa te inrolezi
In acest caz, trebuie sa finalizezi trimiterea tuturor documentelor necesare facultatii care te-a primit (daca nu le-ai trimis deja):
- formularul medical. Acest formular este mai mult preocupat de vaccinurile pe care le-ai facut de-a lungul vietii si daca ai avut o boala periculoasa in trecut (ex. TBC). Se cer anumite vaccinuri, unele vor fi deja facute, altele nu. Ei vor ca toate sa fie facute pana la urma, ai optiunea sa le faci in Romania sau acolo (exemption).
- formularul financiar (acel affidavit of support/bank statement) - un formular in care listezi toate sursele de finantare pentru studii, fie ca sunt proprii, oferite de familie sau de catre departament. Toate sumele listate vor trebui sustinute prin dovezi - de la banca, document oficial din partea facultatii, etc.
- copie dupa pasaport
Este posibil sa se vrea trimiterea acestor documente prin posta.
Odata primite, Graduate School va putea elibera formularul I-20, cel mai important document pentru obtinerea vizei pentru student, F1. Dar despre viza am continuat aici.

06 noiembrie 2012

Sql Server: limit query


SELECT * FROM (
  SELECT *, ROW_NUMBER() OVER (ORDER BY CompanyId) as row FROM Company
 ) a WHERE a.row > M and a.row <= N

-> intai ia primele (N-M) rezultate, dupa care le sorteaza dupa CompanyId

26 septembrie 2012

SQL Server: stergerea randurilor duplicate

ex:
SELECT companyName, contactName, address, country, postings, counting=count(*)
FROM TestTable
GROUP BY companyName, contactName, address,country, postings
HAVING count(*) > 0

- selectul are loc pe toate coloanele lui TestTable
- se obtin randurile unice, alaturi de nr. de aparitii pt fiecare

SELECT companyName, contactName, address, country, postings, counting=count(*)
INTO NewTable
FROM TestTable
GROUP BY companyName, contactName, address,country, postings
HAVING count(*) > 0

- se creeaza un nou tabel cu aceste randuri unice

DROP TABLE TestTable;

SELECT companyName, contactName, address, country, postings
INTO TestTable
FROM NewTable

DROP TABLE NewTable;

Si acum in TestTable se afla doar randurile unice.

22 august 2012

Exemplu simplu SOLR


<add>
<doc>
<field name="cat">book</field>
<field name="id">book-0</field>
<field name="name">The Legend of Po part 0</field>
</doc>

<doc>
<field name="cat">magazine</field>
<field name="id">book-1</field>
<field name="name">The Legend of Po part 1</field>
</doc>

<!-- .... -->

</add>

Fiecare field trebuie declarat in schema.xml ,  cu parametrii indexed si stored setati.
Proiectul cu toate jar-urile atasate:

Se acceseaza si la:

24 iulie 2012

The database is already in use by another process


Check why a port is blocked on windows

  1. Run command : "netstat -ano" and extract the pid of the process
  2. Task manager => Processes =>View => Select column : PID
  3. Order by pid and find the process 

19 iulie 2012

Analiza de chat :)

Aplicația este împărțită în 3 mari funcționalități:
·         Clasificarea participanților în funcție de implicare, cunoștințe, inovații sau per total;
·         Analiza inter-chat care pune în evidență aspecte comparative legate de vocabularele a 2 sau mai multe chat-uri;
·         Statistici în legătură cu diferențele între sexe, așa cum se observă din discuții;
Discuțiile analizate sunt reprezentate în fișiere xml și au mai mulți participanți cu sarcina de a dezbate avantajele și dezavantajele principalelor tehnologii colaborative (blog, chat, wiki, forum).




Exemplu de proiect in Struts

Afiseaza contactele dintr-o agenda (nume, telefon), permite adaugarea unui contact nou, dar si editarea si stergerea lui.

Informatiile sunt preluate dintr-o baza de date (in cazul de fata din SQL Server, tabelul contacts). 

Proiectul se gaseste aici (cu Struts2, J2EE 5.0)

18 iunie 2012

Quantum Mechanics and Quantum Computation | Coursera

Quantum Mechanics and Quantum Computation | Coursera: "This is an introduction to quantum computation, a cutting edge field that tries to exploit the exponential power of computers based on quantum mechanics. The course does not assume any prior background in quantum mechanics, and can be viewed as a very simple and conceptual introduction to that field."  - CURS

About the Course

Quantum computation is a remarkable subject, and is based on one of the great computational discoveries that computers based on quantum mechanics are exponentially powerful. This course aims to make this cutting-edge material broadly accessible to undergraduate students, including computer science majors who do not have any prior exposure to quantum mechanics. The course will introduce qubits (or quantum bits) and quantum gates, the basic building blocks of quantum computers. It will cover the fundamentals of quantum algorithms, including the quantum fourier transform, period finding, and Shor's iconic quantum algorithm for factoring integers efficiently. The course will also explore the prospects for quantum algorithms for NP-complete problems, quantum cryptography and basic quantum error-correcting codes.
The course will not assume any prior background in quantum mechanics. Instead, it will use the language of qubits and quantum gates to introduce the basic axioms of quantum mechanics. This treatment of quantum mechanics has the advantage of both being conceptually simple and of highlighting the paradoxes at the heart of quantum mechanics. The most important pre-requisite for the course is a good understanding of basic linear algebra, including orthogonal bases, eigenvectors and eigenvalues.

Course Format

The course will last 8 weeks with two lectures in each week, totaling 16 lectures. There will be a weekly assignment which will either be computer-graded or peer-graded. There will be no exam.

'via Blog this'

30 mai 2012

Secure cookies

import hmac

# hashing with HMAC
CHEIE = "secret"

def hash_str_hmac (s):
    return hmac.new(CHEIE, s).hexdigest()

def make_secure_val(s):
    return "%s|%s" % (s, hash_str_hmac(s))

def check_secure_val(h):
    val = h.split('|')[0]
    if h == make_secure_val(val):
        return val

Mecanism:
* vrem sa setam un cookie de tipul: camp=valoare
Daca setam cookie-ul in acest format, el va fi usor de modificat din browser-ul clientului.
Altfel, putem sa ii atasam un hash, noua valoare devenind: valoare|hash(valoare)
* ca algoritm de hashing, putem folosi md5 sau chiar mai sigur, hmac - acesta implica si contributia unei chei secrete cunoscute doar de noi ("secret")
* noul cookie este transmis serverului, exemplu de format:  user_id=3|890b62425d300574b7bcdf60a5bc6059
3 este valoarea care ne intereseaza, pe cand sirul ce ii urmeaza este criptarea cu cheia secreta CHEIE a numarului 3. ~ make_secure_val()
* pe server, din cookie este extrasa valoarea 3, si hash-ul lui 3 este comparat cu hash-ul primit in cookie. Daca valorile nu coincid, valoarea extrasa este considerata invalida. ~ check_secure_val()

In acest fel, serverul este sigur ca cookie-urile nu au fost modificate fortat de client.

* Setare cookie (in webapp2):
self.response.headers.add_header('Set-Cookie', 'user_id=%s' % mycookie + ';Path=/')
* Stergere cookie - cookie-ul nu se chiar sterge, ci valoarea campului respectiv devine vida
self.response.headers.add_header('Set-Cookie', 'user_id=; Path=/')
" Path=/ " este optionala, dar este important ca de fiecare data cand se doreste suprascrierea, cookie-ul sa fie referit de pe aceeasi cale (path). Nu pot exista 2 cookies care sa contina informatii despre acelasi camp ("user_id"), decat daca sunt salvate in locatii/cai diferite.

11 mai 2012

Scoli de vara 2012

1) Scoala de vara IP Workshop
Durata: 2 saptamani, 30 iulie-12 august 2012
Locatie: Calimanesti, jud. Valcea
Cursuri disponibile:
  • Administrarea sistemului Linux
  • Dezvoltarea aplicațiilor de rețea
  • Grafică pe calculator
  • Introducere Android
  • Programare iOS
  • Programare pentru Blackberry Playbook
  • Programare Python
Cost: studenti - 650 RON (600 inainte de 1 iunie) & profesori 400 RON (350 inainte de 1 iunie). Costul include cazarea, 3 mese pe zi, materialele pentru curs si excursiile
Contact: http://calimanesti.ipworkshop.ro/2012/?page_id=27
Mai multe detalii: e-mail la alex@ipworkshop.ro, informatii despre editia de anul trecut


2) Scoala de vara de programare functionala
Durata: 5 zile, 18-22 iunie
Locatie: UPB, Bucuresti
Curs: programare in Scheme, Haskell, Erlang , paradigme de programare
Cost: -
Contact, detalii: pe situl lor


3) Scoala de vara NCIT
Durata: 3 saptamani, 4 iunie-22 iunie
Locatie: UPB, Bucuresti
Curs: stagii in domeniul HPC (simulari in seismologie, meteorologie, dinamica moleculara, astrofizica, procesare de imagini satelitare)
Cost: -
Inscriere si detalii: Stagii pe bune


4) Open source summer school

Durata: 3 saptamani, 4 iunie-22 iunie
Locatie: UPB, Bucuresti
Curs: managementul proiectelor software open source, sisteme pt controlul versiunii, Python, interfete grafice, POO, design patterns, testare unitara, dezvoltare Android.
Cost: -
Inscriere si detalii: open-source.cs.pub.ro

Google Application Engine si GQL

Google Application Engine este o platforma pentru deployment-ul unor aplicatii web scrise in mai multe limbaje de programare (gen JSP, Python, Ruby). Este usor de instalat, de rulat, e gratuit in limita a 1GB de date, ofera acces la un Datastore, iar pentru Python ofera un framework numit webapp care usureaza construirea aplicatiilor. (descrierea nu se opreste aici)

GQL - este un limbaj asemanator SQL folosit in GAE care insa suporta un singur tip de query : "select [parametri]" - acesta returneaza o liste de obiecte de tipul tabelului considerat. GQL nu este o baza de date relationala, adica nu suporta JOIN-uri, interogarea a mai mult de un tabel/query, iar in campul where din select se poate pune o singura coloana (din motive de rapiditate). In schimb, coloanele nu sunt fixate: pot exista oricate si chiar pot fi schimbate de-a lungul programului.

De exemplu: pentru definirea unui tabel in Datastore mai intai se construieste o clasa al carei nume va fi numele tabelului, cu variabile reprezentand campurile acestuia si tipurile lor.
from google.appengine.ext import db
class User (db.Model):
    username = db.StringProperty (required = True)
    password = db.StringProperty (required = True)
    email = db.StringProperty (required = False)
Crearea clasei User este echivalenta cu crearea tabelului in baza de date (acest lucru este specificat de db.Model care reprezinta clasa mostenita).
Oriunde in program, se poate crea acum un obiect de tip User pe care sa il inseram in baza de date:
u = User(username = "boom", password = "ble", email = "bee@gmail.com")
u.put()
Tabelul User, la fel ca orice tabel din GQL, contine un camp suplimentar numit id ca o cheie primara, generat automat. Daca vrem sa aflam id-ul inregistrarii ce tocmai am inserat-o, se foloseste:
id = u.key().id()
Consultarea tabelului User se poate realiza foarte simplu:
entries=db.GqlQuery("select * from User")
for entry in entries:
    self.response.out.write(entry.username + " " + entry.email)
"entries" furnizat este o lista de obiecte de tip User, si campurile fiecarui User se acceseaza cu "."
Pentru stergerea unei inregistrari se poate folosi:
db.delete(entry)
, unde entry este un element din entries (lista returnata de select).

13 aprilie 2012

Exemplu simplu AJAX + php (metoda GET)

  AJAX (Asynchronous JavaScript and XML) se ocupa cu schimbul unei cantitati mici de informatii cu serverul al unei pagini web, in fundal, fara sa fie nevoie de reincarcarea intregii pagini pentru a obtine informatiile necesare.

  Un exemplu simplu: utilizatorul introduce o parola intr-un textbox si primeste instant un feedback privind puterea parolei sale. Am considerat ca o parola slaba inseamna mai putin de 5 caractere, una medie cu mai mai mult de 5 caractere, fara numere, si una puternica o parola ce contine peste 5 caractere din care cel putin unul este o cifra (evident in realitate nu este asa).





---------------------------- index.html --------------------------------------------

<html>
<head>
<script type="text/javascript">
function getStrength(input) {
var request;
var str;
if (input.length<5) { 
  document.getElementById("strength").innerHTML= 'slaba';
  return;
  }
// code for IE7+, Firefox, Chrome, Opera, Safari
  request = new XMLHttpRequest();
request.onreadystatechange=function() {
  if (request.readyState==4 && request.status==200)
        document.getElementById("strength").innerHTML=request.responseText;
  }
request.open("GET","script.php?data="+input,true); // async
request.send();
}
</script>
</head>
<body>

<form action="">
Parola: <input type="text" id="txt1" onKeyUp="getStrength(this.value)" />
</form>
<p>Putere: <font color="#009900"><span id="strength"></span></font></p>

</body>
</html>

---------------------------- script.php --------------------------------------------


<?php

if (isset($_GET['data'])) {
$pass =  $_GET['data'];
$response = 'medie';
if (preg_match('#[0-9]#',$pass)) {
$response = 'puternica';
}
echo $response;
}

?>

----------------------------------------------------------------------------------------

Dacă am fi folosit metoda POST în loc de GET, atunci ar fi fost obligatoriu trimiterea a cel puțin 2 antete: Content-Type și Content-length - folosind metoda setRequestHeader pe obiectul request, iar în send să fie trimis ca parametru obiectul de date (format JSON, xml, etc). 

07 aprilie 2012

Functii in javascript

<script type="text/javascript">
// crearea unui obiect myObject: contine o variabila value si o functie increment
var myObject = {
value: 0,
increment: function (inc) {
this.value += typeof inc === 'number' ? inc : 1;
}
};

myObject.increment();
console.log(myObject.value);    // 1

myObject.increment(2);
console.log(myObject.value);    // 3

 // adaugarea unei noi functii obiectului nostru numita double
myObject.double = function () {
    // functia nu e buna
var wrongHelper = function () {
this.value = this.value + this.value;
};
 
wrongHelper();

  // functia este buna
var rightHelper = function () {
myObject.value = myObject.value + myObject.value;
};
 
rightHelper();
};

// Invoke double as a method.
myObject.double();
console.log(myObject.value);    // 3
</script>


Prima metodă din double (wrongHelper) este greșită deoarece this.value nu este definit. Mai precis this nu referă obiectul curent reprezentat de myObject, ci se află într-o funcție care la rândul ei este într-o funcție și contextul este reprezentat de acea funcție care o conține. Pentru a rezolva acest lucru, în rightHelper am înlocuit this cu myObject.

05 aprilie 2012

Backtracking si partitionarea unui numar in Python


nsol = 0.
nz = 0.
nr = []
N = 0.

def construct(nr_partitii, numar):
    global N, nr
    N = numar
    for i in range(nr_partitii):
        nr.append(0)

def is_zero():
    for i in range (len(nr)):
        if nr[i] == 0:
            return True
    return False

def init (k):
    nr[k] = -1

def succesor (k):
    if nr[k] < N:
        nr[k] += 1
        return True
    nr[k] -= 1
    return False

def valid (k):
    suma = 0.
    for i in range (k):
        suma += nr[i]
    if suma+nr[k] <= N:
        return True
    return False

def solutie (k):
    return k == len(nr)-1 and sum(nr)==N

def bt (k):
    init(k)
    global nsol, nz
    while succesor(k):
        if valid(k):
            if solutie(k):
                #print nr
                nsol += 1
                if is_zero():
                    #print nr
                    nz += 1
            elif k<len(nr)-1:
                bt(k+1)

print "Partitionarea unui numar"

construct(4,12)
bt(0)

print "Solutii: ",nsol
print nsol-nz,"combinatii de termeni nenuli"

Probabilistic Robotics

"Probabilistic Robotics" - Sebastian Thrun, Dieter Fox, Wolfram Burgard
Acest ebook este suport de curs pt multe cursuri de robotica, si recomandata ca further reading pentru Udacity cs373.
P.S. acesta este un draft din anul 2000. Cartea finală a apărut în 2005 dar nu se găsește la liber pe internet. Ea conține în mare aceleași capitole cu unele modificări și adăugiri (cum ar fi Graph SLAM).

27 martie 2012

Form Spoofing in HTML

  Form spoofing este o metoda prin care un script poate primi o cerere falsificata, trimisa printr-un formular strain, din afara aplicatiei noastre, cu elemente diferite fata de cele presupuse initial, dar care au aceeasi denumire.

  De exemplu: presupunand ca intr-un formular avem un select, care la randul lui are cateva optiuni predefinite - daca se afla numele acestui select atunci cineva poate simula acest formular punand in el un input text cu acelasi nume ca si select-ul si cu orice valoare. Rezultatul este inconsistenta datelor.

  Solutie: atasarea la formular a unui input type hidden cu o valoare generata dinamic iar aceasta valoare sa fie, in plus, inclusa si in array-ul global $_SESSION , ca variabila ce tine de sesiunea curenta.

-----------------------  index.php


<?php
session_start();
$_SESSION['secret'] = md5(uniqid(mt_rand(), true));

// formularul corect
echo '    <form action="destinatie.php" method="POST">
    <select name="color">
        <option value="red">red</option>
        <option value="green">green</option>
        <option value="blue">blue</option>
    </select>
<input type="hidden" name="secret" value="'. $_SESSION['secret'] .'"/>
    <input type="submit" />
    </form> <p/><p/>';

// formularul falsificat
echo '<form action="destinatie.php" method="POST">
    <input type="text" name="color" />
    <input type="submit" />
<input type="hidden" name="secret" value="100"/>
      </form>';
?>

-------------------- destinatie.php


<?php
session_start();

if (isset($_POST['secret']) == false || $_POST['secret']!=$_SESSION['secret']) {
echo "form spoofing";
return ;
}

?>

  La destinatie se verifica daca in formular exista un element cu denumirea 'secret'. Acesta trebuie, in plus sa aiba aceeasi valoare cu $_SESSION['secret'], ceea ce inseamna ca sesiunea din care vine formularul este aceeasi cu cea a utilizatorului curent care a ajuns la destinatie. Pentru a evita orice fel de coincidenta, valoarea "secreta" care verifica egalitatea este un md5 al unui identificator unic bazat pe timpul curent in microsecunde, si prefixat cu  un numar random....

Porti elementare si implementarea lor in Icarus Verilog

1. Inversorul CMOS

module inversor(intrare, iesire);

    input intrare;
    output iesire;

    supply1 vdd;
    supply0 gnd;

    pmos p1(iesire, vdd, intrare);
    nmos n1(iesire, gnd, intrare);

endmodule

module test_inv;

    reg in1;
    wire out1;

    inversor inst1(in1, out1);

    initial begin
        in1 = 1'b0;
        #5   in1 = 1'b1;
        #10  in1  = 1'b0;
    end

    initial $monitor ($time, " out1=%b in1=%b",  out1, in1);

endmodule




2. CMOS AND gate

module and_cmos (in1, in2, out);

    input in1;
    input in2;
    output out;

    supply1 vdd;
    supply0 gnd;

    wire w1, w2;
   
    // stanga sus, au output in acelasi loc
    pmos pmos1(w1, vdd, in1);
    pmos pmos2(w1, vdd, in2);
   
    // stanga jos
    nmos nmos1(w2, gnd, in2);
    nmos nmos2(w1, w2, in1);
   
    // rezulta output
    pmos pmos3(out, vdd, w1);
    nmos nmos3(out, gnd, w1);
   
endmodule


module test_and;

    reg in1 = 0;
    reg in2 = 0;
    wire out;
   
    initial begin
        #5  in1 = 1'b1;
        #5 in2 = 1'b1;
        #5 in1 = 1'b0;
        #5 in2 = 1'b0;
    end
   
    and_cmos and1(in1, in2, out);
   
    initial
    $monitor($time," AND(in1, in2, out) = (%b, %b, %b)", in1, in2, out);

endmodule




3. CMOS OR gate

module or_cmos (in1, in2, out);

    input in1;
    input in2;
    output out;

    supply1 vdd;
    supply0 gnd;

    wire w1, w2;

    // stg sus
    pmos pmos1(w1, vdd, in1);
    pmos pmos2(w2, w1, in2);

    // stg jos
    nmos nmos1(w2, gnd, in1);
    nmos nmos2(w2, gnd, in2);

    // output
    pmos pmos3(out, vdd, w2);
    nmos nmos3(out, gnd, w2);

endmodule

module test_or;

    reg in1 = 0;
    reg in2 = 0;
    wire out;
   
    initial begin
        #5 in1 = 1'b1;
        #5 in2 = 1'b1;
        #5 in1 = 1'b0;
        #5 in2 = 1'b0;
    end
   
    or_cmos or1(in1, in2, out);
   
    initial
    $monitor($time," OR(in1, in2, out) = (%b, %b, %b)", in1, in2, out);

endmodule




4. CMOS XOR gate



module xor_cmos (in1, in2, out);

    input in1;
    input in2;
    output out;

    supply1 vdd;
    supply0 gnd;

    wire w1, w2;

    // dreapta
    pmos pmos1 (w1, vdd, in1);
    nmos nmos1 (w1, gnd, in1);

    // stanga
    pmos pmos3 (out, in1, in2);
    nmos nmos3 (out, w1, in2);

    // centru
    pmos pmos2 (out, in2, in1);
    nmos nmos2 (out, in2, w1);

endmodule

module test_xor;

    reg in1 = 0;
    reg in2 = 0;
    wire out;
  
    initial begin
        #5 in1 = 1'b1;
        #5 in2 = 1'b1;
        #5 in1 = 1'b0;
        #5 in2 = 1'b0;
    end
  
    xor_cmos xor1(in1, in2, out);
  
    initial
    $monitor($time," XOR(in1, in2, out) = (%b, %b, %b)", in1, in2, out);

endmodule


5. Poarta T-gate (Transmission Gate)

module tgate_cmos (in, A, out);

    input in;
    input A;
    output out;

    pmos pmos1 (out, in, ~A);
    nmos nmos1 (out, in, A);

endmodule

module test_tgate;

    reg in = 0;
    reg A = 0;
    wire out;
   
    initial begin
        #5 in = 1'b1;
        #5 A = 1'b1;
        #5 in = 1'b0;
    end
   
    tgate_cmos tgate(in, A, out);
   
    initial
    $monitor($time," TGATE(in, A, out) = (%b, %b, %b)", in, A, out);

endmodule


Semnificatie T-gate: compus dintr-un un tranzistor nmos si unul pmos,  cu A semnal de enable, aceasta poarta lasa sa treaca mai departe valoarea lui In, numai atunci cand A este activat, si blocheaza iesirea, in caz contrar.
  Cand A este 1, in pmos intra ~A adica 0, deci pmos-ul este inchis (conduce pe 0). La fel, in nmos intra 1 si acesta conduce. La In = 1, conduce pmos si out = 1, iar la In = 0, conduce nmos si out = 0.
  Cand A este 0, in pmos intra 1 si se deschide (nu mai conduce), iar in nmos intra 0 - idem. Rezulta ca la out va fi impedanta marita = z oricare ar fi intrarea In.

surse foto: http://www.allaboutcircuits.com/vol_4/chpt_3/7.html

25 martie 2012

Jeem: limbaj de programare in limba araba

Super super tare:

متغير
صحيح: رقم, ل, المجموع;  
صحيح: ب, ت;
حقيقي: رقم حقيقي;
بداية
إمسح;
إطبع("اهلا و سهلا", سطر, سطر,سطر);  # ش
إطبع("أدخل أي عدد صحيح بين 0 و 10 الحساب المجموع من 1 لذلك الرقم");  # ش 
إطبع(سطر);  # ش
   إطبع  ("و تحديد زوجي أو فردي, أو اي رقم غير ذلك للخروج من  البرنامج" , سطر); # ش
إطبع (سطر, "أدخل الرقم :") ;
إقرأ (رقم);

طالما ((رقم >= 0) و (رقم <=10));
بداية
تكرار ل من 1 إلى (رقم-1);
 المجموع = المجموع + ل;
إطبع (ل, "+");
نهاية;

 إطبع (ل, "=", المجموع+ رقم))
إذا ((رقم مود 2) == 0)
إطبع (سطر, "الرقم زوجي", سطر) # ش
وإلا
إطبع ("الرقم فردي", سطر)
# ......

نهاية.

In traducere proprie:

variabile
intregi:  raqam, L, almajmua;
intregi: B, T;
reale: raqam_haqiqi;

inceput
permite;
afiseaza ("bine ati venit", linie, linie, linie);
afiseaza ("introduceti orice numar intreg intre 0 si 10 .....");
afiseaza (linie);
afiseaza ("si determinati daca este par sau impar, sau altceva pentru a iesi din program", linie);
afiseaza (linie, "introduceti numarul");
citeste (raqam);

cat timp (raqam>=0 si raqam<=10);
inceput
pentru L de la 1 la raqam-1;
    almajmua = almajmua + L; 
    afiseaza (L, "+");
sfarsit;

afiseaza (L, "=" , almajmua + raqam);
daca (raqam modulo 2 == 0)
    afiseaza (linie, "numar par", linie);
altfel
    afiseaza ("numar impar" , linie)

sfarsit


P.S. Programul este incomplet.
Link de descarcare programul Jeem: http://www.jeemlang.com/index.php?page=downloads

22 martie 2012

La ce foloseste TS (Teoria Sistemelor)

  Unul dintre locurile unde îți poți aminti de ”TS” este în robotică, în control theory . De exemplu, având o mașinuță care se presupune că ar merge drept, de fapt, din cauza erorilor, traiectoria este mai mult sau mai puțin deviată (cross-track error - CTE). Pentru a o încadra cât de cât aproape de ceea ce se aștepta, se introduc celebrele compensatoare din capitolul de sinteza SRA, cum ar fi compensatorul P, PI, PD, PID, PDD, etc.

  Compensatorul de tip P - proportional control. A conduce proporțional cu eroarea CTE - deviația scade dar au loc frecvente depășiri - deci nu foarte exact.
  Compensatorul de tip PD - proportional derivative control. A conduce proporțional cu eroarea CTE plus adăugarea derivatei în timp a CTE (diferența a oricăror 2 erori consecutive între 2 momente de timp) înmulțită cu un parametru ales. Ca rezultat, eroarea devine mai mică cu trecerea timpului, fără depășiri (oscilații în jurul axei), o convergență mai bună.
  Compensatorul de tip PID - proportional, integral, derivative. La fel ca PD, plus adăugarea integralei CTE privită ca suma a tuturor valorilor CTE anterioare, înmulțită cu un parametru. PID rezolvă o problemă neadresată de PD și anume atunci când roțile mașinuței nu sunt perfect alineate și e nevoie de o ”forță mai mare” în conducere.

  Din punct de vedere euristic, valorile proporționale, integrale și derivative pot fi interpretate temporal. Astfel, P depinde de eroarea curentă, la momentul prezent, I depinde de acumularea erorilor trecute, iar D depinde de o predicție a viitorilor erori pe baza ratei de schimbare curentă. Foarte importantă este alegerea corectă a parametrilor.

graficul răspunsului unui sistem cu regulatoare P, PI și PID
PID-ul pare a fi cel mai bun stabilizator (cu deviații minime față de y=1 și convergență rapidă)

21 martie 2012

PHP: Transmiterea datelor

În formularele HTML se poate specifica ca atribut method - POST sau GET.

În GET: browserul direcționează către pagina specificată în atributul action, la care adaugă niște perechi de tip cheie-valoare. De exemplu:  script.php?id=1440&post=14. Transmiterea se face prin URL, vizibilă pentru utilizator. Accesul la date se face prin interogarea: $_GET ['nume_variabile'] (ex. $_GET['id'] )
În POST: browserul direcționează către pagina specificată în atributul action, dar nu adaugă perechile la URL (utilizatorul nu le mai vede), totuși acestea aflându-se în cererea HTTP în clar. Accesul la date: $_POST['nume_variabila'].
În plus, fără a folosi una din cele 2 metode, putem pune link la o pagină: script.php?id=1440

Sesiuni PHP  - mecanism pentru păstrarea informațiilor despre starea clientului.
session_start () este metoda care trebuie apelată în fiecare script, la început. Sesiunea se închide cu session_destroy(). Pentru transmiterea variabilelor se încarcă/descarcă super array-ul $_SESSION.

Cookies în PHP - un fișier trimis de server și salvat în calc. personal în care se pot stoca mai multe informații.
setcookie() este metoda care definește cookie-ul, care va fi trimis împreună cu antetele HTTP. Cookies trebuie trimise înainte de orice output (inclusiv etichete HTML). Variabilele vor fi descărcate prin $_COOKIE['nume_var'] sau $_REQUEST['nume_var']. 

20 martie 2012

PHP: Metoda magică __call

În PHP, metoda magică __call permite polimorfismul (= aceeași metodă definită în mai multe feluri).
Semnătură:
public function __call ($name, $parameters) {

}
Unde:
$name este numele metodei care se suprascrie
$parameters este un array de parametri ai funcției

Diferența între metode se face în funcție de nume și de numărul de parametri (count ($parameters)).

Exemplu: într-o clasă oarecare numită User dorim să avem o metodă numită getPermissions care dacă ia un singur parametru, returnează True/False (dacă userul respectiv are acces la un articol sau nu), și dacă nu ia niciun parametru returnează un array de id-uri de articole la care userul are acces.

class User {


    // alte metode


     public function __call ($name,$param) {
if ($name== "getPermissions" && count($param) == 0) {
// returneaza un array
}
if ($name== "getPermissions" && count ($param) == 1) {
// returneaza true sau false in fct de $param
}
}
  }

$user = new User ("guest", "parola");
// apelare metodă magică
print ( $user->getPermissions("3") );
print_r ( $user->getPermissions() );  

12 martie 2012

Filtru de particule

 Filtrul de particule este o metoda de localizare folosita in robotica. Presupunand ca avem un robot, in starea initiala el stie ca se afla intr-un spatiu predefinit, dar nu stie unde anume. Dispune de o harta (care sa presupunem ca are un numar de puncte de reper/remarcabile), dar este incapabil sa distinga pozitia in care s-ar afla pe acea harta. De aceea, isi creeaza ("in imaginatia lui") un set de particule ce reprezinta "copii in miniatura" ale sale si le plaseaza in diverse locuri. Pot fi 10, 100, 1000 sau oricate particule raspandite la random in intreg spatiul. Se presupune ca particulele au fost raspandite cat de cat uniform, astfel incat in fiecare pozitie sa se gaseasca o particula ceea ce inseamna ca exista o sansa ca robotul sa se afle chiar acolo. Robotul nu stie efectiv unde se afla, dar este capabil sa detecteze distante pana la anumite puncte de reper cu o anumita acuratete, folosind laseri.


 Apoi se intampla urmatoarele: robotul doreste sa se miste si o data cu el se misca si particulele. Dupa ce robotul s-a miscat, coordonatele lui s-au schimbat si robotul doreste sa verifice (sa masoare) distantele de la locul unde se afla pana la punctele de reper ale hartii. Si obtine un set de distante. Particulele, la randul lor, fiind niste robotei fictivi, isi vor modifica pozitia _reala_ si vor si ele sa masoare distantele pana la aceste puncte remarcabile ale hartii. Particulele calculeaza aceste distante "de mana" pentru ca dispun atat de coordonatele in care se afla cat si de coordonatele punctelor de reper. In schimb, robotul nu isi stie coordonatele proprii dar poate afla distantele pana la punctele de reper (toate, sau doar o parte) folosind laseri.
 Compararea acestor distante obtinute poate oferi un indiciu despre cat de apropiat e robotul fata de particule (adica cat de reale sunt ipotezele oferite de particule). De aceea, fiecarei particule i se va atribui ulterior o greutate/probabilitate ca EA sa indice pozitia corecta. 


 Apoi, cele 10, 100, 1000, etc particule vor fi filtrate (sampling with replacement). Unele dintre ele se dovedesc a returna distante prea aberante fata de punctele de reper, comparativ cu masuratorile robotului (care in continuare nu stie unde se afla), acelea cu siguranta vor avea greutati mici si _probabil_ vor muri. Din cele N particule initiale se vor alege, la intamplare, tot N, cu posibilitatea ca dintr-o singura particula initiala sa rezulte 1,2 sau mai multe particule noi. In final va fi acelasi numar de particule, dar unele probabil se vor repeta, ceea ce va indica faptul ca pozitia exprimata de acea particula este mai probabila decat altele. Alegerea noilor particule se face la intamplare, dar o particula cu greutate mare are o sansa mai mare sa fie aleasa (si o sansa destul de mica, dar existenta, de a "muri"). 


 Cand robotul se misca din nou, procesul se repeta si dupa mai multi pasi vom vedea in jurul lui mai multe particule aglomerate care il vor insoti oriunde acesta se plimba. Poate, intr-un final, va rezulta o singura particula, care va spune cu o probabilitate mare (dar nu cu certitudine) ca robotul se afla la pozitia indicata de aceasta.


 Ce se intampla cand avem de la inceput un filtru de particule cu o singura particula? Aceasta va fi asezata intr-un loc, la intamplare, care poate fi atat locul "cel bun" cat si foarte departe de locul real. Si cum posibilitatile de asezare sunt numeroase, cel mai probabil particula nu va oferi o localizare buna. Masuratorile robotului nu vor afecta durata de viata a particulei, deoarece suntem siguri ca la urmatorul resampling noua particula este chiar cea anterioara (care are probabilitate 1 sa fie realeasa). Deci, masuratorile nu vor afecta in niciun fel localizarea oferita de particula. In schimb, miscarea robotului influenteaza miscarea particulei pentru ca cei doi se misca la fel (aceleasi translatii, rotatii, etc).

08 martie 2012

HTML5


  reprezinta cea de-a cincea mare revizuire a standardului HTML, care este in curs de dezvoltare (draft). Reprezinta un limbaj unic care poate fi scris atat in sintaxa HTML cat si in XML, ideal atat pentru browsere cat si pentru parsere. De asemenea, s-a luat in calcul si posibilitatea rularii noilor aplicatii web pe platforme mobile, smartphone-uri si tablete.

  Organizatia care a infiintat noul standard in 2004 este WHATWG (Web Hypertext Application Technology Working Group). Dintre organizatiile care sustin standardul se regasesc producatorii de browsere Firefox, Opera, dar si gigantii Google, Apple, Adobe sau Facebook.  Cu toate ca este sustinut de multe organizatii, HTML5 nu se grabeste sa fie definitivat, termenul preconizat fiind in iulie 2014.

  HTML5 contine o serie de elemente de sintaxa in plus fata de versiunea anterioara, dintre care cele mai remarcabile par a fi <audio> si <video>. Acestea ar putea inlocui plugin-urile dedicate (Flash, Silverlight, etc) si astfel ar putea imbunatati performantele (mai putine resurse consumate, securitate mai buna). De asemenea, elementul <canvas> va permite ca motorul browser-ului sa randeze grafica in timp real, pentru integrarea jocurilor fara a mai fi nevoie de Flash.

  In total, HTML5 are in jur de 100 de specificatii noi si este compatibil cu documentele HTML4 si XHTML1 publicate pe internet, dar necompatibil cu functiile SGML  are HTML4. In schimb, suporta elemente de MathML si SVG.

  Dintre elementele noi (tag-uri) cele mai importante par a fi section, article, aside, header, footer, figure, video/audio, track, embed, mark, progress, meter, time, ruby, canvas, command, details, datalist, keygen, output si altele. De exemplu, noul element numit <article> specifica un continut independent de restul paginii care va putea fi distribuit independent de restul sitului, iar <ruby> specifica o adnotare ruby, folosite pentru tipografia tarilor din Asia de Est pentru a le arata pronuntarea.

  Pe langa elemente noi, s-au adaugat si atribute noi unor elemente deja existente. De exemplu, pentru <input> exista in plus atributele autocomplete, min, max, multiple, pattern, iar pentru <textarea> apar maxlength, wrap sau dirname.  <html> va putea lua ca atribut nou manifest, ceea ce inseamna specificarea locatiei unde se afla o lista a resurselor pe care browser-ul le va cache-ui pentru accese offline ulterioare – acest atribut trebuie specificat in fiecare pagina html a aplicatiei web care se doreste a fi pastrata in cache.

  Unele atribute de elemente pot avea acum si alte valori, cum este cazul lui <input> care primeste pentru atributul type valorile: search, tell, url, email, datetime, date, month, week, time, datetime-local, number, range sau color.

  Pe langa adaugiri de sintaxa, s-au efectuat si modificari (un exemplu ar fi ca <img> nu poate primi ca valori ale atributelor width si height procente) dar si eliminari de sintaxa. S-a considerat ca unele dintre elementele absente au un efect pur de imagine (prezentare) si astfel ele pot fi setate prin CSS: basefont, big, center, font, strike, etc. Alte elemente nu apar deoarece se crede ca ar ameninta uzabilitatea si accesibilitatea: frame, frameset, noframes, iar altele au fost folosite prea putin de-a lungul timpului: <acronym> (creeaza confuzii), <applet> (inlocuit cu object),  <dir> (invechit, se foloseste <ul>). Dintre atributele des folosite, surprinzator, unele au fost eliminate deoarece functionalitatea poate fi realizata direct din CSS: align, background (<body>), bgcolor, border, cellpadding, cellspacing, frame (<table>), scrolling (<iframe>) si altele.


  Pe langa specificarea elementelor de markup noi, HTML5 specifica si API-uri de scripting. API-uri noi care apar sunt: aplicatii web offline, drag and drop, editarea documentelor, managementul istoricului web, elemental canvas pentru desenare 2D, stocare web (web storage – un framework de stocare de perechi cheie-valoare cu un comportament similar cu cookies, dar cu o capacitate mai mare de stocare si API imbunatatit), etc. GeoLocation este o interfata prin care un site poate identifica locatia calculatorului, fara ajutorul altui plugin.

  Web workers este un alt concept nou introdus de HTML5 care este o functie de procesare in fundal ce se va ocupa simulan de scripturile sitului si de aplicatiile web in thread-uri separate. In mod normal, in browsere opera un singur thread care executa tot codul Javascript, dar prin web workers, viteza si timpul de raspuns vor fi imbunatatiti prin separarea partilor CPU-intensive de  codul pentru interfata utilizatorului.
  Noua versiune HTML5 pare sa aduca imbunatatiri pe partea de securitate, prin adaugarea unui sandbox la iframe si permiterea in mod limitat a executarii scripturilor sau a cookie-urilor.

  Personal, sunt foarte atrasa de ideea de HTML5 si cred, conform specificatiilor, ca noul standard va aduce imbunatatiri substantiale atat la nivel vizual, cat si din punct de vedere al performantei. Mi se pare excelenta ideea separarii pe thread-uri a interfetei cu utilizatorul si a  “activitatii din spate” deoarece in viata de zi cu zi, multe aplicatii web crapa sau produc intarzieri deoarece toate task-urile sunt procesate laolalta, in acelasi thread. De asemenea, unui utilizator ii va fi mult mai usor cu HTML5 decat sa fie nevoit sa instaleze plugin-uri pentru orice fel de continut multimedia (Flash, Silverlight, ActiveX, etc). Cu toate acestea, se pare ca Flash nu va fi uitat prea curand deoarece HTML5 nu poate reda continut HD. Nu vad o neaparata nevoie de un API pentru accesarea aplicatiilor web offline, in conditiile in care aproape toti utilizatorii au acces la internet non-stop, dar poate ca pentru rapiditate este mai convenabil ca pagina sa fie incarcata de pe statia locala.

Referinte:

02 martie 2012

PHP: arrays, magic arrays

  Cerință: fiind dat un tabel users, ce conține câmpurile (id, firstName, lastName, email) și câteva înregistrări, să se scrie o clasa UserCollection pentru parcurgerea si afisarea utilizatorilor dintr-un tabel folosind un vector de obiecte de tip User
Facilități:
* sortarea crescator/descrescator dupa un camp specificat (Trebuie folosit un mecanism de sortare vectori)
* introducerea de restrictii; un set de restrictii poate fi reprezentat de un array (cheie ⇒ valoare), avand urmatoarea semnificatie: Selecteaza din tabel doar inregistrarile unde coloana “cheie” are valorile “valoare”. Exemplu: daca array-ul de restrictii este de forma (“email” ⇒ “test@email.com”) atunci lista va contine doar utilizatorii care au campul email egal cu valoarea “test@email.com”;
informatiile legate de sortare si de restrictii pot fi trimise in constructorul clasei, si retinute ca membri ai clasei;
* metode suplimentare:
getNextUser(): intoarce un obiect de tip User, sau false (daca nu mai sunt utilizatori in colectie);
_ _toString (): afiseaza intr-un format intuitiv colectia;
* un mecanism prin care parametrii de sortare/restrictii sa poata fi modificati fara a fi necesara re-instantierea clasei UserCollection;

Rezolvările se găsesc aici.

27 februarie 2012

Have fun with chatbots

ELIZA - este printre primele sisteme de prelucrare naturală a limbajului, capabilă să realizeze o conversație limitată cu un utilizator. Program destul de simplu, folosește pattern matching pentru a procesa intrările (inputs) și a le traduce în ieșiri (outputs) convenabile. Astfel, Eliza nu are nevoie să știe nimic despre lume. Se spune că răspunsurile ei sunt similare cu cele ale unui psihoterapeut.
Dr. Romulon - bazat pe platforma de chat ALICE, Dr. Romulon este mai avansat decât Eliza având un set mai larg de răspunsuri. Dar doctorul are o memorie slabă.
Chato - ”Chato is a new chatbot, it is still learning about the world.
It has an AIML heart, and uses some new PHP code for a brain.”

Human: is Eliza your wife?
Dr. Romulon: she is my ancestor.
Human: grandmother?
Dr. Romulon: A deeper algorithm is needed to respond to that correctly.
Human: do you believe in aliens?
Dr. Romulon: Yes I think Dr. Wallace was created by aliens.
Human: who is dr.Wallace?
Dr. Romulon: He is a famous computer scientist, the author of ALICE, and a graduate of Carnegie Mellon.
Human: do you love dr.Wallace?
Dr. Romulon: Yes I love him like a father.