giovedì 16 ottobre 2014

Cat poti fi de dobitoc?

Nu ma refer la o persoana anume, ci la o firma. Firma care are in spate persoane, care insa probabil nu se simt responsabile de prostia lor. Firma e Yahoo, mai exact clientul de mail de la yahoo.

Acum vreun an, au introdus "embedded disposable emails" - adica poti sa iti creezi mai multe adrese de email pe care sa le folosesti din contul tau, utile pentru site-ul unde nu vrei sa iti dai emailul principal. Cand incepe sa iti vina SPAM, poti sa le dezactivezi simplu. Deci, "disposable emails" normale, dar mult mai usor de gestionat. Super inventie am zis!

Toate bune si frumoase, insa atunci cand incepi sa le folosesti, incepe durerea. Cam in 50% din cazuri, cand dau reply la un email venit pe o astfel de adresa... in loc sa raspunda de la adresa respectiva (disposable), raspunde de la adresa principala! Adica tu nu ii dai lui X emailul principal pt. ca vrei sa ramana privat (probabil nu ai incredere in X), si cand vrei sa ii raspunzi, Yahoo decide ca ar fi mai bine sa ii raspunzi de la emailul principal, adica "sa te desconspire".

Si uite asa, o super idee - embedded disposable emails - esueaza lamentabil din cauza unei logici/implementari/bug de tot cacatul!

venerdì 4 aprile 2014

Incarcator inteligent de baterii!

Am cumparat recent niste acumulatori R6 (AA) de 2800 mAh. Incarcatorul Ducracell pe care il aveam (fast charger, de 500mA) le incarca intr-o ora si ele se termina foarte repede. Deci... e o problema, ca nu le incarca suficient, adica le incarca doar vreo 400mAh. Asta duce la degradarea rapida a acumulatorilor repsectivi. Asa ca am hotarat sa cumpar un incarcator nou!

Primul gand: "cheap chinese plastic". Am gasit pe ebay mai multe modele interesante, intre 5 si 10E, cu tot cu transport. Insa dupa vreo 3-4 ore de cautat (in care am mai vazut din cand in cand reclama la un "incarcator inteligent" Energizer), m-am prins ca mai toate aveau curent de incarcare de 100mA. Asta inseamna ca, ar fi incarcat bateriile mele de 2800mAh in... 33,6 ore, adica intr-o zi jumate! Asa ca am zis: dar oare nu exista si "fast chearger"?

Cautand un fast charger, am vazut ca mai toate se laudau ca sunt "inteligente", deci ce ar fi daca as lua acel incarcator inteligent? Si m-am uitat ce stie sa faca:
- testeaza bateria ca sa stii/stie cat sa o incarce
- goleste bateria (initial m-am gandit: ce tampenie, de ce as avea nevoie de asta???) - util pentru a revitaliza baterii "obosite". Adica le goleste/incarca/goleste/incarca.... de cateva ori, pana cand ele devin (aproape) ca noi.
- poti selecata curentul de incarcare, ca sa incarci bateria "repede" sau "normal, pentru o viata mai lunga a bateriei"

Am zis: hai sa vad ce optiuni sunt pe piata! Am gasit un articol unde se facea review la 10 incarcatoare inteligente. Super comparatie, am fost foarte multumit de ea si am decis sa iau chiar cel mai bun incarcator -  Alpha Power Battery Charger BC-9009 (in europa este vandut ca Technoline BC 700)- , care stie sa faca de toate si are o gramada de protectii. Costul: 27,98E, adica cu vreo 20E mai mult decat alea "proaste", insa sunt foarte multumit sa ii dau! Mai era si un alt incarcator inteligent mai ieftin (care nu are testare) - 7dayshop Battery Charger - 600LCD la £10.99 - insa nefacand livrare decat in UK si Franta... am zis ca nici nu are rost sa ma gandesc.


Deci, dupa vreo 6 ore de cautare.. am decis sa dau un ban in plus pe incarcator, ca sa pot folosi cu incredere si pentru o perioada lunga bateriile!

giovedì 27 marzo 2014

Functionarii publici?

