Archive for the ‘Programare’ Category

JsLint in Eclipse

Wednesday, December 3rd, 2008

JsLint (http://www.jslint.com) este un validator de sintaxa si “bune practici”, evident pentru Javascript. Utilitate relativ indoielnica, dar devine util de exemplu cand ai probleme de cross browser.

In acest context, am incercat sa creez un “external tool” in eclipse cu jslint ca sa-l pot rula usor pe orice fisier. Problema e ca jslint e scris in … javascript - deci aveam nevoie de un interpretor de javascript care merge pe windows in linia de comanda.
Un scurt search pe g, ar fi cateva optiuni:

- rhino (http://www.mozilla.org/rhino/) Rhino e teoretic un motor care ar putea face asa ceva, dar e scris in java deci trebuie sa chem interpetorul java care sa cheme rhino care sa intepreteze jslint … prea complicat. In plus, sincer, nu am reusit sa fac sa mearga combinatia, deci pula.

- jslib (http://code.google.com/p/jslibs/) Jslib e o librarie destul de misto … aparent. Dar nu ruleaza jslint, da erori .. deci pula si asta.

Usor enervat, mai gasisem ceva in care era utilizat motorul jscript din windows dar era outdated, eram gata sa renunt cand am descoperit. Javascript Lint : http://www.JavaScriptLint.com , care e practic o versiune compilata, cu interfata in linie de comanda pentru jslint-ul original.
Are si un fisier de configuratie care e destul de flexibil … deci merge.
Pentru a utiliza asta in eclipse, am creat un nou external tool, care arata cam asa:

external tool

external tool

Cu chestia asta am rezolvat problema, rezultatul evaluarii apare in consola.

Despre MySQL si soundex

Sunday, September 21st, 2008

Deci MySQL … Sincer sa fiu, in disputele religioase MySQL vs PostgreSQL, sunt de obicei de partea Postgres, dar fortat de imprejurari in general trebuie sa utilizez MySQL (impotriva bunului meu simt, of course). Anyway, pana acum nu am avut motive chiar asa serioasa sa ma irite MySQL. Pana acum.

De curand intr-un proiect care-l “repar”, aveam o pagina care lista niste aeroporturi in functie de inputul utilizatorului. De exemplu daca introduceai “paris”, respectiva pagina iti lista cele cateva aeroporturi din paris si inca vreo 7 - 8 din lume care erau “asemanatoare” ca nume.

Problema e ca rezultatele erau foarte aiurea in unele cazuri, si nu intelegeam de ce. O scurta privire in codul primitiv si prostesc care domneste in acest proiect mi-a dezvaluit modul destul de simplu in care se facea operatiunea:

in baza de date o tabela stoca o lista de aeroporturi care avea in nume si orasul (utilizatorul urma sa caute dupa oras), si folosind functia SOUNDEX, lista toate inregistrarile alea carui SOUNDEX era identic cu cel al stringului cautat. Destul de normal .. aparent.

SELECT ID,Code,City, Airport, Country FROM airports WHERE Soundex(City) = SOUNDEX(\”$deptArpt\”)

Problema e ca “baietii de la mysql” au hotarat ca nu are sens sa urmeze algoritmul de soundex din manual, ei sunt mai destepti si algoritmul lor nu se opreste dupa 3 numere identificate, ci merge pana la sfarsit. Ideea pare ok, pana iti dai seama ca in felul asta “new york airport” si “new york” au scoruri diferite, which really sux. De aici veneau problemele - soundex este destul de inutil in forma lui initiala.
O posibila rezolvare ar fi sa pastrez doar primele 3 numere si sa le ignor pe restul, ceea ce am si facut. Insa inainte am calculat toate soundex-urile intr-un camp suplimentar  (soundscore) pentru a usura load-ul in timpul functionarii.
O alta problema a fost “similitudinea”. Un SGBD inteligent ca Postgres are o functie care se cheama similarity si care iti returneaza un scor care il poti folosi pentru a regla cate rezultate primesti. MySQL … normal ca nu are asa ceva. Eu aveam nevoie si de acest comportament, asa ca am scos prima litera din rezultatul soundex (care arata ceva de genul P345, unde P e prima litera a stringului), si am facut o comparatie a diferentei intre scorul initial si scorul stringului cautat.
Adica ceva cam asa:

select ID,Code,City, Airport, Country from airports where ABS(CAST(substring(soundex(\”$deptArpt\”), 2) as SIGNED) - soundscore) < 5 AND substring(soundex(\”$deptArpt\”), 1, 1) = soundletter

Ultima comparatie este necesara pentru ca prima litera este esentiala in acest tip de cautare.
Bun asta cam imi rezolva problema, pot stoca rezultatele in soundscore pentru ca lista de aeroporturi este statica. Oricum … MySQL … pula mea …varza.

Drupal 5.0 si sections

Tuesday, December 11th, 2007

Pentru un proiect care l-am avut, am vrut sa utilizam modulul sections pentru a avea teme diferite pentru admin si site. Nimic anormal pana acum, doar ca modulul sections nu vroia sa mearga, in mod misterios …

Asa ca a trebuit sa hacuiesc un pic:
Pe drupal.org am mai intalnit oameni cu aceeasi problema, care insa se zicea ca se rezolva prin modificarea weight a modului la -10, care deja era inclusa in versiunea curenta, si tot nu mergea. Pana la urma am ajuns in system.module la urmatorul cod:
[cc lang="php"]
if (arg(0) == ‘admin’) {
global $custom_theme;
$custom_theme = variable_get(’admin_theme’, ‘0′);
drupal_add_css(drupal_get_path(’module’, ’system’) .’/admin.css’, ‘module’);
}
[/cc]
Care in mod evident suprascria ce facuse modulul de sections, care baga tema in $custom_theme.

Asa ca am facut un mic hack:
[cc lang="php"]
if (arg(0) == ‘admin’) {
global $custom_theme;
if(empty($custom_theme)) {
$custom_theme = variable_get(’admin_theme’, ‘0′);
}
drupal_add_css(drupal_get_path(’module’, ’system’) .’/admin.css’, ‘module’);
}
[/cc]
Si gata, acu merge … desi solutia nu este foarte ortodoxa.