SQL Good Idea/Bad Idea

30 October 2009

The following is a SQL function that splits the string provided as an argument into a table of values on the comma character:

CREATE FUNCTION Split
    (@Argument NVARCHAR(MAX))
RETURNS
    @List TABLE (Item NVARCHAR(20))
AS
BEGIN
    -- While a comma still exists in the argument
    WHILE (CHARINDEX(',', @Argument) > 0)
    BEGIN
        -- Add substring from start of argument to comma to result list (trim string to remove spaces)
        INSERT INTO @List
            VALUES (RTRIM(LTRIM(SUBSTRING(@Argument, 1, CHARINDEX(',', @Argument) - 1))))

        -- Remove the item from argument
        SET @Argument = SUBSTRING(@Argument, CHARINDEX(',', @Argument) + 1, LEN(@Argument))
    END

    -- Add last item to the list
    INSERT INTO @List VALUES (RTRIM(LTRIM(@Argument)))

    RETURN
END
GO

So if passed the argument ‘1, 2, 3, 4′, the function will return a table containing ‘1′, ‘2′, ‘3′ and ‘4′. The reason I wrote the function was because I had to wrap a set of queries in SQL stored procedures to provide an interface. The queries were pretty complex but for this example, I will only use a single table, let’s say a table containing employee information:

CREATE TABLE Employee
(
    ID INT PRIMARY KEY,
    Name NVARCHAR(200),
    Salary INT
)
GO

We need to wrap a query that returns the salary for a given list of employees, the list being provided as a comma-separated string of IDs. There are multiple ways to do this, I will just give a good idea and a bad idea.

Good Idea

CREATE PROCEDURE GetSalaries
    (@Employee_IDs NVARCHAR(MAX))
AS
    SELECT ID, Salary
        FROM Employee
        WHERE ID IN (SELECT CAST (Item AS INT) FROM Split(@Employee_IDs))
GO

Using the initial function, the input is split into individual IDs and cast as INT. ID and Salary are extracted from the table with the condition that ID is in the list. So for the sample data

INSERT INTO Employee VALUES (1, 'John Doe', 10000)
INSERT INTO Employee VALUES (2, 'Jane Doe', 20000)
INSERT INTO Employee VALUES (3, 'John Doe the 2nd', 30000)
GO

Calling

GetSalaries '1, 2, 4'

should return

1 10000
2 20000

(as ID 4 doesn’t exist in the table and ID 3 is not in the argument).

Bad Idea

CREATE PROCEDURE GetSalaries
    (@Employee_IDs NVARCHAR(MAX))
AS
    EXEC ('SELECT ID, Salary FROM Employee WHERE ID IN (' + @Employee_IDs + ')')
GO

The above procedure, using dynamic SQL, should behave similar to the previous procedure:

GetSalaries '1, 2, 4'

should still return

1 10000
2 20000

It’s even shorter. And it doesn’t require a Split function to parse the input. So why I call this a bad idea? The stored procedure will be provided as an interface, meaning the input will be beyond our control. And input could also be

GetSalaries '1); DROP TABLE Employee --'

Run it and see what happens ;)


Pe scurt

28 October 2009

Știți cum mi-am dat seama că am câștigat ceva vechime la locul de muncă? Deși am un milion de lucruri de terminat în două săptămâni ca să pot pleca liniștit în vacanță, trebuie să pierd câte o jumătate de zi explicând la unii și la alții cum funcționează una și alta. Cred că un senior developer nu mai are timp de loc să lucreze.