A mai trecut un an, iar trebuie sa platim impozitele! Asa ca am purces la treaba, incercand sa le platesc online. Pentru a plati impozitul pe un teren, am sunat la primaria Buftea, sperand sa il pot plati prin transfer bancar. Am sunat la centrala, am fost transferat la biroul corespunzator, unde doamna N.C. a fost foarte amabila si mi-a zis exact cat aveam de platit. In plus, s-a oferit sa imi trimita pe email "Nota de plata" cu toate detaliile, precum numarul de cont unde sa platesc. Bineinteles ca am acceptat, ca doar imi este mai simplu asa, decat sa mi-l dicteze si sa risc sa gresesc. Apoi am facut plata si i-am multumit.

Astazi (la 2 zile dupa), nu mica mi-a fost mirarea cand am primit un alt email de la doamna respectiva, informandu-ma ca "au intrat banii si mi i-a trecut pe rol". Super serviciu, super promptitudine, din partea unui functionar public care isi face meseria, sprijinind contribuabilii si chiar intrecandu-le asteptarile.

Felicitari doamna N.C., mi-as dori ca toate primariile sa aiba functionari la fel de seriosi precum dvs. Ma bucur intotdeauna cand vad "exemple pozitive", si cred ca persoanele ca dvs. ar trebui incurajate. Poate asa vom reusi sa scapam tara de puzderia de trantori care au impanzit administratia publica si politica.

giovedì 20 marzo 2014

Php cache: APC + Memcached + custom

De multe ori, un site dinamic are unele portiuni din pagina care sunt identice pentru toate paginile si se schimba destul de rar. De exemplu: topul celor mai vandute produse, ultimele anunturi sau cei mai activi useri. Aceste statistici se populeaza din baza de date, deci necesita cate cel putin un query mysql la fiecare incarcare de pagina. Daca ne gandim ca query-ul intoarce aceleasi rezultate de fiecare data, ne dam seama ca acest lucru duce la o incarcare nejustificata a serverului mysql, ceea ce poate duce inclusiv la blocarea tabelelor sau la timpi f. mari de acces pentru celelalte query-uri, deci la timpi mari de incarcare a paginilor. Putem scapa de acest overload, prin stocarea rezultatelor intr-un cache si citirea/folosirea lor direct din cache, fara a mai interoga DB-ul.

Solutiile cele mai des folosite pentru acest lucru sunt APC si memcache, insa niciunul dintre aceste module nu face parte din PHP standard, deci firmele de hosting pot alege daca sa il instaleze sau nu. Din motive istorice, eu folosesc mai multe hostinguri:
- Godaddy - ofera APC, insa cu o calitate forte slaba (missing rate de 30%, vezi mai jos)
- Arvixe - ofera APC ok
- TsoHost - ofera doar Memcache, deoarece APC nu poate fi instalat pe suPHP


Tinand cont de faptul ca uneori vreau sa mut un site de la un hosting la altul si nu vreau sa schimb toata logica caching-ului, am fost nevoit sa contruiesc un set de functii generice. Aceste functii verifica daca modulele sunt disponibile si folosesc cea mai potrivita solutie, in felul urmator:
1. verifica daca mod_apc este instalat. Daca este instalat si nu este cerut explicit sa nu fie folosit APC (pentru godaddy), atunci apeleaza functiile APC.
2. daca este setat un server de Memcache, atunci apeleaza functiile memcache*
3. altfel apeleaza functii custom, scrise de mine, care stocheaza totul intr-un fisier.

* Biblioteca Memcached a fost conceputa pentru un singur user, deci nu are nici un fel de protectie a datelor. Un user poate citi/actualiza/sterge accidental sau voit, toate datele celorlalti useri. Trebuie mentionat ca acest lucru nu este f. simplu (caci trebuie sa afli intai numele variabilelor), insa eu am reusit sa le aflu folosind o pagina de statistici memcache, similara cu cea de la APC. Pentru ca nu vrem ca oricine sa se joace cu datele noastre, inainte de a stoca datele cu memcache, le serializez si criptez (serialize() + mcrypt_encrypt), iar dupa recuperare le decriptez si le deserializez (mcrypt_decrypt() + unserialize()). In felul acesta:
- orice user poate sa le vada, dar nu ii folosesc la nimic, decat daca stie key+iv, deci sunt sigur ca nu imi poate fura informatiile.
- De asemenea, daca cineva vrea sa le rescrie, poate, insa neavand parola, nu poate sa le encripteze la un sir valid, deci atunci cand incerc sa le folosesc, imi va da eroare si pur si simplu voi ignora acele date, ca si cum nu ar fi fost prezente in cache.
- Daca vrea sa le stearga, le poate sterge, insa nu e nici o pierdere. Eu le voi regenera fara probleme.

