Installing a Windows Service without MSI

30 July 2009

Recently I had to write a Windows service in C# and encountered an interesting issue: seems that, due to our setup, I was not allowed to use msi packages to install it.

This post doesn’t focus on writing Windows services, as there are numerous sources online that talk about this. For example you can take a look at this article on CodeProject: http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx

The interesting thing is that all articles on services end with installation through msi – you write the service installer class decorated with the RunInstaller attribute and use a custom action on the setup project that automatically takes care of running the installation code.

But, as I said, I couldn’t use such a setup project. After some more searching, I found another interesting article that suggested using the InstallUtil application that comes with .NET Framework: http://www.codeproject.com/KB/cs/DynWinServiceInstallUtil.aspx

Seems that the application does pretty much the same thing as a deployment through msi would do, namely it runs the required code in the RunInstaller class. But I was reluctant do depend on a batch file for deployment. Now considering that the RunInstaller attribute is implemented in the framework, I thought there also must be a class that interprets this attribute. Seems I was right: I found the AssemblyInstaller class in the System.Configuration.Install namespace.

The AssemblyInstaller constructor takes as argument an assembly and a set of command line options and provides the same methods available through msi deployment – Install, Commit, Rollback and Uninstall. More information on the AssemblyInstaller can be found on MSDN: http://msdn.microsoft.com/en-us/library/system.configuration.install.assemblyinstaller.aspx

I suggest this approach in case msi deployment is unavailable, the advantage over using a batch file being that it is completely independent of external applications (except the .NET Framework, of course), any custom deployment code can be added and you also get .NET exception handling for any errors that might occur.


Căldură mare

30 July 2009

E o caniculă teribilă aici. Noroc cu aerul condiționat că dacă nu nu știu ce ne făceam. De pe la 9-10 până seara pe la 6 nu ai ce căuta afară din casă. Și stau eu așa și mă întreb: WTF? Adică înainte să vin aici, când mă gândeam la Canada, îmi imaginam păduri de brazi acoperite de zăpadă, reni și chestii din astea. Probabil că eu îmi imaginam nordul Canadei.

Oricum, anii trecuție era mai nasol. Mai ales în Timișoara, fără aer condiționat, cu omniprezenetel termopane și cu geam spre sud. Aici măcar în casă e mai bine. Și bere rece pot cumpăra de la doi pași.

Ăștia de tot vorbesc de încălzirea globablă, they’re on to something. Sigur. :)


La dentist

28 July 2009

Astăzi mi-am luat în sfârșit inima în dinți și m-am dus la dentist. Bine, doar să-mi fac programare deocamdată, dar și asta a necesitat foarte mult curaj. E o dentistă româncă aici în Richmond. Mi-au recomandat-o mai demult doi colegi. Și cum alți dentiști de aici nici nu cunosc și nici nu mi-au fost recomandați, am zis că îmi fac programarea acolo. Poate, dacă vede că sunt și eu român, mă chinuie mai puțin.

Așa că azi m-am dus la cabinet. Acolo asistenta m-a informat că doamna doctor e plecată în concediu de maternitate până pe la sfârșitul anului. Îi ține un chinez locul. Ce era să fac? Dacă tot mă dor măselele și dacă tot eram în cabinet la dentist, mi-am făcut programare. Peste vreo lună.

Și pe urmă m-a apucat frica. Dentist chinez. Am în cap o imagine cu mine urlând de durere în scaun și spunându-i să se oprească și el continuând, rânjind și dând din cap că da – ca vânzătorii care nu pricep o boabă de engleză. Pe cuvânt că dacă mi se pare ceva dubios – dacă vorbește ciudat sau cu acent sau nu înțelege ceva când îi zic – am fugit de acolo. Pe geam.


Who Watches the Watchmen?

26 July 2009

I do. E atât de cald afară că nu poți decât să stai în casă și să-ți găsești ocupații domestice, sub protecția sfântului aer condiționat. Ieri am fost în Downtown. Era Celebration of Light, cu focuri de artificii și chestii. Din păcate ploaia a început înainte de artificii, așa că a trebuit să renunțăm la spectacol și să ne întoarcem acasă.

