Planuri de vacanță

29 June 2009

De mâine seară încep mini-vacanța. Chiar am nevoie. Săptămâna trecută am avut niște chestii urgente de făcut de m-a prins vineri seara la niște prieteni la cină cu laptopul pe masă. Corporatist, ce mai. Bine, nu obișnuiesc să fac așa și nici serviciul nu e atât de solicitant de obicei dar când trebuie, trebuie. În fine. Vreau să spun că nu o să-mi strice 5 zile libere.

Într-una din ele – una lucrătoare – joi sau vineri (că miercuri e ziua Canadei), vreau să mă trezesc dis-de-dimineață și să merg la mall sau undeva să beau cafeaua și să mă uit la oameni cum merg la servici – adormiți, triști. Asta așa, de pe la vreo 8:30 până pe la 9:30, 10. Pe urmă am de gând să mă întorc acasă și să mă culc.


Transformers

29 June 2009

Am văzut noul Transformers. Bine, l-am văzut săptămâna trecută, în prima zi în care a apărut la cinematograf. Și asta nu pentru că aș fi eu mare fan Transformers, ci pentru că nu prea mai am la ce mă uita. Așa că am fost, după cum ziceam, în prima zi în care a apărut în cinematograf. Mare greșeală. Era plin ochi. Pe cuvânt că n-am mai pomenit așa ceva. Adică de când văd filme aici, niciodată nu a fost sala atât de plină. Eu, soția, și toată puștimea din Richmond.

Filmul a fost, din nou, așa cum mă așteptam: roboți care se bat. Nu m-am dus nici pentru poveste, nici pentru actori, și bine am făcut. Ca și Terminator, dacă vă pasionează roboții, e fain – dacă nu, lasă de dorit.

Și dacă tot mi-am adus aminte să scriu despre filme, am mai văzut acum vreo două-trei săptămâni Drag Me to Hell. Indiferent ce citiți sau ce auziți, să știți că Drag Me to Hell e în primul rând comedie, abia apoi horror. Pe mine m-a distrat tare. A fost un film drăguț, puțin scârbos pe alocuri dar mai bun decât multe altele și foarte amuzant.

Din păcate, cam atât. Nu au apărut multe filme care să merite să fie văzute în ultima vreme. Noroc că am colecția personală de DVD-uri și pot să revăd oricând Goodfellas, Casino, Scarface sau American Gangster. Încă aștept cu nerăbdare Inglorious Bastards.


Vacanță!

23 June 2009

În sfârșit o zi de marți care ține cu mine :) Miercuri (nu mâine, săptămâna viitoare) e ziua Canadei – liberă prin lege. Și ca norocul, am primit două zile libere și de la Microsoft, cu ocazia releas-ului din primăvară, zile pe care le putem lua oricând până în august. Le iau joi și vineri săptămâna viitoare. Așa că visul meu se împlinește – săptămână de lucru cu două zile lucrătoare și cinci libere. O, dacă ar fi așa tot timpul…


Din microbuz

23 June 2009

Acum, cât bicicleta e la reparat, sunt nevoit să merg din nou la lucru cu microbuzul. Și văd pe geam niște chestii foarte interesante.

Am văzut muncitori pe șantier. Care chiar munceau. Înainte de ora 8. În România n-am văzut niciodată muncitori pe șantier înainte de ora 8. Și extrem de rar muncitori pe șantier care chiar să muncească, asta și după ora 8.

Am văzut un boschetar începător. De unde știu că era boschetar? Pentru că nu arăta grozav de curat și împingea un căruț din ăla de supermarket, cum e moda la boschetari aici. De unde știu că era începător? Pentru că nu avea mai nimic în căruțul respectiv – doar o sticlă. Boschetarii cu vechime au zeci de pungi și gunoaie în căruciuoare. Probabil că tipul abia se apucase. Îi doresc succes!

