În articolul anterior am făcut o scurtă paralelă între Thread-uri și Events; am precizat că modelul Evented are un loop principal și 2 componente: detectarea evenimentelor (event detection) și manipularea evenimentelor (event handlers).

De ce modelul evented este mai eficient pentru server?

În mare parte serverele sunt proiectate pt. I/O, ceea ce înseamnă că, în majoritatea timpului, așteaptă operațiile I/O (conexiune la server, accesarea unei baze de date, citirea unui fișier de pe HDD, comunicarea cu un serviciu web extern, etc).

Să luăm un exemplu: după ce a terminat de redactat cartea, una din damele din articolul anterior intenționează să o trimită editorului. Se conectează la www.paginalui.ro, face upload la PDF și apăsa submit.

Serverul editorului este programat să ruleze următoarea rutină: Read the rest of this entry »

De ceva timp am foarte mult de lucru (cam trei proiecte simultan de mult) și nu am foarte mult timp să găsesc articole interesante, cu atât mai puțin să le citesc (și să le recomand). Acesta e motivul pentru care am linkurile săptămânii la fiecare… două săptămâni. Spre dezamăgirea unora, sunt un simplu om; mă descurc și eu cum pot cu timpul.

  1. Eugen Tudorancea a scris primul guest post pe iamntz.com și Tutorial Node JS din seria dedicată NodeJS;
  2. jQuery Performance Tips and Tricks;
  3. Fundamentals For Great JavaScript & JQuery Development;
  4. Become a Javascript Console Power-User;
  5. Organize Your Code with RequireJS;
  6. jQuery 1.7 Beta Release Preview;
  7. Future-proofing Your JavaScript Applications For Improved Scalability;
  8. Design Patterns in Javascript;
  9. Some JavaScript Resources Worth Checking Out;
  10. Allen Pike: Tackling JavaScript;
  11. Scalable and Modular Architecture for CSS;
  12. How To Use Structural Pseudo Classes and Pseudo Element Selectors;
  13. What are CSS Shaders?
  14. WordPress Internals: How WordPress Boots Up;
  15. WordPress Essentials: The Definitive Guide To WordPress Hooks;
  16. How To Create Custom Post Meta Boxes In WordPress;
  17. Pulse – ceva drăguț;

Într-un sistem complex, interacțiunea și colaborarea dintre componentele sistemului prezintă principalele structuri când este vorba de efciența. Web-ul (Internetul) este un sistem (global) complex de rețele, servere interconectate care folosesc un protocol (set de reguli) standard, TCP/IP. O persoană care utilizează un Browser comunică cu serverele printr-un alt protocol standard, HTTP.

Datorită evoluției rapide a web-ului și dorinței de comunicare în timp real, serverele HTTP sunt nevoite să evolueze. O soluție eficientă pentru îmbunătățirea comunicării (interacțiunii) dintre utilizator și server o prezintă Node.js – evented I/O bazat pe V8 – JavaScript engine-ul de la Google.

Thread vs Evented

Să luăm un exemplu: 3 persoane se conectează simultan la www.paginata.ro

Site-ul este hostat pe un server cu Apache2, PHP, Linux (LAMP).

Serverul HTTP (Apache2) preia conexiunile și deschide un thread pentru fiecare conexiune. Fiecare thread va rula o instanță a fișierului index.php, îl va evalua integral, de sus până jos (synchronous). Read the rest of this entry »

Aseară am fost la workshop-ul 2parale. S-a vorbit despre marketing afiliat, despre 2parale și despre toate chestiile ce-i fac pe mulți să tresară când aud cuvintele magice „bani online”, „bani pe internet” și alte combinații de genul ăsta.

Din toată povestea am înțeles câteva lucruri (pe care le-am „rumegat” peste noapte):

  • Prin 2parale trec sume importante spre afiliați. Sunt afiliați în sistem care încasează câteva mii de euro. Lunar;
  • Userii nu au suficientă încredere pentru a face cumpărături online iar tu, ca site, trebuie să-i educi. Teoretic, e corect. Practic însă, e ca și cum un dealer de droguri îți spune că marfa lui e perfect sigură. :D
  • Proiectele care merg sunt agregatoarele, comparatoarele și alte chestii d’astea ce presupun spam indexare masivă în motoarele de căutare (gen tpu.ro). Ce se întâmplă în cazul în care nu mai apari în rezultate? Well… Shit!
  • Ca advertiser trebuie să ai câteva sute (cu bătaie spre o mie) de vânzări pentru a intra în sistemul 2parale. Pe de-o parte e bine pentru afiliați. Pe de-o parte e rău pentru advertiserii mici ce vor să se promoveze;
  • Că tot vorbim de advertiseri, un magazin online a fost închis deoarece nu a mai putut face față comenzilor primite prin 2parale. Nu știu despre ce magazin e vorba, treaba asta pare un pic trasă de păr, dar știu că sunt destui oameni care nu pot face față unei creșteri bruște;
  • În curând se vor face mici modificări în interfața 2parale. Datorită mie. :D

