De ce vreau iPhone4S de la Vodafone?

Ca urmare a provocarii de aici, raspunsul meu e urmatorul: vreau sa imi spuna Siri o poveste in fiecare seara. Lasand gluma la o parte, cam asta ar fi principalul motiv pentru care mi-as schimba telefonul curent (iPhone 4, cumparat de la Vodafone in Ianuarie): asistentul personal.

Mai sint citeva functii de care m-as bucura: camera de 8MP, filmarea 1080p si nu in ultimul rind procesorul dual core A5. Ar mai fi de mentionat si viteza modemului 3G de 14.4MBps dar cum majoritatea timpului mi-l petrec la serviciu unde am WiFi atunci nu e chiar relevant pentru mine.

Una peste alta un update major, dar nu un telefon nou asa cum se asteptau fanii asta-primavara.

A.. si de ce vreau tot de la Vodafone? Pentru ca sint abonat VDF din 1997 🙂 fara alte comentarii.

Reabilitare termică

Primaria Sectorului 3 anunţă că până pe 31 Ianuarie se pot depune cererile pentru reabilitarea termică a blocurilor. Costurile sunt astfel reduse cu 67%.

Mă uit frumos pe situl primăriei, www.sector3primarie.ro şi apoi încerc să downloadez formularele necesare. Dar nu funcţionează… Încerc la toate formularele care au link pe site. Nici unul nu merge. De ce? Uite de-asta:

http://servregist/portal/bucuresti/ps3/portal.nsf/E24A2DDA65536B63C22572DE002F95E5/$FILE/cerere%20de%20inscriere.JPG

Observ că băieţii de la Sobis nu prea le au cu link-urile relative ca să se vadă corect numele domeniului web în loc de numele serverului unde e instalată aplicaţia. Ori nu au configurat bine prin Lotusul ăla. În mod normal, link-ul de mai sus ar fi trebuit să fie:

http://www.sector3primarie.ro/portal/bucuresti/ps3/portal.nsf/E24A2DDA65536B63C22572DE002F95E5/$FILE/cerere%20de%20inscriere.JPG

… şi funcţionează. Mă întreb dacă a testat cineva chestia asta după ce a fost publicat articolul din CMS.

A… cât era de complicat să fi făcut nişte fişiere PDF în loc de panaramele alea de hârtii scanate in format jpeg?

Mic îndrumar de LEFT JOIN cu LINQ

Nu sunt rare cazurile în care avem nevoie de un LEFT JOIN prin selecturile de la casa omului şi deoarece LINQ nu are operator LEFT JOIN dedicat, trebuie rezovată problema într-un fel…

Deci, dacă ai nevoie de un SELECT de genul:

SELECT

t0.ID_REC_PROJECT_TARGET AS _targetId, t0.ID_PERSON AS _personId, t0.ID_PROJECT AS _projectId, t5.COMPANY_NAME AS _company,

t4.POSITION AS _position, t2.VALUE AS _priority, t3.VALUE AS _source, t0.COMMENT AS _comments

FROM

dbo.REC_PROJECT_TARGET AS t0

INNER JOIN dbo.PERSON AS t1 ON t0.ID_PERSON = t1.ID_PERSON

INNER JOIN dbo.REC_LOOKUP AS t2 ON t0.ID_PRIORITY = t2.ID_REC_LOOKUP

INNER JOIN dbo.REC_LOOKUP AS t3 ON t0.ID_SOURCE = t3.ID_REC_LOOKUP

LEFT OUTER JOIN dbo.PERSON_WORKEXPERIENCE AS t4 ON (t4.IS_PRESENT = 1) AND (t1.ID_PERSON = t4.ID_PERSON)

LEFT OUTER JOIN dbo.COMPANY AS t5 ON t4.ID_COMPANY = (t5.ID_COMPANY)

El se traduce în LINQ în felul următor:

from t in dac.REC_PROJECT_TARGETs

join p in dac.PERSONs on t.ID_PERSON equals p.ID_PERSON