Cum folosesc functiile?
1. pentru fiecare set de informatii pe care le pun in cache, am construit cate o functie, cu parametri relevanti (gen limba, categorie...)
2. creez numele variabilei de pus in cache, pe baza numelui functiei+parametri. In felul acesta, asigur unicitatea si evit suprascrierea din greseala
3. verifica daca variabila se gaseste in cache. Daca da, atunci o folosesc.
4. daca nu e in cache, atunci:
   - generez valoarea variabilei, eventual intr-un array
   - salvez variabila in cache
   - folosesc variabila
In felul acesta, variabila este generata si stocata in cache doar daca nu este gasita in cache. In general, tin variabilele in cache pentru o ora.
Unele variabile (gen ultimele anunturi) trebuie sa expire inainte de termen. In acest caz, atunci cand "este adaugat un nou anunt", pur si simplu sterg variabila din cache. In acest fel, atunci cand voi avea nevoie de acea variabila, negasind-o in cache, o voi regenera, folosind evident date actualizate.

Download
Fisierul cu functiile construite de mine poate fi descarcat de aici. Fisierul contine instructiuni sumare de utilizare. Sper ca nu trebuie sa mentionez ca ar fi bine sa modificati key-iv... din motive de securitate.

venerdì 14 marzo 2014

Mutarea unui domeniu

Of, iar schimb hostingul, iar trebuie sa imi mut domeniile. Si e destul de complicat, asa ca voi face o lista cu chestiile care trebuiesc verificate, la fiecare mutare da la hostingul A la B. Evident, fiecare pas trebuie facut si TESTAT!
  1. Insereaza domeniul in noul hosting (B)
  2. Vezi unde e gazduit site-ul (A) si de unde ai cumparat domeniul (C). La C va trebui sa schimbi nameserverele mai tarziu, iar la A trebuie sa verifici toate setarile de mai jos
  3. De mutat baza de date (de la A la B)
  4. De mutat fisierele site-ului (de la A la B), mai putin logurile sau fisierele temporare. 
  5. De setat in fis. de configurare (B) noua baza de date.
  6. De verificat (la A) daca site-ul are subdomenii. Daca are, creeaza subdomeniile la B si copiaza fisierele lor (pct. 3-5)
  7. De verificat (la A) daca exista conturi (sau forwarding) de email corespunzatoare domeniului. Daca da, de recreeat la B
  8. verifica daca sunt mai multe conturi FTP la A. Daca sunt folosite, recreeaza-le la B
  9. verifica daca sunt CRON job-uri la A si recreeaza-le la B
  10. daca userii pot contribui la site (crea pagini, actualiza info in DB...) asigura-te ca poti bloca acest lucru in scripturile tale.
  11. Schimba nameserverele la C, sa puncteze catre B, in loc de A
  12. Blocheaza actualizarea userilor, doar in scriptul de la A
  13. Copiaza din baza de date de la A, in baza de date de la B, tabelele care ar fi putut fi modificate de la pasul 3 pana acum. De asemenea, copiaza si fisierele care ar fi putut fi uploadate de catre useri intre timp (gen poze la anunturi)
  14. Asteapta o saptamana si daca totul e ok la B, sterge scripturile si domeniul gazduit la A. Altfel risti sa intri in confuzie in viitor!
Acum cele doua site-uri (A si B) ar trebui sa fie identice. In urmatoarele ore, noile nameservere se vor propaga si userii vor vedea (si actualiza) doar site-ul B. Site-ul A nu ar mai trebui sa fie actualizabil, incepand cu pasul 12.