<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Daniel Buca &#187; Tehnic</title>
	<atom:link href="http://www.danielbuca.ro/category/tehnic/feed" rel="self" type="application/rss+xml" />
	<link>http://www.danielbuca.ro</link>
	<description>despre online, Romania, politica si despre mine</description>
	<lastBuildDate>Thu, 12 Jan 2012 21:44:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Girls Programming Camp</title>
		<link>http://www.danielbuca.ro/tehnic/girls-programming-camp-802.html</link>
		<comments>http://www.danielbuca.ro/tehnic/girls-programming-camp-802.html#comments</comments>
		<pubDate>Sun, 09 Oct 2011 18:07:15 +0000</pubDate>
		<dc:creator>Daniel Buca</dc:creator>
				<category><![CDATA[Tehnic]]></category>
		<category><![CDATA[Camp]]></category>
		<category><![CDATA[chinezu]]></category>
		<category><![CDATA[Girls]]></category>
		<category><![CDATA[infoarena]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.danielbuca.ro/?p=802</guid>
		<description><![CDATA[Citesc la Chinezu ca, cica, nu prea ar fi fete programatoare 
Ma bucur ca a postat acest articol pe blog pentru ca imi da ocazia sa-l contrazic, lucru care se intampla, trebuie sa recunosc, foarte rar.
Trebuie sa spun ca am intalnit fete care fac aceasta meserie &#8211; programarea &#8211; foarte bine si, pe alocuri, mai ]]></description>
			<content:encoded><![CDATA[<p>Citesc la <a href="http://chinezu.eu/2011/10/07/fetele-programam-si-noi-pu/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/chinezu.eu/2011/10/07/fetele-programam-si-noi-pu/?referer=');">Chinezu</a> ca, <em>cica</em>, nu prea ar fi fete programatoare <img src='http://www.danielbuca.ro/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Ma bucur ca a postat acest articol pe blog pentru ca imi da ocazia sa-l contrazic, lucru care se intampla, trebuie sa recunosc, foarte rar.</p>
<p>Trebuie sa spun ca am intalnit fete care fac aceasta meserie &#8211; programarea &#8211; foarte bine si, pe alocuri, mai bine ca unii dintre baietii din echipa.<br />
In esenta, programarea este mai mult decat o meserie, este o pasiune iar fetele si baietii au aptitudini diferite si reusesc sa se completeze unii pe altii in proiecte.</p>
<p>Dar hai sa revenim la lucruri importante: infoarena si Facebook au o initiativa foarte interesanta &#8211; <a href="http://infoarena.ro/blog/girls-programming-camp-2011" target="_blank" onclick="pageTracker._trackPageview('/outgoing/infoarena.ro/blog/girls-programming-camp-2011?referer=');">Girls Programming Camp</a>.</p>
<p>De pe site-ul organizatorilor: &#8220;<em>Infoarena, în parteneriat cu Facebook, organizează în premieră un eveniment dedicat apropierii fetelor de informatică şi programare. Girls Programming Camp este o tabără de pregătire de o săptămână, ce va avea loc în perioada 30 octombrie &#8211; 5 noiembrie la Bucureşti.</em>&#8221;</p>
<p>In concluzie: dati vestea mai departe <img src='http://www.danielbuca.ro/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;"><span class="Apple-style-span" style="color: #222222; font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; background-color: #ffffff;"></p>
<h1 style="margin: 0.2em 0px 0.7em; padding: 0px; font-family: Georgia,'Times New Roman',Times,serif; font-weight: normal; font-size: 19pt; border-bottom: 1px solid #dddddd;">Girls Programming Camp</h1>
<p></span></div>
<h3  class="related_post_title">Daca ti-a placut acest articol citeste si:</h3><ul class="related_post"><li><a href="http://www.danielbuca.ro/online-related/grandi-ro-o-continuare-542.html" title="Grandi.ro, o continuare">Grandi.ro, o continuare</a></li><li><a href="http://www.danielbuca.ro/online-related/grandi-ro-bun-sau-rau-531.html" title="Grandi.ro : Bun sau Rau ?">Grandi.ro : Bun sau Rau ?</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.danielbuca.ro/tehnic/girls-programming-camp-802.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Optimizarea unei pagini web</title>
		<link>http://www.danielbuca.ro/online-related/optimizarea-unei-pagini-web-502.html</link>
		<comments>http://www.danielbuca.ro/online-related/optimizarea-unei-pagini-web-502.html#comments</comments>
		<pubDate>Sat, 17 Apr 2010 20:29:11 +0000</pubDate>
		<dc:creator>Daniel Buca</dc:creator>
				<category><![CDATA[Online related]]></category>
		<category><![CDATA[Tehnic]]></category>
		<category><![CDATA[incarcare]]></category>
		<category><![CDATA[load time]]></category>
		<category><![CDATA[optimizare]]></category>
		<category><![CDATA[performanta]]></category>
		<category><![CDATA[planning]]></category>
		<category><![CDATA[programare]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.danielbuca.ro/?p=502</guid>
		<description><![CDATA[Intro: N-am mai scris de ceva timp un articol tehnic si simteam nevoia sa fac asta. Sunt multe subiecte pe care as vrea sa le ating, sunt multe articole pe care le-am inceput si nu le-am mai terminat dar imi revin.
Incep cu un subiect interesant (in opinia mea) care sper sa va stimuleze sa investigati ]]></description>
			<content:encoded><![CDATA[<blockquote style="font-size: 11px;"><p><strong>Intro</strong>: N-am mai scris de ceva timp un articol tehnic si simteam nevoia sa fac asta. Sunt multe subiecte pe care as vrea sa le ating, sunt multe articole pe care le-am inceput si nu le-am mai terminat dar imi revin.<br />
Incep cu un subiect interesant (in opinia mea) care sper sa va stimuleze sa investigati mai mult problema optimizarii unei pagini web.</p></blockquote>
<p><strong>A optimiza o pagina web:</strong> o afirmatie cu multe sensuri. Optimizare pentru motoare de cautare, optimizarea vitezei de incarcare, optimizarea layout-ului pentru o utilizare cat mai buna, etc.<br />
In <strong>acest articol</strong> voi scrie despre <strong>optimizarea vitezei de incarcare a unei pagini</strong>.</p>
<p><img class="aligncenter size-full wp-image-506" title="Timp de incarcare" src="http://www.danielbuca.ro/wp-content/uploads/2010/03/loadtime.jpg" alt="Timp de incarcare" width="500" height="152" /></p>
<p><span id="more-502"></span></p>
<h3>1. Anatomia unei pagini web</h3>
<p>Inainte de toate trebuie sa discutam despre ce se intampla din momentul in care introducem un url in browser si pana cand pagina s-a terminat de incarcat.<br />
Putem imparti actiunile care au loc in urmatoarele tipuri , in ordine cronologica:</p>
<ul>
<li>Server side: performanta este data de cat de bine sunt implementati algoritmii care genereaza continutul paginii si de accesul la resurse externe (storage, incluzand baze de date, API-uri)</li>
<li>Transferul fisierelor catre client: performanta este data de viteza cu care fisierele ajung de pe server pe client, numarul de fisiere sau marimea lor</li>
<li>Afisarea paginii la client: performanta este data de modul in care este construita pagina (html / css / js)</li>
</ul>
<p>Fiecare dintre aceste tipuri de actiuni are o importanta majora in perfomanta generala a site-ului si atunci cand vrem sa optimizam viteza de incarcare a unei pagini web trebuie sa adresam fiecare tip de actiune in parte.</p>
<h3>2. Optimizarea server side</h3>
<p>Asa cum spuneam si la punctul anterior, aici vorbim despre doua aspecte: performanta algoritmilor pe care ii implementam si accesul la resurse externe.<br />
<strong>Performanta algoritmilor</strong> pe care ii implementam tine, in general, de tipul de aplicatie pe care o dezvoltam si nu exista prea multe sfaturi general valabile care pot fie date. Totusi, sunt cateva lucruri de care trebuie sa ne asiguram in orice tip de aplicatie dezvoltam.<br />
<strong>Accesul la resurse externe </strong>se refera la accesul la baza de date, la storage-ul fizic al serverului sau la API-uri externe.</p>
<p>Aspecte la care trebuie sa fim atenti:</p>
<ul>
<li><strong>Redundanta la construirea structurilor de date:</strong> atunci cand proiectam o baza de date trebuie sa analizam si cererile care se vor face catre aceasta si, in functie de tipurile de date care vor fi foarte accesate, frecventa si modul de accesare, trebuie sa pastram inregistrari redundante.<br />
<strong>Exemplu:</strong> se da o structura de categorii, una de tag-uri si una de articole; desi relatia intre articole si categorii si tag-uri se salveaza in tabele de <em>join</em> (tabele ce pastreaza strict aceasta relatie) este de preferat sa salvam si in tabela de articol atat denumirile categoriilor cat si cele ale tag-urilor; astfel evitam, la afisare, 2 <a href="http://en.wikipedia.org/wiki/Join_%28SQL%29" target="_blank" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Join_28SQL_29?referer=');"><em>join</em></a>-uri pe care le-am face</li>
<li><strong>Lucru pe baza de date in mod delayed:</strong> o mare problema de performanta apare in momentul in care selectam date dintr-o tabela si ordonam informatiile dupa un camp care este modificat foarte des. In cele mai multe cazuri engine-ul de baza de date nu va putea sa modifice acel camp si sa reconstruiasca un index pe acesta in timp util, astfel incat performanta sa nu fie afectata.<br />
Lucrul in mod delayed poate fi facut in doua feluri, in functie de necesitati: fie folosim instructiuni sql specifice atunci cand facem un update / insert, cum ar fi <a href="http://dev.mysql.com/doc/refman/5.1/en/insert-delayed.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/dev.mysql.com/doc/refman/5.1/en/insert-delayed.html?referer=');">DELAYED</a> sau <a href="http://dev.mysql.com/doc/refman/5.0/en/update.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/dev.mysql.com/doc/refman/5.0/en/update.html?referer=');">LOW_PRIORITY</a>, fie construim o structura de date paralela care sa ne permita o performanta ridicata.<br />
<strong>Exemplu:</strong> avem nevoie sa afisam articolele ordonate dupa numarul de afisari iar campul care tine numarul de afisari este in tabela de articole si trebuie incrementat la fiecare afisare a unui articol. O solutie ar fi sa facem update cu keyword-ul DELAYED pe tabela de articole, astfel incrementarea numarului de afisari se va face numai in momentul in care tabela este <em>libera</em>.<br />
O alta solutie ar fi construirea unei alte tabele in care sa tinem doar afisarile asociate unui articol, in esenta putem insera doar id-ul unui articol. Acest insert, cu sau fara keyword-ul LOW_PRIORITY este foarte rapid. La fiecare 10 &#8211; 15 minute putem rula un script care sa goleasca aceasta tabela si sa faca update pe tabela de articole pentru a modifica numarul de afisari.</li>
<li><strong>Caching, in mai multe feluri:</strong> in circuitul informatiei intre server si client este bine sa folosim si proceduri de caching pentru a mari viteza cu care sunt servite informatiile si pentru a reduce incarcarea pe server.<br />
<em>- cache pe file system:</em> sectiuni de pe paginile service catre client pot fi salvate pe server ca si fisiere si pot fi servite de catre serverul web direct de acolo; in functie de frecventa de schimbare a continutului alegeti un timp de rescriere a acestor pagini; un astfel de sistem se foloseste pentru sectiuni de pagina care nu se schimba prea des insa sunt accesate foarte des (ex: listari de categorii cu count de produse)<br />
<em>- cache in memorie: </em>stucturi intregi de date pot fi salvate in memorie si pot fi accesate de catre orice proces al serverului web; un astfel de sistem se poate folosi pentru caching de cautari (se salveaza rezultatele in memorie pentru un interval de timp) sau de comentarii.<br />
<em>- cache logic la nivelul bazei de date: </em>acest sistem se foloseste in cazul in care stocam in baza de date informatii brute si le afisam in forma procesata; ex: salvam afisarile unei pagini si vrem sa afisam si numarul de afisari pe fiecare tip de browser, in cazul acest facem o noua tabela in care salvam aceasta informatie deja procesata</li>
<li><strong>Executie de procese in background:</strong> sunt actiuni care trebuie executate in mod frecvent pe o aplicatie, cum ar fi procesarile necesare pentru caching; toate acestea trebuie rulate in procese separate.</li>
<li><strong>Folosim sau nu un framework:</strong> in cele mai multe cazuri un framework inseamna o munca mai simpla si mai rapida pentru programator dar, in acelasi timp, inseamna si un load pe server care nu poate fi ignorat; intotdeauna trebuie analizat daca acest load se justifica (beneficiul adus de folosirea acelui framework sa justifice cheltuielile cu hardware-ul pentru a sustine acel framework).</li>
</ul>
<h3>3. Optimizarea client side</h3>
<p>Desi optimizarea client side este strans legata de actiuni server side prefer sa le analizam separat.</p>
<ul>
<li><strong>Incarcare JS-uri: </strong>fisierele javascript se impart, in aceasta situatie, in 2 feluri: framework-uri JS si fisiere cu functii proprii.<br />
Fisierele ce contin definitii de framework-uri JS este de preferat sa le incarcam direct de pe site-ul de unde sunt distribuite pentru ca astfel se cache-uiesc de catre browser mult mai bine si sunt service catre client fara a incarca serverul pe care este aplicatia. Ex: jQuery este de preferat sa-l incarcam de la http://code.jquery.com/jquery-1.4.2.js .<br />
Fisierele cu functii proprii trebuie tratate altfel. In primul rand trebuie impartite in: 1) fisier cu functii generale si 2) fisiere cu functii specifice pe sectiuni. Aceste fisiere trebuie incarcate selectiv in functie de sectiunea accesata.<br />
Dupa ce ajungem la o versiune finala a unui fisier JS trebuie sa-l trecem printr-o procedura de <a href="http://en.wikipedia.org/wiki/Minification_%28programming%29" target="_blank" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Minification_28programming_29?referer=');">minificare</a>.</li>
<li><strong>Incarcare CSS: </strong>in ce priveste fiserele CSS situatia este similara cu cea de la fisierele JS</li>
<li><strong>Incarcare imagini: </strong><br />
<em>- procesarea imaginilor:</em> pe un site putem afisa o imagine in mai multe dimensiuni (in listare, intr-o galerie, in preview, in vizualizare, etc); este de preferat ca la uploadul imaginii sa generam toate dimensiunile de imagini de care avem nevoie<br />
<em>- salvarea imaginilor:</em> atunci cand nu dispunem de un <a href="http://en.wikipedia.org/wiki/Content_Delivery_Network" target="_blank" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Content_Delivery_Network?referer=');">CDN</a> este de preferat sa salvam imaginile intr-o structura separata de serverul care serveste si aplicatie pentru a putea distribui load-ul generat de aceste request-uri; pentru serverul care va servi imaginile puteti folosi <a href="http://en.wikipedia.org/wiki/Lighttpd" target="_blank" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Lighttpd?referer=');">lighttpd</a> sau <a href="http://en.wikipedia.org/wiki/Nginx" target="_blank" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Nginx?referer=');">nginx</a>.<br />
<em>- servirea imaginilor de layout: </em>o parte din layout-ul site-ului consta in imagini si in general vorbim de imagini multe si mici; este de preferat sa salvam toate aceste imagini intr-un sprite; mai multe despre acest subiect puteti citi <a href="http://www.alistapart.com/articles/sprites" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.alistapart.com/articles/sprites?referer=');">aici</a>.</li>
</ul>
<p>Articolul este deschis iar pentru orice completari la aceasta lista de optimizari va rog sa lasati un comentariu.<br />
Sunt intotdeauna deschis si la alte metode de optimizare <img src='http://www.danielbuca.ro/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  .</p>
<h3  class="related_post_title">Daca ti-a placut acest articol citeste si:</h3><ul class="related_post"><li><a href="http://www.danielbuca.ro/personale/optimizari-la-lucrul-cu-bazele-de-date-incarcarea-predictiva-348.html" title="Optimizari la lucrul cu bazele de date &#8211; incarcarea predictiva">Optimizari la lucrul cu bazele de date &#8211; incarcarea predictiva</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.danielbuca.ro/online-related/optimizarea-unei-pagini-web-502.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