join lp in dac.REC_LOOKUPs on t.ID_PRIORITY equals lp.ID_REC_LOOKUP

join ls in dac.REC_LOOKUPs on t.ID_SOURCE equals ls.ID_REC_LOOKUP

join wp in dac.PERSON_WORKEXPERIENCEs on p.ID_PERSON equals wp.ID_PERSON into wpl

from wpo in wpl.Where(wpo => wpo.IS_PRESENT).DefaultIfEmpty()

join co in dac.COMPANies on wpo.ID_COMPANY equals co.ID_COMPANY into cpu

from c in cpu.DefaultIfEmpty()

where t.ID_PROJECT == projectId

select new {t.ID_REC_PROJECT_TARGET,

t.ID_PERSON,

t.ID_PROJECT,

c.COMPANY_NAME,

wpo.POSITION,

lp.VALUE,

ls.VALUE,

t.COMMENT}

Partea interesantă (cea cu LEFT JOIN in LINQ) este următoarea:

LEFT OUTER JOIN dbo.PERSON_WORKEXPERIENCE AS t4 ON (t4.IS_PRESENT = 1) AND (t1.ID_PERSON = t4.ID_PERSON)

se traduce:

join wp in dac.PERSON_WORKEXPERIENCEs on p.ID_PERSON equals wp.ID_PERSON into wpl from wpo in wpl.Where(wpo => wpo.IS_PRESENT).DefaultIfEmpty()

Acuma, dacă vrem să complicăm lucrurile puţin, am nevoie sa imi aduc doar acele date care nu au referinte prin alte tabele, adică:

SELECT

t0.ID_REC_PROJECT_TARGET AS _targetId, t0.ID_PERSON AS _personId, t0.ID_PROJECT AS _projectId, t5.COMPANY_NAME AS _company,

t4.POSITION AS _position, t2.VALUE AS _priority, t3.VALUE AS _source, t0.COMMENT AS _comments

FROM dbo.REC_PROJECT_TARGET AS t0

INNER JOIN dbo.PERSON AS t1 ON t0.ID_PERSON = t1.ID_PERSON

INNER JOIN dbo.REC_LOOKUP AS t2 ON t0.ID_PRIORITY = t2.ID_REC_LOOKUP

INNER JOIN dbo.REC_LOOKUP AS t3 ON t0.ID_SOURCE = t3.ID_REC_LOOKUP

LEFT OUTER JOIN dbo.PERSON_WORKEXPERIENCE AS t4 ON (t4.IS_PRESENT = 1) AND (t1.ID_PERSON = t4.ID_PERSON)

LEFT OUTER JOIN dbo.COMPANY AS t5 ON t4.ID_COMPANY = (t5.ID_COMPANY)

LEFT OUTER JOIN dbo.REC_EVENT AS t6 ON (t0.ID_PROJECT = t6.ID_PROJECT) AND (t0.ID_PERSON = t6.ID_PERSON)

LEFT OUTER JOIN dbo.REC_PROJECT_TARGET_REJECTED AS t7 ON t0.ID_REC_PROJECT_TARGET = t7.ID_REC_PROJECT_TARGET

WHERE (t0.ID_PROJECT = @p0) AND (t6.ID_REC_EVENT IS NULL) AND (t7.ID_REC_PROJECT_TARGET_REJECTED IS NULL)

Practic, vreau să elimin din recordsetul meu, înregistrările care apar prin tabelele REC_EVENT respectiv REC_PROJECT_TARGET_REJECTED.

Astfel, construcţia LINQ arată aşa:

from t in dac.REC_PROJECT_TARGETs

join p in dac.PERSONs on t.ID_PERSON equals p.ID_PERSON

join lp in dac.REC_LOOKUPs on t.ID_PRIORITY equals lp.ID_REC_LOOKUP

join ls in dac.REC_LOOKUPs on t.ID_SOURCE equals ls.ID_REC_LOOKUP

join wp in dac.PERSON_WORKEXPERIENCEs on p.ID_PERSON equals wp.ID_PERSON into wpl

