<?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>Mon, 09 Aug 2010 15:47:33 +0000</lastBuildDate>
	<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>Parole aleatoare în Linux, “extended ASCII”</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/KbBrEs6WHuE/parole-aleatoare-in-linux-extended-ascii.html</link>
		<comments>http://www.saltwaterc.net/linux/parole-aleatoare-in-linux-extended-ascii.html#comments</comments>
		<pubDate>Mon, 09 Aug 2010 14:57:41 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Administrare]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programare]]></category>

		<guid isPermaLink="false">http://www.saltwaterc.net/?p=819</guid>
		<description><![CDATA[Deși în teorie problema din titlu este una rezolvată, în practică de multe ori mi-am dorit o parolă de o complexitate mai mare față de ce-mi oferă majoritatea uneltelor ce nu ies din standard ASCII. Prin metoda subsemnatului, se ia următoarea funcție și se trântește în .bashrc: function urandompass&#40;&#41; &#123; cat /dev/urandom &#124; tr -dc [...]]]></description>
			<content:encoded><![CDATA[<p>Deși în teorie problema din titlu este una rezolvată, în practică de multe ori mi-am dorit o parolă de o complexitate mai mare față de ce-mi oferă majoritatea uneltelor ce nu ies din standard ASCII. Prin metoda subsemnatului, se ia următoarea funcție și se trântește în .bashrc:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> urandompass<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
	<span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>urandom <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">tr</span> <span style="color: #660033;">-dc</span> <span style="color: #ff0000;">'[\41-\176\241-\254\256-\376]'</span> <span style="color: #000000; font-weight: bold;">|</span> fold <span style="color: #660033;">-w</span> $<span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">head</span> <span style="color: #660033;">-n</span> <span style="color: #000000;">1</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></div></div>

<p>Apelul este cretin de simplu: urandompass 12 va genera o parolă de 12 caractere. Sau cheie, am zis-o și pe asta. Funcția poate fi folosită pentru a genera chei pentru un &#8220;block cipher&#8221;.</p>
<p>Cu toate acestea, pentru cei cu terminalul setat pe UTF-8, caracterele dincolo de range-ul celui de-al 7-lea bit (aka cele ce intră în extended ASCII) nu vor fi printate corect. Teoria spune faptul că UTF-8 este compatibil doar cu setul ASCII, ăla standard. În prealabil este nevoie să se seteze terminalul pe un char encoding single-byte ce implementează vreo formă de extended ASCII gen ISO-8859-x, unde x = 1 este Western, x = 2 = Central European, etc. Personal prefer Western. Pentru cei cu Gnome Terminal, &#8220;Terminal » Set Character Encoding » Add or Remove &#8230;&#8221; dacă e pentru prima dată, dacă nu, atunci ar trebui să poată fi ales din meniu un encoding diferit de cel implicit. Buba este faptul că Gnome Terminal are memorie destul de proastă deci va da reset la UTF-8 dacă terminalul este închis sau se execută reset, deci operația trebuie repetată înainte de a genera orice parolă / cheie.</p>
<p>Acum urmează partea pentru obsedații de detalii aka cei după chipul și asemănarea subsemnatului. &#8220;Limitarea&#8221; la extended ASCII, ce oricum oferă o complexitate mai bună decât majoritatea generatoarelor, provine de fapt din tr. Un info coreutils &#8216;tr invocation&#8217; în shell specifică destul de clar: &#8220;Currently `tr&#8217; fully supports only single-byte characters.&#8221;, deci suportă multi-byte din jumătatea lui cinci. Pentru amatorii de detalii, acele range-uri din funcția mea au fost documentate, oarecum, în prealabil.</p>
<p>În DEC:</p>
<p>33-126<br />
161-172<br />
174-254</p>
<p>În OCT:</p>
<p>41-176<br />
241-254<br />
256-376</p>
<p>Evident, cu ochiul liber se poate vedea că tr primește octal, precum zice manualul. Pentru a le determina am încercat cu encoding ISO-8859-1 și ISO-8859-2 o aplicație ce printează tot range-ul single-byte (mă rog, fără ultimul caracter).</p>
<p>Pentru PHP-iști:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">256</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$i</span><span style="color: #339933;">.</span><span style="color: #0000ff;">': '</span><span style="color: #339933;">.</span><span style="color: #990000;">chr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Iar pentru snobii cu C, avem alternativă <img src='http://www.saltwaterc.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  :</p>
</pre>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include </span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">256</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
                <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d: %c<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> i<span style="color: #339933;">,</span> i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>gcc -std=c99 -o chars chars.c</p>
<p>Inițial m-am inspirtat dintr-o versiune *sh de pe linuxquestions.org, dar arată cretin, nu dau paste la așa ceva. Mă cam strânge octalul de dinți. O versiune rescrisă pentru DEC junkies:
</pre>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
chr<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
	<span style="color: #7a0874; font-weight: bold;">printf</span> \\$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">printf</span> <span style="color: #ff0000;">'%03o'</span> $<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #007800;">i</span>=<span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$i</span> <span style="color: #660033;">-lt</span> <span style="color: #000000;">256</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">do</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$i</span>: <span style="color: #780078;">`chr $i`</span>&quot;</span>
	<span style="color: #7a0874; font-weight: bold;">let</span> <span style="color: #ff0000;">&quot;i++&quot;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div>

<p>Pentru cei ce preferă alte encoding-uri single-byte, dacă range-urile de mai sus nu sunt potrivite, atunci se poate rula oricând vreo aplicație de mai sus pentru a face un test de char printing.</p>
<p>Pentru cei ce nu s-au născut cu "DEC to OCT converter" în cap, așa ca subsemnatul, Calculator din Gnome (gcalctool) are și un mod Programming (Ctrl+P).</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p><img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/KbBrEs6WHuE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/linux/parole-aleatoare-in-linux-extended-ascii.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/linux/parole-aleatoare-in-linux-extended-ascii.html</feedburner:origLink></item>
		<item>
		<title>Căi UNIX corecte în PHP</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/f9Uj60m4wPY/cai-unix-corecte-in-php.html</link>
		<comments>http://www.saltwaterc.net/programare/cai-unix-corecte-in-php.html#comments</comments>
		<pubDate>Thu, 03 Jun 2010 11:50:11 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Administrare]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programare]]></category>

		<guid isPermaLink="false">http://www.saltwaterc.net/?p=810</guid>
		<description><![CDATA[Se dă următoarea problemă, aparent mai simplă decât zice titlul: să se determine dacă o cale de tip UNIX este corectă. Buba este faptul că această cale poate să fie către un fișier ce nu există, spre exemplu o cale de UNIX socket ce va fi creat într-un director ce va conține un pool de [...]]]></description>
			<content:encoded><![CDATA[<p>Se dă următoarea problemă, aparent mai simplă decât zice titlul: să se determine dacă o cale de tip UNIX este corectă. Buba este faptul că această cale poate să fie către un fișier ce nu există, spre exemplu o cale de UNIX socket ce va fi creat într-un director ce va conține un pool de socket-uri. Deci funcțiile la nivel de filesystem nu vor ajuta, cel puțin nu în primă fază. În cazul  în care există vreo încercare de intuiție a scopului, da, scriu server scripting și în PHP. *sh este prea limitat pentru anumite chestii mai avansate, sau are nevoie de prea mult &#8220;boilerplate code&#8221;, pe când în Perl nu sunt încă fluent. Pentru cei ce au pierdut știrile de la ora 5, PHP nu mai este de mult un limbaj strict &#8220;web oriented&#8221;, funcționează bine merci și pentru &#8220;general purpose&#8221;.</p>
<p>Să revin la problema inițială. Practic se pot identifica două probleme: a) validarea unei căi inexistente &#8211; deci apelăm la regex; b) validarea directorului &#8211; deși fișierul poate să nu existe în timpul execuției de validare, directorul e musai să fie acolo. De regulă aplicațiile care creează câte un UNIX socket nu verifică aceasta și vor eșua să pornească.</p>
<p>Rezumat, codul arată cam așa:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$validate</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/^(\/[^\0]*?\/?)[^\0\/]+$/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$path</span><span style="color: #339933;">,</span> <span style="color: #000088;">$matches</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$validate</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">TRUE</span> OR <span style="color: #990000;">is_dir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!==</span> <span style="color: #009900; font-weight: bold;">TRUE</span> OR <span style="color: #990000;">is_dir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!==</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// handle error here</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Acum, discuție pe marginea textului. Acest regex satisface direct ambele probleme. Prima, este fix problema de validare. Se ține cont doar de căi absolute &#8211; acesta fiind contextul în care operez. Cu toate acestea, soluția se poate adapta ușor pentru căi relative.</p>
<p>Singurul capturing group din expresie preia întreaga cale, mai puțin numele fișierului. A fost făcută să funcționeze inclusiv pentru root (/). Calea capturată trebuie să fie către un director, pe când calea întreagă trebuie să nu fie un director.</p>
<p>Teoria căilor este simplă. O cale UNIX poate să conțină orice caracter, mai puțin nul, iar / este folosit pe post de separator de directoare, deci este rezervat acestui scop. Căile de tip //var///www//// sunt valide. Exemplul anterior va duce în //var/www unde // în general (Linux, BSD) este tot una cu /. Nu am lucrat pe sisteme unde // să fie distinct față de /, deci nu am considerat că este nevoie să tratez cazul prin expresia de mai sus.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p><img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/f9Uj60m4wPY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/programare/cai-unix-corecte-in-php.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/programare/cai-unix-corecte-in-php.html</feedburner:origLink></item>
		<item>
		<title>SopCast sub Linux</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/fQMxMDi309A/sopcast-sub-linux.html</link>
		<comments>http://www.saltwaterc.net/linux/sopcast-sub-linux.html#comments</comments>
		<pubDate>Wed, 02 Jun 2010 21:30:05 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.saltwaterc.net/?p=794</guid>
		<description><![CDATA[Probabil că te întrebi ce e ăla SopCast. Pe scurt, este un protocol de TV streaming, bazat pe un protocol de tip P2P, sop. Problema cea mai mare sub Linux sunt acei incompetenți proprietari de site-uri ce oferă suport pentru acest protocol doar folosind versiunea de Windows pentru SopCast, sau alte chestii plus WMP. Și [...]]]></description>
			<content:encoded><![CDATA[<p>Probabil că te întrebi ce e ăla <a title="SopCast" href="http://www.sopcast.com/" target="_blank">SopCast</a>. Pe scurt, este un protocol de TV streaming, bazat pe un protocol de tip P2P, sop. Problema cea mai mare sub Linux sunt acei incompetenți proprietari de site-uri ce oferă suport pentru acest protocol doar folosind versiunea de Windows pentru SopCast, sau alte chestii plus WMP. Și doar IE, majoritatea cer exclusiv IE, deși s-a făcut și o extensie de Firefox pentru a putea viziona un stream sop și fără a folosi IE direct de pe web.</p>
<p>Acum poate cei ce mă cunosc suficient de bine ar remarca faptul că eu nu mă mai uit la televizor de ani de zile, iar acest interes pentru sop nu este unul menit să rupă acest șir magic. Singura excepție sunt cursele de Formula 1. Aș prefera transmisiunea BBC, dar în lipsa lor, merge și TVR 1, cu toate că Miki și gașca mă chinuie de opt ani și ceva cu comentariul imbecil. Din moment ce obligat &#8211; forțat trebuie să le plătesc abonament ăstora de la Televizunea Națională, măcar de atâta să mă bucur.</p>
<p>Ceea ce incompetenții de mai sus cu site-urile lor au transformat în &#8220;Rocket Science&#8221; prin soluții tehnice legate de o platformă, transform eu acum într-o chestie cretin de simplă, dar pentru care a trebuit să dau din taste vreo 30 minute până să găsesc această rezolvare. Adresa stream-ului TVR 1 este:</p>
<blockquote><p><a href="sop://broker.sopcast.com:3912/60707">sop://broker.sopcast.com:3912/60707</a></p></blockquote>
<p>Aceasta se ia frumos și se pune în SopCast player. Chestie ce prezintă și versiune de Linux. Sub Ubuntu este chiar simplu de instalat din moment ce prezintă repository PPA, ceea ce reduce problema la:</p>
<blockquote><p>sudo apt-add-repository ppa:jason-scheunemann/ppa</p></blockquote>
<p>Se instalează pachetul sopcast-player și voila, gata de F1.</p>
<p>Din câte am observat, cară după el și ceva dependințe VLC (plus VLC cu totul). TVR 1 nu este de găsit în &#8220;Channel Guide&#8221;, dar cu adresa de mai sus este posibilă vizionarea stream-ului TVR 1. Dacă se înregistrează protocolul sop în browser, link-ul de mai sus poate fi deschis direct cu sopcast-player din moment ce aplicația primește link de stream ca argument. Are funcție de bookmark pentru cei ce preferă să nu facă muncă repetitivă, recte subsemnatul.</p>
<p>PS: în general, durează câteva secunde până stream-ul devine &#8220;văzubil&#8221;, până se curăță artefactele.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p><img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/fQMxMDi309A" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/linux/sopcast-sub-linux.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/linux/sopcast-sub-linux.html</feedburner:origLink></item>
		<item>
		<title>G-WAN – acceleratorul de web</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/VHkDR6DQ-D8/g-wan-acceleratorul-de-web.html</link>
		<comments>http://www.saltwaterc.net/linux/g-wan-acceleratorul-de-web.html#comments</comments>
		<pubDate>Mon, 31 May 2010 14:18:11 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Administrare]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programare]]></category>

		<guid isPermaLink="false">http://www.saltwaterc.net/?p=791</guid>
		<description><![CDATA[Deși titlul pare forțat, proiectul pomenit acolo are un potențial mare atâta timp cât este utilizat cum trebuie. Singurele probleme sunt toate aceste primadone, așa zișii programatori auto-proclamați, ce maxim au idee despre despre ceva scripting într-un limbaj cu tipuri dinamice de date, dar în momentul în care vine vorba de muncă adevărată sau a [...]]]></description>
			<content:encoded><![CDATA[<p>Deși titlul pare forțat, proiectul pomenit acolo are un potențial mare atâta timp cât este utilizat cum trebuie. Singurele probleme sunt toate aceste primadone, așa zișii programatori auto-proclamați, ce maxim au idee despre despre ceva scripting într-un limbaj cu tipuri dinamice de date, dar în momentul în care vine vorba de muncă adevărată sau a proiecta un algoritm, dispar. Nu susțin faptul că sunt marele guru ce s-a născut cu tastatura în mână, nu sunt fluent în ANSI C, căci despre acesta este vorba, dar (pe testate) am putut observa potențialul unei astfel de soluții. Deci se adresează programatorilor. Programatorilor ce nu se ascund de pointeri (pe care, recunosc, încă nu-i stăpânesc), programatorilor ce au idee despre cum funcționează platforma pe care rulează aplicația și nu se ascund sub încă un nivel de abstractizare [insert smart-ass name here], etc. Din această categorie recomand &#8220;<a title="What every programmer should know about memory" href="https://lwn.net/Articles/250967/" target="_blank">What every programmer should know about memory</a>&#8220;, chestie pe care vreau să o parcurg pe îndelete pe când voi avea timp.</p>
<p>Deci ce este acest <a title="G-WAN is a FREE Web App. server using full ANSI C scripts" href="http://trustleap.com/" target="_blank">G-WAN</a>? Pe scurt, în cele aproximativ 120 kile de binar se găsește un web server brutal de rapid și un început de application server, practic suport pentru servlet-uri scrise în ANSI C, compilate dinamic, după metoda edit &amp; play folosită de PHP-iști. Și evident, caching, acea sperietoare de &#8220;web developers&#8221;, altfel nu ar fi fost chiar atât de rapide.</p>
<p>Am urmărit îndeaproape proiectul de pe la v1.0.3 deoarece mi s-a părut interesantă prezentarea, dar fără aplicabilitate momentană &#8220;in real life&#8221;. Între timp aplicatia a mai crescut în valoare, iar platforma s-a modificat din Windows (la acea dată) în Linux. Autorul se săturase de limitările din kernelul Windows, limitări ce se găsesc și în kernelul Linux, dar sunt mai sus.</p>
<p>Nu vorbesc din citatele autorului G-WAN despre aceste limitări. Le-am testat pe propria piele. Fie că am executat fractalul lui Mandelbrot (servletul fractal.c disponibil în arhiva de distribuție), fie că am executat problema <a title="I can has Makavelis numbers" href="http://www.saltwaterc.net/programare/i-can-has-makavelis-numbers.html" target="_blank">despre care vorbeam aici</a>, atât implementarea brută cât și cea eficientă, pe un quad-core (C2Q Q9400) și Apache Bench pe localhost am stat în jurul valorii de 69000 req/s. Da, vorbesc de o aplicație, unde fractalul este cu ordin de complexitate mare comparat cu problema numerelor. Dar cu toate acestea, throughput-ul servlet-urilor a fost apropiat ca valoare. Deci există o limitare, dincolo de eficiența algoritmului și a puterii de procesare necesare.</p>
<p>Printre altele, nu a fost nici o limitare de lățime de bandă. Rulând teste de conținut static, am obținut aproximativ 1.2 GiB/s la o concurență suficient de mare, înainte ca ab să înceapă să dea timeout-uri și erori de conectare. Da, 1.2 GiB/s prin interfața de loopback. Aici se adaugă doar efortul de encapsulare, decapsulare și fragmentare a pachetelor din moment ce MTU este mare comparat cu o &#8220;rețea normală&#8221;, dar totuși cu o valoare implicită de 16436 pe care nu am încercat să o mânăresc și nici nu știu să fi mânărit vreodată prin setările de la lo. Testele dinamice nu se apropiau de această lățime de bandă, de altfel, conținutul static la 1.2 GiB/s abia urca pe la 20000 req/s, deci o limitare de bandă era mult mai evidentă în cazul acestui tip de conținut, față de un servlet.</p>
<p>Singura problemă ce am observat-o a fost una de scalabilitate pe mai mult de două nuclee de procesor. G-WAN lansează un număr de thread-uri egal cu numărul de nuclee, dar din cele 4 pe care le-a lansat, doar primul și ultimul încărcau procesorul în timp ce 2 și 3 frecau menta în idle. Cel puțin așa raportează htop pus în modul threaded la listarea proceselor din sistem.</p>
<p>De altfel, la capitolul conținut static nu am observat o viteză mărită cu ordine de magnitudine față de <a title="nginx" href="http://nginx.org/" target="_blank">nginx</a>, ci doar o viteză de ordinul procentelor mai mare, dar totuși vizibilă. La capitolul aplicații dinamice este zona unde strălucește, deși încă mai are puțin până în zona &#8220;production ready&#8221;, în sensul că momentan lipsesc două chestii mari și late. Prima chestie este renunțarea la privilegiile elevate dacă rulează ca network daemon, unde pentru a folosi portul 80 este nevoie de privilegii de superuser &#8211; sau să se apeleze la hack-uri precum NAT prerouting în iptables ori *inetd &#8211; nerecomandate. A doua chestie este suportul pentru reverse proxy. Din moment ce codul existent nu se transformă peste noapte în ANSI C, eventual ANSI C optimizat la sânge, G-WAN va putea fi folosit, cândva, pe post de frontent web server într-o arhitectură multi-tier.</p>
<p>Configurația este &#8230; ce configurație? De fapt până și pentru virtual hosting se folosește un sistem de &#8220;convention over configuration&#8221; ce simplifică la maxim treaba, ceea ce face web serverul foarte sysadmin friendly. Singurele chestii mai sofisticate sunt maitenance script-ul și acele handlers, chestii ce necesită cunoștinte de ANSI C înainte de a te apuca să le folosești. Cam toate chestiile minime în accepțiunea unui web server modern sunt acolo inclusiv gzip, activat automat în funcție de tipul de conținut. Restul &#8230; sunt specificații, mai mult sau mai puțin interesante.</p>
<p><strong>Update:</strong> săpând puțin prin web, am dat de <a title="CTPP" href="http://ctpp.havoc.ru/en/" target="_blank">CTPP</a> ce se laudă că are interfață pentru C, chestie ce ar putea satisface nevoile de template engine. Încă nu am renunțat la gândul de a încerca o chestie implementată sub formă de bibliotecă/biblioteci compilate din moment ce acea compilare dinamică nu are suport de optimizare de aia șmecheră cum are gcc, MongoDB sau ceva asemănător pentru persistență și un servlet pe post de front controller.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p><img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/VHkDR6DQ-D8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/linux/g-wan-acceleratorul-de-web.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/linux/g-wan-acceleratorul-de-web.html</feedburner:origLink></item>
		<item>
		<title>Apache 2+mod_fcgid – setup rapid pentru test/dezvoltare</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/ozqqcvMAbWc/apache-2-mod-fcgid-setup-rapid-pentru-test-dezvoltare.html</link>
		<comments>http://www.saltwaterc.net/linux/apache-2-mod-fcgid-setup-rapid-pentru-test-dezvoltare.html#comments</comments>
		<pubDate>Tue, 25 May 2010 10:14:03 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Administrare]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.saltwaterc.net/linux/apache-2-mod-fcgid-setup-rapid-pentru-test-dezvoltare.html</guid>
		<description><![CDATA[Apache 2 + mod_php, ceea ce în majoritatea cazurilor implică prefork MPM, este un setup cretin. Am spus-o, o mai spun și o susțin, cu toate că acest setup este implicit sub *nix. Dacă memoria este oarecum un lux, sau nu ai trecut deja pe un web server cu o arhitectură asincronă, atunci agonia cu [...]]]></description>
			<content:encoded><![CDATA[<p>Apache 2 + mod_php, ceea ce în majoritatea cazurilor implică prefork MPM, este un setup cretin. Am spus-o, o mai spun și o susțin, cu toate că acest setup este implicit sub *nix. Dacă memoria este oarecum un lux, sau nu ai trecut deja pe un web server cu o arhitectură asincronă, atunci agonia cu Apache se mai poate prelungi puțin, apelând la worker MPM + mod_fcgid + PHP rulat ca FastCGI. O să fac doar o scurtă mențiune despre faptul că arhitectura multiproces / multithread din punctul de vedere al scalabilității este moartă, oricât ai face &#8220;yet another Apache smart-ass tweak&#8221;. Problema nu este în viteza efectivă a soft-ului ci în arhitectura în sine. <a target="_blank" href="http://ha.ckers.org/slowloris/">Să mai zic ceva de Slowloris</a>?</p>
<p>Bun. Mi-am mai vărsat încă o dată anii de frustrare acumulați cu Apache, deci trebuie să pun și partea productivă în schemă. Sub Debian &amp; friends se rezolvă simplu cu un:</p>
<blockquote><p>apt-get -y install libapache2-mod-fcgid<br />a2dismod php5<br />a2enmod fcgid<br />/etc/init.d/apache2 force-reload<br />apt-get -y install php5-cgi</p></blockquote>
<p>Cam atât pe partea de instalare. Cei ce suferă cu RHEL/CentOS, pot apela cu încredere la EPEL. Sau să compileze din surse. Nu o să îmi vărs în acest articol frustrările acumulate cu tandemul de mai sus.</p>
<p>Pe partea de configurare, integrarea dintre Apache + mod_fcgid + php-cgi lipsește cu desăvârșire ceea ce poate să dezamăgească mulțimea &#8220;kewl, I just installd Lenux and PHP&#8221;. Dar nu e nici &#8220;rocket science&#8221;. Ca idee: nano /etc/apache2/mods-enabled/fcgid.conf iar pe post de conținut:</p>
<blockquote><p>&lt;IfModule mod_fcgid.c&gt;<br />&nbsp;&nbsp;&nbsp; AddHandler fcgid-script .fcgi .php<br />&nbsp;&nbsp;&nbsp; DefaultInitEnv PHPRC /etc/php5/cgi<br />&nbsp;&nbsp;&nbsp; DefaultInitEnv PHP_FCGI_MAX_REQUESTS 10000<br />&nbsp;&nbsp;&nbsp; MaxRequestsPerProcess 10000<br />&nbsp;&nbsp;&nbsp; MaxProcessCount 10<br />&nbsp;&nbsp;&nbsp; IPCCommTimeout 240<br />&nbsp;&nbsp;&nbsp; IdleTimeout 240<br />&nbsp;&nbsp;&nbsp; FCGIWrapper /usr/bin/php-cgi .php<br />&nbsp;&nbsp;&nbsp; AddType application/x-httpd-php .php<br />&lt;/IfModule&gt;</p></blockquote>
<p>Aceasta este sintaxa &#8220;sigură&#8221;, deși ultimele versiuni ale mod_fcgid includ o sintaxă nouă iar cea veche este marcată ca &#8220;deprecated&#8221;. Pentru cei cu Ubuntu 10.04 LTS sau o altă distribuție relativ nouă, sintaxa actualizată este următoarea:</p>
<blockquote><p>&lt;IfModule mod_fcgid.c&gt;<br />&nbsp;&nbsp;&nbsp; AddHandler fcgid-script .fcgi .php<br />&nbsp;&nbsp;&nbsp; FcgidInitialEnv PHPRC /etc/php5/cgi<br />&nbsp;&nbsp;&nbsp; FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 10000<br />&nbsp;&nbsp;&nbsp; FcgidMaxRequestsPerProcess 10000<br />&nbsp;&nbsp;&nbsp; FcgidMaxProcesses 10<br />&nbsp;&nbsp;&nbsp; FcgidIOTimeout 240<br />&nbsp;&nbsp;&nbsp; FcgidIdleTimeout 240<br />&nbsp;&nbsp;&nbsp; FcgidWrapper /usr/bin/php-cgi .php<br />&nbsp;&nbsp;&nbsp; AddType application/x-httpd-php .php<br />&lt;/IfModule&gt;</p></blockquote>
<p>Atenție: nu va funcționa pe versiunile vechi de mod_fcgid!</p>
<p>Încă puțin și setup-ul este gata de bătaie. Mai trebuie adăugat un flag în Options pentru a permite execuția PHP-ului sub FastCGI, sau serverul va returna 403. Fie se adaugă pentru fiecare definiție &lt;Directory&gt; din virtual host (nu e nevoie pentru &lt;Directory /&gt; în anumite cazuri) sau din .htaccess. Teoretic Options, conform documentației, poate fi setat în context &lt;VirtualHost&gt;, dar practic existența unui &lt;Directory&gt; cu Options o invalidează. Se poate seta doar pentru &lt;Directory /&gt; dacă toate celelalte definiții &lt;Directory&gt; nu au directiva Options. Pe scurt: Options funcționează pe ideea de arbore, dacă un fiu folosește Options, nu se mai moștenește părintele. Alternativa simplă și fără bătaie de cap, repet, pentru test/dezvoltare, este .htaccess cu Options +ExecCGI. Sub Ubuntu Hardy Options ExecCGI a refuzat să funcționeze din .htaccess, deci e mai sigur să fie prefixat cu +. Am repetat ce am zis în titlu pentru simplul fapt că .htaccess în producție se pretează doar unui mediu partajat ce este vândut de către companiile de hosting. În rest e risc potențial de securitate, în special pentru cele auto-generate (+ implicații la nivel de permisiuni), și supra-încărcare inutilă a serverului din moment ce Apache este mai țăran din fire și nu este notificat de schimbarea fișierului ci îl citește la fiecare cerere. În plus, un setup de producție făcut după &#8220;manualul de securitate&#8221; presupune configurare per virtual host și suEXEC versus rularea sub userul web serverului și un singur Dumnezeu pentru toate fișierele.</p>
<p>Din punctul de vedere al eficienței, în idle (după restartul serviciului) cu setup-ul implicit sub Ubuntu Hardy:</p>
<blockquote><p>&lt;IfModule mpm_worker_module&gt;<br />&nbsp;&nbsp;&nbsp; StartServers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<br />&nbsp;&nbsp;&nbsp; MaxClients&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 150<br />&nbsp;&nbsp;&nbsp; MinSpareThreads&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25<br />&nbsp;&nbsp;&nbsp; MaxSpareThreads&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 75<br />&nbsp;&nbsp;&nbsp; ThreadsPerChild&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25<br />&nbsp;&nbsp;&nbsp; MaxRequestsPerChild&nbsp;&nbsp; 0<br />&lt;/IfModule&gt;</p></blockquote>
<p>și un singur PHP upstream, am obținut un record de memory footprint pentru Apache 2: 18MiB.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p><img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/ozqqcvMAbWc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/linux/apache-2-mod-fcgid-setup-rapid-pentru-test-dezvoltare.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/linux/apache-2-mod-fcgid-setup-rapid-pentru-test-dezvoltare.html</feedburner:origLink></item>
		<item>
		<title>Ubuntu și network management-ul</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/lfp1JIAu520/ubuntu-si-network-management-ul.html</link>
		<comments>http://www.saltwaterc.net/linux/ubuntu-si-network-management-ul.html#comments</comments>
		<pubDate>Fri, 21 May 2010 11:33:08 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.saltwaterc.net/linux/ubuntu-si-network-management-ul.html</guid>
		<description><![CDATA[De când mă știu Ubuntu (și distribuțiile ce vin cu Gnome în general) au un management de rețea de-a dreptul cretin în interfața grafică, iar Ubuntu 10.04 nu face excepție. Problema mea cea mai mare este conectivitatea wireless dacă folosesc un access point ce nu are suport pentru DHCP. Configurarea este de-a dreptul imposibilă, sau [...]]]></description>
			<content:encoded><![CDATA[<p>De când mă știu Ubuntu (și distribuțiile ce vin cu Gnome în general) au un management de rețea de-a dreptul cretin în interfața grafică, iar Ubuntu 10.04 nu face excepție. Problema mea cea mai mare este conectivitatea wireless dacă folosesc un access point ce nu are suport pentru DHCP. Configurarea este de-a dreptul imposibilă, sau are o metodă necunoscută mie, deși sub interfața aparent simplă, posibilitatea de a mă conecta cu o conexiune predefinită lipsește cu desăvârșire.</p>
<p>Din fericire nu sunt singurul nemulțumit de problemele inerente ale părții de network management din Gnome deci a apărut alternativa: <a target="_blank" href="http://wicd.sourceforge.net/">wicd</a>. wicd este acel network manager ce mi-a lipsit multă vreme și m-a forțat să dau cu shell-ul prin /etc/network/interfaces. Pentru rețeaua fixă pe lângă interfața intuitivă, oferă și posibilitatea de a salva profile de conectare, chestie ce m-ar ajuta foarte mult spre exemplu dacă m-aș plimba cu notebook-ul prin varii rețele fixe, fiecare cu particularități în configurare. Lucru acesta era realitate acum vreo 2 ani, momente în care era pacoste să-mi reconfigurez rețeaua fără un mic ajutor de la zeul shell script. Sub Windows foloseam (și încă mai este instalat) <a target="_blank" href="http://www.netsetman.com/index.php?s=nsm">NetSetMan</a>.</p>
<p>Pe partea de wireless oferă posibilitatea de a seta interfața de rețea în funcție de access point-urile găsite, inclusiv pentru cele ce folosesc SSID ascuns, recte cel al subsemnatului pe care wicd îl detectează. Iar această &#8220;posibilitate&#8221; se traduce printr-un buton lângă fiecare AP detectat, nu săpat prin meniuri cretine ce oricum nu oferă nici un rezultat. Singura lipsă ce i-am găsit-o a fost imposibilitatea de a putea opri interfața wireless (turn off radio). Din câte am înțeles această funcție nu face parte din obiectivul unui network manager sau acestui network manager în particular. Sunt unul dintre ghinioniștii căruia Ubuntu îi recunoaște toate combinațiile de taste, mai puțin Fn+F2 pentru a putea opri wireless-ul. Nu sunt nici unul dintre fericiții cu hardware switch pentru radio, gen noteook-ul lui frate-meo.</p>
<p>Încă o chestie ce mi-a plăcut extrem de mult a fost posibilitatea de a defini un profil de global DNS ce poate fi folosit de către orice conexiune. Acesta poate fi suprascris prin setările particulare ale unei conexiuni. Oricum, sunt utilizator de <a target="_blank" href="http://www.opendns.com/">OpenDNS</a> și <a target="_blank" href="http://code.google.com/speed/public-dns/">Google Public DNS</a> ca fallback, deci profilul global este un real ajutor. Singura limitare este posibilitatea de a defini (din GUI?) doar 3 servere DNS, iar explicația vine de la un comentariu lăsat de defunctul Gnome Network Manager ce menționa în /etc/resolv.conf faptul că anumite biblioteci de resolving nu suportă mai mult de 3 servere, deci ultima intrare s-ar putea să fie ignorată.</p>
<p>Pe total, s-a dovedit a fi o adiție foarte utilă notebook-ului meu, ceea ce înseamnă faptul că Windows XP va coexsita acolo doar din motive istorice.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p><img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/lfp1JIAu520" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/linux/ubuntu-si-network-management-ul.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/linux/ubuntu-si-network-management-ul.html</feedburner:origLink></item>
		<item>
		<title>Ubuntu 10.04 Lucid Lynx și OpenVZ</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/yzYIe3cNm20/ubuntu-10-04-lucid-lynx-si-openvz.html</link>
		<comments>http://www.saltwaterc.net/linux/ubuntu-10-04-lucid-lynx-si-openvz.html#comments</comments>
		<pubDate>Thu, 13 May 2010 06:30:13 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Virtualizare]]></category>

		<guid isPermaLink="false">http://www.saltwaterc.net/?p=768</guid>
		<description><![CDATA[Vestea bună este faptul că a apărut Ubuntu 10.04. Vestea proastă este faptul că suportul pentru OpenVZ în kernel 2.6.32 a apărut prea târziu pentru a fi inclus în distribuție. Sunt conștient de faptul că LXC (Linux Containers) va fi următoarea tehnologie de virtualizare la nivel de sistem de operare. De fapt a fost adoptată [...]]]></description>
			<content:encoded><![CDATA[<p>Vestea bună este faptul că a apărut Ubuntu 10.04. Vestea proastă este faptul că suportul pentru <a href="http://community.livejournal.com/openvz/30998.html" target="_blank">OpenVZ în kernel 2.6.32</a> a apărut prea târziu pentru a fi inclus în distribuție. Sunt conștient de faptul că <a href="http://lxc.sourceforge.net/" target="_blank">LXC (Linux Containers)</a> va fi următoarea tehnologie de virtualizare la nivel de sistem de operare. De fapt a fost adoptată în mainline la nivel de kernel. Dar între timp OpenVZ a strâns o comunitate destul de mare și suficiente unelte de administrare pentru a nu îl face bun de aruncat la gunoi în secunda numărul doi. În plus, migrarea de la o tehnologie de virtualizare la alta nu se poate face imediat.</p>
<p>Probabil buba cea mai mare pe care o are (momentan?) Ubuntu 10.04 în ceea ce privește suportul pentru OpenVZ nu este faptul că (momentan?) nu poate fi folosit pe post de HN (Hardware Node), ci faptul că are probleme destul de mari în rularea ca guest. Abia acum am înțeles de ce <a href="http://pve.proxmox.com/wiki/Debian_Appliance_Builder" target="_blank">DAB (Debian Appliance Builder)</a> nu a venit cu suport pentru Ubuntu 9.10, iar acum pentru 10.04. Noul sistem de init, <a href="http://upstart.ubuntu.com/" target="_blank">upstart</a>, ce practic înlocuiește vechiul SysV init, nu se prea pupă cu OpenVZ, cel puțin nu implicit în unele pachete de servicii incluse în distribuție. Nu o să mai aduc aminte de clasica deja incompatibilitate între <a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html" target="_blank">udev</a> și OpenVZ.</p>
<p>Există mai sus vreo două întrebări din categoria &#8220;momentan&#8221;. Prima cel mai probabil va rămâne la stadiul de permanent. Din moment ce echipa din spatele Ubuntu adoptă LXC, eventualele bug-uri legate de OpenVZ vor intra în caregoria &#8220;won&#8217;t fix / invalid&#8221;, deci feedback-ul din partea comunității să se piardă. Sau să se ajungă la &#8220;by popular demand&#8221; &#8211; sper, deși slabe șanse. Cea de-a doua chestie în schimb se poate să fie rezolvabilă printr-un kernel comunitar ce să includă suport pentru OpenVZ (sper și pentru <a href="http://www.linux-kvm.org/page/Main_Page" target="_blank">KVM</a>). Între timp, Proxmox rulează și va adopta 2.6.32 și pentru OpenVZ. Momentan știe doar de KVM.</p>
<p>Ca regulă, cel mai probabil anumite servicii nu vor porni automat, la boot, fără a modifica scripturile de init, ce se găsesc în /etc/init nu în /etc/init.d (un upstart job din init.d este practic un symlink). Suport pentru SysV Init script încă mai este posibil dacă init-ul nu a fost convertit în upstart job din moment ce upstart a fost conceput cu gândul la &#8220;backward compatibility&#8221;. În ceea ce mă privește, cele mai problematice până acum au fost networking, ssh și mysql. Morala este: pentru a folosi Ubuntu 10.04 ca OpenVZ guest, este nevoie de pregătiri pentru doi termeni de bază: &#8220;hack&#8221; și &#8220;patch&#8221;. Cu toate acestea, consider că merită efortul. Lucid Lynx include suficiente soluții actualizate pentru a renunța la vechiul LTS, Ubuntu Hardy. Sau, de ce nu, la Debian Lenny.</p>
<p>Pentru că nu dețin toate informațiile, dau următoarele link-uri de unde mă inspir și eu:<br />
<a href="http://blog.bodhizazen.net/linux/ubuntu-10-04-openvz-templates/" target="_blank">Ubuntu 10.04 OpenVZ Templates</a><br />
<a href="http://blog.bodhizazen.net/linux/download-ubuntu-10-04-openvz-templates/" target="_blank">Download Ubuntu 10.04 OpenVZ Templates</a></p>
<p>Pentru că nu îmi place lucrul manual atâta timp cât există lucruri precreate:<br />
<a href="http://bodhizazen.fivebean.net/openvz/" target="_blank">http://bodhizazen.fivebean.net/openvz/</a></p>
<p>Printre altele, a trebuit să downloadez template-ul lamp pentru a mă inspira din scripturile de init pentru minimal. Sunt adeptul stilului minimal peste care să fac lego instalând direct din repo atunci când plasez o soluție. <em>Less is more!</em></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p><img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/yzYIe3cNm20" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/linux/ubuntu-10-04-lucid-lynx-si-openvz.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/linux/ubuntu-10-04-lucid-lynx-si-openvz.html</feedburner:origLink></item>
		<item>
		<title>I can has Makavelis numbers</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/oyb4Y0n8tQU/i-can-has-makavelis-numbers.html</link>
		<comments>http://www.saltwaterc.net/programare/i-can-has-makavelis-numbers.html#comments</comments>
		<pubDate>Wed, 12 May 2010 22:00:42 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programare]]></category>

		<guid isPermaLink="false">http://www.saltwaterc.net/?p=771</guid>
		<description><![CDATA[S-a găsit Google Reader să mă scoată cu nasul din shell cu următoarea problemă, dată pe undeva pe aici. Practic rezolvarea problemei: AB + CD + AC + BD = 100 Ca orice &#8220;nerd&#8221; ce se respectă, am pus mâna pe Eclipse pentru a rezolva problema, nu pe o foaie de hârtie, din moment ce [...]]]></description>
			<content:encoded><![CDATA[<p>S-a găsit Google Reader să mă scoată cu nasul din shell cu următoarea problemă, <a title="Uitati cum sta treaba" href="http://makavelis.com/2010/05/uitati-cum-sta-treaba.html" target="_blank">dată pe undeva pe aici</a>. Practic rezolvarea problemei:</p>
<p>AB + CD + AC + BD = 100</p>
<p>Ca orice &#8220;nerd&#8221; ce se respectă, am pus mâna pe Eclipse pentru a rezolva problema, nu pe o foaie de hârtie, din moment ce prin natura ei există 10<sup>4</sup> ( da, 10.000) soluții posibile, dar doar 25 sunt corecte, considerând faptul că A, B, C pot lua valoarea 0. De fapt, am scris soluția ca pe una configurabilă pentru a-i servi și alt input dacă nu am nimerit-o și A, B, C încep de la 1. Oricum, muncă de 5 minute, dar i-am dat un refactor, să moară dușmanii de ciudă, fără număr la bandă.</p>
<p>Din moment ce propria pacoste de motan mi-a servit drept inspirație, codul e scris lolstyle (dar totuși câtuși de cât profesionist). Ca idee, I_can_has_numbers este clasa ce se ocupă de toate chestiile, iar fișierul I_can_has_everything.php este cel apelabil, fie din browser, pentru cei cu o stivă PHP instalată, fie folosind PHP CLI.</p>
<p>Cod: PHP5/OOP</p>
<p>Download: <a title="I can has Makavelis numbers" href="http://saltwaterc.net/wp-download/I_can_has_Makavelis_numbers.zip" target="_self">I_can_has_Makavelis_numbers.zip</a></p>
<p>Pentru cei născuți cu lene de a mai rula cod, acestea sunt soluțiile:</p>
<pre>Number of solutions: 25

A = 0; B = 0; C = 8; D = 6; 0 + 86 + 8 + 6 = 100
A = 0; B = 1; C = 7; D = 6; 1 + 76 + 7 + 16 = 100
A = 0; B = 2; C = 6; D = 6; 2 + 66 + 6 + 26 = 100
A = 0; B = 3; C = 5; D = 6; 3 + 56 + 5 + 36 = 100
A = 0; B = 4; C = 4; D = 6; 4 + 46 + 4 + 46 = 100
A = 0; B = 5; C = 3; D = 6; 5 + 36 + 3 + 56 = 100
A = 0; B = 6; C = 2; D = 6; 6 + 26 + 2 + 66 = 100
A = 0; B = 7; C = 1; D = 6; 7 + 16 + 1 + 76 = 100
A = 0; B = 8; C = 0; D = 6; 8 + 6 + 0 + 86 = 100
A = 1; B = 0; C = 6; D = 7; 10 + 67 + 16 + 7 = 100
A = 1; B = 1; C = 5; D = 7; 11 + 57 + 15 + 17 = 100
A = 1; B = 2; C = 4; D = 7; 12 + 47 + 14 + 27 = 100
A = 1; B = 3; C = 3; D = 7; 13 + 37 + 13 + 37 = 100
A = 1; B = 4; C = 2; D = 7; 14 + 27 + 12 + 47 = 100
A = 1; B = 5; C = 1; D = 7; 15 + 17 + 11 + 57 = 100
A = 1; B = 6; C = 0; D = 7; 16 + 7 + 10 + 67 = 100
A = 2; B = 0; C = 4; D = 8; 20 + 48 + 24 + 8 = 100
A = 2; B = 1; C = 3; D = 8; 21 + 38 + 23 + 18 = 100
A = 2; B = 2; C = 2; D = 8; 22 + 28 + 22 + 28 = 100
A = 2; B = 3; C = 1; D = 8; 23 + 18 + 21 + 38 = 100
A = 2; B = 4; C = 0; D = 8; 24 + 8 + 20 + 48 = 100
A = 3; B = 0; C = 2; D = 9; 30 + 29 + 32 + 9 = 100
A = 3; B = 1; C = 1; D = 9; 31 + 19 + 31 + 19 = 100
A = 3; B = 2; C = 0; D = 9; 32 + 9 + 30 + 29 = 100
A = 5; B = 0; C = 0; D = 0; 50 + 0 + 50 + 0 = 100
</pre>
<p>&nbsp;</p>
<p>Update: F (nu o să îi dezvălui numele din moment ce a decis să se semneze doar cu F <img src='http://www.saltwaterc.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) a atras antețina asupra faptului că am făcut brute-force în soluția mea sofisticată, deci vin în întâmpinare cu un algoritm bazat pe modelarea matematică a soluției. Algoritmul rezolvă problema în numărul minim de pași (24), plus adăugarea soluției iregulate (unde trișez, este hardcoded). Numărul de bucle s-a redus la două cu număr minim de pași (4 pentru A, inițial 9 pentru B, după care scade, C și D sunt deduse).</p>
<p>Download: <a title="I can has Makavelis numbers v0.2" href="http://saltwaterc.net/wp-download/I_can_has_Makavelis_numbers_v0.2.zip" target="_self">I_can_has_Makavelis_numbers_v0.2.zip</a></p>
<p>Update: din moment ce primii doi algoritmi sunt de cacao (fără o), primul e pur brute-force iar al doilea nu reprezintă o modelare matematică ce să includă toate soluțiile, revin pe scenă cu ultima soluție (finală) a problemei de mai sus.</p>
<p>Sursa algoritmului propriu zis:</p>
<pre>
for ($a = 0; $a < = 5; $a++)
{
	$double_a = 2 * $a;
	$end_b = 8 - $double_a;
	$d = $a + 6;
	for ($b = 0; $b <= $end_b; $b++)
	{
		$c = (8 - $double_a) - $b;

		if ($d % 10 === 0)
		{
			$a++;
			$d = 0;
		}

		$this->solutions[] = array
		(
			'a' => $a,
			'b' => $b,
			'c' => $c,
			'd' => $d,
		);
	}
}
</pre>
<p>&nbsp;</p>
<p>Download: <a title="I can has Makavelis numbers v0.3" href="http://saltwaterc.net/wp-download/I_can_has_Makavelis_numbers_v0.3.zip" target="_self">I_can_has_Makavelis_numbers_v0.3.zip</a></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p><img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/oyb4Y0n8tQU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/programare/i-can-has-makavelis-numbers.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/programare/i-can-has-makavelis-numbers.html</feedburner:origLink></item>
		<item>
		<title>Scanarea disk-urilor sub Linux</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/BXTdkLuVn7s/scanarea-disk-urilor-sub-linux.html</link>
		<comments>http://www.saltwaterc.net/linux/scanarea-disk-urilor-sub-linux.html#comments</comments>
		<pubDate>Fri, 16 Apr 2010 08:49:14 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.saltwaterc.net/?p=730</guid>
		<description><![CDATA[O să intru puţin şi în acest subiect. Nu, nu mă refer la chestii de filesystem gen fsck plus familia de prieteni, LVM şi alte avioane, ci la chestii dincolo de date, mai apropiate de fier. Nu oricine deţine un motan idiot ce să folosească un minitower pe post de suprafaţă de frânare, şi să-l [...]]]></description>
			<content:encoded><![CDATA[<p>O să intru puţin şi în acest subiect. Nu, nu mă refer la chestii de filesystem gen fsck plus familia de prieteni, LVM şi alte avioane, ci la chestii dincolo de date, mai apropiate de fier. Nu oricine deţine un motan idiot ce să folosească un minitower pe post de suprafaţă de frânare, şi să-l dărâme, dar problemele pot apărea şi în stare naturală, &#8220;fat free, batteries not included&#8221;. Chiar dacă maşina respectivă în timpul impactului era oprita (fapt ce a oferit oportunitatea de a fi dărâmată), cele două disk-uri aveau capetele parcate, conform specificaţiilor suportă acceleraţii de până la 300G dacă sunt staţionate, wonk, wonk, wonk. Ideea simplă este faptul ca pentru a fi sigur de stabilitatea soluţiei, sunt necesare nişte măsuri ulterioare producerii unui eveniment nedorit.</p>
<p>a) S.M.A.R.T.</p>
<p>S.M.A.R.T.-ul (Self-Monitoring, Analysis, and Reporting Technology) acesta deştept, pe lângă faptul de a furniza o târlă &#8220;geeky parameters&#8221; ştie să ruleze şi nişte teste automate la nivel de disk, a căror rezultate se salvează în log-ul propriu, fapt ce duce această tehnologie dincolo de graniţele sistemului de operare.</p>
<p>O să presupun că disk-ul în cauză este /dev/sda, eventual faptul că scanarea se face dintr-un live edition pentru a elimina anumite probleme potenţiale. Instalarea sub Debian &amp; Friends se face prin pachetul smartmontools. Utilitarul interesant este smartctl.</p>
<blockquote><p>smartctl -i /dev/sda</p></blockquote>
<p>Comanda va returna informaţiile de bază despre disk, dintre care cele mai importante pentru a continua sunt ultimele două:</p>
<blockquote><p>SMART support is: <strong>Available</strong> &#8211; device has SMART capability.<br />
SMART support is: <strong>Enabled</strong></p></blockquote>
<p>Dacă e &#8220;Available&#8221; şi e &#8220;Disabled&#8221;, atunci se poate activa şi fără reboot pentru a meşteri prin BIOS. Dacă e &#8220;Unavailable&#8221;, atunci poţi să arunci rabla de HDD de pe bloc sau intru într-o zonă a disk-urilor ce mă depăşeşte.</p>
<blockquote><p>smartctl -s on /dev/sda</p></blockquote>
<p>Această comandă va activa S.M.A.R.T. dacă există. Dacă nu, citeşte paragraful anterior. Dacă da, lectură plăcută în continuare.</p>
<blockquote><p>smartctl -a /dev/sda</p></blockquote>
<p>Va da lista aceea de &#8220;geeky parameters&#8221; despre starea HDD-ului.</p>
<blockquote><p>SMART overall-health self-assessment test result: <strong>PASSED</strong></p></blockquote>
<p>Ar fi bine să indice acel PASSED. Dacă nu, ar fi cazul să îţi salvezi datele şi să înlocuieşti echipamentul. De regulă ar trebui să fie acompaniate erorile şi de ceva descrieri. In principiu informaţiile cu flag-ul &#8220;Pre-fail&#8221; ar trebui să fie OK.</p>
<p>Dacă totul este OK, atunci se poate trece fără grijă la auto-teste. Ca idee există vreo 3, două rapide şi unul lent. Le recomand pe cele rapide să fie primele:</p>
<blockquote><p>smartctl -t short /dev/sda</p></blockquote>
<p>După ce trece timpul alocat testului se va rula:</p>
<blockquote><p>smartctl -t conveyance /dev/sda</p></blockquote>
<p>Atenţie, testele nu pot fi rulate în paralel sau puse în coadă. Execuţia unui nou test o va anula pe cea anterioară.</p>
<p>Se poate trage cu ochiul la progres prin:</p>
<blockquote><p>smartctl -c /dev/sda</p></blockquote>
<p>Cu toate acestea, nu are vreo formă de &#8220;progress bar&#8221;, doar un procent rămas pâna la terminare, actualizat din 10% în 10%.</p>
<p>Lista rezultatelor stocate în log-ul HDD-ului se poate afla prin:</p>
<blockquote><p>smartctl -l selftest /dev/sda</p></blockquote>
<p>Ca regulă generală, log-ul stochează ultimele 20 teste. Nu îţi pierde vremea (precum subsemnatul) căutând o metodă de resetare a log-ului. O fi existând vreo soluţie, nu am dat de ea în smartctl.</p>
<blockquote><p>=== START OF READ SMART DATA SECTION ===<br />
SMART Self-test log structure revision number 1<br />
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error<br />
# 1  Extended offline    Completed without error       00%     19368         -<br />
# 2  Conveyance offline  Completed without error       00%     19366         -<br />
# 3  Short offline       Completed without error       00%     19366         -</p></blockquote>
<p>Cam aşa arată la mine după cele 3 teste, iar acestea sunt rezultatele &#8220;ochei&#8221;. Nu am zis de ultimul, acesta durează cât căderea turnului din Pisa şi a doua venire a lui Hristos la un loc. Este direct proporţional cu dimensiunea disk-ului şi bănuiesc faptul că ţine şi de viteza acestuia. Ultimul test se rulează prin:</p>
<blockquote><p>smartctl -t long /dev/sda</p></blockquote>
<p>Este un moment bun să îţi faci cafeaua, dacă bei cafea, să scoţi câinele la plimbare, dacă ai vreunul, etc. O să dureze suficient de mult, în special la dimensiunile disk-urilor din zilele de astăzi.</p>
<p>Parametrul -c al smartctl pe lângă starea execuţiei unui test anume furnizează şi durata lor:</p>
<blockquote><p>Short self-test routine<br />
recommended polling time: 	 (   2) minutes.<br />
Extended self-test routine<br />
recommended polling time: 	 ( 147) minutes.<br />
Conveyance self-test routine<br />
recommended polling time: 	 (   5) minutes.</p></blockquote>
<p>În concluzie îţi poţi programa din timp ceva ce să umple acel gol. Din păcate numerele nu sunt precum progress bar-ul din Windows 98 unde arăta sute de ani şi termina în 5 minute sau un progress bar ce avansează dar timpul rămas creşte. Cam atâta durează testele pe bune şi pe rele. Datele de mai sus sunt de la un WD5000AAJS, adică un HDD de 500GB, 8MiB cache şi peste 19300 de ore de funcţionare. Da, are peste 2 ani de uptime, e normal din moment ce rulează în propriul server. Fratele geamăn, camarad de mirror, a murit răpus de Buleptrica, fie-i platanele uşoare. Cu această ocazie am făcut şi comemorarea soldatului căzut la datorie.</p>
<p>b) badblocks</p>
<p>badblocks este un utilitar, potenţial agresiv, menit să scormonească platanele şi să indice existenţa sau inexistenţa sectoarelor defecte. Spre exemplu eu am o mândreţe de HDD Fujitsu-Siemenes cules din notebook (ce a primit la scurt timp după achiziţionare un binemeritat upgrade la 7200 RPM). Junghiul acesta de disk corupe datele, n-are S.M.A.R.T. şi nici bad-uri. L-am scanat de câteva ori, cu mai multe utilitare, de unde concluzia că suferă de alte genuri de defecţiuni, recte electronice. Concluzia scurtă a poveştii de mai sus este faptul că badblocks nu este panaceu, identifică problemele pentru care a fost creat. Disk-urile nu trebuie să fie montate pentru a evita orice problemă, dacă au partiții. Deasemenea se recomandă prezența unei distribuții live, eventual în cazul în care aceasta nu este disponibilă, single user mode cu root montat ca read only.</p>
<blockquote><p>badblocks -sv /dev/sda</p></blockquote>
<p>Va rula un read only test şi arată progresul operaţiei. Durează ceva vreme, cam o oră şi ceva în cazul meu.</p>
<blockquote><p>root@ubuntu:~# badblocks -sv /dev/sda<br />
Checking blocks 0 to 488386583<br />
Checking for bad blocks (read-only test): done<br />
Pass completed, 0 bad blocks found.</p></blockquote>
<p>Dacă vrei un test mai agresiv pentru disk, există și moduri read-write. Există doi parametri mari și lați: -n pentru read-write non-distructiv, recomandat pentru disk-uri ce au date pe ele, sau -w pentru read-write distructiv și îți poți lua gândul de la date cu -w, deci atenție. Parametrii -n și -w sunt disjuncți deci nu se vor utiliza împreună în aceeași comandă.</p>
<p>EOF</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p><img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/BXTdkLuVn7s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/linux/scanarea-disk-urilor-sub-linux.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/linux/scanarea-disk-urilor-sub-linux.html</feedburner:origLink></item>
		<item>
		<title>Windows Automatic Updates și povestea reboot-ului automat</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/5AS4dd2XMBM/windows-automatic-updates-si-povestea-reboot-ului-automat.html</link>
		<comments>http://www.saltwaterc.net/windows/windows-automatic-updates-si-povestea-reboot-ului-automat.html#comments</comments>
		<pubDate>Wed, 14 Apr 2010 17:11:32 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.saltwaterc.net/?p=721</guid>
		<description><![CDATA[Începând cu Windows XP SP2 Microsoft a început un trend ce mă scoate din sărite: reboot automat după un automatic update. Deși nu este instantaneu și îți lasă timp de &#8220;gândire&#8221;, uneori se întâmplă să nu fiu la tastatură pe când se gândește să îmi facă surpriza, sau să îl amân, să mă uit la [...]]]></description>
			<content:encoded><![CDATA[<p>Începând cu Windows XP SP2 Microsoft a început un trend ce mă scoate din sărite: reboot automat după un automatic update. Deși nu este instantaneu și îți lasă timp de &#8220;gândire&#8221;, uneori se întâmplă să nu fiu la tastatură pe când se gândește să îmi facă surpriza, sau să îl amân, să mă uit la film și să mă trezesc cu bucuria gata făcută. Sincer nu știu cine este autorul ideii mărețe, dar sper că într-o zi își va da seama de greșeală și se va căi. Între timp, furnizez și o soluție rapidă &#8220;bugului&#8221; de mai sus. O dau sub formă de registry patch din moment ce nu toate versiunile de Windows includ gpedit.msc (altă idee măreață marca Redmond).</p>
<pre>Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU]
"NoAutoRebootWithLoggedOnUsers"=dword:00000001
</pre>
<p>&nbsp;</p>
<p>Ca idee, târla de mai sus se salvează într-un fișier text cu extensie .reg, se execută și voila, bug killed.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p><img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/5AS4dd2XMBM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/windows/windows-automatic-updates-si-povestea-reboot-ului-automat.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/windows/windows-automatic-updates-si-povestea-reboot-ului-automat.html</feedburner:origLink></item>
		<item>
		<title>OpenVZ Debian Appliance Builder</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/5yn965utuls/openvz-debian-appliance-builder.html</link>
		<comments>http://www.saltwaterc.net/linux/openvz-debian-appliance-builder.html#comments</comments>
		<pubDate>Fri, 26 Mar 2010 20:22:00 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Virtualizare]]></category>

		<guid isPermaLink="false">http://www.saltwaterc.net/?p=705</guid>
		<description><![CDATA[Băieții ăștia faini de la Proxmox ce se ocupă de Proxmox VE printre altele, soluția de virtualizare ce o recomandam în articolul anterior pentru testarea de configurații, au mai scos un hit: Debian Appliance Builder, pe scurt dab. Acum să nu se înțeleagă din fraza anterioară faptul că Proxmox VE nu ar fi bun în [...]]]></description>
			<content:encoded><![CDATA[<p>Băieții ăștia faini de la <a title="Proxmox" href="http://proxmox.com/" target="_blank">Proxmox</a> ce se ocupă de <a title="Proxmox Virtual Environment" href="http://pve.proxmox.com/wiki/Main_Page" target="_blank">Proxmox VE</a> printre altele, soluția de virtualizare ce o recomandam <a title="Cum să reproduci setup-din din producție – pe local" href="http://www.saltwaterc.net/linux/cum-sa-reproduci-setup-din-din-productie-pe-local.html" target="_blank">în articolul anterior</a> pentru testarea de configurații, au mai scos un hit: <a title="Debian Appliance Builder" href="http://pve.proxmox.com/wiki/Debian_Appliance_Builder" target="_blank">Debian Appliance Builder</a>, pe scurt dab. Acum să nu se înțeleagă din fraza anterioară faptul că Proxmox VE nu ar fi bun în producție. <a title="OVH: Proxmox" href="http://help.ovh.co.uk/Proxmox" target="_blank">Cel puțin OVH</a> folosește în producție produsul menționat anterior.</p>
<p>Dar să revenim la builder. Practic dab este un utilitar menit să subțieze destul de mult procesul de <a title="Debian template creation" href="http://wiki.openvz.org/Debian_template_creation" target="_blank">creare al unui template Debian</a>. De fapt procesul în sine nu e mare filosofie, dar este stufos și necesită cel puțin un shell script pentru a reduce repetitivitatea. Cei de la Proxmox au reușit prin automatizarea etapelor de creare să reducă timpul și complexitatea necesară creării unui template OpenVZ pentru Debian. Având în vedere că Ubuntu este compatibil din punct de vedere binar cu upstream-ul (cel puțin la nivel declarativ), dab suportă printre altele și crearea de template-uri pentru câteva versiuni ale acestei distribuții.</p>
<p>Distribuții suportate de către Debian Appliance Builder:</p>
<ul>
<li>Debian Etch (4.0) (Legacy Stable)</li>
<li>Debian Lenny (5.0) (Stable)</li>
<li>Ubuntu Hardy (8.04) (LTS)</li>
<li>Ubuntu Intrepid (8.10)</li>
<li>Ubuntu Jaunty (9.04)</li>
</ul>
<p>Remarcabilă este absență lui Karmic, deși nu este esențială având în vedere că următorul LTS, Ubuntu Lucid Lynx (10.04), stă să apară. Momentan a poposit la Beta 1.</p>
<p>Practic pașii necesari creării unui template au fost reduși la:</p>
<ol>
<li>crearea unui fișier de configurare (dab.conf) cu o sintaxă &#8220;key: value&#8221; relativ simplă, explicată în documentație. Joacă rol de &#8220;metadata&#8221;.</li>
<li>init &#8211; moment în care se citește lista de pachete din repo-urile distribuției alese</li>
<li>bootstrap cu opțiuni, unde subsemnatul preferă &#8220;&#8211;minimal&#8221;. Prefer să am un setup minimal și să instalez din repo pachetele în funcție de context în momentul în care ajung la deploy. Less is more. La bootstrap se face downloadul efectiv al pachetelor în directorul cache al structurii pe care se construiește template-ul.</li>
<li>[opțional] instalare de pachete suplimentare. Minimalul lor nu corespunde minimalului meu, ce presupune și: htop, sysv-rc-conf, sysvconfig, bzip2.</li>
<li>configurare. Minimal în terminologia mea nu înseamnă o chestie redusă la dimensiune până la absurd, gen template-urile minimale de pe openvz.org ce funcționează cu o târlă de erori ce trebuie reparate de mână înainte de deploy. Plus faptul că sunt actualizate din an în Paște din moment ce sunt în secțiunea contrib iar maintainerii sunt de Duminică (one time only?). Printre altele, le optimizez pentru consum de memorie redus, și anume oprirea serviciilor ce nu sunt necesare cel puțin pe moment: cron, postfix, syslog (cu variații în funcție de distro), ceea ce se traduce prin: într-un container chel o să fie un memory footprint inițial de 1-2MiB necesar serviciului <a title="OpenSSH" href="http://www.openssh.com/" target="_blank">OpenSSH</a>, <a title="Two dozen operating system templates" href="http://www.intovps.com/blog/2009/08/23/two-dozen-operating-system-templates/" target="_blank">după cum se lăudau și cei de la IntoVPS</a>. Recordul personal e de 1MiB pe un template Debian Lenny i386 și aș merge pe varianta cu <a title="Dropbear SSH server and client" href="http://matt.ucc.asn.au/dropbear/dropbear.html" target="_blank">Dropbear</a> în loc de OpenSSH doar de dragul virtualizării și a testării scenariului de &#8220;VPS small&#8221;. Timp pentru teste să găsesc. Ca dimensiune, ies în jur de 95MiB în urma arhivării gzip, în jur de 275MiB dezarhivat.</li>
<li>finalizare &#8211; ceea ce presupune curățarea automată a template-ului din containerul temporar urmată de arhivare. Având în vedere faptul că Proxmox VE necesită o sintaxă rigidă în ceea ce privește numele unui template ce trebuie să se regăsească în /var/lib/vz/template/cache (de pe la v1.2 dacă nu mă înșeală memoria), partea de finalize este un real ajutor pentru că se ocupă automat de numele buclucaș.</li>
</ol>
<p>Singura bubă ce i-am găsit-o până acum este lipsa unui suport bun pentru edit &amp; deploy. Cel puțin mie de îndată ce am rulat dab finalize &#8211; nu am mai putut reveni la reconfigurare, rearhivare, retestare. Din fericire dab clean nu șterge lista de pachete. Doar dab dist-clean face curățenie pe acolo, lăsând doar fișierul dab.conf și directorul cache ce e gol (WTF?).</p>
<p>Printre altele suportă crearea de template-uri folosind make și un Makefile. Nu îmi manifest interes deosebit pentru sintaxa Makefile cu care nu sunt familiarizat, iar shell scripting-ul e mai distractiv dacă tot e să automatizăm automatizarea. Suportă anumite scenarii gen bază de date sau PHP, dar cel puțin subsemnatul preferă să facă de mână instalarea de servicii esențiale în funcție de tipul de mașină, fie din repo, fie din surse dacă versiunea din repo e de pe vremea lui Nae.</p>
<p>Per total e un utilitar ce te poate scăpa de stufoșenia creării template-urilor de Debian/Ubuntu folosind debootstrap și un shell, utilitar ce îl Recomand<strong>™</strong>.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p><img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/5yn965utuls" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/linux/openvz-debian-appliance-builder.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/linux/openvz-debian-appliance-builder.html</feedburner:origLink></item>
		<item>
		<title>Cum să reproduci setup-din din producție – pe local</title>
		<link>http://feedproxy.google.com/~r/SaltwatersBlog/~3/n9jDeTYoL9M/cum-sa-reproduci-setup-din-din-productie-pe-local.html</link>
		<comments>http://www.saltwaterc.net/linux/cum-sa-reproduci-setup-din-din-productie-pe-local.html#comments</comments>
		<pubDate>Tue, 16 Mar 2010 10:50:58 +0000</pubDate>
		<dc:creator>SaltwaterC</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Virtualizare]]></category>

		<guid isPermaLink="false">http://www.saltwaterc.net/?p=684</guid>
		<description><![CDATA[Problema reproducerii unui setup compatibil din punct de vedere binar este mai simplă decât pare cu condiția să se apeleze la anumite ajutoare, ajutoare de natură virtuală. Este destul de contra-productiv să instalezi un OS de fiecare dată pe când este nevoie de o instanță curată, fie că dispui de o mașină dedicată, fie că [...]]]></description>
			<content:encoded><![CDATA[<p>Problema reproducerii unui setup compatibil din punct de vedere binar este mai simplă decât pare cu condiția să se apeleze la anumite ajutoare, ajutoare de natură virtuală. Este destul de contra-productiv să instalezi un OS de fiecare dată pe când este nevoie de o instanță curată, fie că dispui de o mașină dedicată, fie că folosești un hypervisor local. Știu că în aparență propoziția anterioară contrazice folosirea virtualizării, dar nu am menționat ce tip de hypervisor se recomandă pentru acest obiectiv specific.</p>
<p>Atâta timp cât trebuie testată doar compatibilitatea userland-ului, o soluție de virtualizare bazată pe OS level virtualization este suficientă, adică se folosesc containere, nu instanțe virtualizare complet. Spre exemplu un setup testat local în container va putea rula pe un VPS, pe un VDS sau pe o mașină dedicată fără probleme. Nu o să fac referire la <a title="The FreeBSD jail mechanism is an implementation of operating system-level virtualization" href="http://en.wikipedia.org/wiki/FreeBSD_jail" target="_blank">FreeBSD Jails</a> și <a title="Solaris Containers (including Solaris Zones) is an implementation of operating system-level virtualization" href="http://en.wikipedia.org/wiki/Solaris_Containers" target="_blank">Solaris Containers</a> pentru că am puțină experiență cu Jails și zero experiență cu Containers. În plus, destul de mulți se orientează în prezent spre Linux.</p>
<p>Dacă ești vreun guru în a rula vzctl în shell sau masochist, poți să te oprești din citit. Dacă nu, atunci voi vorbi în continuare despre <a title="OpenVZ is container-based virtualization for Linux" href="http://wiki.openvz.org/Main_Page" target="_blank">OpenVZ</a> plus metode civilizate și productive de a reproduce un setup. Bariera de intrare printre membrii ce folosesc tehnologia este destul de sus, motiv pentru care au apărut soluții integrate. Dintre acestea, recomand <a title="Proxmox Virtual Environment" href="http://pve.proxmox.com/wiki/Main_Page" target="_blank">Proxmox VE (Virtual Environment)</a>. Băieții aceștia faini de la Proxmox au luat mai multe tehnologii de virtualizare și le-au pus sub același pachet: <a title="Kernel-based Virtual Machine" href="http://en.wikipedia.org/wiki/Kernel-based_Virtual_Machine" target="_blank">KVM (Kernel-based Virtual Machine)</a> și OpenVZ, plus o interfață web pentru administrare. Practic Proxmox VE este un <a title="http://www.debian.org/releases/lenny/" href="http://www.debian.org/releases/lenny/" target="_blank">Debian Lenny</a> împachetat cu tehnologiile despre care spuneam mai sus.</p>
<p>Setup-up este cretin de simplu, durează vreo 5 minute, se face pe o mașină ce nu are un alt OS. Își alocă tot disk-ul și își face partiții <a title="Logical Volume Manager (Linux)" href="http://en.wikipedia.org/wiki/Logical_Volume_Manager_%28Linux%29" target="_blank">LVM</a>. Este recomandat minim 2GB de RAM disponibil dacă se folosesc mai multe containere, minim 1GB RAM pentru un container folosind pentru &#8216;package maintenance&#8217; ce are suport <a title="Symmetric multiprocessing" href="http://en.wikipedia.org/wiki/Symmetric_multiprocessing" target="_blank">SMP</a> și se folosește parallel build. Spre exemplu la un build de PHP cu make -j 3 am rămas fără memorie în container de 512MB RAM. Da, nu recomand instalarea unui compilator în producție sau build pe live servers. Alternativa ar fi <a title="Do it yourself" href="http://en.wikipedia.org/wiki/Do_it_yourself" target="_blank">DIY</a>, adică o distribuție de Linux ce folosește kernel cu patch pentru OpenVZ, preferabil din repo, plus o interfață web precum <a title="OpenVZ Management Tool" href="http://webvz.sourceforge.net/" target="_blank">WebVZ</a> sau <a title="HyperVM" href="http://www.lxcenter.org/hypervm/installation.htm" target="_blank">HyperVM</a>.</p>
<p>Proxmox VE se poate instala fie direct pe fier (bare-metal hypervisor), fie într-o mașină virtuală creată cu <a title="VirtualBox" href="http://www.virtualbox.org/" target="_blank">VirtualBox</a> ce este soluția pentru &#8220;desktop&#8221; ce o recomand. Am pus desktop între ghilimele pentru faptul că VirtualBox are o arhitectură complexă expusă prin CLI. În GUI se găsește doar un set limitat de funcții. În cazul în care se instalează într-o mașină virtuală creată cu VirtualBox (sau echivalent), nu se vor putea crea mașini virtuale folosind KVM pentru că este nevoie de extensiile de virtualizare din procesor (<a title="x86 virtualization" href="http://en.wikipedia.org/wiki/X86_virtualization" target="_blank">VT-x sau AMD-V</a>) pentru aceasta. Oricum, scopul principal al acestui articol este OpenVZ datorită flexibilității ce o oferă. Acesta este motivul pentru care merită chiar și soluția de hypervisor sub hypervisor dacă nu îți permiți luxul unei mașini dedicate. În principiu pe o stație de lucru suficient de puternică nu ar trebui să fie probleme în ceea ce privește rularea unui Proxmox VE sub VirtualBox. Îmi permit aroganță de a menționa faptul că nu am mai lucrat de mult pe o mașină sub quad și 8GB RAM.</p>
<p>Având în vedere faptul că pentru OpenVZ <a title="openvz template creation" href="http://www.google.com/search?hl=en&amp;source=hp&amp;q=openvz+template+creation&amp;aq=0&amp;aqi=g1&amp;aql=&amp;oq=openvz+template+crea" target="_blank">se pot crea relativ ușor template-uri</a>, iar virtualizarea constă în crearea unui container nou, operațiunea prin care se obține un nou setup durează destul de puțin. Iar în cazul în care un container nu mai este necesar, distrugerea acestuia este o operațiune rapidă. Practic se obține propriul mini-cloud, ușor de administrat, ce va scădea timpul în care se creează diferite scenarii ce vor ajunge în producție.</p>
<p>În cazul în care nu am fost suficient de clar la început, repet: setup pentru testarea userland-ului. OpenVZ oferă acces limitat la kernel din moment ce nu folosește virtualizare completă a sistemului de operare, doar rețeaua este virtualizată. Spre exemplu folosind kernel-ul livrat cu Proxmox VE se pot folosi FS-uri virtuale bazate pe <a title="Filesystem in Userspace" href="http://en.wikipedia.org/wiki/Filesystem_in_Userspace" target="_blank">FUSE</a> dacă se sapă puțin prin vzctl, ceea ce deschide anumite posibilități în producție gen <a title=" FUSE-based file system backed by Amazon S3  " href="http://code.google.com/p/s3fs/" target="_blank">s3fs</a> (netestat sub OpenVZ de subsemnatul, am testat alte module FUSE) prin intermediul căruia se poate monta un bucket de <a title="Amazon Simple Storage Service (Amazon S3)" href="http://aws.amazon.com/s3/" target="_blank">Amazon S3</a> ca FS local. De altfel, am reprodus și un sistem desktop într-un container OpenVZ, <a title="Ubuntu Hardy Heron" href="https://wiki.ubuntu.com/HardyHeron" target="_blank">Ubuntu Hardy</a>, accesat prin <a title="Ubuntu FreeNX" href="https://help.ubuntu.com/community/FreeNX" target="_blank">FreeNX</a>, deci limitările sunt destul de puține gen lipsa unui suport civilizat pentru loop device.</p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p><img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/n9jDeTYoL9M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.saltwaterc.net/linux/cum-sa-reproduci-setup-din-din-productie-pe-local.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.saltwaterc.net/linux/cum-sa-reproduci-setup-din-din-productie-pe-local.html</feedburner:origLink></item>
		<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>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </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>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </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>4</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>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p><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>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </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>6</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 &#8216;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>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </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 &#8216;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>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </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>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </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 [...]]]></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>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </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 &#8216;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>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </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 &#8216;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>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </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>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </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 [...]]]></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>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </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>

<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://www.saltwaterc.net/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a> </p><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>
	</channel>
</rss>