Am văzut - și văd de fiecare dată când merg cu microbuzul – o trupă de chinezi bătrâni exersând cu niște săbii într-un parc. Săbii din alea ca-n filmele cu kung-fu – cu lama lată și un moț roșu prins de mâner. Îi văd zilnic, și când merg cu naveta de la 7:30 și când merg cu cea de la 9. Deci în Richmond există cel puțin 20 de oameni care exersează cel puțin de luni până vineri, cel puțin o oră jumate, cu săbii. Înfricoșător.


Camera cu oi

22 June 2009

Din câte știu eu nu-mi încalc NDA-ul dacă vorbesc despre ship room, din moment ce nu este o chestie secretă în sine. Ship room este un meeting în care se decide ce anume va fi lansat în viitor și ce nu, de unde și numele de ship. Câteodată trebuie să particip și eu la aceste meetinguri. Nu tot timpul pentru că nu mă ocup de partea de plănuire dar în momentul în care e vorba despre ceva la care lucrez sau am lucrat personal, atunci trebuie să fiu prezent să dau explicații și să răspund la întrebări.

Și așa mă plângeam eu într-o searcă că trebuie să mă trezesc devreme să merg la ship room (normal, meetingurile sunt ori prea devreme, ori prea târziu, ori la ora prânzului). Soția, nefiind familiară cu termenul, a înțeles sheep room. Și se mira, pe bună dreptate, de unde o cameră cu oi în campusul Microsoft?

Pe mine m-a amuzat teribil chestia asta pentru că am o imaginație bogată și imediat am încercat să vizualizez: birouri, săli de ședințe și, printre ele, o încăpere plină cu oi. De ce s-ar aduna un grup de project manageri și programatori într-o cameră cu oi? Ce s-ar decide în camera respectivă? Oricum, de atunci încolo așa a rămas când e necesară prezența mea – ”Trebuie să merg la camera cu oi”.


Bradul – epilog

21 June 2009

Țineți minte povestea cu bradul de Crăciun? Cum l-am luat înainte de ajun, cum a stat de sărbători în apartament, pe urmă s-a mutat pe balcon unde a stat până în martie când în sfârșit mi-am făcut curaj să-l tai bucăți și să-l pun în plase? Și cum n-avem voie să-l aruncăm la gunoi iar centrul de reciclat e la vreo 2 kilometri de noi?

Ei bine bradul a stat în plase pe balcon până de curând, când ne-am cumpărat șezlonguri. Apoi nu am mai avut loc de el acolo așa că plasele s-au mutat în sufragerie. Vreau să mă laud că ieri, în sfârșit, am încheiat ultimul capitol din lunga poveste a bradului: mi-am făcut curaj, am luat plasele și am tras o plimbare până la reciclare. În principal pentru că bicicleta e la magazin acum, pentru un tune-up gratuit și ca să-mi repare pana de marți. Așa că drumeția de sâmbătă am făcut-o pe jos. Și am scăpat de brad. În iunie. Privirile oamenilor de pe stradă care mă vedeau cărând un brad? Priceless :)


The Null Object Pattern

18 June 2009

The null object represents an object that does not exist. I wanted to write a post about this pattern for some time now but I just didn’t have the inspiration to come up with a good example. Fortunately, I wrote some code that needed to use just this pattern at work. Basically we had a map file which stored some additional information which was needed for reporting. Let’s call it customer map file. Thought not used by the system itself, which just uses a CustomerID, the map file contained information on the customer which had to be used in the reports. Each row in the map file contains the following tab separated values: CustomerId, CustomerName, CustomerAddress. So I wrote a class to represent a row in the file:

class MapRow
{
    private int customerId;
    private string customerName;
    private string customerAddress;

    public MapRow(string lineOfText)
    {
        // Parse a line from map file and set private members
        ...
    }

    public int CustomerId
    {
        get
        {
            return customerId;
        }
    }

    public string CustomerName
    {
        get
        {
            return customerName;
        }
    }

    public string CustomerAddress
    {
        get
        {
            return customerAddress;
        }
    }
}

