<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>printf(" SaltwaterC ");</title>
	
	<link>http://www.saltwaterc.net</link>
	<description>Developer blog</description>
	<lastBuildDate>Thu, 18 Feb 2010 12:43:20 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/SaltwatersBlog" /><feedburner:info uri="saltwatersblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by-sa/3.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><item>
		<title>Flash-ul lui Adobe și Windows-ul meu Mobile</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/cmozICAGadY/flash-ul-lui-adobe-%c8%99i-windows-ul-meu-mobile.html</link>
		<comments>http://www.saltwaterc.net/rant/flash-ul-lui-adobe-%c8%99i-windows-ul-meu-mobile.html#comments</comments>
		<pubDate>Wed, 03 Feb 2010 11:06:25 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Rant]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/rant/flash-ul-lui-adobe-%c8%99i-windows-ul-meu-mobile.html</guid>
		<description><![CDATA[Update: am corectat puțin articolul în urma dialogului avut mai jos prin comentarii. Pe scurt, am calmat tonul frustrat abordat inițial, făra a altera complet forma inițială. Nu mai există sentimentul inițial pe care l-am avut atunci când am scris rândurile de mai jos. Până la urmă cei ce se ocupă de partea de comunicare [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update:</strong> am <em>corectat</em> puțin articolul în urma dialogului avut mai jos prin comentarii. Pe scurt, am calmat tonul frustrat abordat inițial, făra a altera complet forma inițială. Nu mai există sentimentul inițial pe care l-am avut atunci când am scris rândurile de mai jos. Până la urmă cei ce se ocupă de partea de comunicare din partea companiei Adobe își iau salariul pe merit din moment ce își &#8220;pierd&#8221; timpul cu un blog de buzunar ca al meu. Cu toate acestea, aștept rezultatele. Momentan discuția de mai jos rămâne la stadiul de vorbărie, iar eu ca programator nu cred în vorbe ci în software funcțional. De altfel pot trăi fără jocuri Flash pe telefon. Nu intru în sevraj în absența lor. De fapt nu mă joc pe telefon. Afirmația dădea doar o notă de dramatism situației expuse. Experiența web folosind PocketIE, Opera Mobile plus versiunea mobilă a Firefox (codename: Fennec, momentan Alpha stage) lasă de dorit în continuare în unele situații bine determinate unde o mână de CSS + (X)HTML nu pot compensa absența Flash Player. Urarea de la sfârșit rămâne. Înafară de Windows, Flash (încă?) e jale sau nu este deloc.</p>
<p>Era destul de evident faptul că va urma o replică de-a subsemnatului la adresa <a href="http://myadobe.ro/2010/01/29/o-poza-cat-o-mie-de-cuvinte/" title="O poza cat o mie de cuvinte" target="_blank"><strike>nesimțirii</strike> celor de la Adobe legată de lipsa Flash Player pe iPad</a>. De altfel, ideea a mai fost discutată și de către <a href="http://www.euareblog.ro/catalin-nicolescu/piua-piua-pe-myadobe/" title="piua-piua pe myAdobe" target="_blank">Cătălin Nicolescu</a>, dar eu iau o abordare diferită a problemei. Doar nu o să mă apuc să fac &#8216;rant&#8217; pe aceeași temă.</p>
<p>Replica mea către Adobe ar fi: <strike>păi bine mă ipocriților,</strike> de ce nu plăngeți de faptul că eu pe Windows Mobile n-am Flash Player? Știu că există Flash Lite, dar eu nu l-am văzut rulând pe HTC-ul meu, ce apropo, Ș.T.I.E. multitasking, ca să fac referire și la produsul Apple ce nu mă interesează, dar care a generat discuția. Dacă vă doare atât de mult experiența utilizatorilor a unui X-produs pe web datorita produsului vostru proprietar, de ce nu văd un CAB pus la download ca să pot vedea și eu cum merge fleșul în PocketIE sau Opera Mobile? Sau să mă joc jocuri în fleș?</p>
<p><strike>Nu e nici o diferență între ceea ce face Apple și ceea ce face Adobe. Adobe sunt totuși mai ipocriți. Ca să mă citez: același căcat împachetat altfel.</strike> Îi urez Flash-ului ce i-am urat acum câțiva ani: o deschidere mai mare spre platforme diferite, sau o moarte rapidă și foarte dureroasă.</p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/cmozICAGadY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/rant/flash-ul-lui-adobe-%c8%99i-windows-ul-meu-mobile.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/rant/flash-ul-lui-adobe-%c8%99i-windows-ul-meu-mobile.html</feedburner:origLink></item>
		<item>
		<title>Firebug 1.5 + Firefox 3.5.7 + Ubuntu Hardy amd64</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/3viMBw0CXEY/firebug-15-firefox-357-ubuntu-hardy-amd64.html</link>
		<comments>http://www.saltwaterc.net/rant/firebug-15-firefox-357-ubuntu-hardy-amd64.html#comments</comments>
		<pubDate>Fri, 29 Jan 2010 08:34:57 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programare]]></category>
		<category><![CDATA[Rant]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/rant/firebug-15-firefox-357-ubuntu-hardy-amd64.html</guid>
		<description><![CDATA[Firebug este o unealtă indispensabilă activităților de dezvoltare web pe care le execut. Din păcate, actualizările se lasă cu urmări câteodată. Precum zice în titlu, am încercat combinația nefericită de mai sus. Buba stă în Firebug: 64 bit Firefox on Linux crashes with Firebug 1.5.0. Am mers pe firul epic al poveștii de pe issue [...]]]></description>
			<content:encoded><![CDATA[<p>Firebug este o unealtă indispensabilă activităților de dezvoltare web pe care le execut. Din păcate, actualizările se lasă cu urmări câteodată. Precum zice în titlu, am încercat combinația nefericită de mai sus. Buba stă în Firebug: <a href="http://blog.getfirebug.com/2010/01/19/64-bit-firefox-on-linux-crashes-with-firebug-1-5-0/" title="64 bit Firefox on Linux crashes with Firebug 1.5.0" target="_blank">64 bit Firefox on Linux crashes with Firebug 1.5.0</a>. Am mers pe firul epic al poveștii de pe issue tracker și mi-am resetat preferințele. Crash-ul reapare atunci când se reactivează tab-ul Net sau Console. Din nefericire, echipa Firebug aruncă vina către Ubuntu, desi eu mi-am făcut propriul build personalizat de Firefox, deci problema cred că zace undeva prin ceva bibliotecă livrată cu Ubuntu din moment ce versiunea de Firefox îmi aparține.</p>
<p>Soluția de moment: downgrade la Firebug 1.4: <a href="http://getfirebug.com/releases/firebug/1.4/" title="Firebug 1.4" target="_blank">http://getfirebug.com/releases/firebug/1.4/ </a></p>
<p>PS: Firefox 3.6 sub Hardy amd64 este probabil cea mai instabilă versiune lansată vreodată. Am avut versiuni de Firefox Alpha sau Beta ce erau mai stabile de atât.</p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/3viMBw0CXEY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/rant/firebug-15-firefox-357-ubuntu-hardy-amd64.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/rant/firebug-15-firefox-357-ubuntu-hardy-amd64.html</feedburner:origLink></item>
		<item>
		<title>Dragă programatorule, dacă îți vine a copy-paste, fă refactor!</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/3-UOoLvQ1kY/draga-programatorule-daca-iti-vine-a-copy-paste-fa-refactor.html</link>
		<comments>http://www.saltwaterc.net/rant/draga-programatorule-daca-iti-vine-a-copy-paste-fa-refactor.html#comments</comments>
		<pubDate>Fri, 22 Jan 2010 11:41:45 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Programare]]></category>
		<category><![CDATA[Rant]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/rant/draga-programatorule-daca-iti-vine-a-copy-paste-fa-refactor.html</guid>
		<description><![CDATA[M-am săturat de cod prost scris ca de mere pădurețe. Nu mă refer la cod nefuncțional sau cu bug-uri. Mă refer la metodologia copy-paste la care se apelează intensiv din când în când. După care apucă-te și modifică ceva pentru a adăuga chestii noi. M-am săturat de gândire non-DRY datorită căreia apuc să modific în [...]]]></description>
			<content:encoded><![CDATA[<p>M-am săturat de cod prost scris ca de mere pădurețe. Nu mă refer la cod nefuncțional sau cu bug-uri. Mă refer la metodologia copy-paste la care se apelează intensiv din când în când. După care apucă-te și modifică ceva pentru a adăuga chestii noi. M-am săturat de gândire non-<a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself" title="DRY" target="_blank">DRY</a> datorită căreia apuc să modific în 5 locuri și 3 fișiere pentru a pune o chestie amărâtă care să arate la fel peste tot. În concluzie, pe lângă defularea de mai sus, m-am hotărât să mai dau niște idei.</p>
<p>Pe alocuri plângerile mele au avut succes. Acum două zile colegii de echipă mă ascultau în timp ce modificam niște chestii, iar involuntar am zis: iar de aici copiez dincolo &#8230; touche: &#8220;Ce-ai zis mă? Să copiezi?&#8221;. Exact ce ziceam mai sus &#8230; câteodată și mie îmi vine greu să nu scriu cod prost. Dar eforturile susținute = evoluție. În concluzie am luat linia aceea lungă (un apel înlănțuit de proceduri) și am pus-o într-o nouă metodă.</p>
<p>În concluzie vreo câteva idei, departe de a oferi o imagine completă:</p>
<ul>
<li>dacă îți vine să faci copy-paste, fie ele și 3 linii de cod sau una lungă, înseamnă ca ai nevoie de un mic refactor.</li>
<li>o arhitectură bună, modulară, a aplicației, DRY (și preferabil <a href="http://en.wikipedia.org/wiki/KISS_principle" title="Keep It Simple, Stupid" target="_blank">KISS</a>) compliant, duce la o mentenanță mai ușoară. Pentru a modifica ceva nu este nevoie să cauți toate instanțele aceleiași bucăți de cod.</li>
<li>dacă acea parte de &#8216;unknown&#8217; umbrește puterea de a-ți crea arhitectura înainte de a o implementa, atunci orice model repetitiv din cod stă bine într-o metodă separată.</li>
<li>caută să înțelegi framework-ul pe care îl folosești. De exemplu în dezvoltarea web folosind MVC, nu prea are ce căuta într-un controller o chestie ce ar sta bine într-un helper/bibliotecă, pentru că atunci când este nevoie să fie apelată bucata respectivă din alt controller, fără refactor, o să fie trist. Desigur, excepție fac acele controllere moștenite, dar și acolo este o linie fină între ce se poate moșteni și ce ar trebui să fie apelabil global.</li>
<li>refactor, OOP, clase, interfețe, &#8216;design pattern&#8217; (exemplu: singleton) ar trebui să nu fie doar cuvinte într-un vocabular de specialitate.</li>
</ul>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/3-UOoLvQ1kY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/rant/draga-programatorule-daca-iti-vine-a-copy-paste-fa-refactor.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/rant/draga-programatorule-daca-iti-vine-a-copy-paste-fa-refactor.html</feedburner:origLink></item>
		<item>
		<title>Importanța unui PHP framework bine scris</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/lcnuhlqrNnU/importanta-unui-framework-php-bine-scris.html</link>
		<comments>http://www.saltwaterc.net/programare/importanta-unui-framework-php-bine-scris.html#comments</comments>
		<pubDate>Mon, 11 Jan 2010 21:32:08 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programare]]></category>
		<category><![CDATA[Securitate]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/programare/importanta-unui-framework-php-bine-scris.html</guid>
		<description><![CDATA[Spuneam la GeekMeet-ul din octombrie (damn it, iarăși fac referință la el) în timpul prezentării mele, pentru cei absenți, o abordare de la OS până la coder în privința Web Security, despre importanța folosirii unui framework ce să facă în mod implicit filtrare XSS și SQL Injection (SQLi) a input-ului, în biblioteca ce se ocupă [...]]]></description>
			<content:encoded><![CDATA[<p>Spuneam la GeekMeet-ul din octombrie (damn it, iarăși fac referință la el) în timpul prezentării mele, pentru cei absenți, o abordare de la OS până la coder în privința Web Security, despre importanța folosirii unui framework ce să facă în mod implicit filtrare <a href="http://en.wikipedia.org/wiki/Cross-site_scripting" title="Cross-site scripting" target="_blank">XSS</a> și <a href="http://en.wikipedia.org/wiki/SQL_injection" title="SQL injection" target="_blank">SQL Injection</a> (SQLi) a input-ului, în biblioteca ce se ocupă de baza de date. Iar pentru chestii riscante, chiar o filtrare XSS cu <a href="http://htmlpurifier.org/" title="HTML Purifier - Standards-Compliant HTML Filtering" target="_blank">HTML Purifier</a>, o bibliotecă a cărui filtru XSS a fost creat să treacă de <a href="http://ha.ckers.org/xss.html" title="XSS (Cross Site Scripting) Cheat Sheet Esp: for filter evasion" target="_blank">XSS (Cross Site Scripting) Cheat Sheet</a>.</p>
<p>Știu, nu vreau să fac &#8220;carieră&#8221; din astfel de post-uri pe blog și nu prea cred că o să mă vedeți vreodată să trimit chestii către <a href="http://hackersblog.org/" title="hackersblog" target="_blank">http://hackersblog.org/</a>. Sunt preocupat de a proteja, de a-i învăța pe alții cum să se protejeze, și mai puțin de a demonstra vulernabilități. Sunt orientat către ce nu ar trebui să facă aplicația și mai puțin înspre a demonstra cum ajungi acolo. De altel aș prefera ca lumea să nu se ia de &#8216;junk&#8217;-ul de WordPress ce rulează pe blog, sunt prea ocupat pentru a scrie un engine sigur cu un număr echivalent de facilități. Mă rog, va urma un contra-exemplu pentru a susține cele din paragraful anterior.</p>
<p>Povestea începe de la faptul că am avut o mică discuție cu <a href="http://boem.me/" title="necenzurat" target="_blank">necenzurat</a> despre importanța folosirii unui framework, dar el o susținea pe a lui cu alea 10 kile de cod. Doar pentru ce îți trebuie un framework de 1.25 megi (dimensiunea minimă, maxim 1.49) pentru o aplicație banală? Pai în primul rând bune sunt cele de PHP5 folosind OOP și clase cu auto-load. Poți face multiple instalări folosind aceleași surse ale framework-ului exceptând aplicația în sine. Folosești ce încarci. A da, și ai filtrare implicită. De ce? Pentru că nimeni nu este perfect. Greșeli apar și în codul programatorilor ce au trecut de fazele tatonării. Vorbesc din experiența lucrului și mai mult din experiența lucrului în echipă. Dacă tu ca programator nu o dai de gard, se prea poate să dea altul.</p>
<p>Acu recunosc, am trișat puțin. M-am uitat puțin prin cele 10 kile de cod astfel încât buba a fost oarecum imediată. Dar nu imposibil de descoperit cu puțină răbdare și stil având în vedere regulile simple de URL rewrite, destul de evidente, și faptul că era vorba de un singur parametru vulnerabil. De fapt am reușit 3 in 1: XSS, blind SQLi și disclosure în același input.</p>
<p>A da, a folosi mysql_error() în producție este una dintre cele mai proaste idei. XSS-ul și disclosure-ul au fost posibile prin intermediul acestei funcții magice ce ar trebui folosite doar pentru dezvoltare, nu și pentru producție.</p>
<p>Momentan nu dăm poze, așteptăm să aplice patch-ul trimis <img src='http://www.saltwaterc.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/lcnuhlqrNnU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/programare/importanta-unui-framework-php-bine-scris.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/programare/importanta-unui-framework-php-bine-scris.html</feedburner:origLink></item>
		<item>
		<title>PHP sub Windows, Zend Server, WinCache și un cluster FastCGI cu Process Manager</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/0qBTOFCJQ5Y/php-sub-windows-zend-server-wincache-%c8%99i-un-cluster-fastcgi-cu-process-manager.html</link>
		<comments>http://www.saltwaterc.net/windows/php-sub-windows-zend-server-wincache-%c8%99i-un-cluster-fastcgi-cu-process-manager.html#comments</comments>
		<pubDate>Wed, 06 Jan 2010 22:11:45 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programare]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/windows/php-sub-windows-zend-server-wincache-%c8%99i-un-cluster-fastcgi-cu-process-manager.html</guid>
		<description><![CDATA[La GeekMeet-ul din Octombrie de la Sibiu, Todi Pruteanu ne zicea printre altele despre WinCache &#8211; un accelerator de PHP dedicat platformei Windows. Nelămurirea mea legată de WinCache a fost următoarea: dacă Microsoft iși anunță colaborarea pentru a susține PHP sub Windows, atunci de ce nu au colaborat cu echipa APC (Alternative PHP Cache) din [...]]]></description>
			<content:encoded><![CDATA[<p>La GeekMeet-ul din Octombrie de la Sibiu, <a href="http://studentclub.ro/todi/" title="Deschis celor deschiși" target="_blank">Todi Pruteanu</a> ne zicea printre altele despre <a href="http://www.iis.net/expand/WinCacheForPHP" title="Windows Cache Extension for PHP" target="_blank">WinCache</a> &#8211; un accelerator de PHP dedicat platformei Windows. Nelămurirea mea legată de WinCache a fost următoarea: dacă Microsoft iși anunță colaborarea pentru a susține PHP sub Windows, atunci de ce nu au colaborat cu echipa <a href="http://pecl.php.net/package/APC" title="Alternative PHP Cache" target="_blank">APC</a> (Alternative PHP Cache) din moment ce acesta este proiectul de casă și va fi introdus în nucleul PHP începând cu versiunea 6? Întrebarea a rămas fără răspuns. Cu toate acestea, experimentând puțin, am găsit un loc pentru această extensie, deși am impresia că acceleratorul &#8216;closed source&#8217; de la Zend, <a href="http://files.zend.com/help/Zend-Server-Community-Edition/zendoptimizerplus.html" title="Zend Optimizer+" target="_blank">ZendOptimizer+</a> alăruri de <a href="http://files.zend.com/help/Zend-Server-Community-Edition/zenddatacache.html" title="Zend Data Cache" target="_blank">Zend Data Cache</a> ce oferă un API de caching compatibil cu APC poate să preia aceeași funcție. Poate pentru că echipa Zend a scris printre altele un modul de Apache, tot closed source, &#8216;Zend Enabler for Apache&#8217; ce oferă un FastCGI Process Manager pentru Windows suficient de deștept, dar care face o chestie: rularea de mai multe procese FastCGI care deservesc același server web. În plus, Zend Server oferă suport și pentru Microsoft IIS, deci backend-ul PHP nu este restricționat la Apache.</p>
<p>Paragraful anterior rezumă problema, dacă citim printre rânduri. Problema sub Windows este rularea mai multor procese FastCGI ce să servească pe același port, practic un cluster local cu &#8217;round robin load balance&#8217;. Tehnic vorbind &#8211; se poate. Dincolo de un simplu FastCGI wrapper cum este spawn-fcgi, proiect de casă al lighttpd, a apărut <a href="http://redmine.lighttpd.net/boards/2/topics/686" title="Spawn-FCGI Win32" target="_blank">o versiune nativă de Windows</a> pe forurile respective. De curiozitate am luat <a href="http://redmine.lighttpd.net/attachments/727/spawn-fcgi-win32.c" title="Spawn-FCGI Win32 Source" target="_blank">sursa</a>, am compilat-o cu MinGW (gcc -O2 -lws2_32 -o spawn-fcgi-win32.exe spawn-fcgi-win32.c) și am început să mă joc. Într-un mod așteptat, suportul pentru PHP FastCGI childs nu funcționează sub Windows, din motive tehnice. De fapt cercetând sursele PHP pentru cgi SAPI (php-src/sapi/cgi/cgi_main.c) partea cu child process este pusă între niște blocuri de preprocesare pentru compilator: #ifndef PHP_WIN32 &#8230; #endif ceea ce practic anulează FastCGI Process Manager-ul rudimentar implementat de către echipa de dezvoltare a PHP. Motivele sunt simple: spre deosebire de *NIX, sub Windows nu există conceptul de fork() al proceselor. Ba mai mult, sub *NIX există PHP-FPM(FastCGI Process Manager) ceea ce dă apă la moară și mai mult unei platforme non-Windows pentru PHP. Fanii nginx știu despre ce este vorba.</p>
<p>Vestea bună este faptul că acel spawn-fcgi-win32.exe știe să lanseze mai multe procese ce să servească pe același port TCP. Dă și idei despre cum ar trebui implementat un FastCGI Process Manager sub Windows pentru PHP. Ba mai mult, cum ziceam și în paragraful anterior,  acestea vor servi prin round robin load balance. Această arhitectură multiproces, deși nu se pretează stilului Windows ce este preponderent multithread, rezolvă problemele cu extensiile de PHP ce nu au implementat acel &#8216;thread safety&#8217;, iar clusterul poate să facă uz de o arhitectură SMP, fără a apela la threading.</p>
<p>Acum poate apare întrebarea: de ce mai multe procese FastCGI pentru a procesa scripturile PHP? În primul rând practica ne invață că un &#8217;segmentation fault&#8217; poate să apară oricând, iar în producție nu este faptul cel mai de dorit. Arhitecturile multiproces s-au dovedit a fi cele mai potrivite. Vezi cazul Google Chrome cu 1 proces per tab. În al doilea rând, un proces PHP ce servește cereri FastCGI are o limită de 500 de cereri după care acel proces se închide. Acea limită este codată în sursele PHP (tot în cgi_main.c). Acea limită se poate altera prin &#8216;environment variables&#8217;, și anume prin: PHP_FCGI_MAX_REQUESTS. Problema care se ivește: o limită mare poate duce la probleme de memorie ocupată abuziv (memory leaks). În concluzie, această limită este necesară. Prin design-ul serverului FastCGI al PHP, limita este obligatorie și finită deci este nevoie de un PHP FastCGI Process Manager. Apache are ceva extensii (mod_fastcgi si mod_fcgid, doar mod_fastcgi știe să folosească TCP binding) sau soluția Zend Server: Zend Enabler for Apache, IIS are propriul manager. Piața de web servere de Windows ce <em>întâmplător</em> știu de FastCGI nu se termină aici. Spre exemplu eu folosesc versiunea nativă a nginx sub Windows pentru simplul fapt că folosesc nginx și sub alte platforme. Am o târlă de motive pentru care nginx este trecut în preferințele subsemnatului ca web server excelent. Dar, în același timp, nu pot să mă iau după toate &#8216;tutorialele&#8217; de PHP FastCGI sub Windows unde &#8216;php-cgi.exe -b 127.0.0.1:9000&#8242; este suficient pentru a rula. Este suficient până la primul crash sau până la 500 de cereri. În plus, eu ca web developer poate că îmi doresc o soluție complet separată de web server.</p>
<p>Bun, acum am pus bazele ideei despre cum ar trebui făcut un Process Manager. Una dintre probleme este acel &#8216;race condition&#8217;: dacă toate procesele au aceeași viață, spre exemplu un cluster local de 4 cu limită implicită de 500, atunci acestea se vor termina în modul următor: la cererea 1997 &#8211; primul, la cererea 1998 &#8211; al doilea, la cererea 1999 &#8211; al treilea, la cererea 2000 &#8211; ultimul. Dacă process managerul nu se prinde de faptul că nu mai exista cineva care să proceseze ceva.php, atunci web serverul va servi clasica eroare 504 (Gateway Timeout) iar clienții conectați la webserver vor fi nemulțumiți. Acel php-cgi.exe nu oferă o metodă de identificare a faptului că rămâne fără cereri. Nu există în cod suport pentru IPC (Inter Process Communication) cu un manager. În concluzie, după bootstrap, un manager poate doar să monitorizeze clusterul. Nu susțin faptul că nu s-ar putea implementa. Ori, această monitorizare poate avea întârzieri, și pe un server încărcat aceasta nu este de dorit. În concluzie, printr-un algoritm, managerul ar putea mări artificial și temporar viața proceselor 2, 3 și 4 pentru a pune un interval de întârziere și a fi cineva acolo care să servească până monitorul se prinde de faptul că lipsește cineva. Altă idee ar mai fi modificarea pentru Windows a serverului FastCGI ca să suporte respawn (autospawn), înainte de a se închide, deși încă nu am investigat dacă această posibilitate este realizabilă din punct de vedere tehnic. Teoretic ar fi OK, cel puțin din câte mă prind citind despre varii funcții din Windows API. Ar rezolva problema existenței unui child care să servească, in concluzie managerul s-ar transforma în simplu monitor de procese după secvența de bootstrap unde lansează clusterul. Idei am, din păcate n-am mai pus mâna pe C decât ocazional în ultimii 5 ani. Din fericire mai pricep ce e prin codul altora <img src='http://www.saltwaterc.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Ziceam și pe <a href="http://twitter.com/SaltwaterC/status/7451025800" title="De ce nu există un PHP - FastCGI Process Manager sub Windows?" target="_blank">Twitter</a>: <span class="status-body"><span class="entry-content">De ce nu există un PHP &#8211; FastCGI Process Manager sub Windows? Pentru că nimeni nu și-a dat interesul să scrie unul. Posibilităti există!</span></span></p>
<p>Ceea ce ne aduce iarăși la WinCache. N-am început degeaba cu el. Unei platforme PHP îi stă bine și cu un opcode cache (PHP accelerator, whatever). Pe lângă PHP din Zend Server &#8211; ce vine cu multe jucării de la mama lui, Zend, cred că se poate pune un nginx. Problema acceleratorului și al Cache API-ului ar fi rezolvată. Ba ar fi compatibil codul cu un eventual APC folosit în producție, chiar dacă în teorie, având în vedere soluțiile multiple, se recomandă o bibliotecă abstractă cu drivere pentru varii extensii PHP. Bun, ar zice unii: dar APC ce are? Păi, ultima versiune pusă la dispoziție de unul dintre oamenii ce se ocupă de build-ul de PHP pentru Windows, precum și de dezvoltarea lui, a pus la dispoziție o <a href="http://downloads.php.net/pierre/" title="Windows PHP extensions" target="_blank">chestie compatibilă PHP 5.3.x</a> ce din păcate pusă în setup-ul multiproces expus mai devreme duce la crash. Practic din 4 procese, 3 crapă, unul rulează relativ stabil. Contravine ideii de multiproces. XCache deși este excelent, nu foloseste shared memory pentru data cache, deci practic acesta va fi împărțit într-un număr egal cu numărul de procese. Nu știu code cache-ul cum se comportă. WinCache știe doar code cache, dar face uz de shared memory și funcționează bine cu load balancer-ul. În concluzie, cel puțin pe termen scurt WinCache are un rol acolo. Mai mult, WinCache funcționează doar cu versiunile de PHP non-thread-safe, compilate cu Visual C++ 9, și teoretic cu IIS, practic Microsoft a mințit. Funcționează cu nginx fără probleme și de ce nu, cu alte servere.</p>
<p>Altă idee: un server web sub *NIX ar putea folosi un server FastCGI sub Windows. nginx poate să folosească backend-uri multiple, eventual cu load balance între mai multe mașini. Deși încă sunt de părere că PHP sub Windows cam suge datorită faptului că are multe lacune iar majoritatea bibliotecilor ce le integrează provin din *NIX, are un atu: suportul COM/.NET &#8211; ceea ce înseamnă că într-o arhitectură existentă se poate adăuga un server Windows cu PHP ce să poată beneficia de anumite SDK-uri comerciale ce se distribuie sub formă de COM.</p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/0qBTOFCJQ5Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/windows/php-sub-windows-zend-server-wincache-%c8%99i-un-cluster-fastcgi-cu-process-manager.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/windows/php-sub-windows-zend-server-wincache-%c8%99i-un-cluster-fastcgi-cu-process-manager.html</feedburner:origLink></item>
		<item>
		<title>Actualizare de Virtualbox. Acum ce? Management de procese? Reboot!</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/L1lQxoY55RA/actualizare-de-virtualbox-acum-ce-management-de-procese-reboot.html</link>
		<comments>http://www.saltwaterc.net/windows/actualizare-de-virtualbox-acum-ce-management-de-procese-reboot.html#comments</comments>
		<pubDate>Sat, 28 Nov 2009 10:53:44 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Virtualizare]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/windows/actualizare-de-virtualbox-acum-ce-management-de-procese-reboot.html</guid>
		<description><![CDATA[Băieții aceștia faini de la Sun Microsystems au &#8216;ghiara&#8217; pe VirtualBox de la băieții de la Innotek. Vremuri istorice tulburi cu un produs mediocru. Între timp Sun-ul a băgat camionul de dolari în proiect și a început să se distingă din mulțime printr-un backend foarte puternic. Pe subsemnatul l-a convins să renunțe la VMware Server [...]]]></description>
			<content:encoded><![CDATA[<p>Băieții aceștia faini de la Sun Microsystems au &#8216;ghiara&#8217; pe VirtualBox de la băieții de la Innotek. Vremuri istorice tulburi cu un produs mediocru. Între timp Sun-ul a băgat camionul de dolari în proiect și a început să se distingă din mulțime printr-un backend foarte puternic. Pe subsemnatul l-a convins să renunțe la VMware Server pentru acele &#8217;server consolidation deployment&#8217; ce mai apărea prin rețelele locale pe unde operez. Tot istoric vorbind, pentru Windows se distribuiau două pachete, unul pentru x86 și unul pentru x86-64. În prezent se distribuie unul singur ce se instalează în funcție de contextul platformei.</p>
<p>Bun. La partea cu instalarea îmi doream să ajung. Mai bine zis la partea cu actualizarea. De regulă pe un Ubuntu Server ce mai rulează servicii mici/medii VirtualBox are bunul simț să ruleze în background ca daemon printr-un simplu init script. În concluzie actualizările le fac atunci când îmi mai aduc aminte să deschid interfața grafică. Sub Windows în schimb este o jucărie unde mai testez ultimele apariții în domeniul OS. Dar aici mă lovesc suficient de des de acea fereastră ce mă anunță faptul că a apărut o nouă versiune. Click &#8211; download  &#8211; next, next, next &#8230; gata. În teorie era gata. În practică 3.0.12, adică ultima versiune, refuză să adauge orice fel de HDD virtual nou și am o mică bănuială despre imposibilitatea de a adăuga noi mașini virtuale.</p>
<p>Mă apuc să lucrez în calculator să văd ce se întâmplă (doctore). Cretinătatea aceea de installer nu a închis VBoxSVC înainte de instalare. Adică acel serviciu ad-hoc din arhitectura VirtualBox ce se ocupă de mașinile virtuale atâta timp cât rulează cel puțin una. În mod normal stă închis acel proces. Ridicolul merge mai departe. Acel proces, VBoxSVC dă un &#8216;lock&#8217; exclusiv pe fișierele de configurare astfel încât să nu apară chestia aceea numită &#8216;race condition&#8217; în geek language. Iar acel proces nu mai vrea să moară. Task Manager-ul e inutil ca de obicei la omorât procese încăpățânate. Am scos artileria grea: <a href="http://diamondcs.com.au/advancedseries/apt.php" title="Advanced Process Termination" target="_blank">Advanced Process Termination</a> (APT). Pe lângă o duzină de metode de kill, știe două metode de kernel kill și încă două de crash kill. Kernel kill pe Windows 7 x64 nu are suport. Nu mi-am spart capul cu hack-ul de OS. Din păcate metodele din user mode au dat greș. Windows încă e copil mic și udă patul atunci când vine vorba de procese încăpățânate. Sistemele UNIX-like (ex: Linux, FreeBSD) rămân în situația penibilă de mai sus atunci când un proces rămâne blocat în &#8216;<a href="http://en.wikipedia.org/wiki/Uninterruptible_sleep" title="IO wait" target="_blank">IO wait state</a> &amp; friends&#8217;. Soluția este evidentă: reboot. Dar m-am cam săturat să rămân cu procese blocate pentru ca Windows e rebut la management-ul lor din &#8216;user mode&#8217;. Iar VirtualBox e rebut la actualizare și nu își știe închide serviciul înainte de un nou &#8216;deploy&#8217;. În mod curios, procesul blocat nu apare în APT. Dar APT are o jucărie numită &#8216;Custom PID&#8217; pentru a da kill după kill.</p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/L1lQxoY55RA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/windows/actualizare-de-virtualbox-acum-ce-management-de-procese-reboot.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/windows/actualizare-de-virtualbox-acum-ce-management-de-procese-reboot.html</feedburner:origLink></item>
		<item>
		<title>Agile OpenSpace la Cluj, Scrum și Software Craftsmanship – Code retreat</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/OS8t7-yxHHU/agile-openspace-la-cluj-scrum-si-software-craftsmanship-code-retreat.html</link>
		<comments>http://www.saltwaterc.net/programare/agile-openspace-la-cluj-scrum-si-software-craftsmanship-code-retreat.html#comments</comments>
		<pubDate>Tue, 13 Oct 2009 23:06:04 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Programare]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/fara-nume/agile-openspace-la-cluj-scrum-%c8%99i-software-craftsmanship-code-retreat.html</guid>
		<description><![CDATA[Vineri și sâmbătă subsemnatul și Ciprian și-au mișcat fundurile pătrățoase până la Cluj pentru o întâlnire informală anunțată de către AgileWorks Romania, ca urmare a efortului curent de a ne &#8216;agiliza&#8217;. Deși inițial s-ar fi anunțat mai multă lume, prezența clujeană a fost destul de restrânsă &#8211; ceea ce într-un fel a fost trist, din [...]]]></description>
			<content:encoded><![CDATA[<p>Vineri și sâmbătă subsemnatul și <a href="http://despremere.blogspot.com/" title="Despre mere, marketing și comunicare" target="_blank">Ciprian</a> și-au mișcat fundurile pătrățoase până la Cluj pentru o întâlnire informală anunțată de către <a href="http://groups.google.com/group/agileworks-romania" title=" AgileWorks Romania">AgileWorks Romania</a>, ca urmare a efortului curent de a ne &#8216;agiliza&#8217;. Deși inițial s-ar fi anunțat mai multă lume, prezența clujeană a fost destul de restrânsă &#8211; ceea ce într-un fel a fost trist, din moment ce au apărut și speak-eri de talie mondială ce în mod normal ar veni pe finanțe dese la o conferință. Noi i-am prins pe &#8216;moca&#8217;. Cei ce au ajuns totuși, în ordinea în care au stat la masă și s-au prezentat:</p>
<p>- <a href="http://www.mihaibrehar.ro/blog/" title="programare web, management, antreprenoriat" target="_blank">Mihai Brehar</a></p>
<p>- <a href="http://www.mozaicworks.com/" title="Think, Design, Work Smart" target="_blank">Maria Diaconu</a></p>
<p>- Aici ar trebui să am un nume, dar am un lapsus în schimb</p>
<p>- <a href="http://www.negrean.ro/" title=" IT, New Marketing &amp; Web Specialist" target="_blank">Ovidiu Negrean</a></p>
<p>- Ciprian Stăvar</p>
<p>- Ștefan Rusu (adică subsemnatu&#8217;)</p>
<p>- <a href="http://www.alexbolboaca.ro/silverstripe/" title="Science, Evolution, Software Development" target="_blank">Alex Bolboacă</a></p>
<p>- Paul Nagy</p>
<p>- <a href="http://www.noop.nl/welcome.html" title="Management, Development, Complexity, and Whimsicality" target="_blank">Jurgen Appelo</a></p>
<p>În fine, timpul a fost scurt, au fost ceva probleme cu locația, s-au propus mai multe teme, s-a vorbit în mare parte despre estimări. Am trecut repede la fapte, cu berea în față (am specificat: cadru informal) dar cu atenția spre Agile. Paul în special și restul au oferit câteva informații valoroase:</p>
<p>- estimările se pot face pe task-uri ce nu depind de alte task-uri. Un dezvoltator pricepe mai bine care-i treaba cu dependința.</p>
<p>- este mai ușor să măsori în unități relative comparat cu unități bine stabilite. Exercițiul a constat în faptul că l-a pus pe Mihai Brehar să estimeze distanța dintre ei. Răspuns: 1,5m. Următoarea chestie a fost: pune degetul unde crezi tu că este jumătatea distanței dintre noi. Ochiometric a fost bine, iar dacă treceam la măsurători precise, a doua estimare ar fi mai bună &#8211; de unde și povestea cu velocity points. Pe de altă parte acele velocity points sunt valabile pentru o echipă. Schimbi oameni din echipă &#8211; ai altă echipă. Ajungem la filosofia Agile &#8211; oameni, nu unelte, dar despre asta era vorba în primul rând, nu?</p>
<p>- pentru cei ce vor să estimeze task-urile în timp, Paul a fost ferm: &#8216;am o veste proastă pentru dezvoltatori &#8211; nu puteți&#8217;. Se leagă de povestea de mai sus.</p>
<p>-  au fost prezentate mai multe metode de estimare, pe lângă clasicele numere incrementate sau luate ca valori din șirul lui Fibonacci, Alex a prezentat un tabel ceva mai complicat (nu îl pot reproduce, am reținut doar chestia cu numerele la tricouri <img src='http://www.saltwaterc.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ), iar Paul a vorbit despre metoda cărților de poker.</p>
<p>- ca idee, este nevoie de date suficiente pentru a face calcule. Ideea este luată oarecum din teoria numerelor mari din statistică. Numerele mici dau statisticile peste cap cu variații mari când ai date puține &#8230; dar când ai date multe, situația se schimbă.</p>
<p>- încă o reprezentare grafică a fost o chestie ce arăta partea de &#8216;known&#8217; și partea de &#8216;unknown&#8217; ce înconjoară acea zonă. Se leagă de chestiile de mai sus. Scopul este de a trece mai repede de la &#8216;unknown&#8217; la &#8216;known&#8217; prin învățare &#8211; cu cât înveți mai repede, cu atât mai repede se produce tranziția &#8211; și prin feedback.</p>
<p>Pentru că discuția a rămas începută, am schimbat locația datorită micilor probleme pomenite mai sus. Mai multă bere (beer is priceless!) și discuții mai aprinse. Ca niște concluzii: Agile este o filosofie (nimic nou sub Soare aici) ca răspuns celor ce debitează pe această temă. Paul (din nou) a venit cu o completare la idee prin &#8216;Scrum este un framework&#8217;. Ba mai mult, este un framework minimal &#8211; dacă scoți din el, se duce naibii totul, dar mai departe pe el se poate construi și personaliza metodologia de lucru. De altfel, cred că Jurgen a spus aceasta, sper să nu atribui greșit citatul/adaptarea, cei ce &#8216;fac Scrum&#8217; au tot atâtea șanse de a &#8216;face Scrum&#8217; câte șanse are un programator de a instanția o clasă abstractă. Lucru ce vine în completarea ideii despre Scrum ca framework.</p>
<p>Altă discuție interesantă la bere ce merită menționată a fost motivul pentru care managerii nu trebuie să pună presiune pe dezvoltatori. Din nou Paul la balon &#8211; da a fost vedeta serii. Cercul vicios sună/arată cam așa: presiune de la manager catre dezvoltator -&gt; grabă + hack -&gt; cod prost -&gt; maitenance -&gt; mai puțini oameni activi. Ultimele 3 duc la frustrare, buguri care mai departe duc la și la mai multă presiune, iar frustrarea adaugă încă o doză de cod prost și bug-uri.</p>
<p>A doua zi a fost dedicată Code retreat-ului, deși a apărut prin zonă doar Mihai Brehar și mai târziu Ovidiu Negrean. Deși mă simțeam ca după o bătaie cu parul (motiv necunoscut), am luat parte la toate cele trei iterații ce s-au făcut pe problema jocului de <a href="http://groups.google.com/group/agileworks-romania/browse_thread/thread/a7cfa7190436b687" title="  AgileWorks - October 2009 - ClujNapoca  " target="_blank">poker</a>, problemă pentru care am apelat la PHP ca limbaj și Kohana ca framework pentru simplitatea de a încărca automat clase și a face rapid un prototip. Primele două au fost alături de Mihai unde am exersat varii tehnici (TDD, pair programming), ultima a fost cu Alex. Ultimele două iterații au fost bazate pe TDD. Ca rezumat:</p>
<p>- prima iterație = FAIL. Cică era de așteptat. După 45 minute de pair programming, codul a fost rulat o singură dată și a returnat un simplu 0 &#8211; ceea ce nu rezolva prima mână. S-a văzut importanța testelor și ca o paranteză la implementare &#8211; folosirea limbajului de business cerut de client (black și white pentru jucători, nu hand1 și hand2).</p>
<p>- a doua iterație, TDD based, nu doar că a fost cu succes, dar am avut și timp de refactoring plus 5 minute de relaxare. Alex a fost prin zonă cu o mână de ajutor deoarece nimeni nu știa cum să facă TDD.</p>
<p>- a treia iterație a mers tot pe mâna TDD, am folosit o abordare diferită a problemei (altă echipă). Inițial ne-am propus să rezolvăm problema full house, iar în final am rezolvat și careul deoarece soluțiile erau înrudite în contextul respectiv. De data aceasta am fost creativ și am folosit o metodă matematică ce nu presupune parcurgerea mâinilor, ci calcule. Problema s-a redus la una de rezolvare a unui sistem de clasa a VI-a:</p>
<p>{ 2X + 3Y = 4X + Y</p>
<p>{ 2X + 3Y = X+ 4Y</p>
<p>ce rapid ajunge la X = Y  pe ambele ecuații (două drepte suprapuse, ca reprezentare în plan x0y) de unde și concluzia că soluția este funcțională pentru cele două cazuri (full + careu), deoarece X = Y presupune &#8216;five of a kind&#8217; cum erau la acele jocuri obosite de poker ce se găseau prin varii baruri. E bună și matematica aceasta la ceva în programare și mi-am adus aminte de ce sunt bune unele modele: dacă sunt demonstrate corect și implementate corect, sunt &#8216;bug free&#8217; din punct de vedere logic. Excludem erorile de limbaj/runtime.</p>
<p>Pentru că puțini pricep cum se face TDD, iau ca exemplu un feature ce trebuie să returneze -1, 0 sau 1 &#8211; folosit și în tratarea cazurilor la jocul de poker (black, tie, white).</p>
<p>- se scrie primul test (am folosit assert($obj-&gt;method() == -1);, nu am apelat la PHPUnit)</p>
<p>- se implementează un mock în method (return -1;)</p>
<p>- se rulează testul =&gt; OK</p>
<p>- se scriu celelalte teste (assert($obj-&gt;method() == 0); și assert($obj-&gt;method() == 1);), se rulează și evident, eșuează</p>
<p>- se implementează codul funcțional propriu zis</p>
<p>- se rulează iar testele, iar dacă totul e OK, refactor și teste</p>
<p>Chiar aveam într-o metodă o eroare de logică, TDD a arătat rapid sursa problemei, iar debug-ul a durat 10 secunde. Avantajele sunt clare. Ca idee: TDD se potrivește doar pentru core functionality, nu pentru interfețe. Nu poți testa un capcha sau un CSS pe IE 6 prin TDD. Pentru aplicații ce folosesc baze de date, este nevoie de un mock. În rest, metoda își arată utilitatea. Noapte bună!</p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/OS8t7-yxHHU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/programare/agile-openspace-la-cluj-scrum-si-software-craftsmanship-code-retreat.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/programare/agile-openspace-la-cluj-scrum-si-software-craftsmanship-code-retreat.html</feedburner:origLink></item>
		<item>
		<title>MSI P35 Neo2 FR și update de BIOS</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/H5ofg5xF1L8/msi-p35-neo2-fr-si-update-de-bios.html</link>
		<comments>http://www.saltwaterc.net/rant/msi-p35-neo2-fr-si-update-de-bios.html#comments</comments>
		<pubDate>Mon, 05 Oct 2009 15:49:30 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Rant]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/rant/msi-p35-neo2-fr-si-update-de-bios.html</guid>
		<description><![CDATA[Ăștia de la MSI fac niște plăci de bază execelente atâta timp cât nu trag nimic la măsea. Din păcate, plăcile precum cea pomenită în titlu au un mod de-a dreptul cretin de a face update la BIOS.
Metode oficiale:
- Iei una bucată startup disk (floppy de ăla), pui imaginea ROM și aplicația de actualizate pe [...]]]></description>
			<content:encoded><![CDATA[<p>Ăștia de la MSI fac niște plăci de bază execelente atâta timp cât nu trag nimic la măsea. Din păcate, plăcile precum cea pomenită în titlu au un mod de-a dreptul cretin de a face update la BIOS.</p>
<p>Metode oficiale:</p>
<p>- Iei una bucată startup disk (floppy de ăla), pui imaginea ROM și aplicația de actualizate pe o partiție FAT, butezi în DOS și flash-uiești BIOS-ul. FAIL. N-am chef de floppy &#8211; nici n-am mai folosit vreunul de ani buni.</p>
<p>- Pentru cei fără partiții FAT (aka majoritatea în secolul 21), iei una bucată startup disk de Windows 98 sau Windows ME (WTF?!) plus una bucată floppy disk pe care se alfă aplicația de actualizare și imaginea ROM. Butezi de pe startup, actualizezi de pe al doilea disk. FAIL. Double FAIL.</p>
<p>Metode semi-oficiale (nesuportate de MSI):</p>
<p>- Îți faci cont pe forumurile MSI. Este trist pentru că nici măcar nu poți citi thread-urile de update făra cont. Trist și inutil. Există vreo două aplicații ce crează stick-uri USB pentru boot. Una dintre aplicațiile menționate știe chiar live update. Partea jenibilă: îți trebuie o placă MSI în sistem ca să poți face un stick boot-abil. WTF? FAIL.</p>
<p>Metoda subsemnatului:</p>
<p>- În primul rând n-am Windows pe mașina cu pricina și nici nu cred că o să am vreodată. Este strict pentru dezvoltare și altceva înafară de Ubuntu nu a văzut de la geneză și până în prezent. Floppy nu am de gând să îmi pun pentru un f%t%t de BIOS update. Și nici nu am de gând să caut două disk-uri. În plus sunt destul de fragile. Ca să fac un stick boot-abil trebuie să rulez pe o mașina cu placă de bază MSI ceea ce este inutil și enervant. N-o să pun Windows doar pentru că așa vrea dezvoltatorul aplicației respective. Da, actualizările MSI sunt Windows-centric. Aș fi dat multe pentru acel ASUS EZ Flash 2 cu inerfață grafică, accesibil din BIOS. Deși ASUS Update de Windows suge. Vineri a făcut praf un P5B Deluxe &#8211; a șters chip-ul, dar a &#8216;uitat&#8217; să-l mai scrie. După care a refuzat orice interacțiune. Dar măcar suportul din hardware e impecabil. În concluzie a trebuit să fiu inventiv.</p>
<p>Pas 1 : Se ia una bucată <a href="http://unetbootin.sourceforge.net/" title="UNetbootin allows you to create bootable Live USB drives" target="_blank">UNetbootin</a>. Are atât versiune de Windows cât și versiune de Linux. Pentru Ubuntu se găsește <a href="http://launchpad.net/~gezakovacs/+archive/ppa" title="PPA for Geza Kovacs  " target="_blank">repository PPA</a>, deci instalarea a fost după metoda standard după ce s-a adăugat noul repo în config.</p>
<p>Pas 2: Se ia una bucată stick USB formatat FAT32 și se infige în portul cu pricina. Se lansează UNetbootin. Pentru că pe net se găsesc doar tutoriale complicate despre cum se instalează FreeDOS pe USB, am ales UNetbootin. Are interfața cu dificultate apropiată de nivelul de percepție al unui retard.</p>
<p>Pas 3: se alege ca distribuție FreeDOS din primul drop down (da, nu știe doar Linux) &#8211; și versiunea 1.0 (singura disponibilă). Jos se alege drive-ul USB pe care să-l scrie (în cazul în care detectează mai multe) &#8211; OK. Ar trebui să downloadeze FreeDOS de pe Web și să-l pună pe stick.</p>
<p>Pas 4: Se desface arhiva în care se gasește imaginea ROM și aplicația de actualizare. Se pun pe stick-ul USB menționat anterior. Reboot.</p>
<p>Pas 5: Se scormonește prin BIOS pentru a putea face USB boot. Opțional se poate sări peste BIOS. F11 în timpul POST ar trebui să arate meniul în care se alege BOOT device-ul. Așa e la P35 Neo2 FR. La altele e Esc în timpul POST.</p>
<p>Pas 6: Se alege opțiunea 3 din meniul FreeDOS. Nu e un meniu standard (pentru cei familiarizați cu FreeDOS) precum cel din imaginea ISO. Opțiunea 3 e un live edition cu highmem suport, blah, blah, blah, yada, yada, yada. Se încarcă FreeDOS, după care se tastează în shell B:. Da, mi-a luat ceva să mă prind de faptul că B: este de fapt drive-ul USB propriu zis. În A: se montează live filesystem-ul FreeDOS.</p>
<p>Pas 7: Se rulează aplicația de actualizare ce primește ca argument fișierul de update. În cazul subsemnatului:</p>
<p>B:\&gt; Afud408.exe A7345IMS.1A0</p>
<p>Se așteaptă până își termină toate mizeriile. Reboot. Ar fi bine ca sistemul să nu crape în timpul update-ului. Exclus OC și alte mizerii. Nu strică un UPS.</p>
<p>După reboot BIOS-ul o să dea un checksum bad la CMOS și e normal pentru că imaginea ROM e diferită. F1 pentru a intra în setup. Se va vedea faptul că s-a instalat ultima versiune și se pot pune vechile opțiuni. Succes.</p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/H5ofg5xF1L8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/rant/msi-p35-neo2-fr-si-update-de-bios.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/rant/msi-p35-neo2-fr-si-update-de-bios.html</feedburner:origLink></item>
		<item>
		<title>Problema mail() din Zend Server Community Edition – Debian Repository</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/9HlPBOb1-eM/problema-mail-din-zend-server-community-edition-debian-repository.html</link>
		<comments>http://www.saltwaterc.net/rant/problema-mail-din-zend-server-community-edition-debian-repository.html#comments</comments>
		<pubDate>Sun, 04 Oct 2009 19:53:07 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Rant]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/rant/problema-mail-din-zend-server-community-edition-debian-repository.html</guid>
		<description><![CDATA[Din plictiseală sau datorită faptului că în mod repetitiv m-am tot lovit de Zend Server CE printre plimbările mele pe Web, m-am decis să renunț la versiunea implicită ce vine în reopository-ul sistemului de operare de pe mașina de dezvoltare (Ubuntu Hardy) și să pun în schimb Zend Server. Zis și făcut. Țac, țac, țac [...]]]></description>
			<content:encoded><![CDATA[<p>Din plictiseală sau datorită faptului că în mod repetitiv m-am tot lovit de Zend Server CE printre plimbările mele pe Web, m-am decis să renunț la versiunea implicită ce vine în reopository-ul sistemului de operare de pe mașina de dezvoltare (Ubuntu Hardy) și să pun în schimb Zend Server. Zis și făcut. Țac, țac, țac &#8211; zgomot de taste &#8211; instalarea a mers ca unsă.</p>
<p>Din păcate, ocazional, dezvolt și aplicații ce au nevoie de acces la funcția mail(), funcție ce altceva înafară de FALSE aka FAIL nu știa să returneze. Verific Postfix-ul &#8211; rula de zor. Deci nu era bubă de MTA. NU, nu suport Sendmail. Iau o porție de copypasta de pe php.net, pun totul întrun fișier php, rulez în shell &#8211; surpriză:</p>
<p>sh: -t: not found</p>
<p>Mă scarpin cu o mână în cap și cu cealaltă în dos. Ceva îmi pute &#8211; și nu era de la a doua mână. Încep să sap pentru a afla ce pește prăjt au făcut cei de la Zend cu php.ini de încearcă să ruleze aplicația &#8216;-t&#8217;. Crăp un output de phpinfo() in Firefox și mă luminez:</p>
<p>sendmail_path Local Value: -t -i Master Value:  -t -i</p>
<p>Erm, WTF Zend? Casc vinovatul (/usr/local/zend/etc/php.ini) și caut linia cu pricina ce bine mersi era comentată. Cică în mod implicit ar trebui să fie &#8217;sendmail -t -i&#8217;, dar se pare că opțiunea nu este hardcodată ca atare. Soluția e la mintea cocoșului:</p>
<p>sendmail_path = sendmail -t -i</p>
<p>Restart la Apache2. Merge? Merge. Shell-ul este fericit deasemenea.</p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/9HlPBOb1-eM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/rant/problema-mail-din-zend-server-community-edition-debian-repository.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/rant/problema-mail-din-zend-server-community-edition-debian-repository.html</feedburner:origLink></item>
		<item>
		<title>Vulnerabilitate în WordPress e pleonasm</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/DgguwSx-aCM/vulnerabilitate-in-wordpress-e-pleonasm.html</link>
		<comments>http://www.saltwaterc.net/wordpress/vulnerabilitate-in-wordpress-e-pleonasm.html#comments</comments>
		<pubDate>Thu, 13 Aug 2009 07:25:49 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/tech/wordpress/vulnerabilitate-in-wordpress-e-pleonasm.html</guid>
		<description><![CDATA[Cu riscul de a supăra vreo câțiva spălați pe creier ce suferă de &#8216;fanboyism&#8217;, WordPress încă suge pe partea de securitate. Da, s-au făcut progrese, da, timpul de răspuns al echipei de dezvoltare este scăzut (vezi cazul 2.8.4), da, am eu mania unor reguli stricte (prea stricte în opinia neavizată a unora), da, am boala [...]]]></description>
			<content:encoded><![CDATA[<p>Cu riscul de a supăra vreo câțiva spălați pe creier ce suferă de &#8216;fanboyism&#8217;, WordPress încă suge pe partea de securitate. Da, s-au făcut progrese, da, timpul de răspuns al echipei de dezvoltare este scăzut (vezi <a href="http://www.stefamedia.ro/vulnerabilitate-descoperita-la-wordpress-2-8-3-resetarea-parolei/" title="Vulnerabilitate descoperită la Wordpress 2.8.3.Resetarea parolei" target="_blank">cazul 2.8.4</a>), da, am eu mania unor reguli stricte (prea stricte în opinia neavizată a unora), da, am boala bug report. În fine, prin Iunie am încercat <a href="http://core.trac.wordpress.org/ticket/10294" title="Ticket #10294 (closed defect (bug): invalid)" target="_blank">lupta împotriva morilor de vânt</a> din punctul de vedere al posibilitaților de a lansa vectori de atac CSRF prin intermediul WordPress &#8211; folosind cont fără opțiunea de &#8216;unfiltered HTML&#8217;. Și da, aș fi contribuit cu un patch &#8211; deși problema nu este ușoară. Ca o paranteză, în cazul WordPress măcar am reușit să creez puțină vâlvă &#8211; alții precum cei de la SMF (Simple Machine Forums) nici în ziua de astăzi nu au răspuns la mail privind această problemă a CSRF-ului.</p>
<p>Sunt conștient de faptul că la nivel de WordPress problemele sunt minore sau inexistente datorită acelui sistem de token signature (wp_nonce), dar cumulat cu plug-in-uri defecte sau potențiale vulnerabilități pot duce la un efect de domino. Chiar descoperisem un plug-in vulnerabil la acest tip de atac, dar a fost patch-uit înainte să apuc să dau mail dezvoltatorului. Știu că unii pot atribui poveștii de mai sus valențe beletristice legate de droburi de sare, dar eu sunt dintre cei ce s-au mai fript cu WordPress &#8211; din fericire nu pe blogul personal. De fapt mulți dezvoltatori de plug-in-uri nu au o cultură a securității, și ca să nu fiu ipocrit, chiar și plug-in-ul subsemnatului are o problemă minoră ce ar putea fi exploatată printr-ul XSS+AJAX &#8211; deși e foarte dificil, dar nu mai este menținut din Ianuarie (va urma o rescriere completă). Iar o platformă atât de eterogenă are punctul cel mai slab localizat în codul cel mai slab &#8211; ce adesea va fi primul atacat având în vedere că acest aspect este o regulă în (in)securitate, iar caracterul deschis al platformei și plug-in-urile aferente elimină orice urmă de &#8217;security through obscurity&#8217;.</p>
<p>Pe de altă parte, la anumite probleme răspunsul a fost destul de prompt. În aceeași zi cu povestirea cu CSRF-ul de mai sus am dat un mail echipei de securitate cu niște XSS vectors localizați. <a href="http://www.stefamedia.ro/wordpress-2-8-2-repara-o-vulnerabilitate-xss/" title="WordPress 2.8.2. Repară o vulnerabilitate XSS" target="_blank">S-a scris</a> despre asta, deși detaliile sunt vagi. Problema raportată se manifestă doar pe IE 6, unele și pe IE 7, dar echipa WordPress nu s-a obosit să dea detalii. Atacurile se puteau lansa prin proprietăți CSS nefiltrate. Browserele decente nu suferă de această problema, dar judecând după cota de piață a IE 6 &amp; 7 &#8211; lucrurile nu sunt roz. Din păcate vulnerabilitatea se regăsește în toate versiunile anterioare lui 2.8.2, deci în cazul în care un blog arbitrar are posibilitatea de user registration și contribuție &#8211; este recomandat minim WP 2.8.2. Problema e însăși acea kses, menținută de către dezvoltatorii WordPress. Oficial proiectul kses e mort &#8211; nu a mai avut suport de prin 2006. Iar kses nu a fost concepută ca o bibliotecă sigură până la paranoia. Spre exemplu <a href="http://htmlpurifier.org/" title="HTML Purifier" target="_blank">HTML Purifier</a> bifează cu succes toate test case-urile ce se găsesc in <a href="http://ha.ckers.org/xss.html" title="XSS (Cross Site Scripting) Cheat Sheet" target="_blank">cheat sheet-ul celor de la ha.ckers.org</a> dar nu observ nici un efort în adoptarea acestuia. Au fost făcute plug-in-uri în acest sens &#8211; dar această funcționalitate ar trebui să fie &#8216;core level&#8217;. Filtrul WordPress a fost testat parțial de către subsemnatul &#8211; iar rezultatul îl vedeți mai sus. Nu am testat event handlers pe JavaScript pentru ca sunt 90 si ceva, iar un test case corect ar fi preferabil sa il codez, nu sa il fac de mana din motive de dimensiuni.</p>
<p>Din păcate, etic ar fi fost să se menționeze și cine și-a pierdut timpul pentru a le testa aplicația și raporta vulnerabilitatea. Da, nu am fost creditat. Nu este prima oară când se întâmplă, dar în cazul WordPress este deranjant pentru că dialogul nu a mers fin precum în cazul altora. Am ales metoda mail &#8211; pentru că din nou, așa e etic, spre deosebire de acțiunea de a pune totul pe grok.org ca sa panichez lumea &#8211; ce oricum pune botul la F.U.D. mai mult decât trebuie.</p>
<p>Știu că a vorbi este ușor și in principiu este degeaba. Cum am spus în repetate rânduri, oricine poate să își dea cu părerea &#8211; dar nu orice părere conteaza. Cam din perioada amintită mai sus tot ameninț lumea cu un blog engine implementat pe un M.V.C. framework iar motivele sunt evidente. Nu contest cantitatea de timp investită in WordPress, numărul de plug-in-uri disponibile (ce în timp devin enervante pe partea de maintenance), dar prea multă entropie și mentalitate îmbâcsită s-a strâns acolo. Dar pentru a face ceva &#8211; evident, este nevoie de timp, motiv pentru care WordPress înca se bucură de acest status quo pe care îl are având în vedere că am facut un numar consistent de deploy-uri la viața mea (iar pe unele le mențin).</p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/DgguwSx-aCM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/wordpress/vulnerabilitate-in-wordpress-e-pleonasm.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/wordpress/vulnerabilitate-in-wordpress-e-pleonasm.html</feedburner:origLink></item>
		<item>
		<title>Eclipse, Subclipse si relocarea unui repository SVN</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/oZD9Je__Q1g/eclipse-subclipse-si-relocarea-unui-repository-svn.html</link>
		<comments>http://www.saltwaterc.net/rant/eclipse-subclipse-si-relocarea-unui-repository-svn.html#comments</comments>
		<pubDate>Thu, 09 Jul 2009 15:57:18 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Programare]]></category>
		<category><![CDATA[Rant]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/rant/eclipse-subclipse-si-relocarea-unui-repository-svn.html</guid>
		<description><![CDATA[Se pare că interfața SVN pe care o are Subclipse activată în mod implicit, și anume JavaHL are un DNS resolving scris cu picioarele. Inițial am crezut că m-am tâmpit eu și nu am setat corect adresa serverului ce rezolva hostname-ul respectiv &#8230; dar adresa era corectă, deci relocare &#8211; din cuc &#8211; un alt [...]]]></description>
			<content:encoded><![CDATA[<p>Se pare că interfața SVN pe care o are Subclipse activată în mod implicit, și anume JavaHL are un DNS resolving scris cu picioarele. Inițial am crezut că m-am tâmpit eu și nu am setat corect adresa serverului ce rezolva hostname-ul respectiv &#8230; dar adresa era corectă, deci relocare &#8211; din cuc &#8211; un alt eventual checkout &#8211; din cuc. Din fericire există alternativă, și anume folosirea SVNKit pe post de interfață.</p>
<p>Window » Preferences » Team » SVN &#8211; iar Client se schimba din JavaHL în SVNKit. Voila &#8211; se rezolvă problemele.</p>
<p>Eroarea era ceva de genul:</p>
<blockquote><p>RA layer request failed<br />
svn: OPTIONS of &#8216;http://<em>hostname</em>/svn/<em>repository_path</em>/trunk&#8217;: Could not resolve hostname `<em>hostname</em>&#8216;: No such host is known (http://<em>hostname</em>)</p></blockquote>
<p>Acum totul este roz. Setup: Eclipse 3.4.1, Subclipse 1.6.2, Java 1.6.0_13.</p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/oZD9Je__Q1g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/rant/eclipse-subclipse-si-relocarea-unui-repository-svn.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/rant/eclipse-subclipse-si-relocarea-unui-repository-svn.html</feedburner:origLink></item>
		<item>
		<title>BuyBox.ro – si live deployment-ul</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/-tHHafnrDMM/buyboxro-si-live-deployment-ul.html</link>
		<comments>http://www.saltwaterc.net/rant/buyboxro-si-live-deployment-ul.html#comments</comments>
		<pubDate>Tue, 30 Jun 2009 20:44:18 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Rant]]></category>
		<category><![CDATA[Securitate]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/rant/buyboxro-si-live-deployment-ul.html</guid>
		<description><![CDATA[Deshid o nouă categorie cu acest post și anume o să îmi dau cu părerea și despre securitate. Știu că oricine poate să-și dea cu părerea, dar pe barba mea că nu e cazul de fața. Nu îmi stă în fire să îmi dau cu părerea dacă nu e nimic de zis.
Nu știu cum se [...]]]></description>
			<content:encoded><![CDATA[<p>Deshid o nouă categorie cu acest post și anume o să îmi dau cu părerea și despre securitate. Știu că oricine poate să-și dea cu părerea, dar pe barba mea că nu e cazul de fața. Nu îmi stă în fire să îmi dau cu părerea dacă nu e nimic de zis.</p>
<p>Nu știu cum se face, dar în țărișoara noastră eCommerce + securitate sunt două concepte ce par a fi mutual exclusive, altfel spus sunt disjuncte. Cel puțin cam așa se întâmplă în ultima vreme. Dacă tot faceți update la site sau a dat tanti Tanța cu mătura pe tastatură, măcar puneți în puii mei o pagină de offline, sau băgați erorile în log, în loc să le băgați in browser.</p>
<p><strong>Fatal error</strong>:  require() [<a href="http://www.buybox.ro/function.require">function.require</a>]: Failed opening required &#8216;admin/encriptare.php&#8217; (include_path=&#8217;.') in <strong>/[...]/index.php</strong> on line <strong>13</strong></p>
<p>Știu că este doar un simplu path disclosure, dar e un semn bun faptul că serverul acela nu prea e configurat pentru &#8220;producție&#8221;.</p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/-tHHafnrDMM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/rant/buyboxro-si-live-deployment-ul.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/rant/buyboxro-si-live-deployment-ul.html</feedburner:origLink></item>
		<item>
		<title>urlencode()/rawurlencode() complet</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/HMA_6Ga1UUw/urlencode-rawurlencode-complet.html</link>
		<comments>http://www.saltwaterc.net/programare/urlencode-rawurlencode-complet.html#comments</comments>
		<pubDate>Thu, 11 Jun 2009 23:32:22 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Programare]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/programare/urlencoderawurlencode-complet.html</guid>
		<description><![CDATA[Exceptând faptul ca Mr. Google bușește validarea blogului (deși W3 nu citește resursele externe = se validează), deasemenea exceptând faptul că WordPress mai trage câte o gherlă și refuză să pună conținut valid, este cunoscut faptul că am un oarecare fetiș cu standardele. În concluzie depun eforturi reale pentru a le respecta. Din păcate există [...]]]></description>
			<content:encoded><![CDATA[<p>Exceptând faptul ca Mr. Google bușește validarea blogului (deși W3 nu citește resursele externe = se validează), deasemenea exceptând faptul că WordPress mai trage câte o gherlă și refuză să pună conținut valid, este cunoscut faptul că am un oarecare fetiș cu standardele. În concluzie depun eforturi reale pentru a le respecta. Din păcate există situații rare în care caractere arbitrare din UTF-8 duc la invalidarea paginilor. Un exemplu bun este atunci când se compun link-uri ce conțin caractere non-ASCII. Soluția evidentă este URL encoding, dar din păcate funcția urlencode() din PHP, precum și rawurlencode() are boala de a omite caracterele menționate mai sus. Din moment ce dezvoltatorii PHP refuză introducerea unui flag pentru a putea face o codare completă a unui șir de caractere, există soluții ce pot fi aplicate la nivel de PHP. Soluția propusă de către subsemnatul depinde doar de componente din core (PCRE este parte a PHP core!).</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> url_encode_all<span style="color: #009900;">&#40;</span><span style="color: #000088;">$text</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #990000;">preg_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/./e'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;sprintf('<span style="color: #009933; font-weight: bold;">%%</span><span style="color: #009933; font-weight: bold;">%02X</span>', ord('<span style="color: #000099; font-weight: bold;">\\</span>0'))&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$text</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span></pre></div></div>

<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/HMA_6Ga1UUw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/programare/urlencode-rawurlencode-complet.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/programare/urlencode-rawurlencode-complet.html</feedburner:origLink></item>
		<item>
		<title>MySQL, arbori, o singură tabelă, cheile străine si un exemplu în Kohana</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/67uBTnpjOm8/mysql-arbori-o-singura-tabela-cheile-straine-si-un-exemplu-in-kohana.html</link>
		<comments>http://www.saltwaterc.net/programare/mysql-arbori-o-singura-tabela-cheile-straine-si-un-exemplu-in-kohana.html#comments</comments>
		<pubDate>Wed, 27 May 2009 16:34:27 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Programare]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/programare/mysql-arbori-o-singura-tabela-cheile-straine-si-un-exemplu-in-kohana.html</guid>
		<description><![CDATA[Aparent am o poveste de spus. Ei bine și de data aceasta aparențele nu înșeală. M-am lovit de suficiente ori de problema arborilor stocați în baze de date, în special atunci când este vorba de o structură de categorii. Cum nu sunt un mare fan al procedurilor stocate și al trigger-elor, sunt de părere că [...]]]></description>
			<content:encoded><![CDATA[<p>Aparent am o poveste de spus. Ei bine și de data aceasta aparențele nu înșeală. M-am lovit de suficiente ori de problema arborilor stocați în baze de date, în special atunci când este vorba de o structură de categorii. Cum nu sunt un mare fan al procedurilor stocate și al trigger-elor, sunt de părere că impunând o constrângere de cheie străina problema se rezolvă mult mai elegant atunci când vine vorba să se șteargă toată ierarhia. MyISAM nu știe el de chei străine deci aici vine în ajutor InnoDB. InnoDB știe de chei străine, dar cel mai probabil prin transformarea tabelei problema arborelui nu se rezolvă de la sine deoarece nu se pot impune constrângerile de cheie străina.</p>
<p>Ideea este următoarea: pentru a impune o cheie străina folosind MySQL și InnoDB este nevoie ca structura arborelui să fie corecta și aceasta să convină lui InnoDB. A doua parte este partea spinoasă. Cel mai probabil un arbore corect definit are un lucru esențial ce îi lipsește. Se dă următoarea structură de bază:</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">TABLE</span> <span style="color: #008000;">`trees`</span> <span style="color: #FF00FF;">&#40;</span>
<span style="color: #008000;">`id`</span> <span style="color: #999900; font-weight: bold;">INT</span><span style="color: #FF00FF;">&#40;</span> <span style="color: #008080;">11</span> <span style="color: #FF00FF;">&#41;</span> <span style="color: #FF9900; font-weight: bold;">UNSIGNED</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span> <span style="color: #FF9900; font-weight: bold;">AUTO_INCREMENT</span> <span style="color: #990099; font-weight: bold;">PRIMARY KEY</span> <span style="color: #000033;">,</span>
<span style="color: #008000;">`parent<span style="color: #008080; font-weight: bold;">_</span>id`</span> <span style="color: #999900; font-weight: bold;">INT</span><span style="color: #FF00FF;">&#40;</span> <span style="color: #008080;">11</span> <span style="color: #FF00FF;">&#41;</span> <span style="color: #FF9900; font-weight: bold;">UNSIGNED</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span> <span style="color: #990099; font-weight: bold;">DEFAULT</span> <span style="color: #008000;">'1'</span><span style="color: #000033;">,</span>
<span style="color: #008000;">`data`</span> <span style="color: #999900; font-weight: bold;">VARCHAR</span><span style="color: #FF00FF;">&#40;</span> <span style="color: #008080;">255</span> <span style="color: #FF00FF;">&#41;</span> CHARACTER <span style="color: #990099; font-weight: bold;">SET</span> utf8 <span style="color: #CC0099; font-weight: bold;">COLLATE</span> utf8_unicode_ci <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span> <span style="color: #000033;">,</span>
<span style="color: #990099; font-weight: bold;">INDEX</span> <span style="color: #FF00FF;">&#40;</span> <span style="color: #008000;">`parent<span style="color: #008080; font-weight: bold;">_</span>id`</span> <span style="color: #FF00FF;">&#41;</span>
<span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">ENGINE</span> <span style="color: #CC0099;">=</span> <span style="color: #990099; font-weight: bold;">InnoDB</span> CHARACTER <span style="color: #990099; font-weight: bold;">SET</span> utf8 <span style="color: #CC0099; font-weight: bold;">COLLATE</span> utf8_unicode_ci</pre></div></div>

<p>Precum se observă schema de date este corectă iar aparent nu pot apărea probleme. Se dă chiar următorul arbore:</p>
<pre>
1, 0, a
2, 0, b
3, 1, c
4, 1, d
5, 3, e
6, 2, f</pre>
<p>Deși (aparent) la prima vedere structural este corect, dacă se rulează interogarea ce ar trebui sa pună constrângerea:</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">ALTER</span> <span style="color: #990099; font-weight: bold;">TABLE</span> <span style="color: #008000;">`trees`</span> <span style="color: #990099; font-weight: bold;">ADD</span> <span style="color: #990099; font-weight: bold;">FOREIGN KEY</span> <span style="color: #FF00FF;">&#40;</span> <span style="color: #008000;">`parent<span style="color: #008080; font-weight: bold;">_</span>id`</span> <span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">REFERENCES</span> <span style="color: #008000;">`trees`</span> <span style="color: #FF00FF;">&#40;</span>
<span style="color: #008000;">`id`</span>
<span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">ON</span> <span style="color: #990099; font-weight: bold;">DELETE</span> <span style="color: #990099; font-weight: bold;">CASCADE</span> <span style="color: #000033;">;</span></pre></div></div>

<p>o să dea o eroare de MySQL de toată frumusețea, ceva gen:</p>
<pre>#1452 - Cannot add or update a child row: a foreign key constraint fails
([...]`, CONSTRAINT `[...]` FOREIGN KEY (`parent_id`)
REFERENCES `trees` (`id`) ON DELETE CASCADE)</pre>
<p>Cei cu privirea mai ageră poate că s-au prins de soluție. Nu întâmplător i-am dat valoare implicită 1 lui parent_id, ba chiar mai mult, exemplul dat de mine nu este UN arbore, ci mai mulți arbori stocați în aceeași tabelă. Am dat acest exemplu pentru că am întâlnit de suficiente ori în practică asemenea implementări ce mai încolo îmi dădeau bătăi de cap. Ba chiar am moștenit o astfel de baza de date pentru un proiect. Ceea ce confirmă zicala care spune faptul că web developerii sug la SQL &#8211; iar cum sunt și eu în breasla lor mă auto-includ. Dar din când în când, mai există și momente de deșteptare.</p>
<p>Soluția sună cam asa: se face backup la date. Cheile primare nu se salvează, coloana parent_id ce va deveni cheie străina se incrementează cu o unitate dacă este vorba de o implementare precum cea din exemplul meu, dacă nu, atunci se adaptează. Se golește tabela. Se aplică iarăși codul de mai sus pentru crearea cheii străine (ALTER TABLE bla, bla, bla). În mod deloc surprinzător, aceasta va funcționa fără probleme. Nu va mai da eroarea #1452. Dar, pentru a continua, este imperativ ca această înregistrare să se găsească în tabelă:</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">INSERT</span> <span style="color: #990099; font-weight: bold;">INTO</span> <span style="color: #008000;">`trees`</span> <span style="color: #FF00FF;">&#40;</span>
<span style="color: #008000;">`id`</span> <span style="color: #000033;">,</span>
<span style="color: #008000;">`parent<span style="color: #008080; font-weight: bold;">_</span>id`</span> <span style="color: #000033;">,</span>
<span style="color: #008000;">`data`</span>
<span style="color: #FF00FF;">&#41;</span>
<span style="color: #990099; font-weight: bold;">VALUES</span> <span style="color: #FF00FF;">&#40;</span>
<span style="color: #008000;">'1'</span><span style="color: #000033;">,</span> <span style="color: #008000;">'1'</span><span style="color: #000033;">,</span> <span style="color: #008000;">'root'</span>
<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span></pre></div></div>

<p>&#8216;root&#8217; nu e musai să fie &#8216;root&#8217;. Poate fi și &#8216;rădăcină&#8217;, dar cum personal scriu mai rar soft pentru România, prefer denumirile în Engleză. Aceasta trebuie să fie rădăcina arborelui. O înregistrare de genul (0, 0, &#8216;root&#8217;) este invalidă, deci nu va putea fi folosită pentru a valida implementarea originală. De aici se pot insera mai departe înregistrările, fără bătăi de cap atâta timp cât se păstrează integritatea relației cheie primară &#8211; cheie străină. De altfel, această înregistrare NU trebuie ștearsă. Dacă se șterge, se va șterge automat tot arborele. Este evident &#8230; dacă tai un copac de la rădăcina, cade cu totul. Dacă tai doar o creangă, restul copacului nu este afectat. În concluzie, dacă datele sunt manipulate corect, nu pot apărea probleme. Mai departe se poate insera noul arbore:</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">INSERT</span> <span style="color: #990099; font-weight: bold;">INTO</span> <span style="color: #008000;">`trees`</span> <span style="color: #FF00FF;">&#40;</span>
<span style="color: #008000;">`parent<span style="color: #008080; font-weight: bold;">_</span>id`</span> <span style="color: #000033;">,</span>
<span style="color: #008000;">`data`</span>
<span style="color: #FF00FF;">&#41;</span>
<span style="color: #990099; font-weight: bold;">VALUES</span> <span style="color: #FF00FF;">&#40;</span>
<span style="color: #008080;">1</span><span style="color: #000033;">,</span> <span style="color: #008000;">'a'</span>
<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span> <span style="color: #FF00FF;">&#40;</span>
<span style="color: #008080;">1</span><span style="color: #000033;">,</span> <span style="color: #008000;">'b'</span>
<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span> <span style="color: #FF00FF;">&#40;</span>
<span style="color: #008080;">2</span><span style="color: #000033;">,</span> <span style="color: #008000;">'c'</span>
<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span> <span style="color: #FF00FF;">&#40;</span>
<span style="color: #008080;">2</span><span style="color: #000033;">,</span> <span style="color: #008000;">'d'</span><span style="color: #000033;">,</span>
<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span> <span style="color: #FF00FF;">&#40;</span>
<span style="color: #008080;">4</span><span style="color: #000033;">,</span> <span style="color: #008000;">'e'</span>
<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span> <span style="color: #FF00FF;">&#40;</span>
<span style="color: #008080;">3</span><span style="color: #000033;">,</span> <span style="color: #008000;">'f'</span>
<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span></pre></div></div>

<p>Se va obține rezultatul dorit inițial. Iar constrângerea își face magia: spre exemplu dacă se șterge (2, 1, &#8216;a&#8217;), atunci automat se vor șterge și (4, 2, &#8216;c&#8217;), (5, 2, &#8216;d&#8217;) și (6, 4, &#8216;e&#8217;) pentru că ierarhic au ca părinte pe (2, 1, &#8216;a&#8217;).</p>
<p>Pentru că tot m-a prins microbul MVC, mai bine zis Kohana, o să dau ca exemplu un model ce tratează din punctul de vedere al aplicației problema de mai sus. Din moment ce în mod implicit Kohana este destul de restrictiv cu manipularea variabilelor, altfel spus chestii ce în mod normal PHP le tratează ca &#8216;Notice&#8217; în Kohana pot da in &#8216;Runtime Error&#8217;, metodele sunt puțin mai stufoase în sensul că verifică integritatea înainte de a acționa. Exemple asupra a ceea ce am spus mai sus: nu se poate șterge sau actualiza o înregistrare ce este deja ștearsă. În mod normal aceste operații returnează 0, fie ca e vorba de &#8216;affected rows&#8217; sau de &#8216;deleted rows&#8217;. Cel puțin așa se întâmplă în mod implicit în ambele situații descrise, nu am cercetat dacă este configurabil acest comportament și nici nu am de gând. Kohana prin strictețe impune modele sănătoase de programare ce nu și le însușește orice cocalar ce pune mâna pe PHP pentru faptul că variabilele încep cu $ și a auzit că poate să se simtă și el h4&#215;0r pentru că poate programa ceva. Deci să îi dau bâte cu modelul:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Tree_Model <span style="color: #000000; font-weight: bold;">extends</span> Model <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> add_child<span style="color: #009900;">&#40;</span><span style="color: #000088;">$parent_id</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$check_record</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>db<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>where<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$parent_id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>get<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'trees'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$check_record</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>count<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>db<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>from<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'trees'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>set<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'parent_id'</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #000088;">$parent_id</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'data'</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>insert<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">else</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> update_child<span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #339933;">,</span> <span style="color: #000088;">$parent_id</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$check_record1</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>db<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>where<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>get<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'trees'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$check_record2</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>db<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>where<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$parent_id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>get<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'trees'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$check_record1</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>count<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #cc66cc;">1</span> AND <span style="color: #000088;">$check_record2</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>count<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>db<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>from<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'trees'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>set<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'parent_id'</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #000088;">$parent_id</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'data'</span> <span style="color: #339933;">=&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>where<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>update<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">else</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> delete_child<span style="color: #009900;">&#40;</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$check_record</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>db<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>where<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>get<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'trees'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$check_record</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>count<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #cc66cc;">1</span> AND <span style="color: #000088;">$id</span> <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>db<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>from<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'trees'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>where<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>delete<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">else</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>PS: clasa este portabilă și pentru alte baze de date având în vedere faptul că am folosit &#8216;Database Query Builder&#8217;. Mergea si cu ORM, dar prefer o abordare puțin mai directa a problemei. În ORM nu mă mai simt stăpân pe situație. Pentru cârcotași: având în vedere că aceste tipuri de structuri de date nu prea sunt dedicate modificărilor dese, impactul de performanță datorat numărului mărit de interogări pentru a verifică integritatea este minim și merită efortul pentru a face o abordare corectă în loc să se apeleze la reguli mai puțin stricte și a depinde de erorile eventuale returnate de către baza de date (FK constraint error).</p>
<p>Nota: nu pot corecta comportamentul cretin al WordPress pentru a afisa corect apostrof si ghilimele.</p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/67uBTnpjOm8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/programare/mysql-arbori-o-singura-tabela-cheile-straine-si-un-exemplu-in-kohana.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/programare/mysql-arbori-o-singura-tabela-cheile-straine-si-un-exemplu-in-kohana.html</feedburner:origLink></item>
		<item>
		<title>Lista Județelor, Municipiilor, Orașelor și a Comunelor/Satelor din România</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/FMXswOMNzIs/lista-judetelor-municipiilor-oraselor-si-a-comunelor-satelor-din-romania.html</link>
		<comments>http://www.saltwaterc.net/programare/lista-judetelor-municipiilor-oraselor-si-a-comunelor-satelor-din-romania.html#comments</comments>
		<pubDate>Sat, 23 May 2009 00:41:55 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Programare]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/programare/lista-jude%c8%9belor-municipiilor-ora%c8%99elor-%c8%99i-a-comunelorsatelor-din-romania.html</guid>
		<description><![CDATA[Pe post de introducere: în primul rând o să îmi cer scuze din start pentru că nu am mai scris cu diacritice de un secol, deci anumite chestii s-ar putea să sune ciudat &#8211; cel puțin până ma obișnuiesc. Dacă tot am &#8216;Romanian Programmers&#8217; dat de Sfântul Windows 7, am zis să beneficiez puțin (ca [...]]]></description>
			<content:encoded><![CDATA[<p>Pe post de introducere: în primul rând o să îmi cer scuze din start pentru că nu am mai scris cu diacritice de un secol, deci anumite chestii s-ar putea să sune ciudat &#8211; cel puțin până ma obișnuiesc. Dacă tot am &#8216;Romanian Programmers&#8217; dat de Sfântul Windows 7, am zis să beneficiez puțin (ca porcul) pentru a-mi îndrepta această bubă în ceea ce privește scrierea propriilor articole.</p>
<p>Iar acum să trec la articolul pe bune. Ieri și astăzi am răscolit Internet-ul după o chestie ce să imi ofere lista pomenită în titlu. M-au ajuns din urmă zilele în care sunt pus în fața faptului de a dezvolta o asemenea aplicație ce necesită o astfel de listă/astfel de liste. Fie am găsit liste incomplete &#8211; mai bine zis un document xls de la Institutul Național de Statistică ce datează de pe vremea lui Pazvante (sau recensământul din 2002, fiecare citește ce vrea) sau lista disponibilă pe Wikipedia ce nu mă coafează din moment ce am observat inadvertențe, fie <a href="http://www.mihaitha.net/2009/03/07/judetele-si-orasele-din-romania/" title="Judetele si orasele din Romania" target="_blank">nu sunt structurate</a> în sensul că orice sat e trecut la orașe. Deși nu am întâlnit o chestie ce să le mulțumească pe toate și anume o listă ce cuprinde și diacritice, lista de față este (relativ) completă.</p>
<p>Am scris un mic script ce a cules listele pomenite mai sus. Le pun la download ca fișier serializat, urmând ca fiecare sa îl convertească în formatul pe care și-l dorește: XML, JSON, SQL, etc. Mai pun și un script obosit ce ia conținutul fișierului și îl trântește în HTML  (cu var_dump() &#8211; nu m-am obosit să fac artă).</p>
<p>Download: <a href="http://saltwaterc.net/wp-download/lista-judete-municipii-orase-comune-sate-romania/lista_localitati.zip">lista_localitati.zip</a> <a href="http://saltwaterc.net/wp-download/lista-judete-municipii-orase-comune-sate-romania/process_ro_list_output.zip">process_ro_list_output.zip</a></p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/FMXswOMNzIs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/programare/lista-judetelor-municipiilor-oraselor-si-a-comunelor-satelor-din-romania.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/programare/lista-judetelor-municipiilor-oraselor-si-a-comunelor-satelor-din-romania.html</feedburner:origLink></item>
		<item>
		<title>Instalarea Apache 2.2 + PHP 5.2 + MySQL 5.1 sub Windows</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/0r5-klZHvMw/instalarea-apache-22-php-52-mysql-51-sub-windows.html</link>
		<comments>http://www.saltwaterc.net/windows/instalarea-apache-22-php-52-mysql-51-sub-windows.html#comments</comments>
		<pubDate>Wed, 29 Apr 2009 19:24:00 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Programare]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/tech/instalarea-apache-22-php-52-mysql-51-sub-windows.html</guid>
		<description><![CDATA[Ultima actualizare: 19 Aprilie 2009
Introducere
Desi exista o droaie de pachete de astea ce le contin pe toate si au o gramada de arome, pe zi ce trece ajung la concluzia ca un developer serios nu se incurca cu mizerii si isi seteaza singur mediul de dezvoltare a aplicatiilor web. Ma rog, nu toate sunt mizerii, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Ultima actualizare:</strong> 19 Aprilie 2009</p>
<h2>Introducere</h2>
<p>Desi exista o droaie de pachete de astea ce le contin pe toate si au o gramada de arome, pe zi ce trece ajung la concluzia ca un developer serios nu se incurca cu mizerii si isi seteaza singur mediul de dezvoltare a aplicatiilor web. Ma rog, nu toate sunt mizerii, dar majoritatea fie sunt prea stufoase, fie inutile sau inutilizabile fara lucru manual &#8211; deci mai bine faci lucru manual din start. Asta in cazul in care nu vrei sa ramai o mimoza pentru tot restul vietii care transpira cand vine vorba sa adauge module noi mediului respectiv, sau pur si simplu sa se blocheze in parametrii de configurare relativ simpli. Nu sustin faptul ca este usor. De altfel patrunderea in tainele configurarii fine necesita timp si multa documentatie citita. Dar macar vreo cateva chestii de baza ar trebui cunoscute. Iar chestiile de baza pornesc cu instalarea.</p>
<p>Propozitie cheie: daca iti este lene sa iti configurezi acest mediu (lucru ce nu se intampla zilnic, iar experienta acumulata este benefica) atunci oare nu iti este lene sa te apuci sa programezi catusi de cat mai mult decat aplicatii gen &#8220;hello world&#8221;? Pentru a implementa solutii de o complexitate relativ mare ce necesita varii module este nevoie de mult mai multa munca pentru documentare decat pentru a configura un mediu de dezvoltare. In plus, din moment ce nu iti cunosti bine mediul in care ruleaza aplicatiile tale, cum poti avea nesimtirea sa sustii ca ai idee foarte bine ce face propria aplicatie? De unde vei sti ca va functiona corect si este portabila pe alta masina? Intrebarile acestea sunt multe, si nu, nu am de gand sa le transform in intrebari retorice. Raspunsurile sunt mai mult sau mai putin evidente.</p>
<p>O sa structurez acest articol in cativa pasi destul de simplu de urmat. Este ca in cazul in care se construieste o casa: se pleaca de la fundatie, si se termina treaba cu acoperisul. Deci ordinea va respecta logica si bunul simt, cu notiunea ca desi o sa incep cu <strong>Apache</strong>, <strong>MySQL </strong>deasemenea poate fi primul pas deoarece baza de date si serverul web nu sunt interdependente. <strong>PHP </strong>se integreaza cu Apache, deci regulile anterior mentionate indica faptul ca va fi instalat dupa el &#8211; aceasta pentru a nu fi nevoit sa faci instalarea PHP de doua ori.<span id="more-533"></span></p>
<h2>Pasul 1: Instalarea Apache 2.2</h2>
<p>In principiu primul pas ar fi verificarea faptului ca nici un alt proces nu asculta pe portul 80 ce in mod uzual este folosit de catre Apache. In mare chestii precum Skype ar trebui inchise inainte de instalare, pentru ca Skype are prostul obicei de a asculta pe porturile tipice HTTP si HTTPS (adica 80 si 443) printre altele. Pentru o solutie generalizata, utilitarul netstat ar trebui sa ofere solutia: Start &gt; Run &gt; cmd.exe iar in chestia aia neagra aka terminal (chestie pe care multi nu o pricep, in concluzie o urasc) se ruleaza urmatoarea linie:</p>
<p><em>netstat -a -p TCP</em></p>
<p>ce va returna toate porturile TCP ce sunt active. Daca apare o chestie ce se termina cu :80 in coloana &#8220;Local Address&#8221; este necesara oprirea aplicatiei ce ocupa acel port. Exemplu de situatie in care instalarea <u><em><strong>nu</strong></em></u> va fi cu succes:</p>
<p align="center"> <a href="http://saltwaterc.net/wp-content/uploads/netstat-tcp-image.png" title="netstat si porturile TCP"><img src="http://saltwaterc.net/wp-content/uploads/netstat-tcp-image.png" alt="netstat si porturile TCP" /></a></p>
<p>Desi in trecut installer-ul oferit de Apache Foundation era destul de trist, sau buildul avea lacune (cea mai notabila: absenta suportului pentru SSL &#8211; deci nu se puteau folosi conexiuni criptate prin HTTPS), in prezent situatia s-a schimbat in bine. Nu mai este nevoie de build-uri 3rd party cu tutoriale complicate de instalare. Acest tutorial nu se vrea unul complicat, de unde si prezenta pozelor. <strong>Click pe ele</strong> pentru a le vedea mai mari. Desigur, anumite categorii de cititori se auto-exclud prin definitie. Desi suportul pentru criptare nu este obligatoriu pentru dezvoltare, este recomandat a-l avea la indemana in eventualitatea de a testa aplicatia cum se comporta in acest context &#8211; de altfel foarte recomandat daca se compun cai absolute din aplicatia PHP ce depind de context HTTP/HTTPS.</p>
<p>Pagina proiectului este: <a href="http://httpd.apache.org/download.cgi" title="Apache HTTP Server" target="_blank">http://httpd.apache.org/download.cgi </a></p>
<p>Ultima versiune la ora actuala este 2.2.11, deci pe parcursul acestui tutorial voi folosi aceasta versiune. De <a href="http://apache.iasi.roedu.net/httpd/binaries/win32/apache_2.2.11-win32-x86-openssl-0.9.8i.msi" title="Apache 2.2.11 - Windows + OpenSSL 0.9.8i" target="_blank">aici</a> se poate lua aceasta versiune folosind un mirror de Romania. Daca serverul este cazut, sau fisierul devine indisponibil, se poate oricand cauta o alternativa urmarind link-ul dat mai sus. In principiu dupa ce download-ul e gata, se executa pachetul ce tocmai a poposit pe disk:</p>
<p><em>apache_2.2.11-win32-x86-openssl-0.9.8i.msi </em></p>
<p>De aici instalarea e relativ banala pana la configurarea <strong>Server Information</strong>:</p>
<p align="center"><a href="http://saltwaterc.net/wp-content/uploads/apache2-server-information-image.png" title="Apache 2 Server Information"><img src="http://saltwaterc.net/wp-content/uploads/apache2-server-information-image.png" alt="Apache 2 Server Information" /></a></p>
<p>In principiu pentru o masina de dezvoltare aceste chestii nu sunt relevante, deci poti lasa datele implicite. Pentru un server &#8220;de productie&#8221; in primul rand n-as recomanda Windows pentru Apache2+PHP si in al doilea rand nu cred ca acesta este locul potrivit pentru a trata acest subiect. Deci ma limitez la dezvoltatori. Bifa pentru &#8220;All Users&#8221; este puternic recomandata, precum si instalarea ca serviciu. In cazul instalarii ca serviciu, serverul va porni impreuna cu sistemul de operare.</p>
<p>La urmatorul pas, <strong>Setup Type</strong>, se alege &#8220;Custom&#8221;. Installer-ul vrea sa faca treaba pentru tine, dar asta nu inseamna ca o va face neaparat asa cum trebuie, sau cum e recomandat. Mai departe, optiunile din lista de chestii ce se pot instala pot fi lasate asa cum sunt. Documentatia este optionala deoarece se poate gasi online. Eu o instalez pentru ca spre deosebire de PHP si MySQL, nu se distribuie o arhiva CHM pe site-ul oficial cu aceasta documentatie. Restul chestiilor sunt recomandate. &#8220;Build Headers and Libraries&#8221; este necesar doar celor ce fac sporturi extreme, deci nu este cazul de fata.</p>
<p>Aici mai este totusi o chestie de facut. Instalarea acestei stive WAMPP (Windows Apache MySQ PHP Platform) &#8211; pun sub acest nume pentru a nu se confunda cu proiectul WAMP ce le impacheteaza pe toate, se poate face imprastiat pe disk, dar ca recomandari acestea ar trebui sa fie tinute in acelasi director, caile de pe disk sa nu contina spatii si sa fie cat mai scurte. In concluzie click pe &#8220;Apache HTTP Server 2.2.11&#8243;, iar in partea stanga jos e un buton &#8220;Change&#8221;:</p>
<p align="center"> <a href="http://saltwaterc.net/wp-content/uploads/apache2-custom-setup-image.png" title="Apache 2 Custom Setup"><img src="http://saltwaterc.net/wp-content/uploads/apache2-custom-setup-image.png" alt="Apache 2 Custom Setup" /></a></p>
<p>Calea propusa de catre subsemnatul este:</p>
<p><em>C:\wampp\apache</em></p>
<p>Nu este obligatorie, este doar o recomandare. Dar folosind aceasta denumire, este suficient de clar ce fel de stiva este instalata.</p>
<p align="center"> <a href="http://saltwaterc.net/wp-content/uploads/apache2-custom-setup-path-image.png" title="Apache 2 Custom Setup - Calea catre WAMPP"><img src="http://saltwaterc.net/wp-content/uploads/apache2-custom-setup-path-image.png" alt="Apache 2 Custom Setup - Calea catre WAMPP" /></a></p>
<p>Se termina restul instalarii ce practic se rezuma la next, install, etc. La sfarsit ar trebui ca serviciul sa porneasca automat, iar jos langa ceas sa fie un panel de control pentru Apache 2.2. Pentru a valida instalarea, cu Web browserul preferat se viziteaza adresa: <a href="http://localhost" title="localhost" target="_blank" rel="noindex,nofollow">http://localhost/</a> iar daca totul e OK, ar trebui sa apara mesajul &#8220;It Works!&#8221;. Cam atat de la Apache.</p>
<h2>Pasul 2: Instalarea PHP 5.2</h2>
<p>Trecem la PHP 5.2.6 &#8211; ramura stabila 5.2 a PHP. Nu am ales o versiune mai noua (5.2.8 sau 5.2.9-2) pentru simplul motiv ca PHP 5.2.6 are un setup complet, in timp ce versiunile mai noi au o mana de module lipsa. Este drept ca se pot pune cele de la 5.2.6, dar este o munca ce nu va fi pe gustul cuiva ce acum incepe incet-incet sa puna gramada un mediu de dezvoltare. In plus, intre aceste versiuni nu au fost modificari majore. Ca o mica paranteza, PHP 5.3.0 va aduce modificari majore, dar momentan este disponibil doar ca versiune de test. De altfel, idea este sa avem un suport cat mai larg pentru dezvoltarea unei aplicatii. Exceptand cazurile in care nu exista alternative, limitarea la tehnologii vechi nu este de dorit. Oricum, in cazul branch-ului 5.2, de anul trecut si pana in prezent, nu s-a miscat mare lucru. S-a centrat atentia pe 5.3 si pe 6. Deci alegerea 5.2.6 este oarecum justificata.</p>
<p>Pentru ca versiunea este totusi una mai veche, link-ul de download este <a href="http://museum.php.net/php5/php-5.2.6-win32-installer.msi" title="PHP 5.2.6">acesta</a>. Dupa ce ati obtinut fisierul, executata-l. Da, este vorba despre:</p>
<p><em>php-5.2.6-win32-installer.msi</em></p>
<p>In continuare, treaba va merge ca pentru majoritatea installer-elor de Windows. Doar la Destination Folder este nevoie de o mica modificare:</p>
<p align="center"><a href="http://saltwaterc.net/wp-content/uploads/php5-destination-folder-image.png" title="PHP 5 Destination Folder"><img src="http://saltwaterc.net/wp-content/uploads/php5-destination-folder-image.png" alt="PHP 5 Destination Folder" /></a></p>
<p>si anume faptul ca am folosit calea propusa/recomandata:</p>
<p><em>C:\wampp\php</em></p>
<p>pentru a pastra o structura consistenta.</p>
<p>Urmatorul pas este important, nu pentru ca vreau sa ii acord eu importanta, ci pentru ca aici se va alege optiunea de configurare ce va integra PHP cu serverul HTTP. Se alege &#8220;Apache 2.2.x Module&#8221; nu pentru ca spun eu ci pentru faptul ca versiunea de Apache instalata in acest tutorial este 2.2 (d&#8217;oh) si pentru ca alte metode de integrare cu Apache fie sunt lente, fie sunt ceva mai dificile, deci vor fi prezentate intr-un articol viitor.</p>
<p align="center"><a href="http://saltwaterc.net/wp-content/uploads/php5-web-server-setup-image.png" title="PHP 5 Web Server Setup"><img src="http://saltwaterc.net/wp-content/uploads/php5-web-server-setup-image.png" alt="PHP 5 Web Server Setup" /></a></p>
<p>Pasul urmator presupune oferirea directorului unde se afla fisierul de configurare al Apache 2.2. Installer-ul este suficient de destept astfel incat sa stie sa puna ceea ce trebuie acolo, atata timp cat nu sunt probleme intre scaun si tastatura. Am ales calea precum zice imaginea urmatoare:</p>
<p align="center"><a href="http://saltwaterc.net/wp-content/uploads/php5-apache-configuration-directory-image.png" title="PHP 5 Apache Configuration Directory"><img src="http://saltwaterc.net/wp-content/uploads/php5-apache-configuration-directory-image.png" alt="PHP 5 Apache Configuration Directory" /></a></p>
<p>si anume:</p>
<p><em>C:\wampp\apache\conf\</em></p>
<p>ce respecta conventia anterior facuta.</p>
<p>Pasul urmator presupune alegerea componentelor PHP ce vor fi instalate. Ceea ce propune installer-ul este un setup minim, destul de inutil de altfel. Pentru a beneficia de intreaga putere a PHP este nevoie si de extensiile sale. Astfel, in sectiunea &#8220;Program&#8221; aleg si &#8220;Script Executable&#8221;, dar fara inregistrarea extensiei .php pentru a fi executata de catre PHP pe motiv ca atunci cand dau dublu click pe un .php prefer sa se deschida scriptul intr-un editor, in loc sa il ruleze. Oricum, daca este parte a unei aplicatii Web, atunci rularea de catre interpretor va fi inutila din start.</p>
<p>Sectiunea &#8220;Extensions&#8221; este partea stringenta. De altfel motivul pentru care am ales PHP 5.2.6. Le poti instala pe toate, dar se va incarca mediul in mod inutil. Alta solutie ar fi sa fie incarcate pe masura ce un proiect avanseaza, dar refacerea configuratiei aduce ceva batai de cap si necesita o cunoastere destul de buna a extensiilor. O lista recomandata de catre subsemnatul include: bzip2, bz2_filter, Crack, Curl, domxml, EXIF, Fileinfo, GD2, Gettext, GMP, pecl_http, mcrypt_filter, Multi-Byte String, Mcrypt, Ming, MySQL, MySQLi, OpenSSL, PDO &#8211; iar din sectiunea PDO &#8211; MySQL si SQLite, mai departe, phar, rar, Sockets, Standard PHP Library &#8211; Types Addon, SQLite, ssh2, Tidy, timezonedb, XML-RPC, XSL, zip, zip_filter. Lista este departe de a fi completa si inafara de MySQL si SQLite, alte engine-uri pentru baze de date au fost lasate pe afara, desi exista suport pentru ele. Deasemenea am lasat pe afara extensiile ce ofera suport pentru diverse protocoale, printre care si cele tipice pentru e-mail. La nevoie se pot include. Multe dintre ele se prea poate sa fie inutile pentru proiecte relativ simple.</p>
<p>Sectiunea &#8220;Extras&#8221; contine doar documentatie, dar nu isi are rostul. Online se gaseste documentatie actualizata, fie direct pe site, fie disponibila ca download. Deci o sa o las ca &#8220;debifata&#8221;.</p>
<p align="center"><a href="http://saltwaterc.net/wp-content/uploads/php5-chose-install-items-image.png" title="PHP 5 Chose Install Items"><img src="http://saltwaterc.net/wp-content/uploads/php5-chose-install-items-image.png" alt="PHP 5 Chose Install Items" /></a></p>
<p>Dupa terminarea instalarii, o sa ai un Apache 2.2 integrat cu PHP 5.2. Mai este nevoie totusi de o modificare:</p>
<p><em>C:\wampp\apache\conf\httpd.conf</em></p>
<p>contine optiunile de configurare ale Apache. Ce n-a facut installer-ul PHP si trebuie corectat de mana este activarea index.php ca fisier de index. Se cauta urmatorul bloc de configurare:</p>
<p><em>&lt;IfModule dir_module&gt;<br />
DirectoryIndex index.html<br />
&lt;/IfModule&gt;</em></p>
<p>Acesta se schimba in</p>
<p><em>&lt;IfModule dir_module&gt;<br />
DirectoryIndex index.php index.html index.htm<br />
&lt;/IfModule&gt;</em></p>
<p>Am adaugat din burta index.htm pentru ca unii folosesc si aceasta extensie pentru fisiere HTML. Restart la Apache. Daca ai lasat optiunile implicite, atunci ai langa ceas acel Apache Monitor ce are butoane pentru Start, Stop, Restart &#8211; deci nu este nevoie sa se sape prin managerul de servicii al Windows.</p>
<p><strong>Actualizare:</strong> NU apela la butonul <strong>Restart</strong> dupa instalarea PHP! Am constatat cu stupoare ca aplicand tutorialul meu, desi C:\wampp\php e in %PATH%, doar <strong>Stop</strong>+<strong>Restart</strong> il aduc pe calea cea buna. Detalii despre %PATH% mai jos.</p>
<p align="center"><a href="http://saltwaterc.net/wp-content/uploads/apache2-service-monitor-restart-image.png" title="Apache 2 Service Monitor Restart"><img src="http://saltwaterc.net/wp-content/uploads/apache2-service-monitor-restart-image.png" alt="Apache 2 Service Monitor Restart" /></a></p>
<p>In directorul:</p>
<p><em>C:\wampp\apache\htdocs</em></p>
<p>se gaseste directory root-ul aplicatiilor Web ce vor fi servite de catre configuratie. Pentru teste, index.html se va redenumi in index.php iar continutul lui va fi schimbat in:</p>
<p><em>&lt;?php</em></p>
<p><em>phpinfo();</em></p>
<p>dupa care se va accesa din nou adresa: <a href="http://localhost/" title="localhost" target="_blank" rel="noindex,nofollow">http://localhost/</a>. Ar trebui sa apara informatiile despre PHP si mediul in care ruleaza + informatii despre extensii si configurare.</p>
<p>Ponturi:</p>
<ol>
<li>pentru reconfigurarea PHP este suficienta rularea installer-ului din nou, urmata de apelarea cu incredere la butonul &#8220;Change&#8221;. Este recomandat ca extensiile instalate de catre installer sa nu fie scoase din setup direct din fisierul de configurare, desi aceasta este posibil. Reconfigurarea este posibila si fara installer, dar nu este de dorit pentru toata lumea.</li>
<li>daca apari erori la pornirea Apache (<em>C:\wampp\apache\logs\error.log</em> &#8211; contine log-ul de erori) atunci trebuie verificat daca installer-ul PHP si-a pus propria cale in %PATH%. Pentru mai multe detalii apelati la: <a href="http://en.wikipedia.org/wiki/Environment_variable" title="Environment Variable" target="_blank">Environment Variable</a>. %PATH% face parte din aceasta categorie si se poate modifica:</li>
</ol>
<ul>
<li>Windows XP: Properties la My Computer -&gt; Advanced -&gt; Environment Variables</li>
<li>Windows Vista/Windows 7: Properties la My Computer, e un link &#8220;Change Settings&#8221; pe acolo, ce va deschide un panou asemanator cu cel din Windows XP. De aici procedura e identica, si anume</li>
</ul>
<blockquote><p> In sectiunea System Variables, exista variabila cu numele Path. Se verifica daca contine calea C:\wampp\php. Daca nu, se adauga acolo. Separatorul de astfel de cai este &#8220;;&#8221; (fara ghilimele!!!) deci atentie la sintaxa.</p>
<p align="center"><a href="http://saltwaterc.net/wp-content/uploads/windows-environment-variables-path-image.png" title="Windows Environment Variables"><img src="http://saltwaterc.net/wp-content/uploads/windows-environment-variables-path-image.png" alt="Windows Environment Variables" /></a></p>
<p><strong>Note</strong>:</p>
<p>(1) Nu constituie erori de pornire acele &#8220;PHP Notice&#8221;. Erorile sunt explicite si arata faptul ca anumite biblioteci dinamice nu se pot incarca pentru ca Apache nu le gaseste. Acele biblioteci (dll-uri) ce nu sunt gasite de catre Apache se pot copia intr-un director de sistem gen <em>C:\Windows</em> sau <em>C:\Windows\system32</em> dar aceasta nu este o optiune prea desteapta. Deasemenea se pot copia si in directorul bin al Apache, dar din nou nu este o optiune desteapta. In fond si la urma urmei exista doua categorii de utilizatori de Windows: cei ce il utilizeaza corect &#8211; desi este mai dificil, scuteste utilizatorul de multe probleme clasice pe termen indelungat &#8211; si utilizatorii ce il fac praf suficient de repede datorita administrarii extrem de proaste. Nu exista cale de mijloc.</p>
<p>(2) In cazul Windows XP o sa apara &#8220;Warnings&#8221; in legatura cu bibliotecile suplimentare necesare anumitor extensii (gen libmysql.dll pentru MySQL si MySQLi). Solutii: a) Reboot la OS dupa instalarea Apache+PHP. Sub anumite versiuni de Windows (exemplu: XP, la Vista nu am remarcat datorita problemei descrise mai jos) Apache nu baga in seama un %PATH% modificat &#8211; deci este nevoie de un reboot pentru a-l aduce pe calea cea buna. Avand in vedere faptul ca anumite chestii din PHP depind de un environment variable, chestia de mai sus este bine sa fie retinuta. b) copierea dll-urilor cu pricina ce se gasesc in directorul PHP si sunt cerute de catre extensii din directorul bin al Apache. Desi, aceasta optiune este una destul de trista. As zice din barda.</p></blockquote>
<p><strong>Windows Vista:</strong> intamplator astazi m-am lovit de instalarea stivei prezentare in acest articol sub Windows Vista. Din moment ce subsemnatul si Vista suntem certati (pe buna dreptate) detaliul de mai sus mi-a scapat. Pana in prezent, integrarea de fata functioneaza doar sub Windows XP si Windows 7 (Beta si RC). Windows Vista are nevoie de un parametru suplimentar atunci cand se configureaza integrarea dintre Apache 2.2 si PHP 5.2, in rest codul PHP apare in browser in loc sa fie interpretat intr-un mod foarte retard. Problema se mai intalneste si la unele pachete de acestea all-in-one. Sectiunea aceasta ce in mod standard se gaseste la sfarsitul fisierului httpd.conf dupa rularea installer-ului PHP:</p>
<p><em>#BEGIN PHP INSTALLER EDITS &#8211; REMOVE ONLY ON UNINSTALL<br />
PHPIniDir &#8220;C:/wampp/php/&#8221;<br />
LoadModule php5_module &#8220;C:/wampp/php/php5apache2_2.dll&#8221;<br />
#END PHP INSTALLER EDITS &#8211; REMOVE ONLY ON UNINSTALL </em></p>
<p>trebuie sa mai contina inca o chestie, deci sa arate astfel pentru Windows Vista:</p>
<p><em>#BEGIN PHP INSTALLER EDITS &#8211; REMOVE ONLY ON UNINSTALL<br />
PHPIniDir &#8220;C:/wampp/php/&#8221;<br />
LoadModule php5_module &#8220;C:/wampp/php/php5apache2_2.dll&#8221;<br />
<strong>AddType application/x-httpd-php .php</strong><br />
#END PHP INSTALLER EDITS &#8211; REMOVE ONLY ON UNINSTALL</em></p>
<h2>Pasul 3: Instalarea MySQL 5.1</h2>
<p>In principiu inainte de instalare ar trebui verificat daca nu ruleaza nimic pe portul 3306, adica portul implicit pe care asculta serverul MySQL. Daca nu mai exista o alta instalare de MySQL, atunci slabe sanse. Pentru identificarea precisa, se va folosi metoda prezentata la instalarea Apache.</p>
<p>MySQL 5.1.34 este ultima versiune stabila disponibila la momentul redactarii acestui articol, deci il vom folosi pe acesta. Desi mai exista MySQL 5.0 ca branch stabil, folosit destul de mult in productie (de altfel mai exista si 4.1 prin productie, dar il urasc cu pasiune din motive obiective) totusi am mers pe ultima chestie lansata. Are vreo cateva chestii noi ce in buna parte tin de viteza si de extensibilitate.</p>
<p>Spre deosebire de Apache 2.2 si PHP 5.2, pe pagina oficiala a MySQL exista atat build-uri de 32-bit, cat si build-uri de 64-bit. Primele doua se distribuie oficial doar ca binare de 32-bit. In principiu se recomanda build-ul ce se potriveste cel mai bine platformei, 64-bit in cazul subsemnatului, cu notiunea ca pot apela si la unul de 32-bit. Link-ul de download pentru build-ul pe 32 este <a href="http://dev.mysql.com/downloads/mysql/5.1.html#win32" title="MySQL 5.1 32-bit" target="_blank">acesta</a>, in timp ce pentru cel de 64 este <a href="http://dev.mysql.com/downloads/mysql/5.1.html#winx64" title="MySQL 5.1 64-bit" target="_blank">acesta</a>. De acolo se alege &#8220;Windows MSI Installer&#8221; iar din dreapta link-ul de &#8220;Download&#8221;. In cazul in care mirror-ul ales automat pentru &#8220;Download&#8221;este invalid sau are probleme, se poate alege si &#8220;Pick a mirror&#8221; de unde se alege unul mai apropiat de casa.</p>
<p>Eu am plecat la drum cu:</p>
<p><em>mysql-5.1.34-winx64.msi</em></p>
<p>iar utilizatorii unui Windows 32-bit este obligatoriu sa plece la drum cu:</p>
<p><em>mysql-5.1.34-win32.msi</em></p>
<p>In rest, instalarea este relativ identica.</p>
<p>In pasul in care installer-ul intreaba de  &#8220;Setup Type&#8221;, se alege &#8220;Custom&#8221;. Se va debifa documentatia deoarece este disponibila online. Optional se poate lasa. Eu prefer sa downloadez ultimele arhive cu documentatie ce sunt la zi. In rest, nu mai este nevoie de nimic deoarece optiunile sunt multumitoare. Ce mai trebuie schimbata este calea de instalare, ce va folosi modelul prezentat mai sus in cazul Apache si PHP.</p>
<p><strong>Later Edit:</strong> mi-a scapat un mic aspect ce nu l-am mentionat data trecuta, si anume faptul ca serverul se poate instala intr-o locatie iar data storage-ul in alta. Acestea sunt imaginile actualizate:</p>
<p align="center"> <a href="http://saltwaterc.net/wp-content/uploads/mysql5-server-install-path-image.png" title="MySQL 5 Server Path"><img src="http://saltwaterc.net/wp-content/uploads/mysql5-server-install-path-image.png" alt="MySQL 5 Server Path" /></a></p>
<p align="center"> <a href="http://saltwaterc.net/wp-content/uploads/mysql5-server-datafiles-path-image.png" title="MySQL 5 Datafiles Path"><img src="http://saltwaterc.net/wp-content/uploads/mysql5-server-datafiles-path-image.png" alt="MySQL 5 Datafiles Path" /></a></p>
<p align="center"> <a href="http://saltwaterc.net/wp-content/uploads/mysql5-server-install-path-image1.png" title="MySQL 5 Install Paths"><img src="http://saltwaterc.net/wp-content/uploads/mysql5-server-install-path-image1.png" alt="MySQL 5 Install Paths" /></a></p>
<p>Se continua instalarea. La aparitia acelor chestii despre MySQL Enterprise, se da &#8220;Next&#8221; pana in sfarsit se ajunge la ultimul pas:</p>
<p align="center"><a href="http://saltwaterc.net/wp-content/uploads/mysql5-wizard-completed-image.png" title="MySQL 5 Wizard Completed"><img src="http://saltwaterc.net/wp-content/uploads/mysql5-wizard-completed-image.png" alt="MySQL 5 Wizard Completed" /></a></p>
<p>Bifa aia e importanta, dupa ea se va porni procesul de configurare al serverului MySQL si pe aici unii s-ar putea sa isi prinda urechile.Se continua clasicul click-Next pana configuratorul intreaba despre tipul configurarii:</p>
<p align="center"><a href="http://saltwaterc.net/wp-content/uploads/mysql5-server-instance-configuration-image.png" title="MySQL 5 Server Instance Configuration"><img src="http://saltwaterc.net/wp-content/uploads/mysql5-server-instance-configuration-image.png" alt="MySQL 5 Server Instance Configuration" /></a></p>
<p>Urmatoarea alegere este atat de evidenta, incat nu voi pune o poza ce sa o arate. Se va alege &#8220;Developer Machine&#8221; la server type. Urmatorul pas cere modul de utilizare a bazei de date. Cel implicit, &#8220;Multifunctional Database&#8221; este potrivit pentru acest tip de instalare. La urmatorul pas despre &#8220;InnoDB Tablespace Settings&#8221; se lasa optiunile implicite. Presupun ca pe C:\ exista suficient spatiu.</p>
<p>Urmatorul pas presupune setarea numarului de conexiuni concurente. De regula, desi in procesul de dezvoltare sunt rare situatiile in care optiunea implicita, &#8220;Decision Support (DSS)/OLAP&#8221; ce presupune un numar maxim 20 conexiuni concurente s-ar putea sa fie suficient, subsemnatul foloseste optiunea &#8220;Manual Setting&#8221; si pune numarul la 50.</p>
<p align="center"><a href="http://saltwaterc.net/wp-content/uploads/mysql5-server-instance-configuration-concurent-connections-image.png" title="MySQL 5 Server Instance Configuration Concurent Connections"><img src="http://saltwaterc.net/wp-content/uploads/mysql5-server-instance-configuration-concurent-connections-image.png" alt="MySQL 5 Server Instance Configuration Concurent Connections" /></a></p>
<p>Mai departe, la setarile de retea, &#8220;Enable TCP/IP Networking&#8221; este obligatoriu. Nu este necesara activarea unei exceptii in firewall daca baza de date nu va fi folosita inafara masinii. Eu deschid o gaura in firewall pentru acest port pentru ca se intampla sa accesez o baza de date din exterior. Exista alternativa la TCP/IP si anume &#8220;named pipes&#8221;, dar aceasta va fi lasata deoparte pe moment. Se justifica alegerea pentru masinile ce ruleaza baze de date impreuna cu aplicatii ce le folosesc, in rest, configurarea este putin mai dificila. Web-ul este gandit ca modular, deci in practica, exceptand o parte a Web hosturilor shared (sau cei ce au bani doar de un VPS/masina dedicata), serverul MySQL va rula pe o masina dedicata, in concluzie TCP/IP va fi singura cale de a comunica cu bazele de date. &#8220;Enable Strict Mode&#8221; este recomandat de catre installer si de catre subsemnatul.</p>
<p align="center"><a href="http://saltwaterc.net/wp-content/uploads/mysql5-server-instance-configuration-networking-options-image.png" title="MySQL 5 Server Instance Configuration Networking Options"><img src="http://saltwaterc.net/wp-content/uploads/mysql5-server-instance-configuration-networking-options-image.png" alt="MySQL 5 Server Instance Configuration Networking Options" /></a></p>
<p>Urmatorul pas este unul foarte important. O greseala in alegere aici se poate propaga mai departe in optiunile implicite si mai departe in probleme mari. Totul ar fi bine si frumos daca ar exista un singur set de caractere, dar din pacate nu este asa. Iar daca intentionezi sa dezvolti o aplicatie ce va primi altceva inafara de caractere latine si uzuale, este cazul sa pui bifa pe &#8220;Best Support For Multilingualism&#8221;. Se pot face hack-uri la nivel de cod PHP pentru a putea fi folosit setul de caractere implicit, dar aceasta inseamna ca toate sirurile de caractere ce se indreapta catre baza de date sa treaca prin acel filtru, iar o mica neatentie poate sa duca la ore de debugging inutil. In concluzie, mai bine se lucreaza direct cu UTF8.</p>
<p align="center"><a href="http://saltwaterc.net/wp-content/uploads/mysql5-server-instance-configuration-default-charset-image.png" title="MySQL 5 Server Instance Configuration Default Charset"><img src="http://saltwaterc.net/wp-content/uploads/mysql5-server-instance-configuration-default-charset-image.png" alt="MySQL 5 Server Instance Configuration Default Charset" /></a></p>
<p>Mai departe urmeaza setarile serviciului. Da, este recomandat ca MySQL sa fie instalat deasemenea ca serviciu. Bifa pentru lansare automata iarasi e recomandata. Deasemenea recomand adaugarea directorului bin al MySQL in %PATH%. Trebuie doar o bifa. Eu pun numele serviciului MySQL5.1 pentru ca am un fetis cu consistenta, iar Apache se pune Apache2.2 fara ca sa ma intrebe &#8211; deci pastrez ideea. Nu e obligatoriu.</p>
<p align="center"><a href="http://saltwaterc.net/wp-content/uploads/mysql5-server-instance-configuration-windows-options-image.png" title="MySQL 5 Server Instance Configuration Windows Options"><img src="http://saltwaterc.net/wp-content/uploads/mysql5-server-instance-configuration-windows-options-image.png" alt="MySQL 5 Server Instance Configuration Windows Options" /></a></p>
<p>Pasul urmator presupune setarile de securitate. Sub nici o forma nu este recomandata crearea unui &#8220;Anonymous Account&#8221;. Se recomanda crearea unei parole suficient de puternice pentru utilizatorul root ce este un superuser pentru MySQL. A nu se confunda cu root din *nix &#8211; utilizatorii MySQL nu sunt utilizatori de sistem. Serverul are propriul sistem de management al utilizatorilor. Deasemenea nu se recomanda activarea accesului remote pentru root.</p>
<p align="center"><a href="http://saltwaterc.net/wp-content/uploads/mysql5-server-instance-configuration-security-options-image.png" title="MySQL 5 Server Instance Configuration Security Options"><img src="http://saltwaterc.net/wp-content/uploads/mysql5-server-instance-configuration-security-options-image.png" alt="MySQL 5 Server Instance Configuration Security Options" /></a></p>
<p>Se continua setup-ul si gata si cu MySQL.</p>
<h2>Bonus: instalarea phpMyAdmin 3.1</h2>
<p><a href="http://www.phpmyadmin.net/home_page/" title="phpMyAdmin" target="_blank"><strong>phpMyAdmin</strong></a> este un frontend MySQL popular si destul de bun la ceea ce face. Desi initial nu l-am prea suportat, pe servere la distanta se poate dovedi un aliat puternic. In concluzie este o aditie buna si pentru dezvoltarea locala, desi exista si alte optiuni, recomandate de altfel sa fie la indemana: <a href="http://dev.mysql.com/downloads/gui-tools/5.0.html" title="MySQL GUI Tools" target="_blank">MySQL Query Browser, MySQL Administrator</a> si <a href="http://dev.mysql.com/workbench/" title="MySQL Workbench" target="_blank">MySQL Workbench</a> &#8211; scule facute de cei de la MySQL AB &#8211; adica Sun &#8211; adica Oracle &#8211; daca este sa pastrez istoricul cumparaturilor. Mai exista si <a href="http://www.webyog.com/en/downloads.php" title="SQLyog" target="_blank">SQLyog</a>, un frontend ce imbina elemente de Query Browser si de Administrator. Unii prefera in locul lui <a href="http://www.heidisql.com/download.php" title="HeidiSQL" target="_blank">HeidiSQL</a> &#8211; desi acesta din urma stie mai putine.</p>
<p>De <a href="http://www.phpmyadmin.net/home_page/downloads.php" title="phpMyAdmin Download" target="_blank">aici</a> am luat ultima versiune stabila, si anume 3.1.5. Instalarea este relativ mai complicata decat in cazul chestiilor de mai sus pentru ca este aplicatie PHP si nu am apelat la metoda cea mai usoara, dar am apelat la cea mai comoda pe termen lung. Am downloadat:</p>
<p><em>phpMyAdmin-3.1.5-all-languages.zip</em></p>
<p>A urmat extragerea arhivei si redenumirea directorului <em>phpMyAdmin-3.1.5-all-languages</em> din interiorul ei in <em>phpmyadmin</em>. L-am mutat in <em>C:\wampp\</em>. Acesta trebuie sa contina fisierele phpMyAdmin. Daca contine alt director, atunci acela trebuie redenumit in phpmyadmin si mutat in WAMPP. Configurarea phpMyAdmin presupune copierea fisierului <em>config.sample.inc.php</em> in <em>config.inc.php</em> si modificarea lui. Modificari necesare:</p>
<ul>
<li>definirea <em>$cfg['blowfish_secret']</em> cu un sir de caractere arbitrar. Preferabil sa fie cat mai de neinteles. <strong>ATENTIE: </strong>pentru a nu invalida sintaxa config.inc.php trebuie sa se foloseasca apostrof nu ghilimele pentru a defini sirul blowfish_secret. Conform documentatiei phpMyAdmin acesta are o dimensiune maxima <em>aparenta</em> de 46 caractere. Un generator bun poate fi algoritmul sha1, desi setul de caractere este mai redus decat in cazul in care se foloseste un generator ce sa includa varii caractere speciale. Pentru sha1 apeleaza cu incredere la: <a href="http://www.shell-tools.net/index.php?op=hash_sha" title="SHA1 Hash Generator" target="_blank">http://www.shell-tools.net/index.php?op=hash_sha </a></li>
<li>schimbarea <em>$cfg['Servers'][$i]['extension']</em> din <em>mysql</em> in <em>mysqli</em>. MySQLi aka MySQL Improved &gt; MySQL.</li>
</ul>
<p>Mai are si alte optiuni, dar nu sunt necesare si nu trebuie schimbate. <a href="http://www.phpmyadmin.net/documentation/" title="phpMyAdmin Documentation" target="_blank">Documentatia phpMyAdmin</a> le explica pe indelete.</p>
<p>Urmeaza integrarea cu Apache. Desi directorul s-ar fi putut pune pur si simplu in interiorul <em>C:\wampp\htdocs</em> s-ar putea sa incurce pe acolo, sau sa fie sters din greseala. Deci apelarea la un alias este o optiune mult mai recomandata. Mai intai voi prezenta pasii, dupa care voi oferi detalii pentru doi dintre ei. Aici sunt pasii:</p>
<ol>
<li>crearea unui fisier text gol in <em>C:\wampp\apache\conf\extra</em>. Acesta se va numi <em>httpd-phpmyadmin.conf</em> pentru a pastra conventia de nume ce o are Apache pentru fisierele de configurare. Fisierul se va gasi ca download la sfarsitul articolului, alaturi de toate celalte resurse.</li>
<li>acest fisier va trebui inclus in config-ul cel mare, si anume <em>C:\wampp\apache\conf\httpd.conf</em>. Se include fisierul anterior creat, chiar dupa lucrurile configurate automat de catre installer-ul PHP (scrie in comentariu, liniile ce incep cu # sunt considerate comentarii). Locul acesta se gaseste la sfarsitul fisierului.</li>
<li>restart la Apache.</li>
<li>vizitarea adresei <a href="http://localhost/phpmyadmin" title="phpMyAdmin" target="_blank" rel="noindex,nofollow">http://localhost/phpmyadmin</a> pentru validare.</li>
</ol>
<p>Continutul lui <em>httpd-phpmyadmin.conf</em>:</p>
<blockquote><p><em>Alias /phpmyadmin &#8220;C:/wampp/phpmyadmin&#8221;</em></p>
<p><em>&lt;Directory &#8220;C:/wampp/phpmyadmin&#8221;&gt;<br />
Options Indexes FollowSymLinks<br />
AllowOverride None<br />
Order deny,allow<br />
Allow from all<br />
DirectoryIndex index.php</em></p>
<p><em>&lt;IfModule mod_php4.c&gt;<br />
AddType application/x-httpd-php .php</em></p>
<p><em>php_flag magic_quotes_gpc Off<br />
php_flag track_vars On<br />
php_flag register_globals Off<br />
php_value include_path .<br />
&lt;/IfModule&gt;</em></p>
<p><em>&lt;IfModule mod_php5.c&gt;<br />
AddType application/x-httpd-php .php</em></p>
<p><em>php_flag magic_quotes_gpc Off<br />
php_flag track_vars On<br />
php_flag register_globals Off<br />
php_value include_path .<br />
&lt;/IfModule&gt;<br />
&lt;/Directory&gt;</em></p></blockquote>
<p><strong>ATENTIE:</strong>  datorita modului retard prin care WordPress inlocuieste ghilimelele cu niste chestii ce seamana cu ele dar sunt inclinate (practic alte caractere), metoda copy-paste a textului de mai sus nu se preteaza fara o curatare a mizeriilor. Se recomanda download-ul fisierului de la sfarsitul articolului.</p>
<p>Includerea fisierului de mai sus in <em>httpd.conf</em> prespune adaugarea la sfarsitul <em>httpd.conf</em> a:</p>
<blockquote><p><em># Include the phpMyAdmin configuration file<br />
Include conf/extra/httpd-phpmyadmin.conf</em></p></blockquote>
<p>In principiu cam in aceasta consta o instalare de phpMyAdmin. Fisierul de configurare pentru Apache este inspirat de cel din <a href="http://www.debian.org/" title="Debian" target="_blank">Debian</a>, desi are vreo cateva chestii noi in el, si vreo cateva chestii scoase. Atentie: nu incerca chestii gen &#8220;I know better&#8221;, mai ales daca iti vine vreo idee creata sa scoti linia cu &#8220;Allow from all&#8221;. Apache va refuza sa serveasca directorul.Warning-ul din footer, si anume: &#8220;Your PHP MySQL library version 5.0.51a differs from your MySQL server version 5.1.34. This may cause unpredictable behavior.&#8221; se poate ignora. Inca n-am intalnit probleme folosint clientul de MySQL 5.0, si nu, nu am avut timp sau chef sa caut sau sa imi compilez unul pentru MySQL 5.1.Va urma.</p>
<p>Niste imagini pe post de dovezi (in cazul 3.1.5 arata la fel, nu am actualizat si imaginea):</p>
<p align="center"><a href="http://saltwaterc.net/wp-content/uploads/phpmyadmin3-login-window-image.png" title="phpMyAdmin 3 Login Window"><img src="http://saltwaterc.net/wp-content/uploads/phpmyadmin3-login-window-image.thumbnail.png" alt="phpMyAdmin 3 Login Window" /></a><a href="http://saltwaterc.net/wp-content/uploads/phpmyadmin3-logged-in-image.png" title="phpMyAdmin 3 Logged In"><img src="http://saltwaterc.net/wp-content/uploads/phpmyadmin3-logged-in-image.thumbnail.png" alt="phpMyAdmin 3 Logged In" /></a></p>
<h2>Download:</h2>
<p><a href="http://saltwaterc.net/wp-download/wampp/apache_2.2.11-win32-x86-openssl-0.9.8i.msi.zip" title="Apache 2.2.11" target="_blank">apache_2.2.11-win32-x86-openssl-0.9.8i.msi</a> &#8211; installer-ul Apache</p>
<p><a href="http://saltwaterc.net/wp-download/wampp/php-5.2.6-win32-installer.msi.zip" title="PHP 5.2.6" target="_blank">php-5.2.6-win32-installer.msi</a> &#8211; installer-ul PHP</p>
<p><a href="http://saltwaterc.net/wp-download/wampp/mysql-5.1.34-winx64.msi.zip" title="MySQL 5.1 64-bit" target="_blank">mysql-5.1.34-winx64.msi</a> &#8211; installer-ul 64-bit al MySQL</p>
<p><a href="http://saltwaterc.net/wp-download/wampp/mysql-5.1.34-win32.msi.zip" title="MySQL 5.1 32-bit" target="_blank">mysql-5.1.34-win32.msi</a> &#8211; installer-ul 32-bit al MySQL</p>
<p><a href="http://saltwaterc.net/wp-download/wampp/phpMyAdmin-3.1.5-all-languages.zip" title="phpMyAdmin 3.1.5" target="_blank">phpMyAdmin-3.1.5-all-languages.zip</a> &#8211; release-ul de phpMyAdmin</p>
<p><a href="http://saltwaterc.net/wp-download/wampp/httpd-phpmyadmin.zip" title="phpMyAdmin Apache Configuration" target="_blank">httpd-phpmyadmin.conf</a> &#8211; fisierul de configurare al phpMyAdmin ce il foloseste Apache.</p>
<p><a href="http://saltwaterc.net/wp-download/wampp/WAMPP-images.zip" title="WAMPP Images" target="_blank">WAMPP-images.zip</a> &#8211; imaginile folosite pe parcursul articolului</p>
<p>Recomand totusi sursele oficiale pentru fisierele de mai sus. Le-am pus pentru comoditatea unora cu speranta sa nu fie abuzate, in caz contrar, vor fi scoase de la download, sau voi bana pe cei ce le abuzeaza. Inclin totusi catre a doua varianta.</p>
<h2>Documentatie online:</h2>
<p>Apache &#8211; <a href="http://httpd.apache.org/docs/2.2/" title="Apache 2.2 Documentation" target="_blank">http://httpd.apache.org/docs/2.2/</a></p>
<p>PHP &#8211; <a href="http://www.php.net/manual/en/" title="PHP Documentation" target="_blank">http://www.php.net/manual/en/</a></p>
<p>MySQL &#8211; <a href="http://dev.mysql.com/doc/refman/5.1/en/" title="MySQL 5.1 Documentation" target="_blank">http://dev.mysql.com/doc/refman/5.1/en/</a></p>
<h2>Manuale:</h2>
<p>PHP &#8211; <a href="http://www.php.net/download-docs.php" title="PHP Manuals" target="_blank">http://www.php.net/download-docs.php</a></p>
<p>MySQL -  <a href="http://dev.mysql.com/doc/" title="MySQL Manuals" target="_blank">http://dev.mysql.com/doc/</a></p>
<p>Recomand versiunile CHM ale manualelor.</p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/0r5-klZHvMw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/windows/instalarea-apache-22-php-52-mysql-51-sub-windows.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/windows/instalarea-apache-22-php-52-mysql-51-sub-windows.html</feedburner:origLink></item>
		<item>
		<title>Gnome History</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/QLM-ry-Ipt8/gnome-history.html</link>
		<comments>http://www.saltwaterc.net/linux/gnome-history.html#comments</comments>
		<pubDate>Tue, 21 Apr 2009 10:08:05 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/tech/gnome-history.html</guid>
		<description><![CDATA[Acesta este inca unul dintre acele posturi despre intalnitele &#8220;OS annoyances&#8220;. Desi primele 3 rezultate din Google Search-ul de mai sus fac referire la Windows OS, de data aceasta Gnome in implementarea Debian/Ubuntu iese la rampa. Posibil si sub alte distributii pentru ca imi miroase a problema din upstream in loc sa fie o problema [...]]]></description>
			<content:encoded><![CDATA[<p>Acesta este inca unul dintre acele posturi despre intalnitele &#8220;OS <a href="http://www.google.com/search?hl=en&amp;q=annoyances&amp;btnG=Google+Search&amp;aq=f&amp;oq=" title="annoyances" target="_blank">annoyances</a>&#8220;. Desi primele 3 rezultate din Google Search-ul de mai sus fac referire la Windows OS, de data aceasta Gnome in implementarea Debian/Ubuntu iese la rampa. Posibil si sub alte distributii pentru ca imi miroase a problema din upstream in loc sa fie o problema a Debian+derivatii.</p>
<p>M-am trezit inca de dimineata cu gand rau impotriva Gnome History. Din pacate gandul meu a fost mai slab decat implementarea incapatanata a celor ce au <em>gandit</em> Gnome-ul din acest punct de vedere si n-au pus pe undeva o optiune pentru dezactivarea acestei functii, optiune ce sa fie demna de &#8216;Captain Obvious&#8217;, altfel spus, la mintea cocosului. Daca in trecut istoricul se tinea in fisierul ~/.recently-used iar un simplu:</p>
<pre>chmod -c 400 ~/.recently-used</pre>
<p>era suficient pentru a opri atrocitatea, in prezent (de la Gutsy si pana in prezent daca nu ma insel) lucrurile sunt sensibil mai diferite. Numele fisierului s-a schimbat intre timp in .recently-used.xbel. Nu aceasta ar fi problema esentiala daca metodele clasice ar functiona. Am incercat schimbarea ACL-urilor precum am pus mai sus: ceva le restaureaza. Am pus symlink catre /dev/null &#8230; ceva sterge link-ul si restaureaza fisierul. L-am creat de sub root si l-am lasat asa &#8230; ceva ii restaureaza ACL-urile si le pune iarasi pe contul meu. Parca era un film de acela prost cu Greuceanu ce omoara balauri alimentati cu baterii Duracell ce tot primesc resurect. Din fericire acesta a fost balaur pe 2 biti (4 capete). Cine stie bancul cu balaurul pe 8 biti, pricepe.</p>
<p>Metode exista, si sunt doua la numar. Prima desi functioneaza, este trista pentru ca are prostul obicei de a genera erori GTK in shell:</p>
<pre>rm ~/.recently-used.xbel ; mkdir ~/.recently-used.xbel</pre>
<p>Se pare ca e o piatra prea tare de rumegat pentru implementarea incapatanata prezentata mai sus.</p>
<p>Dar are dezavantajul erorilor din shell. Fericitii (ca mine) ce folosesc ext3 pe post de filesystem (nu cunosc utilitare echivalente pentru reiser, xfs, jfs &#8211; nu dati cu pietre) pot apela la o smecherie ce marcheaza fisierul ca immutable iar la incercarea de a face ceva, o sa se loveasca de un raspuns mai incapatanat de la Sfantul Kernel:</p>
<pre>sudo chattr +i ~/.recently-used.xbel</pre>
<p>Chestia asta il va opri pe mucos sa mai salveze istoricul, ba mai mult, scuteste shell-ul de erori neinteresante.</p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/QLM-ry-Ipt8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/linux/gnome-history.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/linux/gnome-history.html</feedburner:origLink></item>
		<item>
		<title>Deepest Sender</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/HFRLifXO79A/deepest-sender.html</link>
		<comments>http://www.saltwaterc.net/wordpress/deepest-sender.html#comments</comments>
		<pubDate>Mon, 30 Mar 2009 17:31:24 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/tech/wordpress/deepest-sender.html</guid>
		<description><![CDATA[Se pare ca m-am cam saturat sa ma chinui a posta articole din interfata web a WordPress deci am inceput sa cercetez optiuni alternative. In concluzie m-am dat pe client relativ dedicat cu mentiunea ca ofera totusi ceva mai multe optiuni.  In principiu mare branza nu a fost, desi trebuia sa respecte o singura [...]]]></description>
			<content:encoded><![CDATA[<p>Se pare ca m-am cam saturat sa ma chinui a posta articole din interfata web a WordPress deci am inceput sa cercetez optiuni alternative. In concluzie m-am dat pe client relativ dedicat cu mentiunea ca ofera totusi ceva mai multe optiuni.  In principiu mare branza nu a fost, desi trebuia sa respecte o singura chestie: sa fie extensie de Firefox. Din moment ce browserul tinde sa fie al doilea sistem de operare la mine pe masina de pe care tastez, am presupus ca exista. Precum titlul o demonstreaza, exista si se numeste Deepest Sender. In caz ca inca iti este lipita de creier intrebarea: dar bine, totusi de ce o extensie de Firefox? &#8211; raspunsul este simplu: pentru ca nu scrie nicaieri faptul ca stau mereu sub Windows OS, deci printe altele o chestie dependenta de platforma limiteaza din spatiul de miscare. Da, stiu, geeky.  Chiar daca nu ofera acces la absolut toate jucariile din interfata de administrare a WordPress, stie totusi sa faca vreo cateva chestii interesante:</p>
<ul>
<li>conturi multiple (nu e musai sa scriu doar pe blogul personal &#8230; de fapt stai, nu scriu doar pe blogul personal);</li>
<li>editor rich text cu posibilitate de a vedea sursa HTML generata si un preview al formatarii;</li>
<li>cica ar sti sa stea si sub forma de sidebar desi nu m-a prins acest trend pentru browser;</li>
<li>drag-and-fleosc;</li>
<li>baga de seama ca ii dai muzica sa roada daca ai <a href="http://www.foxytunes.org/" target="_blank" title="FoxyTunes">FoxyTunes</a> pe aproape</li>
<li>baga de seama ca tastezi balarii si incearca sa te corecteze &#8211; aka spellchecking</li>
<li>daca pusca Firefoxu&#8217; (se intampla si de astea) atunci o sa incerce sa recupereze cat poate, atata timp cat Firefox-ul nu a puscat cu tot cu disk-ul pe care se afla instalat</li>
<li>salvarea de drafts, desi nu poate importa draft-urile salvate folosind interfata web a WordPress</li>
<li>posibilitatea de a modifica ultimele 15 post-uri de pe blog. Este o limitare ce toate engine-urile suportate inafara de LiveJournal o au. Da, Deepest Sender suporta si alte chestii pe langa WordPress.</li>
<li>mod offline, posibilitatea de a salva si incarca fisiere XML in care se stocheaza articolul;</li>
<li>asta e adaugata de la mine din burta (oricum nu duc lipsa) &#8211; editor rich text ce stie sa colaboreze cu persoana care tasteaza articolul in loc sa lucreze impotriva lui cum face de multe ori TinyMCE aka editorul JavaScript ce vine in mod implicit cu WordPress.</li>
<li>inca una de la mine &#8211; adaugarea de imagini ofera si posibilitatea de a alinia chestiile mult mai usor decat TinyMCE si ofera posibilitatea de a da float la o imagine, chestie ce intr-un WordPress chel lipseste cu desavarsire, deci e nevoie sa se intervina in codul HTML.</li>
</ul>
<p>In fine, nu sunt toate numai lapte si miere:</p>
<ul>
<li>are suficienta grija sa nu stie nimic altceva inafara de sintaxa de baza pentru a insera un link. Fara target, fara title &#8230; trist. Din fericire exista tab-ul &#8216;Source&#8217; dar nu tine de cald precum echivalentul din TinyMCE.</li>
<li>din pacate are mai putine optiuni de formatare, desi majoritatea sunt suficiente pentru un bloagar de asta fara nevoi speciale;</li>
<li>faptul ca stie sa vada ultimele chestii postate pe blog este o chestie buna, dar limita de 15 articole este totusi un impediment. Nu stiu sigur daca este o problema cu serverul XML-PRC al WordPress sau pur si simplu o limitare a Deepest Sender.</li>
<li>ar fi fost un fel de &#8220;coolness, I has it&#8221; sa poti modifica ad-labam ora la care postezi articolul asa cum interfata web stie sa o faca. Deasemenea, nu am cercetat daca e limitare de client sau de protocol.</li>
<li>ar fi recomandat sa se nu se inchida clientul atata timp cat se tasteaza un articol. Desi la o deschidere ulterioara stie sa reia procesul de unde a ramas, formatarea articolului a devenit complet cretina si arata de parca a facut-o un copil beat. In rest a fost ochei &#8230; chiar mai ochei si mai ascultator decat TinyMCE. Pe deasupra disparuse si posibilitatea de a alege o categorie (o_O), desi la a doua deschidere in timp ce tastam articolul s-a comportat aproape impecabil: a uitat categoria ce o alesesem initial, in rest nu a mai pus probleme.</li>
</ul>
<p>In conlcluzie, se pare ca o sa ramana o vreme instalat pe la mine prin browser. Flock stiu ca avea o chestie de aceasta, dar il folosesc mai rar datorita suportului slab pentru Firebug, desi e doar un Firefox 3 modificat.</p>
<p><a href="http://deepestsender.mozdev.org/installation.html" target="_blank" title="Deepest Sender">Download</a></p>
<p>Later Edit: mai are un `annoyance` &#8211; si anume faptul ca refuza cu desavarsire sa se pupe cu codul XHTML valid &#8211; asta daca nu e potrivit cu mana. S-a observat abia dupa postarea articolului.</p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/HFRLifXO79A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/wordpress/deepest-sender.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/wordpress/deepest-sender.html</feedburner:origLink></item>
		<item>
		<title>Saltwater’s Video Downloader merge in offline</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/m2Ol_j-op30/saltwaters-video-downloader-merge-in-offline.html</link>
		<comments>http://www.saltwaterc.net/tech/saltwaters-video-downloader-merge-in-offline.html#comments</comments>
		<pubDate>Thu, 19 Feb 2009 16:19:15 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/tech/saltwaters-video-downloader-merge-in-offline.html</guid>
		<description><![CDATA[Versiune in romana mai pe lung &#8230;
De ce? Degeaba. Sau de trefla. Sau ca sa nu ma bata la cap AIMR-ul, desi aplicatia acceseaza doar continut public, iar daca e o problema, e problema companiilor care hosteaza acele fisiere. Cu un Firefox+tab-ul Net al Firebug este banala obtinerea continutului media ce ajunge in browser, si [...]]]></description>
			<content:encoded><![CDATA[<p>Versiune in romana mai pe lung &#8230;</p>
<p>De ce? Degeaba. Sau de trefla. Sau ca <a href="http://blog.w2.ro/muzica-d-load-will-go-offline/" title="Muzica D-Load will go offline" target="_blank">sa nu ma bata la cap <strong>AIMR</strong></a>-ul, desi aplicatia acceseaza doar continut public, iar daca e o problema, e problema companiilor care hosteaza acele fisiere. Cu un Firefox+tab-ul Net al Firebug este banala obtinerea continutului media ce ajunge in browser, si nu e singura metoda, dar e relativ simpla, mai simpla decat scormonitul prin cache. In fine, precum unii au observat, desi Trilulilu si YouTube inca sunt functionale (celelalte nu, desi site-ul a fost in mod intentionat in offline), problemele de mentenanta si de singura gaura de securitate (ce a fost exploatata, dar a dus la crash-ul aplicatiei, deci consecintele au fost minore) mi-au cam ajuns. De altfel personal <u><strong>NU</strong></u> am nevoie de o asemenea aplicatie, doar am avut ambitia sa fiu al doilea ce a scris un Trilulilu Downloader (lansat publicului in August, 2007) dupa ce primul devenise un proiect defunct, iar chestia aceasta i-a adus ceva popularitate. YouTube, Google Video, Metacafe au fost ambitii minore. Bine, mai putin Google Video ce m-a pus la lucru vreo doua zile. Deci nu mai plangeti dupa aplicatie, nu mai este, nici nu o sa mai fie. Sunt prea ocupat cu treburi mult mai serioase. Multumesc celor ce mi-au utilizat munca, dar pentru orice exista un sfarsit.</p>
<p>Short English version &#8230;</p>
<p>As you can see, the Video Downloader is dead. It&#8217;s my decision based on certain facts. Pulling down the Downloader might have been a constraint, but currently this is not the case. Please look down for alternatives, and thank you for using my application.</p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/m2Ol_j-op30" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/tech/saltwaters-video-downloader-merge-in-offline.html/feed</wfw:commentRss>
		<slash:comments>24</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/tech/saltwaters-video-downloader-merge-in-offline.html</feedburner:origLink></item>
		<item>
		<title>Write in C</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/BEEFck_znMg/write-in-c.html</link>
		<comments>http://www.saltwaterc.net/programare/write-in-c.html#comments</comments>
		<pubDate>Wed, 18 Feb 2009 09:27:00 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Programare]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/videos/write-in-c.html</guid>
		<description><![CDATA[If you can see this, then you might need a Flash Player upgrade or you need to install Flash Player if it&#8217;s missing. Get Flash Player from Adobe.&#187; Powered by XHTML Video Embed
Via Misu   &#8230;
]]></description>
			<content:encoded><![CDATA[<p align="center"><object type="application/x-shockwave-flash" style="width:448px;height:386px" data="http://www.youtube.com/v/XHosLhPEN3k&amp;hl=en&amp;fs=1"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="quality" value="best" /><param name="wmode" value="transparent" /><param name="movie" value="http://www.youtube.com/v/XHosLhPEN3k&amp;hl=en&amp;fs=1" /><param name="pluginspage" value="http://www.macromedia.com/go/getflashplayer" />If you can see this, then you might need a Flash Player upgrade or you need to install Flash Player if it&#8217;s missing. Get <a href="http://get.adobe.com/flashplayer/" target="_blank">Flash Player</a> from Adobe.</object><br/><span style='display:block;text-align:left;font-size:xx-small'><a href='http://saltwaterc.net/xhtml-video-embed' target='_blank' title='XHTML Video Embed - Delivers valid XHTML flash content into your WordPress blog'>&raquo; Powered by XHTML Video Embed</a></span></p>
<p>Via Misu <img src='http://www.saltwaterc.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  &#8230;</p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/BEEFck_znMg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/programare/write-in-c.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/programare/write-in-c.html</feedburner:origLink></item>
		<item>
		<title>2YAWM Celebration @ PureSound.FM</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/CGHZkuqpgro/2yawm-celebration-puresoundfm.html</link>
		<comments>http://www.saltwaterc.net/fara-nume/2yawm-celebration-puresoundfm.html#comments</comments>
		<pubDate>Wed, 11 Feb 2009 09:48:09 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Fără nume]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/fara-nume/2yawm-celebration-puresoundfm.html</guid>
		<description><![CDATA[ 
Nu cred ca este cel mai mare secret faptul ca simpatizez acest post de radio online, ba mai mult, am contribuit la promovare, continut (leak-uri pe Web au mai fost), energie &#8230; Si pentru ca timpul tine sa ne reaminteasca faptul ca trece atat de repede, uite ca se serbeaza aniversarea de doi anisori. Chiar [...]]]></description>
			<content:encoded><![CDATA[<p> <a href="http://saltwaterc.net/wp-content/uploads/2yawm_v2.jpg" title="2YAWM Celebration" rel="lightbox-2yawm"><img src="http://saltwaterc.net/wp-content/uploads/2yawm_v2.jpg" alt="2YAWM Celebration" /></a></p>
<p>Nu cred ca este cel mai mare secret faptul ca simpatizez acest post de radio online, ba mai mult, am contribuit la promovare, continut (leak-uri pe Web au mai fost), energie &#8230; Si pentru ca timpul tine sa ne reaminteasca faptul ca trece atat de repede, <a href="http://puresound.fm/topic-88.html" title="2YAWM Celebration" target="_blank">uite ca se serbeaza aniversarea de doi anisori</a>. Chiar daca nu sunt un adept al sarbatoriri timpului, nu puteam sa refuz invitatia de a participa si la acest eveniment, deci fanii muzici EDM (PureSound.FM mai trece si dincolo de Trance) au la dispozitie un eveniment intins pe durata a 4 zile, 4 zile in care isi pot incanta urechile cu seturile DJ-ilor ce au confirmat prezenta pe afis.</p>
<p>Pentru ca in acesti doi ani de la lansare, subsemnatul a avut foarte multe de invatat de la rezidentii PureSound.FM (printre care m-am numarat pentru o perioada de timp destul de mare), contributia mea de data aceasta va fi dincolul de nivelul invatacel sau experiment, venind in intampinare cu un stil matur, dar pus alaturi din pura placere fara constrangerile timpului ce au dus la scaderea calitatii propriului show si in final la amanarea lui din dorinta de a face o treaba catre perfectionism sau a renunta la ea. Deci traiesc cu speranta mea ca voi reusi integrarea unei idei, unui concept, si oricine este invitat sa se alature daca poate sa simta cu adevarat muzica Trance.</p>
<p>Atasez si afisul ce afiseaza planificarea DJ-ilor in functie de zile si orele la care acestia pot fi ascultati (timpul este exprimat in GMT aka ora Marii Britanii) &#8230;</p>
<p><span id="more-536"></span></p>
<p><a href="http://saltwaterc.net/wp-content/uploads/2yawm_list.jpg" title="2YAWM Celebration - Schedule" rel="lightbox-2yawm"><img src="http://saltwaterc.net/wp-content/uploads/2yawm_list.jpg" alt="2YAWM Celebration - Schedule" /></a></p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/CGHZkuqpgro" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/fara-nume/2yawm-celebration-puresoundfm.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/fara-nume/2yawm-celebration-puresoundfm.html</feedburner:origLink></item>
		<item>
		<title>Geek jokes</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/GUV9TRF8Qp4/geek-jokes.html</link>
		<comments>http://www.saltwaterc.net/tech/geek-jokes.html#comments</comments>
		<pubDate>Wed, 04 Feb 2009 11:35:39 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Programare]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/tech/geek-jokes.html</guid>
		<description><![CDATA[http://www.kailashnadh.name/docs/geek_jokes/
Cred ca este una dintre cele mai tari colectii de geek jokes &#8230; evident &#8230; nu le poate pricepe oricine &#8230;
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.kailashnadh.name/docs/geek_jokes/" title="Geek Jokes" target="_blank">http://www.kailashnadh.name/docs/geek_jokes/</a></p>
<p>Cred ca este una dintre cele mai tari colectii de geek jokes &#8230; evident &#8230; nu le poate pricepe oricine &#8230;</p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/GUV9TRF8Qp4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/tech/geek-jokes.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/tech/geek-jokes.html</feedburner:origLink></item>
		<item>
		<title>E bine sa ai backup</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/rpAm6ugzTRc/e-bine-sa-ai-backup.html</link>
		<comments>http://www.saltwaterc.net/fara-nume/e-bine-sa-ai-backup.html#comments</comments>
		<pubDate>Thu, 08 Jan 2009 10:40:15 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Fără nume]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/videos/e-bine-sa-ai-backup.html</guid>
		<description><![CDATA[Sa lasam pixelii sa vorbeasca &#8230;
If you can see this, then you might need a Flash Player upgrade or you need to install Flash Player if it&#8217;s missing. Get Flash Player from Adobe.&#187; Powered by XHTML Video Embed
]]></description>
			<content:encoded><![CDATA[<p>Sa lasam pixelii sa vorbeasca &#8230;</p>
<p align="center"><object type="application/x-shockwave-flash" style="width:448px;height:386px" data="http://www.youtube.com/v/wMEmHfyT408&amp;hl=en&amp;fs=1"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="quality" value="best" /><param name="wmode" value="transparent" /><param name="movie" value="http://www.youtube.com/v/wMEmHfyT408&amp;hl=en&amp;fs=1" /><param name="pluginspage" value="http://www.macromedia.com/go/getflashplayer" />If you can see this, then you might need a Flash Player upgrade or you need to install Flash Player if it&#8217;s missing. Get <a href="http://get.adobe.com/flashplayer/" target="_blank">Flash Player</a> from Adobe.</object><br/><span style='display:block;text-align:left;font-size:xx-small'><a href='http://saltwaterc.net/xhtml-video-embed' target='_blank' title='XHTML Video Embed - Delivers valid XHTML flash content into your WordPress blog'>&raquo; Powered by XHTML Video Embed</a></span></p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/rpAm6ugzTRc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/fara-nume/e-bine-sa-ai-backup.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/fara-nume/e-bine-sa-ai-backup.html</feedburner:origLink></item>
		<item>
		<title>Pentru toti devii PHP</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/ENEqc-uEeWU/pentru-toti-devii-php.html</link>
		<comments>http://www.saltwaterc.net/php/pentru-toti-devii-php.html#comments</comments>
		<pubDate>Wed, 19 Nov 2008 11:28:09 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/pics/pentru-toti-devii-php.html</guid>
		<description><![CDATA[
Am primit acesta (evident) de la un alt PHP dev &#8230;
]]></description>
			<content:encoded><![CDATA[<p style="float: left; margin-right: 10px"><a href="http://saltwaterc.net/wp-content/uploads/php.jpg" title="PHP"><img src="http://saltwaterc.net/wp-content/uploads/php.thumbnail.jpg" alt="PHP" /></a></p>
<p>Am primit acesta (evident) de la un alt PHP dev &#8230;</p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/ENEqc-uEeWU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/php/pentru-toti-devii-php.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/php/pentru-toti-devii-php.html</feedburner:origLink></item>
		<item>
		<title>Zodiacul la modul sarcastic</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/N_QZNtn89ZM/zodiacul-la-modul-sarcastic.html</link>
		<comments>http://www.saltwaterc.net/fara-nume/zodiacul-la-modul-sarcastic.html#comments</comments>
		<pubDate>Tue, 18 Nov 2008 10:29:22 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Fără nume]]></category>

		<guid isPermaLink="false">http://saltwaterc.net/fara-nume/zodiacul-la-modul-sarcastic.html</guid>
		<description><![CDATA[Adevarurile se spun prin glume sarcastice (vezi George Carlin). In aceeasi idee &#8230;
Berbec (21.03-20.04)
Planeta dominantă: Marte, planeta încăpăţănării şi încăierărilor.
Animalul sacru: bărzăunul
Personalitate: Berbecul guvernează capul, drept pentru care Berbecii sunt experţi în a se arunca cu capul înainte, a face doar ce-i taie capul şi a da cu capul de pragul de sus. Sunt foarte [...]]]></description>
			<content:encoded><![CDATA[<p>Adevarurile se spun prin glume sarcastice (vezi George Carlin). In aceeasi idee &#8230;</p>
<p><strong>Berbec (21.03-20.04)</strong><br />
Planeta dominantă: Marte, planeta încăpăţănării şi încăierărilor.<br />
Animalul sacru: bărzăunul<br />
Personalitate: Berbecul guvernează capul, drept pentru care Berbecii sunt experţi în a se arunca cu capul înainte, a face doar ce-i taie capul şi a da cu capul de pragul de sus. Sunt foarte siguri pe ei în tot ce fac, chiar şi când fac cele mai monumentale prostii. Plini de energie şi iniţiativă, sunt atât de grăbiţi şi de ocupaţi, încât nu au timp să gândească. Cu toate astea, în înţelepciunea lor nemărginită, ştiu întotdeauna ce e mai bine pentru ceilalţi. Nimeni n-are voie să-i contrazică, în timp ce ei îşi păstrează dreptul inalienabil de a contrazice pe toată lumea. Specialitatea lor este viteza, din care cauză au mereu fel de fel de vânătăi, arsuri sau tăieturi şi sunt clienţi fideli ai service-urilor şi asigurărilor auto. Cea mai mare afacere a vieţii lor este sexul, pe care-l practică numai din dragoste, chiar dacă dragostea respectivă nu durează decât o zi.<br />
Meseria potrivită: director, pompier, instructor de sex, bungeejumper, spărgător de bănci.<br />
Pizza magică: Diavolo.<br />
Medicamentul norocos: energizantele</p>
<p><strong>Taur (21.04-21.05) </strong><br />
Planeta dominantă: Venus, planeta trăndăviei şi a lascivitătii,<br />
Animalul sacru: vaca indiană<br />
Personalitate: Taurul e recunoscut pentru stabilitate şi perseverenţă, de fapt două modalităţi de exprimare a lipsei de imaginaţie. Universul lui se mărgineşte la ce poate să vadă, să guste sau să pipăie. Noţiunile complexe îl tulbură profund, iar îndărătnicia lui n-are semăn &#8211; dacă a apucat într-o direcţie, aşa o ţine. O schimbare de macaz ar implica un efort fizic şi intelectual prea mare pentru lenea lui. În ciuda obtuzităţii, dă însă dovadă de o aprigă viclenie atunci când îşi apără pielea sau vrea să obţină ceva. E maestru în a scoate castanele din foc cu mâna altuia. Dincolo de falnica-i robusteţe, Taurul ascunde o abominabilă laşitate.<br />
Meseria potrivită: contabil, lăutar, coafeză, manechin, pom-star,degustător de maioneză. Pizza magică: Rusticana<br />
Medicamentul norocos: întăritoarele (sexuale)</p>
<p><strong>Gemeni (22.05-21.06)</strong><br />
Planeta dominantă: Mercur, planeta trăncănelii şi nevricalelor.<br />
Animalul sacru: papagalul<br />
Personalitate: Gemenii sunt isteţi şi foarte adaptabili, cu alte cuvinte nişte oportunişti lipsiţi de scrupule. Stăpânesc perfect arta comunicării şi pot să te mintă în faţă fără să clipească. Sunt drăgălăşenia întruchipată când vor să obţină ceva şi de-a dreptul sadici când au chef să se joace cu nervii altora.. Sprinteni şi îndemânatici, dispar când ţi-e lumea mai dragă şi pot face nevăzute diverse obiecte care li se par interesante. Îşi scot din minţi şefii şi consorţii, dar nici unii nu-i dau afară, din cauză că se pricep să le spună bancuri. În dragoste, sunt deschişi tuturor posibilităţilor şi ar fi primii care ar subscrie la legalizarea poligamiei. Cu toate astea, în clipele romantice au tendinţa de a-şi exprima pasiunea uitându-se pe pereţi.<br />
Meseria potrivită: agent de vânzări, scamator, chelner, escroc.<br />
Pizza magică: Calzone.<br />
Medicamentul norocos: gargara.</p>
<p><strong>Rac (22.06-22.07) </strong><br />
Planeta dominantă: Luna, astrul toanelor şi născocirilor.<br />
Animalul sacru: lipitoarea<br />
Personalitate: Racul este un profitor nesătul, al cărui unic scop în viaţă e să care în bârlog tot ce-i pică în mână. Este mai zgârcit şi mai apucător decât tot neamul hărciogilor la un loc. Se spune că ar fi diplomat, dar în realitate manipulează pe toată lumea ca să-şi rezolve interesele. Zâmbeşte graţios, înşiră verzi şi uscate şi joacă tot timpul teatru, fiind foarte popular printre cei gură-cască şi slabi de minte. Are mania de a coopta tot soiul de rataţi pe care îi psihanalizează sau îi îndoctrinează cu predici filozofice ori cuvântări patriotice. Îşi iubeşte casa, dar nu este lipit de ea. Ros de morbul vagabondajului, dispare periodic pentru diverse intervale de timp. Din nefericire, se întoarce mereu înapoi &#8230; În dragoste este adeptul romantismului siropos şi leşinat. Asta, la început, căci mai devreme sau mai târziu va scoate la bătaie un nimicitor arsenal de tocare măruntă a nervilor: toane, nazuri, îmbufnări, bombăneli, bănuieli, accese masochiste şi şantaje sentimentale.<br />
Meseria potrivită: politician sau afacerist interlop (la alegere), poet, cămătar, pitic de grădină.<br />
Pizza magică: Quattro formaggi.<br />
Medicamentul norocos: alcoolul</p>
<p><strong>Leu (23.07-22.08) </strong><br />
Planeta dominantă: Soarele, astrul egoismului şi îngâmfării.<br />
Animalul sacru: pupăza<br />
Personalitate: Leul este un lider înnăscut şi, ca toţi liderii, se înalţă strivindu-i pe cei cu mai mult bun-simţ decât el. Subordonaţii îi acordă respectul cuvenit, dar I-ar strânge de gât cu maximă plăcere. Ambiţie! ca nimeni altul. consideră că a atins poziţia cuvenită doar atunci cân nu mai are vreun loc alb pe cartea de vizită. Se iubeşte atât de mult pe sine încât îşi pupă oglinda de câte ori se crede singur. Este aşa de obsedat de onoruri că, dacă primeşte o cupă la campionatul de şotron, e în stare să umble cu ea atârnată la gât, să vadă lumea cât de grozav este. Atrage atenţia în orice adunare: fie este cel mai înzorzonat personaj, fie aruncă cu banii în toate părţile, fie poartă o armă. Pozează tot timpul, doarme pe stânga fiindcă profilul drept îl avantajează mai mult şi arată cu degetul mijlociu ca să-şi expună mai bine diamantul de multe carate. În dragoste, este la fel de înflăcărat ca un furnal şi la fel de discret o trompetă cu amplificator.<br />
Meseria potrivită: împărat, şef de bloc, portar de hotel, dresor, hingher<br />
Pizza magică: Quattro stagioni.<br />
Medicamentul norocos: toxina botulinică.</p>
<p><strong>Fecioară (23.08-22.09) </strong><br />
Planeta dominantă: Mercur, planeta trăncănelii şi a isteriilor.<br />
Animalul sacru: ciocănitoarea<br />
Personalitate: Zodiacele critică spiritul critic al fecioarei, punând-o astfel într-o situaţie critică. Cum, pe deasupra, fecioara mai e şi metodica punctuală şi perfecţionistă, sfârşesc prin a-i scoate pe toţi din pepeni. Obsedată de igienă, detalii şi clasificări, este capabilă să caute bacteriile cu lupa, să frece duşumelele periuţa sau să pună rufele în maşina de spălat nu doar pe culori, ci şi ordine crescătoare şi alfabetică. Miroase enervant de curat, ceea ce leagă spiritual de cânii şi pisicile din cartier. Fecioara este o fană a listelor, tabelelor şi regulamentelor pe punele subpuncte, care, în loc să-i simplifice, îi încâlcesc teribil existenţa. Scurt, orice fecioară veritabilă este: 1. mereu ocupată cu o mie de nimicuri sau să-şi bage nasul unde nu-i fierbe oala. 2. tipicară; 3. ipohondră: 4.cicălitoare: 5. cărpănoasă: 6. maniacă: 7. absolut necesară (din păcate). În dragoste, are căldura unei frapiere şi fantezia unui birocrat.<br />
Meseria potrivită: analist politic, CTC-ist, agent de dezinsecţie, sora medicală (sau frate).<br />
Pizza magică: funghi.<br />
Medicamentul norocos: toate, fără excepţie</p>
<p><strong>Balantă (23.09-22.10)</strong><br />
Planeta dominantă: Venus, planeta trândăviei şi lascivităţii.<br />
Animalul sacru: bibilica<br />
Personalitate: Balanţa are certe înclinaţii intelectuale, utile în studiul aprofundat al programului tv, şi un înalt simţ artistic, reflectat în flerul cu care-şi asortează pantofii cu lenjeria. Plină de graţie şi eleganţă, umblă cu nasul pe sus, strâmbând suveran din el la orice încălcare a etichetei. Se zice că adoră confortul şi armonia, ceea ce în traducere liberă înseamnă că este leneşă şi n-are principii ferme. Despre Balanţă se mai spune că este o bună colaboratoare şi sfătuitoare: în orice problemă, expune câteva zeci de soluţii, ca apoi să-l lase pe celălalt să decidă.. Cât despre vestitul ei echilibru, cel mai în măsură să comenteze ar fi psihiatrul care o tratează. În lipsa lui, se acceptă şi mărturiile apropiaţilor, adânc îngrijoraţi de viteza cu care-şi schimbă părerile şi de costurile mărite ale dulciurilor pe care le înghite atunci când e deprimată. Cel mai de seamă lucru din viaţa ei este dragostea, subiect bogat în detalii picante, prea indecente ca să poată fi relatate.<br />
Meseria potrivită: agent matrimonial, arbitru, escortă, gigolo, tester de hamace, rentier.<br />
Pizza magică: Capricciosa.<br />
Medicamentul norocos: gelul anticelulitic.</p>
<p><strong>Scorpion (23.10-21.11)</strong><br />
Planeta dominantă: Pluto, planeta obsesiilor şi paranoiei.<br />
Animalul sacru: vipera<br />
Personalitate: Scorpionul are foarte mult magnetism personal: atrage cuiele ruginite, cutiile de conservă, dramele şi ghinioanele. Are emoţii intense, idei fixe şi puterea de a deochea. Este atât de încordat, încât dă impresia că suferă, iar încordarea lui face să se defecteze obiectele din jur. Chiar şi cei apropiaţi sunt profund afectaţi, de unde şi bafta pe care o are la moşteniri. Ştie ce vrea, dar caută să obţină totul pe căi ocolite. E genul care mai bine îşi otrăveşte duşmanul decât să-i dea un pumn în nas. Paranoic, vede peste tot pericole, intrigi şi conspiraţii. Asta nu-l împiedică să umble cu fitile şi să-i manipuleze pe ceilalţi. Îi consideră prieteni doar pe cei de care se poate folosi, iar prietenii n-au încredere în el, fiindcă ştiu că n-are mamă, tată sau scrupule, şi atacă subversiv, sub centură. În dragoste, este un obsedat sexual frustrat, gelos şi posesiv, care-şi scoate din minţi perechea cu bănuielile şi cu gusturile lui anormale.<br />
Meseria potrivită: detectiv, medic legist, pândar, scafandru, vânător de fantome.<br />
Pizza magică: Siciliana.<br />
Medicamentul norocos: extractul de mătrăgună.</p>
<p><strong>Săgetător (22.11-21.12)</strong><br />
Planeta dominantă: Jupiter, planeta exceselor şi a glumelor proaste.<br />
Animalul sacru: grangurul<br />
Personalitate: Săgetătorul este un inconştient optimist, a cărui specialitate este datul cu bâta în baltă: scoate perle după perle cu un aer de savant atotştiutor, face glume proaste şi râde fără rost. Este un snob care-şi poartă hainele cu etichetele pe-afară şi se laudă cu vedetele de teleshopping pe care le frecventează. Promite marea cu sarea, dar când trebuie să-şi ţină promisiunile este lovit de amnezie. Adoră maşinile, pe care le conduce cu plăcere şi cu mare viteză, în cei mai falnici pomi de pe marginea drumului. fiindcă se crede cel mai tare, se bagă în bucluc şi trece razant pe lângă dezastre. Scapă însă cu bine, căci beneficiază de clauza berzei chioare, care i-a fost acordată pentru a nu rămâne zodia cuI doar cu 11 zodii. Când se îndrăgosteşte, iubeşte cu foc, din toată inima.. Problema e că, având o inimă foarte mare, alesul sau aleasa se poate trezi într-un ventricul teribil de aglomerat.<br />
Meseria potrivită: parlamentar, sociolog, pocherist, paraşutist, turist.<br />
Pizza magică: Hawaiana.<br />
Medicamentul norocos: laxativele.</p>
<p><strong>Capricorn (22.12-20.01)</strong><br />
Planeta dominantă: Saturn, planeta parvenirii şi anchilozării.<br />
Animalul sacru: catârul<br />
Personalitate: Capricornul e un parvenit planificat, care se chinuie să ajungă în moţul ierarhiei şi-şi urmăreşte interesele cu îndârjire de buldog. Perseverenţa cu care merge pe drumul stabilit arată că de fapt nu are alternative sau alte bucurii în viaţă. Încăpăţânarea lui este monumentală &#8211; mai mare ca a Berbecului şi a Taurului, care sunt, totuşi, nişte vietăţi relativ normale. Şi la capitolul rezistenţă stă bine &#8211; în cazul unui cataclism planetar s-ar număra printre puţinii supravieţuitori, alături de şobolani şi insecte. Grozav de suspicios şi sigur că nimeni nu e mai competent ca el, n-are somn dacă nu controlează totul. Deţine un stoc impresionant de temeri şi complexe pe care, fiind foarte orgolios, face eforturi să şi le mascheze. De aici, o permanentă încordare, care-i dă aerul cuiva care a înghiţit o coadă de cazma &#8230; fiind din cale-afară de plictisitor, îşi găseşte greu o pereche care să-l suporte. Singurul care îl tolerează este alt Capricorn.<br />
Meseria potrivită: în asigurări, IT, liftier, călugăr, paznic.<br />
Pizza magică: Margherita<br />
Medicament norocos: antidepresivele.</p>
<p><strong>Vărsător (21.01-19.02)</strong><br />
Planeta dominantă: Uranus, planeta convulsiilor şi ciudăţeniilor.<br />
Animalul sacru: ornitorincul<br />
Personalitate: Vărsătorii sunt cele mai ciudate fiinţe de pe Terra, ceea ce explică frecvenţa mărită cu care sunt răpiţi de marţieni. Nu se ştie totuşi dacă aceştia îi selectează doar pentru a le studia anomaliile sau fiindcă îi consideră o specie înrudită. Oricum, este ceva în neregulă cu ei, deoarece au idei stranii, reacţii imprevizibile şi fac totul pe dos faţă de restul omenirii. Se spune că sunt deschişi la nou, le place să experimenteze şi au o fire independentă. Asta înseamnă că dau banii pe prostii de care n-a mai auzit nimeni, adera la cele mai fistichii diete sau curente religioase şi îi doare în cot de părerea celorlalţi. În plus, sunt deosebit de agitaţi, ceea ce nu este bine, căci excesul de energie le permite să-şi pună în practică proiectele utopice şi iniţiativele anarhiste. Prietenii îi suportă maximum două ore, iar rudele lor migrează în alte cartiere. Cât despre dragoste, Vărsătorilor nu le este prea clar ce înseamnă &#8230; !<br />
Meseria potrivită: futurolog, revoluţionar, guru, vânzător de gogoşi.<br />
Pizza magică: Napoletana.<br />
Medicamentul norocos: sedativele.</p>
<p><strong>Pesti (20.02-20.03)</strong><br />
Planeta dominantă: Neptun, planeta confuziei şi dependenţelor.<br />
Animalul sacru: balena<br />
Personalitate: Peştii sunt nişte vieţuitoare blânde şi buimace, care cred tot ce le îndrugă primul venit. În capul lor este un talmeş-balmeş de impresii şi intuiţii, ce face imposibilă o activitate neuronală decentă. Fiind incapabili să emită vreun argument logic, au devenit la rândul lor experţi în abureală şi îmbrobodire. Se spune că sunt creativi şi talentaţi, ceea ce înseamnă că producţiile lor îi turmentează atât de tare pe ceilalţi, încât le anihilează puterea de discernământ.. Foarte sociabili din fire, se înţeleg de minune cu animalele, handicapaţii, delincvenţii şi spiriduşii de casă. Misterele şi  superstiţiile exercită asupra lor o mare fascinaţie: admira grozav iscusinţa cu care îşi apără intimitatea monstrul din Loch Ness, iar când nu le place vremea de-afară îşi îmbracă plini de încredere hainele pe dos. Dar marca lor distinctivă este enorma capacitate de a iubi. Peştii se îndrăgostesc total şi iremediabil de cine nu trebuie, când nu trebuie sau &#8230; de câte persoane nu trebuie!<br />
Meseria potrivită: veterinar, fotograf. curăţitor de piscine, hipiot, medium, traficant.<br />
Pizza magică: Tonno.<br />
Medicamentul norocos: Untura de peşte.</p>
<img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/N_QZNtn89ZM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/fara-nume/zodiacul-la-modul-sarcastic.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/fara-nume/zodiacul-la-modul-sarcastic.html</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 1.940 seconds. --><!-- Cached page generated by WP-Super-Cache on 2010-03-12 03:20:19 -->