Dar măcar nu am fost degeaba până acolo. Pe lângă un butter chicken grozav pe care l-am mâncat la India Gate, am fost și la cumpărături. Am cumpărat Watchmen pe blue ray, pentru că l-am văzut la cinematograf și mi s-a părut bestial. Așa că în momentul de față beau gin tonic cu gheață și îl revăd în HD.

Am fost și la Chapters pe Robson, Chapters fiind cel mai mare lanț de librării de aici, cel de pe Robson fiind cel mai mare magazin din zonă. Asta pentru că am terminat deja 1984 – l-am citit, cum se spune, pe nerăsuflate – și astăzi voi termina probabil și A Scanner Darkly. După ce am pierdut vremea citind seria Horus Heresy, zilele astea mi-am adus aminte ce plăcut e să citești un “clasic”. Adică o carte atât de bună încât ți-e greu să o lași din mână. Nu că toate cărțile din Horus Heresy ar fi fost proaste, sunt vreo 2-3 bune, dar majoritatea nu se compară cu un SF de top. Așa că am fost la Chapters și mi-am mai cumpărat The Forge of God și Anvil of Stars, ambele de Greg Bear, un alt greu al genului.

Așa că am ce citi, am ce vedea, am ce bea și am aer condiționat. Sunt pregătit să lupt cu canicula.


O jumătate de zi în București

24 July 2009

Ia să particip și la un concurs. Nu de alta dar am câteva amintiri din București și este o ocazie bună să le povestesc. Așa că iată principalele motive pentru care e mișto să locuiești în București:

Nivel de trai ridicat

Povestea are loc în vara lui 2007, când a trebuit să merg la ambasada SUA pentru viză, ca să pot pleca în internship. Am fost cu un tren care ajungea la 6 dimineața și cum ambasada se deschidea doar la 9, am decis să merg pe jos din Gara de Nord până în Piața Universității. Da, știu, e mult de mers dar mie îmi place să umblu pe jos, aveam 3 ore de pierdut și m-am gândit că nu îmi dă nimeni în cap pentru că și infractorii dorm la 6 dimineața. Zis și făcut – am pornit la drum. Ce m-a impresionat cel mai mult – pe lângă blocurile cenușii și pe lângă gunoi – a fost că de la Romană până în Universității, la fiecare colț de stradă dormea un boschetar în mijlocul trotuarului cu capul pe bordură. Pe cuvânt. Am văzut 10 pe puțin. Și da, boschetari sunt peste tot, și în Timișoara, și în Vancouver și cam peste tot pe unde am fost dar nici unde nu i-am văzut dormind nonșalant în centrul orașului, în mijlocul trotuarului.

Oameni cinstiți…

Tot atunci am văzut și spiritul de afacerist al bucureștenilor. Tocmai se trecuse la leul greu și, dacă mai țineți minte, toată lumea era obișnuită să taie doar 3 zerouri din sume, nu patru. 10 mii de lei vechi erau 10 lei nu 1 leu. Ei bine taximetriștii veniseră cu o super-ofertă, astfel că pe o mulțime de taxiuri vedeam scris “Numai 8,99 pe km”. Dacă nu erai atent credeai că sunt 8990 și te trezeai că plătești aproape 100000.

A, și trebuie să povestesc despre micul ecosistem economic construit în jurul ambasadei americane. În primul rând, în ambasadă nu ai voie să intri cu ghizdan sau geantă. Desigur, afli asta doar după ce ajungi înăuntru. Și cum o mulțime de oameni veniseră, ca mine, doar pentru viză, cu un sadwich și un tricou de schimb în ghiozdan (tricou care, se pare, amenință securitate Statelor Unite), ne-am trezit într-o situație aiurea. Dar am rezolvat rapid. Am ieșit din ambasadă și m-a salvat nenea care servea cafea la chioșcul de lângă: se oferea să aibă grijă de ghiozdane pentru doar 8 lei. Bun. I-am lăsat ghiozdanul, 8 lei, și m-am întors în ambasadă. Înăuntru, altă surpriză – pozele de pașaport nu erau mărimea potrivită. Ies iarăși din ambasadă și, surpriză, chiar în față era parcată o dubiță în care un nenea cumsecade îți făcea poze instant, mărimea care trebuie. Pentru doar vreo 14 lei.