Social media nu este foarte social

HTC, când nu scoate trei telefoane / zi organizează concursuri pe Facebook. Irelevant. Relevant este modul în care programatorii – în general – înțeleg fenomenul „social media”. Rezultatul acestei înțelegeri precare se vede la fiecare înscriere pe un site ce folosește uneltele puse la dispoziție, fie de Facebook, fie de alți provideri open ID.

Spus, pe scurt, în momentul în care accepți o astfel de confirmare

Se presupune că site-ul ce îți cere acceptul va folosi datele tale. Nume, poze, sex etc. Ce ți se cere pe următoarea pagină?

Jumătate din datele pentru care ți-ai dat acordul să fie folosite! Autofill presupune vreo zece linii de cod. Atât. Iar asta nu se întâmplă doar la HTC. Nu, asta se întâmplă la majoritatea site-urilor ce folosesc un astfel de sistem de înregistrare.

Chiar sunt singurul care consideraă că e ok dacă îi ceri utilizatorului TOATE datele (inclusiv email-ul) și … gata? Să apeși pe „Allow” și să fii autentificat pe site-ul pe care te-ai înregistrat. E chiar așa greu? Eu am făcut și nu mi s-a părut ieșit din comun. Da, a durat aproximativ o oră, dar cunoștințele mele de PHP/MySql sunt limitate. Bănuiesc că un programator cu experiență ar face treaba asta mult mai repede.

Sunt curios de ce se întâmplă asta? Este vreun motiv legal de care eu nu știu?

Da, săptămâna asta a fost mai lungă. E vreo problemă? :D

Link-ul ăsta merită un post separat! Four tips for learning how to program. Trebuie citit de oricine face primii pași în programare.

  1. 20 JavaScript Frameworks Worth Checking Out.
  2. JavaScript Remote Debugging
  3. 50 Performance Tricks to Make Your HTML5 Web Sites Faster.
  4. Faster JavaScript Memoization For Improved Application Performance.
  5. Essential JavaScript Namespacing Patterns.
  6. Resources For, And How I Learned Backbone.js.
  7. Interacting With The WordPress Database.
  8. Create WordPress Plugins with OOP Techniques.
  9. How to use PHP on the command line?
  10. phpmaster.com este un nou site despre… php aflat sub umbrela Sitepoint.
  11. Native vs mobile apps & HTML5 vs Native Apps.
  12. Building a NAS Server. Pentru că ai nevoie de backup!

Ce comisioane plătești la bancă?

Sunt un client mulțumit al ING. Este loc de mai bine în ceea ce privește homebanking-ul, dar overall nu am foarte multe de reproșat.

Azi, în timp ce îmi făceam niște calcule să văd cam câți bani am cheltuit, am văzut și comisioanele de la extragerile ocazionale (de obicei plătesc cu cardul, dar sunt unele locuri unde nu se poate plăti altfel decât cash). Și când am văzut că am trei retrageri consecutive la un ATM non-ING și că plătesc în jur de 5 lei pentru fiecare retragere, mi-am pus întrebarea firească: oare cât costă comisioanele? Cu puțin ajutor din partea unui prieten am deslușit puțin tainele Excel. Și mi-a ieșit următoarea chestie: de la începutul anului am plătit aproximativ 200 lei doar comisioane de extragere! (la care adăugăm comisioanele de administrare, ceea ce însumează ~500 lei/an!)

Cum poți calcula toate aceste comisioane?

În principiu, chestia asta ar trebui să meargă la absolut orice bancă oferă un extras de cont în format excel (fie că e xls, fie că e csv). Eu îți voi arăta cum poți face toată povestea asta la ING.

În primul rând te autentifici în contul tău de homebank. (vezi aici un script care ușurează această treabă). După autentificare, alegi din meniu „Raport tranzacții”. Ca perioadă alegi 1 ianuarie – ziua curentă (sau orice alt interval vrei), alegi tab-ul „Descarcă raportul”, descarci fișierul în format Microsoft Excel (XLS) și îl deschizi în… Microsoft Excel (deși cred că orice program de calcul tabelar ar merge): Read the rest of this entry »