from wpo in wpl.Where(wpo => wpo.IS_PRESENT).DefaultIfEmpty()

join co in dac.COMPANies on wpo.ID_COMPANY equals co.ID_COMPANY into cpu

from c in cpu.DefaultIfEmpty()

join re in dac.REC_EVENTs on new { t.ID_PROJECT, t.ID_PERSON } equals new { re.ID_PROJECT, re.ID_PERSON } into tempEvents from events in tempEvents.DefaultIfEmpty()

join rj in dac.REC_PROJECT_TARGET_REJECTEDs on t.ID_REC_PROJECT_TARGET equals rj.ID_REC_PROJECT_TARGET into tempRej from rejected in tempRej.DefaultIfEmpty()

where t.ID_PROJECT == projectId && object.Equals(null, events.ID_REC_EVENT) && object.Equals(null, rejected.ID_REC_PROJECT_TARGET_REJECTED)

select new {t.ID_REC_PROJECT_TARGET,

t.ID_PERSON,

t.ID_PROJECT,

c.COMPANY_NAME,

wpo.POSITION,

lp.VALUE,

ls.VALUE,

t.COMMENT}

Se observă că au aparut cele două tabele in body-ul selectului, însă au apărut şi două elemente noi în clauza WHERE: object.Equals(null, events.ID_REC_EVENT) && object.Equals(null, rejected.ID_REC_PROJECT_TARGET_REJECTED)

Nu am folosit events.ID_REC_EVENT == null deoarece in SQL ar fi arătat aşa: t6.ID_REC_EVENT = NULL şi sunt sigur că nu era de dorit 🙂

MacOS X Leopard pe PC

Functioneaza…

E destul de simplu, trebuie sa te inarmezi cu rabdare si sa orbecaiesti putin.
Configuratie: Procesor P4 Prescott @ 2.4GHz (ala de se incinge ca dracu’)
1GB RAM – Kingston ValuRAM
80GB Hard Disc – Maxtor (IDE)
DVD R/W Pioneer (probabil ca o sa ii pun o vechitura de DVD ROM pe care nu-l folosesc)
Placa de baza Gigabyte GA-8I865GVMK socket 478

Am luat si o carcasa draguta microATX si mi-am facut un mac care costa cam 1.000 RON pe Okazii.
A… acest post il editez chiar de pe noul meu Hackintosh 🙂 urmeaza sa vad cum schimb rezolutia la 1280×1024.

Cumpărarea unui iPhone

Cică mai nou, când cumperi un iPhone din State, trebuie să semnezi contractul cu AT&T chiar în magazin.

S-au cam enervat băieții că telefoane se tot vindeau dar abonamente mai subțire…

Marfă gratis

Aseară pe la 5 am plecat la cumpărături și fiindcă stau la 2 minute de noul Real am zis sa văd ce-i acolo.

Deși mă așteptam să fie aglomerat, totuși nu am fost pregătit să văd puhoiul de oameni care, atenție, așteptau să intre in magazin. Așa că am călcat accelerația și m-am dus mai departe pe Fizicienilor, spre Auchan…
N-am înțeles, se dă zahăr și ulei gratis? De câteva zile de când s-a deschis magazinul, zona e aglomerată în permanență. Sunt curios cât o se să ducă în sus prețurile la apartamentele din zonă.

iBrick

O dată cu update-ul la versiunea 1.1.1 de firmware, băieții (și fetele) care și-au deblocat aparatele s-au trezit ca sint la fel de bune ca și un opritor de ușă.

Acuma, se pot aduce argumente pro și contra blocării/deblocării. Cert e că s-a deschis cutia Pandorei. Evident că alde Nokia si Samsung (cu telefonul în colaborare cu Bang & Olufsen, Serenata) profită la maxim.

Dar nu-i nimic, cei de la iPhoneDevTeam deja l-au rezolvat incă de luni… iar în curând o sa-mi vină și mie iTelefonul.