Probabil că era și o dubiță cu un nenea care îți pregătea cererea de viză dacă aveai nevoie dar, din fericire, asta îmi era completată cum trebuie.

…și ospitalieri

Ce am scris mai sus s-a petrecut în doar câteva ore. Asta e impresia pe care o lasă capitala unui provincial ca mine. Mor când aud “provincial” și ”din provincie”, spuse cu aroganța aia specifică. De genul “A, ești din provincie”, adică “N-am ce cu tine” sau “Asta explică multe”. Nu contează că vii din Cucuieții din Deal sau din Cluj sau Timișoara. Tot provincial ești și tot n-are ce cu tine. Că deh, ce știi tu. Nu ești de acolo, ești înapoiat.

Trafic fluid

Inițial am zis că mă abțin de la a scrie și despre trafic pentru că toată lumea, până și provincialii, știu ce fluid este, cât de politicos și civilizat se conduce și cu ce strictețe sunt respecate regulile. În ziua respectivă, chiar dacă nu am fost cu mașina, tot am avut ocazia să observ asta. Pentru că din Universității m-am dus până la sediul Microsoft să mă întâlnesc cu cineva și pur și simplu nu aveam loc să merg pe trotuar. Să nu mai spun de trecut strada. Să nu mai spun de trecut strada pe o trecere de pietoni dar unde nu este semafor. Și asta era într-o zi lucrătoare, pe la ora 11. Când te-ai aștepta ca oamenii să fie, totuși, la muncă.

Gata, mă opresc aici. Deși am fost de destule ori în București și aș avea destule de povestit. De mult mi-am propus să nu mai ajung acolo decât dacă e neapărat necesar. Și când e neapărat necesar, să rezolv ce am de rezolvat cât mai repede și să plec. Cică “Micul Paris”. Pffff


The Nightly WTF

23 July 2009

De ce nu e bine să faci debugging noaptea: Am o aplicație care, printre altele, cheamă niște stored procedures de pe mai multe thread-uri. Aseară am descoperit un bug în componenta de logging – log-urile care trebuiau să fie super detaliate erau niște fișiere goale. Așa că m-am apucat vitejește de depanat. Am găsit problema, am reparat-o și i-am dat drumul la aplicație să văd dacă merge. Surpriză – logul conținea excepția System.InvalidOperationException: Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached pentru fiecare thread care apela un stored procedure.

Excepția înseamnă, de obicei, că un obiect SqlConnection nu este închis cum trebuie (cu SqlConnection.Close()). Și mă apuc să sap prin cod – unde las eu conexiuni deschise? Nici unde. Fiecare conexiune pe care o deschideam era urmată de un try-finally și în blocul finally închideam conexiunea. Ce naiba? Mă uit pe un alt calculator unde rula aplicația – acolo nu era nicio problemă. Încep să mă gândesc ce am putut să stric lucrând la componenta de logging. Și totuși, de ce rămân conexiunile la baza de date deschise, dacă eu le închid pe toate? Panică.

Într-un final am rezolvat misterul – îmi schimbasem parola de curând și serviciul SQL Server, care rula sub contul meu, nu a mai putut face log in așa că era oprit. Eroarea nu o primeam pentru că erau prea multe conexiuni deschise, o primeam pentru că nu se putea efectua nicio conexiune. Și așa am pierdut eu cam o oră azi noapte, ca să depanez nimic.


De citit

23 July 2009

Deadline-ul e mâine așa că pot să mă apuc din nou de blogat pe idea că ce n-am terminat de făcut până azi nu mai termin :) Încep cu cărțile, pentru că de citit nu m-am lăsat, chiar dacă nu am mai avut timp nici de bicicletă, nici de șah, nici de WH40K…