Amazon S3 + MX Host = love

Folosesc Amazon S3 de mai bine de un an pentru hostingul fișierelor de pe acest blog (imagini). Avantajul în a nu avea trafic este că la sfârșitul lunii plătesc în jur de 50 cenți pentru trafic. Beat that, Zoso!

Ce m-a enervat cel mai mult la toată povestea cu S3 (dar aparent nu atât de mult încât să caut până acum) a fost să schimb url-urile de forma: Read the rest of this entry »

Am fost o săptămână foarte… productivă, din toate punctele de vedere, inclusiv link-urile strânse. Enjoy!

  1. Keymaster.js este o modalitate foarte simplă de a defini diverse shortcuts în JavaScript.
  2. Improving HTML5 Canvas Performance.
  3. A Developer’s Guide to HTML5 Canvas.
  4. Making the Transition to HTML5.
  5. Don’t Style Headings Using HTML5 Sections.
  6. The ridiculous case of adding a script element.
  7. Using jQuery’s Data APIs.
  8. jQuery Mobile Beta 3 released. Chiar dacă nu sunt fan (am încercat să folosesc jqm la un proiect și am constatat că este ok cât timp nu vrei să customizezi nimic), nu pot decât să mă bucur că a apărut beta3. Mai ales că se anunță chestii cool în viitorul apropiat (citește și comentariile).
  9. Mobile Design & Development.
  10. Debunking PHP’s bad reputation.
  11. Top 10 MySQL Mistakes Made By PHP Developers.
  12. MySQL caching methods and tips.
  13. Deploying node.js on Amazon EC2.
  14. The Evolution of the Web.
  15. Underscores vs. dashes in URLs. Long story short: use dashes!
  16. The Science Behind A/B Testing.
  17. How GitHub Works.
  18. Git Is Simpler Than You Think.
  19. Why work doesn’t happen at work?
  20. Getting Started With The PayPal API.
  21. Debugging with audio.
  22. Textmate to VIM. Dacă te-ai săturat să aștepți Textmate 2 și nu vrei să încerci Sublime Text, iată că poți folosi cel mai tare editor al anilor 70.

Custom fields (CF) sunt o modalitate excelentă de a realiza lucruri mărețe și de a ajunge pe nebănuite culmi ale gloriei personale. Ok, poate nici chiar așa, dar… Pe acolo.

Cu toate astea, WordPress nu oferă prea multe funcții utile pentru CF. Avem câteva funcții meta-related, dar toate funcțiile sunt prea… generice. Să zicem că faci un sistem de filtrare – cum fac eu – și pui totul în CF (pentru că vrei să faci o… filtrare un pic mai târziu). Tot ce are legătură cu filtrele respective pui la modul _custom_filters_NUME_FILTRU. (dacă primul caracter este underscore, custom field-ul nu este afișat în admin)

Cum poți lua CF ce încep cu _custom_filters?

Varianta cu funcțiile WordPress (documentate)

Luăm toate CF pentru postul curent, facem un foreach, verificăm dacă prefixul este cel dorit și ne facem treaba.

$prefix = '_custom_filters';
$custom_fields = get_post_custom($post_id);
foreach( $custom_fields as $custom_field ){
	if( substr( $custom_field, 0, strlen($prefix) ) == $prefix ){
		// do some awesome thing with my custom field code
	}
}

Varianta geek-ish

Facem un query în baza de date și luăm fix ce ne trebuie.

function get_my_post_meta( $post_id = null, $meta_prefix = '' ){
	if( !isset( $post_id ) ){ return; }
	global $wpdb;
	return $wpdb->get_results( $wpdb->prepare("
	SELECT meta_key, meta_value, meta_id, post_id
		FROM $wpdb->postmeta
		WHERE
			post_id = %d AND
			meta_key LIKE %s
		ORDER BY meta_key, meta_id", $post_id, $meta_prefix.'%') );
} // get_my_post_meta

$custom_fields = get_my_post_meta( $post_id, '_custom_filters' );
foreach( $custom_fields as $custom_field ){
		// do some awesome thing with my custom field code
}
Atenție!

Această funcție NU folosește caching. Ceea ce înseamnă că ar ptea avea efecte… nedorite în cazul unui site cu mulți utiilzatori.
Nu am prezentat o metodă de cacheing deoarece eu am avut nevoie de această funcție strict pe partea de administrare. Dacă ai nevoie de o astfel de funcție pe partea de client, caută mai multe detalii aici sau lasă un comentariu la acest post.