Then I wrote another class to open and read the file, which wraps a dictionary and returns MapRow objects based on CustomerId:

class MapFile
{
    private Dictionary mapRows;

    public MapFile(string fileName)
    {
        // Read map file and for each row create a new MapRow then add it to the dictionary (key is CustomerId)
        ...
    }

    public MapRow this[int customerId]
    {
        get
        {
            return mapRows[customerId];
        }
    }
}

In case you are wondering, the last block of code implements an indexer on the class and can be used like:

MapFile mapFile = new MapFile("CustomerMapFile.tsv");

// Get map data for CustomerId 1
MapRow row = mapFile[1];

So, using the customerId from the system, I started generating reports by calling mapFile[customerId].CustomerName and mapFile[customerId].CustomerAddress when I realized that, for whatever reason, some customers don’t appear in the map file.

In the current implementation, the dictionary throws an exception in this case – key not found. The bad way to go about it is this:

public MapRow this[int customerId]
{
    get
    {
        if (mapRows.ContainsKey(customerId))
        {
            return mapRows[customerId];
        }

        return null;
    }
}

Why would this be the bad way? Because all code that indexes MapRow will have to check that the return object is not null. Let’s say that reporting does something like

reportStream.WriteLine("Name: {0}, Address: {1}",
    mapFile[customerId].CustomerName,
    mapFile[customerId].CustomerAddress);

Now we would have to refactor to this:

MapRow row = mapFile[customerId];

if (row != null)
{
    reportStream.WriteLine("Name: {0}, Address: {1}", row.CustomerName, row.CustomerAddress);
}
else
{
    reportStream.WriteLine("Name: Not Available, Address: Not Available");
}

And just imagine how the code gets if the map is used in multiple places. The solution is to use a null object which represents unavailable customer data. We can add it to the MapRow class as follows:

private static MapRow nullRow = new MapRow("-1\tNot Available\tNot Available");

public static MapRow NullRow
{
    get
    {
        return nullRow;
    }
}

And the indexer becomes:

public MapRow this[int customerId]
{
    get
    {
        if (mapRows.ContainsKey(customerId))
        {
            return mapRows[customerId];
        }

        return MapRow.NullRow;
    }
}

Now we can again use the simple

reportStream.WriteLine("Name: {0}, Address: {1}", row.CustomerName, row.CustomerAddress);

Whenever you find yourself checking again and again for nulls, you should consider using the null object pattern instead. Implementations of it appear throughout the .NET Framework. For example, String.Empty represents an empty string, while StreamWriter.Null represents a strem to which one can write but the written data doesn’t go anywhere.


Marți e fail day

18 June 2009

Nu sunt superstițios de fel dar zău că încep să cred chestia aia cu marți și trei ceasuri rele. Am mai scris despre o zi grozavă de marți aici. Nici nu se compară cu ce s-a întâmplat săptămâna asta.

Am fost, viteaz, cu bicicleta la lucru. Îmi place foarte mult să merg cu bicicleta la lucru pentru că nu depind de orarul microbuzului. De exemplu, prima navetă spre casă pleacă la 5:15. Eu, fiind puțin nedormit, m-am hotărât să plec la 4:30 de la lucru. Am oprit calculatoarele, am împachetat ghiozdanul, mi-am pus casca pe cap și am pus mâna pe bicicletă. Și am constatat că am pană la roata din spate. Nu știu exact cum – dimineața când m-am dus la lucru, roata nu avea nimic.

Bun. Am despachetat ghiozdanul, am pornit la loc calculatoarele, am tras o țigară și m-am apucat să aștept ora 5:15 lucrez. Vine ora de plecare, merg la microbuz, încarc bicicleta și pornim spre casă. Și mă iau la povești cu niște colegi români. Și încep eu să mă plâng în sus și-n jos că am făcut pană și cum la magazinul de biciclete e închis pe când vin de la lucru și că doar în weekend voi putea merge și că e vreme faină și e păcat că nu mai pot bicicla. Ce mai, ultimul ghinionist.