Am terminat The Call of Cthulhu and Other Weird Stories, de H. P. Lovecraft. Super tare. Culoarea căzută din cer e o povestire pe care am citit-o acum mult, mult timp într-un Almanah Anticipația și am recitit-o cu mare plăcere. E una dintre cele mai bune povestiri a autorului și o recomand cu căldură.

Am citit și Agents of Artifice, fantasy din universul Magic the Gathering. Din nou am doar cuvinte de laudă, lectura m-a captivat. Se pare că Wizards of the Coast angajează niște autori buni pentru romanele lor – până acum nu m-a dezamăgit nicio carte. E drept, nu am citit decât Agents of Artifice și romanele din seria Timespiral (Timespiral, Planar Chaos și Future Sight). Nu știu exact cât de bine le-ar înțelege cineva care nu are tangență cu jocul dar mi-e mi-au plăcut foarte mult.

Nu pot spune același lucru despre Tales of Heresy, antologia de povestiri din universul Warhammer. Am citit-o și pe asta ca să pot spune că am terminat cu seria Horus Heresy, cel puțin până apare următorul roman, dar nu am fost foarte încântat. Aici chiar se simt diferențele între autori. E hit or miss cum se zice. Unele bune, unele proaste, și aici mă refer atât la povestirile din antologie cât și în general, la romanele din serie.

Rămas fără cărți, m-am apucat să recitesc povestirile lui Stephen King din Just After Sunset. Și așa, după câteva povestiri, am realizat că trebuie să merg să caut ceva cărți noi.

Inițial am zis că ar trebui să mai citesc ceva tehnic dar am parte de destul tehnic la lucru în ultima vreme, așa că am căutat ceva recreațional. Fiind puțin sătul de autori obscuri, am zis să merg la sigur, așa că am luat două clasice: A Scanner Darkly de Philip K. Dick și 1984 de George Orwell. Philip K. Dick e un autor foarte bun care, după cum cred ca am mai scris, mă enervează la culme. Pentru că niciodată nu îți poți da seama la sfârșitul unei povești cât a fost real și cât a fost iluzie. Am citit vreo 4-5 romane scrise de el și cam în toate e așa. Dar acum am avut chef să mă enervez puțin :) Oricum, am văzut și filmul făcut după carte. E o animație în genul Waking Life. Și dacă tot e vorba de văzut filmul, 1984 l-am văzut de vreo 2-3 ori și m-am gândit că ar fi cazul să citesc și cartea, recunoscută ca un clasic al genului – țineți cont că omul a inventat, printre altele, conceptul de Big Brother. Și fiindcă tocmai (re)citisem câteva povestiri de Stephen King, am cumpărat și Nightmares and Dreamscapes, altă antologie. Așa că acum am ce citi.


Will Be Back Soon…

18 July 2009

După cum ziceam și acum vreo două posturi, am un deadline. N-am mai avut timp să scriu. N-am mai avut timp de mai nimic. În orice caz, deadline-ul e vinerea viitoare. Pe urmă mă întorc cu posturi mai dese și mai serioase. Am și niște posturi tehnice de scris. Ne auzim în curând. Back to work.


Cyanide and Happiness x 3

13 July 2009

Cyanide and Happiness, a daily webcomic

Cyanide and Happiness, a daily webcomic

Cyanide and Happiness, a daily webcomic

Cyanide & Happiness @ Explosm.net


Plants vs. Zombies

9 July 2009

plants-vs-zombies

Nota 10 meseriașilor de la PopCap Games. Fără să mai amintesc de Zuma, Mummy Maze și alte nebunii, după ce mi-am mâncat câteva săptămâni cu Peggle vara trecută, am descoperit acum Plants vs. Zombies, cel mai tare tower defense ever.

Zombie vor să eat your brains și tu te aperi plantând tot felul de flori, fructe și legume ca fasolea care trage cu boabe, cireșele care explodează sau dovleceii care strivesc zombies când aceștia se apropie. E bestial jocul.