Pe scurt, nu mai am timp de blog, nu mai am timp nici de X-Box :( , trebuie să termin chestii. Asta ca să nu stau cu un ochi pe mail și celălalt în Visual Studio și în timpul vacanței. De fapt timp să scriu două rânduri pe blog am, dar nu am subiecte. În parte NDA-ul e de vină – nu prea pot povesti cu lux de amănunte la ce lucrez, în parte e faptul că iară lucrez de dimineața până noaptea și nu mai am când să mă întâlnesc cu tot felul de chinezi ciudați care să-mi dea subiecte de dezbătut aici. Eh, dacă aș fi bloagăr profesionist, altfel ar sta treaba. Dar cum îmi place mai mult să scriu software decât povești, fiind astfel un bloagăr amator, când lucrurile se aglomerează, blogul este cel care suferă. Asta este. Când voi avea mai puțin de lucru, voi avea mai multe de povestit. Revin. Curând. Sper.


Vacanță

25 October 2009

Managerul meu mi-a spus o vorbă foarte înțeleaptă când discutam când să îmi iau concediu – că indiferent când îl plănuiesc, sigur atunci voi avea mai mult de lucru. Și se pare că e adevărat. Merg în România în 3 săptămâni. Până atunci trebuie să termin un proiect. Dacă nu aș fi plecat în vacanță, aș fi avut vreo săptămână-două în plus să lucrez la el. Oricum, zilele astea bag mare. Să nu mai zic că vineri am avut o urgență – prioritate zero, chestii – de am stat până noaptea târziu cu niște colegi să investigăm o problemă. Bine, n-am stat la lucru, am stat conectat la net de acasă, în pijamăluțe, dar tot nu a fost o experiență grozavă.

Și tot zic că am nevoie de o vacanță. Iarna asta chiar aș fi vrut să merg o săptămână în Hawaii – visez de mult la asta, problema e că mă transfer în State dar zilele mele de concediu nu se transferă. Așa că probabil amân Hawaii încă un an și mă mulțumesc cu vacanța din România. Și nu scriu despre Hawaii doar ca să impresionez – avionul din Vancouver și cazarea la hotel o săptămână în Hawaii costă cât un bilet dus-întors până în România.

Mor de curiozitate ce impresie îmi va face România după un an trăit într-o țară civilizată. Cât îmi va lua să mă obișnuiesc cu serviciile din țară? Cu vânzătorii și chelnerii scârbiți și toate cele… cocalari, manele, BMW, semințe :D  Cum o fi o fi, chestia e că am nevoie de o vacanță. Să îmi “încarc bateriile”. Cu prietenii. La Bierhaus. Încă 3 săptămâni.


Nicovala lui Greg Bear

25 October 2009

A venit momentul să mai scriu un post despre cărți, chit că nu am mai citit atât de mult în ultima vreme. Nu de alta dar m-am blocat la un roman pe care îl citesc mai greu.

Am citit Nightmares and Dreamscapes de Stephen King, o mulțime de povestiri, unele mi-au plăcut, altele nu chiar atât de mult. Aștept să mai scrie un roman – cred că am citit aproape toate romanele lui, mai puțin câteva foarte vechi și seria The Dark Tower, care e mai mult fantasy. Poate mă apuc totuși de serie…

Am recitit Spook Country de William Gibson. Nu mai intru în detalii pentru că am mai scris despre carte acum câteva luni, când am citit-o prima dată. Super. Probabil că voi reciti curând și Pattern Recognition, așteptând cu nerăbdare Zero History, care este încă în lucru.

Și ajung la romanul la care m-am blocat, Anvil of Stars de Greg Bear. Am fost puțin dezamăgit de The Forge of God iar Anvil of Stars vrea să fie o continue. Ce să spun, sunt faze mai interesante și faze mai puțin interesante dar e destul de greu de citit – în sensul că nu-mi vine să stau noaptea târziu cu cartea pentru că vreau să văd ce urmează să se întâmple. Mie personal mi se par puțin cam ratate romanele astea două. Dau impresia că nici autorul nu știa exact încotro merge povestea când a scris-o și nici nu a mai revizuit manuscrisul. Se putea și mult mai bine.

După ce termin Anivil of Stars trebuie să caut ceva mai interesant. Cărțile pe care le-am luat data trecută au fost o alegere mult mai bună (1984, A Scanner Darkly) și chiar nu le-am putut lăsa jos din mână.


Fumatul dăunează grav checului

21 October 2009

Aseară ne-au venit prietenii în vizită. Cred că am mai scris despre întâlnirile noastre cu ei, dacă nu, pe scurt, ne-am împrietenit cu un cuplu de români, soț și soție, el venit tot la Microsoft, deodată cu mine. Și toată vara, weekend de weekend, ori am mers la ei la grătare ori am ieșit prin Richmond sau Vancouver la puburi.

Ei au plecat în vacanță în România pentru o lună de zile și abia de curând s-au întors. Așa că i-am invitat la noi să vedem ce am mai făcut unii și alții cât timp nu ne-am văzut. Eu am luat niște bere, ei au adus niște chec și ne-am apucat de povești.

La bere, desigur, merg foarte bine țigările (dacă sunteți nefumători credeți-mă pe cuvânt nu știți ce pierdeți :P ). Așa că am ieșit toți pe balcon să fumăm. Pentru că în apartament, normal, nu e voie, sunt alarme… Ca scrumieră folosim o ceșcuță care, după câteva beri și câteva povești, s-a umplut. Eu, că tot intram în casă să reînoiesc berile, m-am oferit să golesc și “scrumiera”.

Aici trebuie să fac o mică paranteză să explic ce facem noi cu gunoiul - nu avem coș de gunoi pentru că nu am găsit mărimea potrivită ca să încapă sub chiuvetă, așa că folosim pungi. Până nu demult nu era nicio problemă pentru că orice cumperi pe aici, de oriunde, primești în pungi de diferite mărimi. Doar că, pentru ca să salvez planeta, am cumpărat niște plase din material. Tot făcând cumpărături cu ele, rezerva noastră de pungi s-a micșorat dramatic, până am rămas fără. Așa că, înainte să ne vină musafirii, aveam în bucătărie o grămăjoară de lucruri care trebuiau aruncate.

Când am ajuns eu în bucătărie, grămăjoara dispăruse, fiind înlocuită de o pungă. N-am mai stat să mă întreb de unde avem punga respectivă, m-am gândit că a găsit-o soția pe undeva, așa că am luat ceșcuța plină ochi de chiștoace și am golit-o. De fapt, în pungă nu erau lucruri de aruncat ci checul adus de musafiri.

Încă nici nu mi-am dat seama. M-am întors la povești până când a zis soția că merge să taie checul. S-a întors cu o privire din aia priceless și m-a întrebat de unde mai exact am luat eu punga în care am golit chiștoacele. I-am zis că de pe masă. Mi-a zis că bine, m-am uitat ce era în ea? Am zis bănuiesc că gunoi, sau nu? Mi-a răspuns că nu… Când mi-am dat seama ce am făcut nu mă mai puteam opri din râs (trebuie să recunoașteți că e amuzant - gen dulceață în șoșoni). Mi-am cerut scuze așa, râzând, și sper că nu s-au supărat foarte tare pe mine. Ce să-i faci? Se mai întâmplă :)