Doar că povestea nu se gată aici. Ajung în Richmond, cobor din mașină, descarc bicicleta și constat că nu mai am verigheta pe deget. Rog șoferul să mă aștepte puțin, arunc bicicleta pe trotuar și urc să caut – pe scaun, sub scaun. Nimic. Mă uit în ghizdan, mă uit peste tot, nici urmă de verighetă. Adevărul e că mi-e puțin cam largă dar tocmai din acest motiv nu obișnuiesc să mă joc cu ea. Clar mi-a căzut de pe deget când mă luptam cu bicicleta. Cine știe pe unde o fi.

Am ajuns acasă supărat, mi-am înecat amarul într-un bullfrog și am decis că ziua de marți are ceva împotriva mea. Păi în condițiile astea cum să nu fii superstițios? Verigheta am găsit-o a doua zi pe birou. Pentru că tanti care face curățenie e cinstită și nu a luat-o și pentru că era miercuri nu marți.


Bănci și telefoane

16 June 2009

M-am gândit să scriu una bună și una mai puțin bună despre Canada. Serviciile bancare și serviciile de telefonie mobilă. Încep cu cea bună:

Bănci

Venind din România, nici nu-ți vine să crezi ce servicii bancare sunt în Canada și în State. Păi în primul rând nu sunt comisioane pe mai nimic. Nici vorbă să îți ia banca bani dacă vrei să te uiți cât mai ai în cont sau să scoți cash de la bancomat. Să nu mai zic de comision de administrare sau comision pentru online banking sau te miri ce alte comisioane se mai percep în România.

Și dacă tot am pomenit de online banking, trebuie să spun că aici este, într-adevăr, un serviciu excelent. Și nu neapărat pentru că pot să-mi transfer bani dintr-un cont în altul din două clickuri (fără comision). Cel mai mult m-a impresionat sistemul de plătit facturi pus la dispoziție. Eu de exemplu trebuie să plătesc lunar cablul TV și o dată la două luni curentul electric. Abonamentele astea au asociate un număr de cont în care pot transfera banii online. Cam așa se plătesc facturile aici. Încă mi-e scârbă când îmi aduc aminte cum stăteam la cozi în Timișoara la curent și la cablu cu pensionari care se înjurau că și-au furat unul altuia rândul.

Așa că serviciile bancare, nota 10 – online banking cum trebuie să fie în mileniul trei (la bancă merg doar dacă trebuie să încasez cecuri) și fără comisioane.

Telefoane

Cu telefoanele mobile treaba stă puțin altfel. Mi se par foarte exagerate tarifele și mai ales serviciile pe care încasează bani. Adică plătești când suni și cânt trimiți SMS-uri. Până aici e normal. Dar plătești și când ești sunat și când primești SMS-uri. Mai puțin ce-i drept, dar totuși. Mi se pare că nu prea are sens.

Altă chestie pe care a observat-o soția a fost că se taxează o sumă lunar ca să poți suna gratis la 911. Adică serviciul gratis de urgență e gratis pentru că plătești lunar nu-știu-cât.

Și pre-pay aici e cam așa: minim 20$ și trebuie să-i consumi într-o lună sau rămâi fără ei. Sau, ca să prelungești perioada în care poți folosi creditul, mai trebuie să plătești la sfârșitul lunii încă minim 20$. Și nici nu te anunță exact când rămâi fără bani. Primești un mesaj ambiguu, de genul “creditul va expira curând” și dacă nu ești pe fază rămâi fără el.

Așa că eu nu mai am mobil de când am ajuns aici. E mai ieftin liniște așa.


Granville Island

14 June 2009

Sâmbăta asta m-am biciclat până pe Granville Island. De data asta traseul nu a fost foarte pitoresc – am admirat doar traficul de pe Granville Street, dar a meritat pentru Downtown văzut de pe insulă:

granvilleisland1

granvilleisland2

granvilleisland3