Mă mut. Din nou

18 October 2009

Vine în curând vremea să mă mut, în State de data asta. Dacă nu știți povestea, am venit în Canada temporar, pentru că nu am putut lua viză H1B ca să merg direct în State. După un an aici, pot aplica pentru o viză L1, de transfer în interiorul companiei sau așa ceva.

Așa că săptămâna trecută a început Procesul. Bine, nu pot să mă plâng pentru că am un pachet de relocare super, cu firmă care să mă ajute să pregătesc actele pentru viză, firmă care să mă ajute să-mi transport lucrurile, firmă care să mă ajute să-mi găsesc locuință, mașină etc. odată ajuns. Atât doar că am revenit la activitatea pe care o detest cel mai mult – completat acte. Fiecare dintre firmele care mă jută are nevoie de nume, prenume, adresă, data nașterii… 2 pagini de aproape aceleași chestii pentru fiecare. E criminal. E criminal pentru că au grijă să ceară tot felul de date pe care nu le știu pe de rost, ca să nu pot completa un formular din ăla în câteva minute. Numărul pașaportului – trebuie să merg să-mi caut pașaportul; adresa de la serviciu – trebuie să intru pe net să caut adresa. Sau vor tot felul de chestii scanate… În fine. Totul este făcut în așa fel încât să-ți ia o bucată bună de timp ca să poți completa și trimite înapoi un formular.

Cel mai mult m-au distrat ăștia care mă ajută cu viza. Mi-au trimis un mail în care îmi explicau ce vor face. Practic pentru a primi L1 trebuie să explici la ambasadă de ce trebuie tu să fii transferat din altă țară în loc ca firma să angajeze un american sau ceva de genul. Și tipii ăștia o să mă ajute să întocmesc dosarul cu acte și explicații. În mail-ul ăsta de la ei îmi explicau cum că Microsoft le-a dat deja o mulțime de informații despre cine sunt și ce fac, așa că de la mine vor doar câteva date pe care nu le au. Și deschid formularul: nume, prenume, adresă, data nașterii…

Dar, după cum ziceam, se putea și mult mai rău – dacă nu mă ajutau ei, probabil trebuia tot eu să și fac formularele, nu numai să le completez. Sper să termin cât mai repede, să iau viza și să mă mut pentru ultima oară în următorii ani. Deja m-am mutat de prea multe ori în ultima vreme: Timișoara – Hunedoara – Vancouver – Richmond.


Cutia-X

12 October 2009

Dacă tot mi-am luat concediu, am zis că trebuie să găsesc ceva distractiv pentru zilele astea ca să nu mă plictisesc. Așa că, după ce ani de zile m-am lăudat că nu sunt gamer și că nu m-am mai jucat pe calculator de nu știu când, vineri, total din impuls, mi-am cumpărat un X-Box.

Mai are rost să spun că nu mă mai pot dezlipi de el? E bestial. Unde mai pui că am și televizorul HD și se vede super pe el. M-am jucat ca japonezii ăia de îi iau cu ambulanța din fața calculatorului.

Până acum mi-am pierdut timpul cu Need for Speed: Undercover și Fallout 3. Culmea că jucam versiuni mai vechi ale acestor titluri acum 10 ani. Primul NFS pe care l-am jucat a fost NFS 3: Hot Pursuit. Și Fallout 1 și 2 le-am terminat tot pe vremea aia.

Despre consolă nu pot spune multe pentru că nu am experiență cu alte console, atât doar că sunt foarte foarte mulțumit ea din toate punctele de vedere – se instalează ușor, se folosește ușor, se vede superb. Colegii de la Entertainment & Devices au făcut o treabă foarte bună.


Până în State

11 October 2009

Săptămâna asta am fost până în State. Mă distrează cum pot spune “a, am dat o fugă până în America”. Bine, nu prea sunt multe de povestit pentru că am fost în interes de servici și am petrecut două zile în ședințe.

Echipa mea s-a mutat din campusul Microsoft din Redmond în Bellevue. Mai exact în Bellevue City Center la etajul 10. Priveliștea de pe geam e super. Orașul e super. Abia aștept să mă mut de tot acolo – nu la birou, în oraș :) – peste vreo două luni.

În fine, ne-am adunat în Bellevue toți care lucrăm la proiectul despre care am scris data trecută. Lume din State, din Canada, din Anglia și din China. Ședințe peste ședințe și miercuri seara am încheiat-o cu niște pizza și bere.

Am fost cu colegul meu de echipă de la MCDC. A fost destul de obositor pentru că miercuri dimineața am pornit devreme de tot ca să ajungem acolo pe la 10. Și joi, imediat după lucru, ne-am întors în Richmond. Și între timp am alergat dintr-o parte în alta, am cunoscut lume, am discutat și am plănuit… După cum spuneam, obositor. Chiar dacă am fost cu mașina colegului și eu nu am condus. Așa că vineri mi-am luat concediu ca să mă odihnesc. Și ca norocul și luni e liber, e Ziua Recunoștinței în Canada. Așa că acum savurez o mini-vacanță mult așteptată.


Mulți înainte!

5 October 2009

Astăzi am făcut un an de când lucrez la Microsoft. Un an. Extraordinar ce repede trece timpul. Oricum, a fost un an grozav. Am învățat o mulțime de chestii, am lucrat cu niște oameni super și cu niște tehnologii super.

Nici nu mai știu exact dacă am dat pe blog detalii despre echipa din care fac parte așa că dau câteva acum (cu grijă să nu încalc NDA-ul :) ): lucrez la AdCenter. AdCenter e platforma de online advertising de la Microsoft – servim reclame pe Bing, pe mobile etc. AdCenter e mare. Una din multele echipe din AdCenter e RnR – Revenue and Relevance. Adică echilibrul dintre venitul generat pentru companie și relevanța pentru utilizatori. Despre relația relevanță/venit se pot scrie multe, nu am să scriu acum. Atât doar că avem multe sisteme care lucrează împreună pentru asta, principalul de care se ocupă echipa mea fiind sistemul care face predicții – pentru o anumită căutare și alți parametri, se fac predicții pentru a determina care reclame au șansa cea mai mare de a primi un click de la utilizator. Mai are rost să spun că e tehnologie cutting edge? Că am avut ocazia să colaborez cu echipe de research din Cambridge și Beijing? După cum ziceam, a fost un an grozav.

Pe lângă asta, am scris de la zero un sistem care e deja de jumătate de an în producție și sunt responsabil de el, am aprofundat cunoștințele de SQL Server, am învățat cu ce se mănâncă Integration Services, am învățat puțin Perl, am lucrat cu platforme de cloud-computing, calcul distribuit, algoritmi de predicție, data mining și analiză statistică, am învățat despre project management și software development lifecycle… și multe altele. Prea multe ca să mi le amintesc acum. Da, îmi iubesc meseria. Sper doar ca anul următor să fie cel puțin la fel de interesant.


Despre sport

3 October 2009

Am scris acum vreo lună jumate că m-am făcut sportiv. Deh, vreau să dau jos din burtă pe când vin în România. Am zis că nu insist asupra subiectului pentru că nu știu cât o să mă țin de treabă dar se pare că m-am ținut până acum și probabil că nu mă voi lăsa pâna la sfârșitul lui noiembrie. Atunci se schimbă treaba pentru că trebuie să-mi fac operație ca să-mi scot măselele de minte, pe urmă vin în vacanță în România și pe urmă mă mut în sfârșit în Redmond. Așa că atunci pun pauză. Dar până atunci rămân sportiv, așa că pot scrie ceva despre asta :) Plus că am impresia că e un subiect “la modă”. Apare pe multe bloguri pe care le citesc: Tudor Galos a scris mai multe posturi despre cum a slăbit/slăbește, Arhi colecționează obiceiuri sănătoase, VisUrât a făcut turul Ardealului cu bicicleta (super tare)…

Față de cât sport făceam înainte să plec din țară – zero – aici oricum am fost mult mai activ. Ambele apartamente unde am stat – locuința temporară din Downtown și apartamentul din Richmond unde locuiesc în prezent – au bazin de înot pentru locatari, așa că inițial am înotat mult. Doar că atunci când ne-am mutat clădirea abia fusese construită și aveam mai puțini vecini. Cu timpul s-au mutat mulți aici și bazinul de înot e mai tot timpul plin. Și mie nu-mi place așa, să înot în aglomerație.

Așa că primăvara mi-am luat bicicletă. Am început cu plimbări mai mici, prin zonă, și am ajuns la excursii destul de lungi (câteva zeci de kilometri). Plus că vara am mers la servici cu bicicleta. Problema aici e cu vremea. De multe ori plouă. De multe ori e înorat și arată ca și cum ploaia ar putea să înceapă din clipă în clipă. Așa că în ultima vreme am mai rărit și plimbările cu bicicleta.

Dar când m-am făcut cu adevărat sportiv a fost pe la mijlocul lui august, după ce m-am suit pe cântar. Am zis că nu se mai poate așa. Ca norocul, avem și o mică sală de fitness în clădire. Nu mare lucru – 2 ellipticals, 2 biciclete, 2 treadmills și un aparat cu greutăți unde se pot face diferite chestii. Așa că am început să fac cardio 30 de minute aproape în fiecare zi și m-am apucat să “trag de fiare”. Cu rezultate.

Și după ce m-am făcut așa sportiv, ca să mai alung din monotonie și să fac ceva ce mi-am dorit de câțiva ani dar n-am găsit unde, am căutat un curs de mixed martial arts. Și, ca norocul, e o sală la 5 minute de unde stau. Așa că de o lună merg de trei ori pe săptămână la o oră de Muay Thai și o oră Brazilian Jiu Jitsu. Și mă întorc cu o grămadă de vânătăi de fiecare dată, dar îmi place la nebunie.

Cel mai greu este primul pas. Mobilizarea. Dacă ești obișnuit să stai cu burta în sus la televizor, ți se pare criminal să mergi să înoți/pedalezi/alergi. Ți se pare obositor (vorbesc din experiență). Dar după ce încerci de câteva ori devine o plăcere. Cel puțin așa s-a întâmplat pentru mine. Da, am o zi super obositoare și stresantă la servici. Dar uit de toate grijile într-o oră de BJJ – când ești prins într-un chokehold nu te mai gândești la deadlines și alte cele. Sau se mai întâmplă să lucrez de acasă la cine știe ce și când nu iese nimic, dau o fugă până jos și alerg jumătate de oră pe treadmill. Revin fresh. Așa că pot spune că nu e greu. Trebuie doar încercat.