<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en" xml:base="http://www.saltwaterc.ro/wp-atom.php">
	<title type="text">printf(" SaltwaterC ");</title>
	<subtitle type="text">/dev/urandom</subtitle>

	<updated>2011-08-22T08:28:50Z</updated>

	<link rel="alternate" type="text/html" href="http://www.saltwaterc.ro" />
	<id>http://www.saltwaterc.ro/feed/atom</id>
	

			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+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/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/3.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[Kernel upgrade sub Amazon EC2 / Ubuntu]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/beyDmdntKGg/kernel-upgrade-sub-amazon-ec2-ubuntu.html" />
		<id>http://www.saltwaterc.ro/?p=982</id>
		<updated>2011-06-10T06:45:37Z</updated>
		<published>2011-03-03T13:18:32Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Administrare" /><category scheme="http://www.saltwaterc.ro" term="Linux" /><category scheme="http://www.saltwaterc.ro" term="Virtualizare" />		<summary type="html"><![CDATA[Nu o să descriu o metodă generală de kernel upgrade pentru că nu cunosc una ce să meargă pe restul distribuțiilor. Canonical este un susținător activ al virtualizării, iar în cazul Amazon EC2 au pus umărul și oferă suport oficial pentru Ubuntu. Deci o să mă limitez la Ubuntu Server 10.04 LTS. Dacă ar fi [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/kernel-upgrade-sub-amazon-ec2-ubuntu.html">&lt;p&gt;Nu o să descriu o metodă generală de kernel upgrade pentru că nu cunosc una ce să meargă pe restul distribuțiilor. Canonical este un susținător activ al virtualizării, iar în cazul Amazon EC2 au pus umărul și oferă suport oficial pentru Ubuntu. Deci o să mă limitez la Ubuntu Server 10.04 LTS.&lt;/p&gt;
&lt;p&gt;Dacă ar fi să mă iau după trendul celor de la RightScale de a merge &amp;#8220;doar înainte în cloud&amp;#8221;, atunci ar trebui să complic problema mai mult decât trebuie să se complice. Din nefericire nu toate aplicațiile au fost create ca să se muleze acestui model: &amp;#8220;creez instanțe noi, pe cele vechi le arunc la gunoi&amp;#8221;. Iar faptul că au dezactivat butonul de stop instance nu înseamnă că oricine trebuie să se muleze acestui model.&lt;/p&gt;
&lt;p&gt;Tipul de management de mai sus presupune:&lt;/p&gt;
&lt;p&gt;- apt-get update &amp;amp;&amp;amp; apt-get dist-upgrade pentru a avea noul kernel pe disk&lt;br /&gt;
- snapshot la EBS (dacă există)&lt;br /&gt;
- creat AMI nou cu kernel ID nou&lt;br /&gt;
- adăugat instanță nouă in spate la load balancer&lt;br /&gt;
- oprit instanță veche&lt;/p&gt;
&lt;p&gt;Tipul de management în viziunea subsemnatului:&lt;/p&gt;
&lt;p&gt;- apt-get update &amp;amp;&amp;amp; apt-get dist-upgrade pentru a avea noul kernel pe disk&lt;br /&gt;
- oprire instanță EBS backed&lt;br /&gt;
- schimbat atributul kernel (ec2-modify-instance-attribute &amp;#8211;kernel $kernel_id $instance_id)&lt;br /&gt;
- pornire instanță&lt;/p&gt;
&lt;p&gt;TADA!&lt;/p&gt;
&lt;p&gt;Load balancerul și aplicația nu o să tușească la acest model. Pe cuvântul meu de cercetaș. Și se poate automatiza la fel de bine ca și modelul pe care-l propun alții.&lt;/p&gt;
&lt;p&gt;Bila neagră către Amazon este faptul că nu o să câștige vreodată vreun concurs de uzabilitate. Modul în care și-au gândit anumite chestii sună mai mult a box împotriva unui API și mai puțin simpla utilizare a lui. Din fericire, cum ziceam mai sus, Canonical oferă suport oficial. Deci gasirea acelui $kernel_id magic nu este tocmai căutare în acul cu fân, dacă rogi frumos EC2 API Tools:&lt;/p&gt;
&lt;p&gt;Update: Canonical se dovedesc a fi parte a conceptului &amp;#8220;world-class pain-in-the-ass&amp;#8221;. Noile imagini de kernel, se găsesc folosind:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="bash" style="font-family:monospace;"&gt;ec2-describe-images &lt;span style="color: #660033;"&gt;-o&lt;/span&gt; 099720109477 &lt;span style="color: #660033;"&gt;--filter&lt;/span&gt; &lt;span style="color: #007800;"&gt;name&lt;/span&gt;=ubuntu-images&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;ubuntu-lucid-\&lt;span style="color: #000000; font-weight: bold;"&gt;*&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ce am zis mai jos rămâne valabil până la kernel 2.6.32.312-ec2. Mai nou, imaginile sunt în /ubuntu-images/.&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="bash" style="font-family:monospace;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;# pentru mașini 64-bit&lt;/span&gt;
ec2-describe-images &lt;span style="color: #660033;"&gt;-o&lt;/span&gt; 099720109477 &lt;span style="color: #660033;"&gt;--filter&lt;/span&gt; &lt;span style="color: #007800;"&gt;name&lt;/span&gt;=ubuntu-kernels&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;ubuntu-lucid-amd64\&lt;span style="color: #000000; font-weight: bold;"&gt;*&lt;/span&gt;
&lt;span style="color: #666666; font-style: italic;"&gt;# sau, pentru mașini 32-bit&lt;/span&gt;
ec2-describe-images &lt;span style="color: #660033;"&gt;-o&lt;/span&gt; 099720109477 &lt;span style="color: #660033;"&gt;--filter&lt;/span&gt; &lt;span style="color: #007800;"&gt;name&lt;/span&gt;=ubuntu-kernels&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;ubuntu-lucid-i386\&lt;span style="color: #000000; font-weight: bold;"&gt;*&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Notabil este faptul că în /ubuntu-kernels/ se găsesc versiunile considerate stabile. Mai există și chestii ceva &amp;#8220;bleeding edge&amp;#8221;, dar vorbim de mediu de producție, nu de joaca de-a virtualizarea.&lt;/p&gt;
&lt;p&gt;Update: la 2.6.32.316 (1 Iunie 2011) au revenit la schema de publicare explicată inițial. Doar 2.6.32.314 nu apare în listă, fiind nevoie să fie pescuit de prin lista de imagini oficiale.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/beyDmdntKGg" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/kernel-upgrade-sub-amazon-ec2-ubuntu.html#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/kernel-upgrade-sub-amazon-ec2-ubuntu.html/feed/atom" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/kernel-upgrade-sub-amazon-ec2-ubuntu.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[MySQL Backup peste SSH]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/08TbucDa0CU/mysql-backup-peste-ssh.html" />
		<id>http://www.saltwaterc.ro/?p=965</id>
		<updated>2011-03-01T10:10:26Z</updated>
		<published>2011-02-24T20:40:20Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Administrare" /><category scheme="http://www.saltwaterc.ro" term="Linux" />		<summary type="html"><![CDATA[Update (1 Martie 2011): Suport pentru a specifica un MySQL host. E musai să fie definit minim cu &#8220;localhost&#8221; pentru o conexiune locală. Va folosi UNIX socket. Pentru TCP socket, se folosește 127.0.0.1 ca adresă. Suport pentru compresie la nivel de protocol SSH. Mă gândeam la asta, dar am activat-o doar pentru MySQL &#8211; chestie [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/mysql-backup-peste-ssh.html">&lt;p&gt;Update (1 Martie 2011):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Suport pentru a specifica un MySQL host. E musai să fie definit minim cu &amp;#8220;localhost&amp;#8221; pentru o conexiune locală. Va folosi UNIX socket. Pentru TCP socket, se folosește 127.0.0.1 ca adresă.&lt;/li&gt;
&lt;li&gt;Suport pentru compresie la nivel de protocol SSH. Mă gândeam la asta, dar am activat-o doar pentru MySQL &amp;#8211; chestie destul de inutilă pentru o conexiune locală prin UNIX socket. Acum, cu suport pentru host extern, își are rostul.&lt;/li&gt;
&lt;li&gt;Schimbat criptarea în blowfish-cbc ce este semnificativ mai rapidă pentru SSH.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Backup-ul &amp;#8211; un rău necesar. Existența unui server cu skip-networking complică problema. Dar nu o face imposibilă. SSH știe să returneze chestii peste STDOUT. Iar un script pus în cron face ca această pacoste să intre în categoria &amp;#8220;set it and forget it&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Iar dacă tot am vorbit de un script, acesta este:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="bash" style="font-family:monospace;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;#!/bin/bash&lt;/span&gt;
&amp;nbsp;
&lt;span style="color: #666666; font-style: italic;"&gt;# EDIT&lt;/span&gt;
&lt;span style="color: #007800;"&gt;MY_USER&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span style="color: #007800;"&gt;MY_PASS&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span style="color: #007800;"&gt;MY_HOST&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;
&lt;span style="color: #007800;"&gt;SSH_USER&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span style="color: #007800;"&gt;SSH_HOST&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span style="color: #007800;"&gt;SSH_PORT&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span style="color: #666666; font-style: italic;"&gt;# END EDIT&lt;/span&gt;
&amp;nbsp;
&lt;span style="color: #007800;"&gt;CDIR&lt;/span&gt;=$&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;dirname&lt;/span&gt; &lt;span style="color: #007800;"&gt;$0&lt;/span&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#41;&lt;/span&gt;
&lt;span style="color: #007800;"&gt;PKEY&lt;/span&gt;=&lt;span style="color: #007800;"&gt;$CDIR&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;private-key.pem
&lt;span style="color: #007800;"&gt;DUMP&lt;/span&gt;=&lt;span style="color: #007800;"&gt;$CDIR&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;dump
&lt;span style="color: #007800;"&gt;DATE&lt;/span&gt;=$&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;date&lt;/span&gt; +&lt;span style="color: #000000; font-weight: bold;"&gt;%&lt;/span&gt;F+&lt;span style="color: #000000; font-weight: bold;"&gt;%&lt;/span&gt;H-&lt;span style="color: #000000; font-weight: bold;"&gt;%&lt;/span&gt;M-&lt;span style="color: #000000; font-weight: bold;"&gt;%&lt;/span&gt;S&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp;
&lt;span style="color: #000000; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#91;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;!&lt;/span&gt; &lt;span style="color: #660033;"&gt;-f&lt;/span&gt; &lt;span style="color: #007800;"&gt;$PKEY&lt;/span&gt; &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#93;&lt;/span&gt;
&lt;span style="color: #000000; font-weight: bold;"&gt;then&lt;/span&gt;
        &lt;span style="color: #7a0874; font-weight: bold;"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;&amp;quot;Error: The SSH private key file is missing!&amp;quot;&lt;/span&gt;
        &lt;span style="color: #7a0874; font-weight: bold;"&gt;exit&lt;/span&gt; &lt;span style="color: #000000;"&gt;1&lt;/span&gt;
&lt;span style="color: #000000; font-weight: bold;"&gt;fi&lt;/span&gt;
&amp;nbsp;
&lt;span style="color: #000000; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#91;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;!&lt;/span&gt; &lt;span style="color: #660033;"&gt;-d&lt;/span&gt; &lt;span style="color: #007800;"&gt;$DUMP&lt;/span&gt; &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#93;&lt;/span&gt;
&lt;span style="color: #000000; font-weight: bold;"&gt;then&lt;/span&gt;
        &lt;span style="color: #c20cb9; font-weight: bold;"&gt;mkdir&lt;/span&gt; &lt;span style="color: #007800;"&gt;$DUMP&lt;/span&gt;
&lt;span style="color: #000000; font-weight: bold;"&gt;fi&lt;/span&gt;
&amp;nbsp;
&lt;span style="color: #7a0874; font-weight: bold;"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;&amp;quot;Fetching the databases ...&amp;quot;&lt;/span&gt;
&lt;span style="color: #007800;"&gt;database&lt;/span&gt;=&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#40;&lt;/span&gt;$&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;ssh&lt;/span&gt; &lt;span style="color: #660033;"&gt;-C&lt;/span&gt; &lt;span style="color: #660033;"&gt;-c&lt;/span&gt; blowfish-cbc &lt;span style="color: #660033;"&gt;-i&lt;/span&gt; &lt;span style="color: #007800;"&gt;$PKEY&lt;/span&gt; &lt;span style="color: #660033;"&gt;-p&lt;/span&gt; &lt;span style="color: #007800;"&gt;$SSH_PORT&lt;/span&gt; &lt;span style="color: #007800;"&gt;$SSH_USER&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;@&lt;/span&gt;&lt;span style="color: #007800;"&gt;$SSH_HOST&lt;/span&gt; mysql &lt;span style="color: #660033;"&gt;-C&lt;/span&gt; -h&lt;span style="color: #007800;"&gt;$MY_HOST&lt;/span&gt; -u&lt;span style="color: #007800;"&gt;$MY_USER&lt;/span&gt; -p&lt;span style="color: #007800;"&gt;$MY_PASS&lt;/span&gt; &lt;span style="color: #660033;"&gt;-e&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;'&amp;quot;SHOW DATABASES;&amp;quot;'&lt;/span&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#41;&lt;/span&gt;
&lt;span style="color: #007800;"&gt;count&lt;/span&gt;=&lt;span style="color: #800000;"&gt;${#database[@]}&lt;/span&gt;
&lt;span style="color: #000000; font-weight: bold;"&gt;for&lt;/span&gt; &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #007800;"&gt;i&lt;/span&gt;=&lt;span style="color: #000000;"&gt;1&lt;/span&gt;; i&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;&lt;/span&gt;count ; i++&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#41;&lt;/span&gt;
&lt;span style="color: #000000; font-weight: bold;"&gt;do&lt;/span&gt;
        &lt;span style="color: #000000; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#91;&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;&amp;quot;&lt;span style="color: #007800;"&gt;${database[$i]}&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;!&lt;/span&gt;= &lt;span style="color: #ff0000;"&gt;&amp;quot;mysql&amp;quot;&lt;/span&gt; &lt;span style="color: #660033;"&gt;-a&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;&amp;quot;&lt;span style="color: #007800;"&gt;${database[$i]}&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;!&lt;/span&gt;= &lt;span style="color: #ff0000;"&gt;&amp;quot;information_schema&amp;quot;&lt;/span&gt;  &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#93;&lt;/span&gt;
        &lt;span style="color: #000000; font-weight: bold;"&gt;then&lt;/span&gt;
                &lt;span style="color: #7a0874; font-weight: bold;"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;&amp;quot;Dumping &lt;span style="color: #007800;"&gt;${database[$i]}&lt;/span&gt; ...&amp;quot;&lt;/span&gt;
                &lt;span style="color: #c20cb9; font-weight: bold;"&gt;ssh&lt;/span&gt; &lt;span style="color: #660033;"&gt;-C&lt;/span&gt; &lt;span style="color: #660033;"&gt;-c&lt;/span&gt; blowfish-cbc &lt;span style="color: #660033;"&gt;-i&lt;/span&gt; &lt;span style="color: #007800;"&gt;$PKEY&lt;/span&gt; &lt;span style="color: #660033;"&gt;-p&lt;/span&gt; &lt;span style="color: #007800;"&gt;$SSH_PORT&lt;/span&gt; &lt;span style="color: #007800;"&gt;$SSH_USER&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;@&lt;/span&gt;&lt;span style="color: #007800;"&gt;$SSH_HOST&lt;/span&gt; mysqldump &lt;span style="color: #660033;"&gt;-v&lt;/span&gt; &lt;span style="color: #660033;"&gt;-C&lt;/span&gt; -h&lt;span style="color: #007800;"&gt;$MY_HOST&lt;/span&gt; -u&lt;span style="color: #007800;"&gt;$MY_USER&lt;/span&gt; -p&lt;span style="color: #007800;"&gt;$MY_PASS&lt;/span&gt; &lt;span style="color: #660033;"&gt;-x&lt;/span&gt; &lt;span style="color: #660033;"&gt;-B&lt;/span&gt; &lt;span style="color: #800000;"&gt;${database[$i]}&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;|&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;nice&lt;/span&gt; &lt;span style="color: #660033;"&gt;-n&lt;/span&gt; &lt;span style="color: #000000;"&gt;19&lt;/span&gt; pbzip2 &lt;span style="color: #660033;"&gt;-c&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #007800;"&gt;$DUMP&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;${database[$i]}&lt;/span&gt;-&lt;span style="color: #007800;"&gt;$DATE&lt;/span&gt;.sql.bz2
        &lt;span style="color: #000000; font-weight: bold;"&gt;fi&lt;/span&gt;
&lt;span style="color: #000000; font-weight: bold;"&gt;done&lt;/span&gt;
&amp;nbsp;
&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/&lt;/span&gt;count&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Are 5 opțiuni de configurare, destul de evidente. Caută private-key.pem în directorul în care se află &amp;#8211; unde private-key.pem este cheia ce face posibilă comunicarea peste SSH fără a folosi autentificare cu parolă. Iar din moment ce se folosește rețeaua, atât mysql cât și mysqldump folosesc protocol compression (flag-ul -C). Dependințele sunt evidente la o primă citire. Nu este cel mai eficient mod de a face backup (rețea, spațiu), dar este simplu de implementat iar câteodată aceasta contează. Ignoră bazele de date mysql și information_schema. A se ignora ultimul tag a-la HTML din blocul de cod de mai sus. &lt;a href="http://qbnz.com/highlighter/"&gt;GeSHi&lt;/a&gt; face fițe.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/08TbucDa0CU" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/mysql-backup-peste-ssh.html#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/mysql-backup-peste-ssh.html/feed/atom" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/mysql-backup-peste-ssh.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[Amazon EC2 Micro pentru un cluster memcached]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/ehmeaLaZwKU/amazon-ec2-micro-pentru-un-cluster-memcached.html" />
		<id>http://www.saltwaterc.net/?p=897</id>
		<updated>2011-03-03T08:41:29Z</updated>
		<published>2011-02-23T20:00:44Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Administrare" /><category scheme="http://www.saltwaterc.ro" term="Linux" /><category scheme="http://www.saltwaterc.ro" term="Programare" /><category scheme="http://www.saltwaterc.ro" term="Virtualizare" /><category scheme="http://www.saltwaterc.ro" term="Web" />		<summary type="html"><![CDATA[Am stat și am rumegat puțin problema unui cluster memcached ce s-ar putea face peste Amazon EC2. Patru instanțe t1.micro costă mai puțin decât o instanță m1.small ($0.02/h vs $0.085/h, la preț on-demand). În plus, pentru a avea o oarecare disponibilitate a unui cluster de caching, este nevoie de minim două instanțe din moment ce [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/amazon-ec2-micro-pentru-un-cluster-memcached.html">&lt;p&gt;Am stat și am rumegat puțin problema unui cluster memcached ce s-ar putea face peste &lt;a title="Amazon Elastic Compute Cloud (Amazon EC2)" href="http://aws.amazon.com/ec2/" target="_self"&gt;Amazon EC2&lt;/a&gt;. Patru instanțe &lt;a title="EC2 Instance Types" href="http://aws.amazon.com/ec2/#instance" target="_self"&gt;t1.micro&lt;/a&gt; costă mai puțin decât o instanță &lt;a title="EC2 Instance Types" href="http://aws.amazon.com/ec2/#instance" target="_self"&gt;m1.small&lt;/a&gt; ($0.02/h vs $0.085/h, la preț on-demand). În plus, pentru a avea o oarecare disponibilitate a unui cluster de caching, este nevoie de minim două instanțe din moment ce în mod cert în producție vor exista momente în care există mentenanță planificată. Iar la capitolul capacitate, patru instanțe t1.micro depășesc o instanță m1.small. t1.micro are 613MiB RAM dintre care se pot utiliza să zicem vreo 512MiB pentru memcached, pe când dintre cei 1.7GiB RAM disponibili pe o m1.small, sunt utilizabili vreo 1.6GiB. Patru instanțe t1.micro oferă așadar o capacitate mai mare unui cluster memcached decât o singură instanță m1.small. Iar rezervarea pe 3 ani pentru t1.micro costă $84. Deci nu e gaură în cer sau la buzunar.&lt;/p&gt;
&lt;p&gt;Cu toate acestea, pentru început, dacă aplicația nu are cerințe mari (iar în general nu sunt pentru multe aplicații), două instanțe t1.micro pentru un cluster minimal sunt suficiente. Iar dacă este nevoie de mai multă capacitate, se poate adăuga oricând o nouă instanță, deci un &amp;#8220;building block&amp;#8221; poate fi prestabilit.&lt;/p&gt;
&lt;p&gt;Acum nu vreau ca lumea să privească memcached ca pe un panaceu. Au pornit mulți de la ideea că a face caching în memcached este eficient în orice mod de utilizare. Nu este. Pentru o singură instanță, un &amp;#8220;file based caching&amp;#8221; este mult mai eficient. Da, se stochează pe disk, da disk-ul este mai lent decât memoria, dar acel kernel cache nu doarme degeaba. Acolo se duce memoria pe care &lt;a title="Help! Linux ate my RAM!" href="http://www.linuxatemyram.com/" target="_self"&gt;bobocii cred că le-o mănâncă Linux-ul&lt;/a&gt;. Până și acele API-uri de caching din extensiile de PHP ce fac opcode caching sunt mai eficiente decât memcached, deși mai puțin eficiente decât acel PHP API cu condiția ca mașina care rulează aplicația să aibă suficientă memorie disponibilă pentru a face și kernel cache. Da, memcached pe local e mai ineficient pentru că &lt;abbr title="Inter Process Communication"&gt;IPC&lt;/abbr&gt;-ul presupune overhead. Au fost concluziile simple pe care le-am tras cu un benchmark simplu scris folosind &lt;a href="http://www.geertdedeckere.be/article/introducing-codebench" title="Benchmark multiple subjects at once" target="_self"&gt;Codebench&lt;/a&gt;. Nu mai am sursele, dar cred că o să-l reproduc curând și o să public rezultatele, pentru a încheia cu mitul memcached = panaceu.&lt;/p&gt;
&lt;p&gt;Este totuși util pentru instanțe ce sunt puse în spatele unui &lt;abbr title="Elastic Load Balancer"&gt;ELB&lt;/abbr&gt;, Auto Scaling are grijă de instanțele EC2 ce rulează în spatele acestui ELB, și este nevoie de un cache consistent, distribuit. Un cache local pentru un cluster de mașini ce rulează o aplicație poate pune probleme de coerență și complică mult situația dacă aceasta rulează pe un cluster. Deși e mai lent ca o soluție locală, lentoarea unui &lt;abbr title="Relational database management system"&gt;RDBMS&lt;/abbr&gt; este în general mai mare, deci aici intervine modul potrivit de utilizare al memcached. S-ar putea utiliza și instanțele pe care rulează efectiv aplicația, dar în acest caz, adăugarea de capacitate devine dificilă. Auto Scaling (folosind strict uneltele Amazon EC2) devine imposibil. Deci, are sens un cluster extern mașinilor ce rulează aplicația. Și nu, nu vreau să aud de cluster file system. Introduce mai multe probleme decât rezolvă și spun asta pe cuvând de cercetaș. Iar Auto Scaling nu este musai să fie acel nume pompos de marketing ce îi face pe unii să creadă că au scăpat de &amp;#8220;capacity planning&amp;#8221; sau că e o soluție auto-magică la problemele de scalabilitate. Cel mai civilizat mod de utilizare este acela de a menține un număr minim de instanțe de un anume tip să fie &amp;#8220;up and running&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Să dau și o listă de cerințe.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;OS cu suport îndelungat&lt;/li&gt;
&lt;li&gt;32-bit&lt;/li&gt;
&lt;li&gt;Configurație minimală&lt;/li&gt;
&lt;li&gt;Mod de adresare fix&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Să le iau pe rând.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ubuntu 10.04 &lt;abbr title="Long Term Support"&gt;LTS&lt;/abbr&gt; este potrivit obiectivului stabilit. Canonical oferă 5 ani de actualizări pentru versiunile de server LTS . În plus, Canonical oferă AMI oficiale pe care le menține, deci pe lângă base system și userland, sunt asigurate și actualizările pentru kernel.&lt;/li&gt;
&lt;li&gt;Pentru că 64-bit nu aduce un plus de performanță, doar mai mult &amp;#8220;overhead&amp;#8221; pentru memorie. Deci nu merită efortul de a construi o imagine pentru 64-bit. De la t1.micro pe 64-bit se poate face upgrade doar la instanță m1.large, deci costurile cresc pe măsură iar aplicația trebuie să fie una destul de mare ca să necesite asemenea capacități de memorie pentru un cluster de caching. În același timp, dacă management-ul unui cluster t1.small pe 32-bit devine prea complicat (deși nu ar trebui să fie cu uneltele potrivite), se poate trece la m1.small, deși se primește mai puțin &amp;#8220;bang for the buck&amp;#8221;.&lt;/li&gt;
&lt;li&gt;Deși imaginile Canonical sunt destul de subțiri (ideea de &lt;a href="http://en.wikipedia.org/wiki/Just_enough_operating_system"&gt;JeOS&lt;/a&gt;), au totuși prea multe servicii ce rulează în mod implicit și rulează degeaba. În plus, deși în prezent nu mai vin cu un root &lt;abbr title="Elastic Block Store"&gt;EBS&lt;/abbr&gt; de 15GiB (de când s-a introdus acel &amp;#8220;free tier&amp;#8221;), au totuși un root EBS de 8GiB. La exemplul meu inițial cu 4 instanțe, să zicem că 6GiB sunt aproximativ degeaba. 2GiB pentru o instanță memcached sunt suficienți. Într-un an, acei 24GiB de EBS storage nefolosiți practic, se traduc într-un cost suplimentar de $28.8. Nu este mult ținând cont de prețul altor servicii, dar se adună acolo iar cum Amazon au obiceiul să pună taxă pe absolut cel mai mic detaliu, optimizez în această direcție. Pentru că pot.&lt;/li&gt;
&lt;li&gt;Amazon EC2 în mod implicit are un mod de adresare a mașinilor folosind adrese ce se pot schimba. Pentru a elimina reconfigurarea aplicației, Elastic IP vine în ajutor, dar nu în modul intuit de oricine. Modul implicit presupune costuri suplimentare ce se pot rezolva.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;1+2. Ubuntu 10.04 LTS 32-bit&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pe &lt;a title="Ubuntu on Amazon EC2" href="http://alestic.com/" target="_self"&gt;alestic&lt;/a&gt; se găsesc multe resurse legate de Ubuntu pe EC2. Partea interesantă este acel tabel de pe prima pagină ce listează imaginile oficiale ale Canonical în funcție de zonă, arhitectură și root device. Restul e can-can. O instanță poate fi adusă sus în maxim câteva minute, deci nu o să insist cu partea ușoară a lucrurilor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Configurație minimală&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Din moment ce nu insist asupra lucrurilor ușoare, este evident că o să insist asupra celor mai puțin evidente la o primă vedere. Pentru început, subțierea numărului de servicii. Se ia scriptul de mai jos, se trântește într-un *.sh și se execută.&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="bash" style="font-family:monospace;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;#!/bin/bash&lt;/span&gt;
&amp;nbsp;
&lt;span style="color: #000000; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#91;&lt;/span&gt; $&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;id&lt;/span&gt; -u&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #660033;"&gt;-ne&lt;/span&gt; &lt;span style="color: #000000;"&gt;0&lt;/span&gt; &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#93;&lt;/span&gt;
&lt;span style="color: #000000; font-weight: bold;"&gt;then&lt;/span&gt;
	&lt;span style="color: #7a0874; font-weight: bold;"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;&amp;quot;Please run me as root.&amp;quot;&lt;/span&gt;
	&lt;span style="color: #7a0874; font-weight: bold;"&gt;exit&lt;/span&gt; &lt;span style="color: #000000;"&gt;1&lt;/span&gt;
&lt;span style="color: #000000; font-weight: bold;"&gt;fi&lt;/span&gt;
&amp;nbsp;
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;apt-get&lt;/span&gt; &lt;span style="color: #660033;"&gt;-y&lt;/span&gt; remove &lt;span style="color: #660033;"&gt;--purge&lt;/span&gt; consolekit
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;rm&lt;/span&gt; &lt;span style="color: #660033;"&gt;-rf&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;var&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;log&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;ConsoleKit
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;apt-get&lt;/span&gt; &lt;span style="color: #660033;"&gt;-y&lt;/span&gt; autoremove &lt;span style="color: #660033;"&gt;--purge&lt;/span&gt;
&amp;nbsp;
&lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; disable_service
&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#123;&lt;/span&gt;
	&lt;span style="color: #000000; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#91;&lt;/span&gt; &lt;span style="color: #660033;"&gt;-f&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;etc&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;init&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;&lt;span style="color: #007800;"&gt;$1&lt;/span&gt;.conf &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#93;&lt;/span&gt;
	&lt;span style="color: #000000; font-weight: bold;"&gt;then&lt;/span&gt;
		&lt;span style="color: #7a0874; font-weight: bold;"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;&amp;quot;Disabling $1&amp;quot;&lt;/span&gt;
		stop &lt;span style="color: #007800;"&gt;$1&lt;/span&gt;
		&lt;span style="color: #c20cb9; font-weight: bold;"&gt;mv&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;etc&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;init&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;&lt;span style="color: #007800;"&gt;$1&lt;/span&gt;.conf &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;etc&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;init&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;&lt;span style="color: #007800;"&gt;$1&lt;/span&gt;.conf.noexec
	&lt;span style="color: #000000; font-weight: bold;"&gt;else&lt;/span&gt;
		&lt;span style="color: #7a0874; font-weight: bold;"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;&amp;quot;$1 is already disabled&amp;quot;&lt;/span&gt;
	&lt;span style="color: #000000; font-weight: bold;"&gt;fi&lt;/span&gt;
&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; map
&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#123;&lt;/span&gt;
	&lt;span style="color: #000000; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#91;&lt;/span&gt; &lt;span style="color: #007800;"&gt;$#&lt;/span&gt; &lt;span style="color: #660033;"&gt;-le&lt;/span&gt; &lt;span style="color: #000000;"&gt;1&lt;/span&gt; &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#93;&lt;/span&gt;
	&lt;span style="color: #000000; font-weight: bold;"&gt;then&lt;/span&gt;
		&lt;span style="color: #7a0874; font-weight: bold;"&gt;return&lt;/span&gt;
	&lt;span style="color: #000000; font-weight: bold;"&gt;else&lt;/span&gt;
		&lt;span style="color: #7a0874; font-weight: bold;"&gt;local&lt;/span&gt; &lt;span style="color: #007800;"&gt;f&lt;/span&gt;=&lt;span style="color: #007800;"&gt;$1&lt;/span&gt;
		&lt;span style="color: #7a0874; font-weight: bold;"&gt;local&lt;/span&gt; &lt;span style="color: #007800;"&gt;x&lt;/span&gt;=&lt;span style="color: #007800;"&gt;$2&lt;/span&gt;
		&lt;span style="color: #7a0874; font-weight: bold;"&gt;shift&lt;/span&gt; &lt;span style="color: #000000;"&gt;2&lt;/span&gt;
		&lt;span style="color: #7a0874; font-weight: bold;"&gt;local&lt;/span&gt; &lt;span style="color: #007800;"&gt;xs&lt;/span&gt;=$&lt;span style="color: #000000; font-weight: bold;"&gt;@&lt;/span&gt;
		&lt;span style="color: #007800;"&gt;$f&lt;/span&gt; &lt;span style="color: #007800;"&gt;$x&lt;/span&gt;
		map &lt;span style="color: #ff0000;"&gt;&amp;quot;&lt;span style="color: #007800;"&gt;$f&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span style="color: #007800;"&gt;$xs&lt;/span&gt;
	&lt;span style="color: #000000; font-weight: bold;"&gt;fi&lt;/span&gt;
&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
map disable_service atd cron dbus rsyslog tty2 tty3 tty4 tty5 tty6
&amp;nbsp;
&lt;span style="color: #007800;"&gt;cpucount&lt;/span&gt;=$&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;grep&lt;/span&gt; &lt;span style="color: #660033;"&gt;-c&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;'model name'&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;proc&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;cpuinfo&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#41;&lt;/span&gt;
&lt;span style="color: #000000; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#91;&lt;/span&gt; &lt;span style="color: #007800;"&gt;$cpucount&lt;/span&gt; &lt;span style="color: #660033;"&gt;-ne&lt;/span&gt; &lt;span style="color: #000000;"&gt;1&lt;/span&gt; &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#93;&lt;/span&gt;
&lt;span style="color: #000000; font-weight: bold;"&gt;then&lt;/span&gt;
	&lt;span style="color: #7a0874; font-weight: bold;"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;&amp;quot;You have a multicore system, irqbalance is fine&amp;quot;&lt;/span&gt;
&lt;span style="color: #000000; font-weight: bold;"&gt;else&lt;/span&gt;
	disable_service irqbalance
&lt;span style="color: #000000; font-weight: bold;"&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Maniacii ar putea stoarce mai mult cu mingetty vs getty, busybox vs Core Utils și Dropbear în loc de OpenSSH, dar personal nu-mi complic viața atât de mult pentru câțiva megi de RAM. Acestea fiind spuse, se poate trece la faza următoare.&lt;/p&gt;
&lt;p&gt;Memoria swap nu există pe t1.micro, dar se poate pune într-un fișier. Personal am optat pentru 256MiB. În mod normal nu ar trebui să se atingă pentru un memcached de 512MiB, dar e mai sigur așa decât un crash de sistem pe spinarea unui &lt;abbr title="Out of memory"&gt;OOM&lt;/abbr&gt; error.&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="bash" style="font-family:monospace;"&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;dd&lt;/span&gt; &lt;span style="color: #007800;"&gt;if&lt;/span&gt;=&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;dev&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;zero &lt;span style="color: #007800;"&gt;of&lt;/span&gt;=&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;swap &lt;span style="color: #007800;"&gt;bs&lt;/span&gt;=1M &lt;span style="color: #007800;"&gt;count&lt;/span&gt;=&lt;span style="color: #000000;"&gt;256&lt;/span&gt;
mkswap &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;swap
swapon &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;swap&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Pentru a-l pune la boot, trebuie adăugată următoarea linie în coada lui /etc/fstab:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;/swap none swap sw 0 0&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Se poate șterge linia aia ce ar trebui să monteze &amp;#8220;ceva&amp;#8221; în /mnt. t1.micro nu are &amp;#8220;ephemeral storage&amp;#8221; spre deosebire de instanțele mai mari. Pentru mai multe detalii legate de swap, se poate apela cu încredere la &lt;a title="Swap FAQ" href="https://help.ubuntu.com/community/SwapFaq" target="_self"&gt;documentație&lt;/a&gt;, deși înafară de vm.swappiness nu prea văd ce s-ar putea mânări prin configurare.&lt;/p&gt;
&lt;p&gt;Instalarea memcached care în zona ușoară: apt-get install memcached. Configurarea presupune editarea lui /etc/memcached.conf și anume -m 64 modificat în -m 512, comentată linia cu -l 127.0.0.1 și restart la serviciu cu /etc/init.d/memcached restart. Cei îngrijorați de faptul că se ascultă pe interfața &amp;#8220;externă&amp;#8221; pot să stea liniștiți atâta timp cât n-au un Security Group configurat cu picioarele iar 11211 nu e port public.&lt;/p&gt;
&lt;p&gt;Recomand instalarea lui ntp pentru a minimiza problemele legate de timp în sistem. apt-get install ntp și se poate uita de faptul că a fost instalat.&lt;/p&gt;
&lt;p&gt;Opțional se poate instala și monit pentru a avea un polițai ce să țină un ochi pe celelalte servicii. Personal îl folosesc cu următoarea configurare:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;set daemon 60 with start delay 120&lt;br /&gt;
set eventqueue basedir /var/monit slots 256&lt;br /&gt;
set logfile /var/log/monit.log&lt;br /&gt;
include /etc/monit/conf.d/*&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Nu mi-am bătut capul cu email reporting aka să instalez și un &lt;abbr title="Message transfer agent"&gt;MTA&lt;/abbr&gt; (sendmail sau echivalent). De fapt totul e minimal. În conf.d am următoarele:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="ini" style="font-family:monospace;"&gt; # fișierul memcached
check process memcached with pidfile /var/run/memcached.pid
&lt;span style="color: #000099;"&gt;start&lt;/span&gt; &lt;span style="color: #000066; font-weight:bold;"&gt;=&lt;/span&gt; &lt;span style="color: #933;"&gt;&amp;quot;/etc/init.d/memcached start&amp;quot;&lt;/span&gt;
&lt;span style="color: #000099;"&gt;stop&lt;/span&gt; &lt;span style="color: #000066; font-weight:bold;"&gt;=&lt;/span&gt; &lt;span style="color: #933;"&gt;&amp;quot;/etc/init.d/memcached stop&amp;quot;&lt;/span&gt;
if failed host 127.0.0.1 port &lt;span style=""&gt;11211&lt;/span&gt; type TCP then restart
if &lt;span style=""&gt;5&lt;/span&gt; restarts within &lt;span style=""&gt;5&lt;/span&gt; cycles then timeout
&amp;nbsp;
# fișierul ntp
check process ntpd with pidfile /var/run/ntpd.pid
start program &lt;span style="color: #000066; font-weight:bold;"&gt;=&lt;/span&gt; &lt;span style="color: #933;"&gt;&amp;quot;/etc/init.d/ntp start&amp;quot;&lt;/span&gt;
stop  program &lt;span style="color: #000066; font-weight:bold;"&gt;=&lt;/span&gt; &lt;span style="color: #933;"&gt;&amp;quot;/etc/init.d/ntp stop&amp;quot;&lt;/span&gt;
if failed host 127.0.0.1 port &lt;span style=""&gt;123&lt;/span&gt; type UDP then restart
if &lt;span style=""&gt;5&lt;/span&gt; restarts within &lt;span style=""&gt;5&lt;/span&gt; cycles then timeout
&amp;nbsp;
# fișierul ssh
check process sshd with pidfile /var/run/sshd.pid
start program &lt;span style="color: #933;"&gt;&amp;quot;/etc/init.d/ssh start&amp;quot;&lt;/span&gt;
stop program &lt;span style="color: #933;"&gt;&amp;quot;/etc/init.d/ssh stop&amp;quot;&lt;/span&gt;
if failed port &lt;span style=""&gt;22&lt;/span&gt; protocol SSH then restart
if &lt;span style=""&gt;5&lt;/span&gt; restarts within &lt;span style=""&gt;5&lt;/span&gt; cycles then timeout&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Acum ajung la partea cu disk space-ul minimal pentru root EBS. Amazon cere bani pentru spațiul rezervat, nu pentru spațiul utilizat. Un sistem complet instalat, cu swap de 256MiB și cache apt gol (apt-get clean) ocupă în jur de 894MiB. Am zis 2GiB pentru siguranță și eventualele upgrade-uri mai mari. Deși nu e &amp;#8220;rocket science&amp;#8221;, este totuși o procedură puțin mai dificilă față de majoritatea operațiilor. Recomand salvarea setup-ului de până acum ca &lt;abbr title="Amazon Machine Image"&gt;AMI&lt;/abbr&gt; pentru a avea un backup în caz de erori și a nu fi nevoit să repeți toți pașii de mai sus. Personal, folosesc următoarea metodă:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="bash" style="font-family:monospace;"&gt;&lt;span style="color: #007800;"&gt;aminame&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;image-name&amp;quot;&lt;/span&gt;
&lt;span style="color: #007800;"&gt;volumeid&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;vol-volume-id&amp;quot;&lt;/span&gt;
&lt;span style="color: #007800;"&gt;snapshotid&lt;/span&gt;=$&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#40;&lt;/span&gt;ec2-create-snapshot &lt;span style="color: #ff0000;"&gt;&amp;quot;&lt;span style="color: #007800;"&gt;$volumeid&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;|&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;cut&lt;/span&gt; -f2&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#41;&lt;/span&gt;
&lt;span style="color: #007800;"&gt;kernel&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;aki-kernel-id&amp;quot;&lt;/span&gt; &lt;span style="color: #666666; font-style: italic;"&gt;# Spre exemplu pentru 2.6.32-311 este aki-407d9529&lt;/span&gt;
&amp;nbsp;
&lt;span style="color: #000000; font-weight: bold;"&gt;while&lt;/span&gt; ec2-describe-snapshots &lt;span style="color: #ff0000;"&gt;&amp;quot;&lt;span style="color: #007800;"&gt;$snapshotid&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;|&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;grep&lt;/span&gt; &lt;span style="color: #660033;"&gt;-q&lt;/span&gt; pending
&lt;span style="color: #000000; font-weight: bold;"&gt;do&lt;/span&gt;
	&lt;span style="color: #7a0874; font-weight: bold;"&gt;echo&lt;/span&gt; &lt;span style="color: #660033;"&gt;-n&lt;/span&gt; .
	&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sleep&lt;/span&gt; &lt;span style="color: #000000;"&gt;5&lt;/span&gt;
&lt;span style="color: #000000; font-weight: bold;"&gt;done&lt;/span&gt;
&amp;nbsp;
ec2-register &lt;span style="color: #660033;"&gt;--architecture&lt;/span&gt; i386 &lt;span style="color: #660033;"&gt;--name&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;&amp;quot;&lt;span style="color: #007800;"&gt;$aminame&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span style="color: #660033;"&gt;--snapshot&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;&amp;quot;&lt;span style="color: #007800;"&gt;$snapshotid&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span style="color: #660033;"&gt;--kernel&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;&amp;quot;&lt;span style="color: #007800;"&gt;$kernel&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Metoda de mai sus se va folosi și pentru a salva AMI-ul final. Deci nu o să o mai repet.&lt;/p&gt;
&lt;p&gt;Partea de resize presupune o nouă instanță la care se va atașa root EBS-ul instanței folosite până în prezent din moment ce nu se poate edita un filesystem montat. Deci se oprește instanța pe care s-a lucrat până acum. EBS-ul se detașează tot din EC2 API Tools:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="bash" style="font-family:monospace;"&gt;&lt;span style="color: #007800;"&gt;auxinstanceid&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;'i-instance-id-aux'&lt;/span&gt;
ec2-stop-instances &lt;span style="color: #007800;"&gt;$instanceid&lt;/span&gt;
&lt;span style="color: #000000; font-weight: bold;"&gt;while&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;!&lt;/span&gt; ec2-detach-volume &lt;span style="color: #007800;"&gt;$volumeid&lt;/span&gt;; &lt;span style="color: #000000; font-weight: bold;"&gt;do&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;sleep&lt;/span&gt; &lt;span style="color: #000000;"&gt;5&lt;/span&gt;; &lt;span style="color: #000000; font-weight: bold;"&gt;done&lt;/span&gt;
ec2-attach-volume &lt;span style="color: #660033;"&gt;--instance&lt;/span&gt; &lt;span style="color: #007800;"&gt;$auxinstanceid&lt;/span&gt; &lt;span style="color: #660033;"&gt;--device&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;dev&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;sdf &lt;span style="color: #007800;"&gt;$volumeid&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;$auxinstance &amp;#8211; așa am botezat noua instață auxiliară pe care se va face resize-ul. Se purcede la micșorarea filesystem-ului existent:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="bash" style="font-family:monospace;"&gt;fsck &lt;span style="color: #660033;"&gt;-n&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;dev&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;sdf &lt;span style="color: #666666; font-style: italic;"&gt;# device-ul montat pe $auxinstance, dacă e totul OK se merge mai departe&lt;/span&gt;
tune2fs &lt;span style="color: #660033;"&gt;-O&lt;/span&gt; ^has_journal &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;dev&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;sdf &lt;span style="color: #666666; font-style: italic;"&gt;# se oprește jurnalul - practic partiția devine una ext2&lt;/span&gt;
e2fsck &lt;span style="color: #660033;"&gt;-f&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;dev&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;sdf
resize2fs &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;dev&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;sdf 1500M &lt;span style="color: #666666; font-style: italic;"&gt;# aici nu are dimensiunea finală, dar am pus mai mic ca să nu am probleme mai încolo&lt;/span&gt;
fsck &lt;span style="color: #660033;"&gt;-n&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;dev&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;sdf
tune2fs &lt;span style="color: #660033;"&gt;-j&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;dev&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;sdf&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;După aceasta am creat noul disk de 2GiB pe care să-l atașez lui $auxinstance ca /dev/sdg. De îndată ce noul disk este montat, se poate copia de pe vechiul disk:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="bash" style="font-family:monospace;"&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;dd&lt;/span&gt; &lt;span style="color: #007800;"&gt;if&lt;/span&gt;=&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;dev&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;sdf &lt;span style="color: #007800;"&gt;ibs&lt;/span&gt;=16M &lt;span style="color: #007800;"&gt;of&lt;/span&gt;=&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;dev&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;sdg &lt;span style="color: #007800;"&gt;obs&lt;/span&gt;=16M &lt;span style="color: #007800;"&gt;count&lt;/span&gt;=&lt;span style="color: #000000;"&gt;128&lt;/span&gt;
resize2fs &lt;span style="color: #660033;"&gt;-p&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;dev&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;sdg
e2fsck &lt;span style="color: #660033;"&gt;-f&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;dev&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;sdg&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Este nevoie de aceasta deoarece Amazon nu permite să se creeze un disk mai mic decât snapshot-ul de bază, deci metoda directă: snapshot &amp;#8211; create new smaller disk &amp;#8211; nu convine. Ambele volume se pot detașa de instanța auxiliară. Noul volum mai mic se va atașa la vechea instanță de bază. Dacă totul e OK, și ar trebui să fie dacă la acele (e2)fsck nu a dat erori, atunci o să pornească instanța pe disk-ul mai mic. Se poate verifica ușor cu df -h. După aceasta se poate creea un AMI pornind de la această instanță și folosind metoda descrisă anterior pentru salvarea unui AMI intermediar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Adresare fixă prin rețeaua internă&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Elastic IP-ul este prin definiție public. Adică cel puțin peste tot apare ca fiind un IP public. Din moment ce protocolul memcached nu are &lt;a href="https://code.google.com/p/memcached/wiki/SASLAuthProtocol"&gt;autentificare în mod implicit&lt;/a&gt;, complică problema și prin faptul că trebuie făcut un firewall pe fiecare instanță ce să țină cont de acest aspect, problemă ce poate pune bețe în roate unui auto-scaling (sau să-l complice foarte mult). În același timp, memcached folosește client side clustering, deci ordinea de adresare a serverelor și adresarea fixă este esențială.&lt;/p&gt;
&lt;p&gt;Amazon ar putea oferi un subdomeniu fix ce ține de instanță nu de adresă. Chestia asta ar rezolva problema cel puțin parțial (depinde de context). Cu toate acestea (încă?) n-am văzut astfel de implementare. Ar reduce necesitățile de Elastic IP ce au un număr limitat de 5 per cont, după care trebuie cerută creșterea acestei limite. Cererea nu costă, dar este enervant atunci când se epuizează spațiul de adrese disponibil.&lt;/p&gt;
&lt;p&gt;De ce am pomenit de DNS? Simplu. Adresele acelea de Amazon, spre exemplu 1.1.1.1 au atașate un subdomeniu: ec2-1-1-1-1.compute-1.amazonaws.com. Rezolvat din afara rețelei Amazon, acesta va returna 1.1.1.1. Magia se întâmplă în interiorul rețelei Amazon, unde rezolvarea lui ec2-1-1-1-1.compute-1.amazonaws.com se face către adresa internă a serverului, spre exemplu 10.0.0.1. Elastic IP se supune acestei reguli. Folosirea unui Security Group reduce pacostea de a configura dinamic un firewall deoarece mașinile parte a unui grup pot comunica nerestricționat între ele folosind rețeaua internă, cu condiția ca acel grup să conțină o referință către sine. Iar traficul intern, spre deosebire de cel extern, nu este contorizat și facturat. Deci, clientul memcached, dacă se conectează la două mașini, spre exemplu 1.1.1.1 și 1.1.1.2 va folosi adresele ec2-1-1-1-1.compute-1.amazonaws.com și ec2-1-1-1-2.compute-1.amazonaws.com ce vor rezolva adresa internă. Dacă o mașină este oprită, IP-ul intern alocat se va schimba. Deasemenea acest lucru se va întâmpla și dacă se înlocuiește instanța din spatele acelui Elastic IP. Ori, folosind strategia anterioară, aplicația client nu va trebui modificată cu nimic. Totul se face transparent, în spatele scenei.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Câteva referințe:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.howtoforge.com/linux_resizing_ext3_partitions"&gt;http://www.howtoforge.com/linux_resizing_ext3_partitions&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://alestic.com/2010/02/ec2-resize-running-ebs-root"&gt;http://alestic.com/2010/02/ec2-resize-running-ebs-root&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://serverfault.com/questions/183552/shrinking-amazon-ebs-volume-size"&gt;http://serverfault.com/questions/183552/shrinking-amazon-ebs-volume-size&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/ehmeaLaZwKU" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/amazon-ec2-micro-pentru-un-cluster-memcached.html#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/amazon-ec2-micro-pentru-un-cluster-memcached.html/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/amazon-ec2-micro-pentru-un-cluster-memcached.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[Instalarea phpUnit sub Windows 7 / Zend Server Community Edition]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/QvZBe7BFEXE/instalarea-phpunit-sub-windows-7-zend-server-community-edition.html" />
		<id>http://www.saltwaterc.net/?p=934</id>
		<updated>2011-03-03T13:02:35Z</updated>
		<published>2011-02-19T16:45:31Z</published>
		<category scheme="http://www.saltwaterc.ro" term="PHP" /><category scheme="http://www.saltwaterc.ro" term="Programare" /><category scheme="http://www.saltwaterc.ro" term="Rant" /><category scheme="http://www.saltwaterc.ro" term="Windows" />		<summary type="html"><![CDATA[Ca de obicei, PHP sub Windows reușește prin varii metode să dea cu mucii în fasole. Anumite chestii ar trebui să meargă OOTB în teorie. În practică apar dificultăți. În primul rând am golit directorul C:\Program Files (x86)\Zend\ZendServer\bin\PEAR de toate mizeriile mai puțin go-pear.phar, din varii motive, oricum era un &#8220;fresh install&#8221; de Zend Server [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/instalarea-phpunit-sub-windows-7-zend-server-community-edition.html">&lt;p&gt;Ca de obicei, PHP sub Windows reușește prin varii metode să dea cu mucii în fasole. Anumite chestii ar trebui să meargă &lt;a href="http://en.wikipedia.org/wiki/Out_of_the_box" title="Out of the box"&gt;OOTB&lt;/a&gt; în teorie. În practică apar dificultăți.&lt;/p&gt;
&lt;p&gt;În primul rând am golit directorul C:\Program Files (x86)\Zend\ZendServer\bin\PEAR de toate mizeriile mai puțin go-pear.phar, din varii motive, oricum era un &amp;#8220;fresh install&amp;#8221; de Zend Server CE. C:\Program Files pentru cei ce încă trag cu dinții de 32-bit. După care am purces, folosind un shell rulat sub Administrator:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="dos" style="font-family:monospace;"&gt;&lt;span style="color: #b1b100; font-weight: bold;"&gt;cd&lt;/span&gt; C:\Program Files &lt;span style="color: #33cc33;"&gt;(&lt;/span&gt;x86&lt;span style="color: #33cc33;"&gt;)&lt;/span&gt;\Zend\ZendServer\bin
php -dphar.require_hash=0 PEAR\go-pear.phar
pear channel-update pear.php.net
pear upgrade PEAR
pear channel-discover pear.phpunit.de
pear channel-discover components.ez.no
pear channel-discover pear.symfony-project.com
pear install --alldeps phpunit/PHPUnit&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;PEAR_ENV.reg se generează în C:\Program Files (x86)\Zend\ZendServer\bin. Se adaugă în registru la un simplu dublu click. Rulat sub un simplu user:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="dos" style="font-family:monospace;"&gt;C:\Users\SaltwaterC&lt;span style="color: #33cc33;"&gt;&amp;gt;&lt;/span&gt;phpunit
PHPUnit 3.5.11 by Sebastian Bergmann.
&amp;nbsp;
Usage: phpunit [switches] UnitTest [UnitTest.php]
[...]&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Restul e can-can.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update / Disclaimer:&lt;/strong&gt; în cazul în care n-am fost suficient de explicit, este vorba de Zend Server Community Edition ca distribuție pe post de purtător de vină. Nu este vorba de PHP / Windows. Dar cum Zend susțin faptul lor că distribuția lor de PHP este &amp;#8220;certificată&amp;#8221;, &amp;#8220;production &amp;#038; development ready&amp;#8221;, ca tot omul mă aștept ca anumită funcționalitate să funcționeze fără flotări logice.&lt;/p&gt;
&lt;p&gt;Eroarea ține de faptul că o arhivă PHAR are o semnătură ce e fie invalidă, fie lipsește în cazul distribuției respective iar PHP dă un warning și refuză instalarea. Motiv pentru care se aplică la runtime flag-ul phar.require_hash=0. Nu știu dacă e lipsă sau e invalidă, puțin mă interesează. Faptul că installer-ul PEAR din distribuție este vechi a fost doar un bonus. 2008-05-17 &amp;#8211; în &lt;a href="http://pear.php.net/package/PEAR/download/"&gt;changelog&lt;/a&gt; această dată apare alături de versiunea 1.7.2 pe care o dă Zend &amp;#8220;de bună&amp;#8221; în ultima versiune, 5.0.4. Scuza că e un pachet comunitar iar dacă nu-mi convine pot să dau $xxxx pentru versiunea comercială nu ține din moment ce Zend se laudă a fi &amp;#8220;The PHP Company&amp;#8221;. Da, mă deranjează teribil ipocrizia din industria software.&lt;/p&gt;
&lt;p&gt;Personal am încetat să mai discut cu cei de la Zend probleme ce țin de anumite alegeri cretine pe care le fac în distribuția lor. Sunt grei de cap și încăpățânați. Singura &amp;#8220;victorie&amp;#8221; din partea mea a fost includerea unei valori predefinite pentru sendmail_path în distribuția standard. Vezi &lt;a href="http://www.saltwaterc.net/problema-mail-din-zend-server-community-edition-debian-repository.html"&gt;acest post de prin 2009&lt;/a&gt;. Aceasta după ce a trebuit să depun efoturi ca să le explic faptul că /usr/sbin/sendmail este standard pentru toate distribuțiile majore și să mă lupt cu astfel de &lt;a href="http://forums.zend.com/viewtopic.php?f=44&amp;#038;t=1574#p13921"&gt;răspunsuri&lt;/a&gt;, după ce ei susțineau sus și tare că nu e nici un bug de configurație faptul că sendmail_path e invalid, deși există n-implementări de MTA ce oferă compatibilitate cu sendmail (personal folosesc postfix, deși postfix pe lângă MTA are și un server SMTP). Ca după aceea să o rezolve până la urmă și să pună un &lt;a href="http://kb.zend.com/index.php?View=entry&amp;#038;EntryID=427"&gt;articol pe KB&lt;/a&gt;. Îmi este greu să urmăresc logica de a rezolva o problemă pe care inițial susțineai că nu o ai în loc să te ridici de pe curul puturos și să verfici.&lt;/p&gt;
&lt;p&gt;Singurul motiv pentru care încă tolerez această distribuție este faptul că oferă pachete binare decente precum update-uri la versiunea de PHP, spre deosebire de anumite distribuții Linux ce au version lock, partea de backports e aproximativ inexistentă, iar un 3rd party oferă mai puțină încredere. Iar ca sysadmin am și altceva de făcut înafară de presupunerea că aș sta să-mi compilez singur serviciile. O fac atunci când nu am alternativă. Chiar și versiunea de PHP din Ubuntu Lucid este jenant configurată, are bug-uri prin ini-uri, etc. Dar măcar ăia nu emit pretenții de distribuție &amp;#8220;certificată&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Având în vedere experiențele proaste cu Zend, slabe șanse să le cumpăr vreodată vreun produs sau să-mi iau &amp;#8220;certificare&amp;#8221; de la ei din moment ce distribuțiile lor &amp;#8220;certificate&amp;#8221; nu îndeplinesc un minim nivel al bunului simț.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/QvZBe7BFEXE" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/instalarea-phpunit-sub-windows-7-zend-server-community-edition.html#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/instalarea-phpunit-sub-windows-7-zend-server-community-edition.html/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/instalarea-phpunit-sub-windows-7-zend-server-community-edition.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[phbench &#8211; PHP Benchmark Test]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/xD1TYTmXrjY/phbench-php-benchmark-test.html" />
		<id>http://www.saltwaterc.net/?p=902</id>
		<updated>2011-02-19T16:01:41Z</updated>
		<published>2011-02-19T12:29:45Z</published>
		<category scheme="http://www.saltwaterc.ro" term="PHP" /><category scheme="http://www.saltwaterc.ro" term="Programare" />		<summary type="html"><![CDATA[Obișnuiam să testez varii implementări de stive PHP. Îmi doream un test ceva mai complex ce să vizeze strict PHP. Din nefericire majoritatea chestiilor pe care le-am găsit erau fie prea simple (testau doar operații matematice în bună parte), fie erau prea dificil de instalat. Iar chestiile dificil de instalat nu sunt de mine atunci [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/phbench-php-benchmark-test.html">&lt;p&gt;Obișnuiam să testez varii implementări de stive PHP. Îmi doream un test ceva mai complex ce să vizeze strict PHP. Din nefericire majoritatea chestiilor pe care le-am găsit erau fie prea simple (testau doar operații matematice în bună parte), fie erau prea dificil de instalat. Iar chestiile dificil de instalat nu sunt de mine atunci când vine vorba de munci de astea simple.&lt;/p&gt;
&lt;p&gt;La un moment dat am scris &lt;a href="https://code.google.com/p/phbench/" title="phbench"&gt;phbench&lt;/a&gt;, o astfel de soluție, dar rezultatele erau prezentate într-o formă destul de dificilă pentru teste ceva mai îndelungate. Din fericire, mi-a trecut lenea și am rescris complet aplicația, păstrând ideea inițială. Iar acum mi-a trecut lenea de a anunța faptul că de aproape o lună am pus sus noua versiune, de care nu știe nici naiba pentru că nu am mai vorbit de phbench de o vreme. Și am rescris-o folosind &lt;a href="http://kohanaframework.org/" title="Kohana is an elegant HMVC PHP5 framework that provides a rich set of components for building web applications."&gt;Kohana Framework&lt;/a&gt;. Iar de această dată este mult mai utilizabilă din moment ce are o interfață AJAX iar rezultatele sunt detaliate și centralizate de către aplicația în sine.&lt;/p&gt;
&lt;p&gt;Spre deosebire de versiunea anterioară, lipsește interfața CLI, deși nu știu dacă o voi mai implementa vreodată. De cele mai multe ori am fost pus în situația să-mi pese de cum se mișcă PHP în server side și aproape deloc de cum se mișcă PHP pentru o aplicație CLI.&lt;/p&gt;
&lt;p&gt;Printre altele, este și un mini-framework pentru a scrie alte teste. Un nou test este practic o clasă ce respectă niște reguli prestabilite, detaliate în README. Se integrează direct în suportul existent, fără a face configurări de interfațare. phbench folosește &lt;a title="Reflection" href="http://en.wikipedia.org/wiki/Reflection_(computer_programming)"&gt;reflection&lt;/a&gt; pentru aceasta. Sunt deschis la sugestii pentru a include noi teste în distribuția oficială. Cu toate acestea, am evitat teste ce folosesc API-uri externe (gen MySQL, cURL) din moment ce sunt influențate de serverul la care se conectează. Eventual voi face o categorie de teste opționale ce se vor putea include în teste ce pot fi făcute relevante (exemplu: să se conecteze la același server MySQL în teste). Printre altele, deși proiectul nu este o prioritate a mea, voi implementa chestii minore (și mai am vreo 2-3 idei pe rol pentru interfață).&lt;/p&gt;
&lt;p&gt;&lt;a href="https://code.google.com/p/phbench/downloads/list"&gt;Download&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Și un screenshot:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.saltwaterc.net/wp-content/uploads/phbench.png" rel="lightbox-phbench" title="phbench"&gt;&lt;img class="alignnone size-medium wp-image-923" title="phbench" src="http://www.saltwaterc.net/wp-content/uploads/phbench-300x225.png" alt="" width="300" height="225" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/xD1TYTmXrjY" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/phbench-php-benchmark-test.html#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/phbench-php-benchmark-test.html/feed/atom" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/phbench-php-benchmark-test.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[VirtualBox ca serviciu de sistem]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/VResEt3E-lI/virtualbox-ca-serviciu-de-sistem.html" />
		<id>http://www.saltwaterc.net/?p=886</id>
		<updated>2011-01-26T19:50:32Z</updated>
		<published>2010-12-10T22:36:45Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Administrare" /><category scheme="http://www.saltwaterc.ro" term="Linux" /><category scheme="http://www.saltwaterc.ro" term="Programare" />		<summary type="html"><![CDATA[M-am lovit în mod repetitiv de problema rulării VirtualBox ca serviciu, dar până acum niciodată nu am fost mulțumit de soluție. Majoritatea scripturilor de init pe care le găseam aiurea în tramvai pe Internet făceau parte din categoria acelor scripturi ce necesită un serviciu per mașină virtuală. Iar cum subsemnatul e comod din fire și [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/virtualbox-ca-serviciu-de-sistem.html">&lt;p&gt;M-am lovit în mod repetitiv de problema rulării &lt;a href="http://www.virtualbox.org/" target="_blank"&gt;VirtualBox&lt;/a&gt; ca serviciu, dar până acum niciodată nu am fost mulțumit de soluție. Majoritatea scripturilor de init pe care le găseam aiurea în tramvai pe Internet făceau parte din categoria acelor scripturi ce necesită un serviciu per mașină virtuală. Iar cum subsemnatul e comod din fire și n-are chef să facă clasicul:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="bash" style="font-family:monospace;"&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;cp&lt;/span&gt; vboxservice-template vboxservice-machine-name
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;nano&lt;/span&gt; vboxservice-machine-name
&lt;span style="color: #666666; font-style: italic;"&gt;# write all that machine dependent junk, save&lt;/span&gt;
update-rc.d vboxservice-machine-name defaults&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;a inventat o soluție. Posibil nu cea mai bună, dar simplu de utilizat, implementat, extins. Stau și mă gândesc cum naiba geniile de pe &amp;#8220;Teh Internets&amp;#8221; n-au fost în stare să găsească o soluție mai rumegabilă până acum. Iar prin rumegabilă mă refer să abstractizeze un proces repetitiv iar ca parametru să fie un ID de mașină. Deci am luat o copie de /etc/init.d/skeleton și am purces la modificat. Ce-a ieșit, e downloadabil &lt;a href="http://www.saltwaterc.net/wp-download/virtualbox/vbox-machines.tar.bz2"&gt;aici&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Acest articol folosește și pe post de manual, deși nu e mare scofală.&lt;/p&gt;
&lt;p&gt;Pentru instalare se ia scriptul de mai sus, se trântește în /etc/init.d/ și se activează cu:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="bash" style="font-family:monospace;"&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;chmod&lt;/span&gt; +x &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;etc&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;init.d&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;vbox-machines
update-rc.d vbox-machines defaults&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Metoda de mai sus este valabilă pentru Debian &amp;#038; friends. Cu toate că bâzâie ceva mizerii despre &lt;a href="http://www.linuxfoundation.org/collaborate/workgroups/lsb" target="_blank" title="Linux Standard Base"&gt;LSB&lt;/a&gt;, n-am încercat pe alte nații de distribuții, deci nu garantez că funcționează, chiar dacă nu mai este nici o referință la start-stop-daemon, tipic pentru Debian și gașca.&lt;/p&gt;
&lt;p&gt;În mod implicit utilizatorul sub care rulează mașinile e root. Se poate modifica prin metoda standard de a edita parametrii din scripturile de Debian init:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="bash" style="font-family:monospace;"&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;nano&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;etc&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;default&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;vbox-machines&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;și se adaugă&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="bash" style="font-family:monospace;"&gt;&lt;span style="color: #007800;"&gt;CONTROL_USER&lt;/span&gt;=virtualbox&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;unde virtualbox este utilizatorul sub care se intenționează să se lanseze mașina virtuală. Evident, nu trebuie să fie acesta. Aceasta s-a implementat pentru a minimiza editările la nivel de script de init și pentru a avea bucuria sufletească a faptului de a fi câtuși de cât &amp;#8220;standards compliant&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Cam atât pe partea de instalare de serviciu. Dacă nu există directorul /etc/vbox.d/, o să aibă el grijă să zbiere. Pentru a-l face funcțional, se pun în directorul anterior fișiere cu nume identic cu cel al ID-urilor de mașină virtuală. Practic acel ID e un UUID ce se găsește în XML-ul de configurare al mașinii, fișier ce se găsește pe undeva pe aici:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;/home/virtualbox/.VirtualBox/Machines/Machine Name/Machine Name.xml&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;în funcție de utilizatorul folosit și mașina creată (exemplul de aici: Machine Name).&lt;/p&gt;
&lt;p&gt;Tehnic vorbind, în abstract s-ar putea folosi și numele mașinii în loc de UUID, dar dacă are spații în nume, gen &amp;#8220;Retard OS RTM VM&amp;#8221;, atunci este problematic, cu toate că sintaxa VBoxManage acceptă și numele mașinii în loc de UUID, iar serviciul subsemnatului pescuiește numele de pe disk și nu face mofturi la formă. Face mofturi la faptul că un spațiu primește escaping pe undeva pe acolo și la execuția lui VBoxManage for fi mizerii prin comandă. Mi-e mult prea lene să-l fac panaceu. Oricum acel UUID se găsește pe linia numărul 3 din fișier, iar un simplu:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="bash" style="font-family:monospace;"&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;touch&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;etc&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;vbox.d&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;uuid-of-the-machine&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;activează pornirea / oprirea automată. În plus, &lt;a href="http://code.google.com/p/phpvirtualbox/" target="_blank" title="phpVirtualBox - A web-based VirtualBox front-end written in PHP."&gt;phpVirtualBox&lt;/a&gt; este un proiect genial, recomandat chiar de către Oracle pe pagina lui VirtualBox iar subsemnatul intenționează să creeze / șteargă acele fișiere ce se integrează cu serviciul meu direct din interfața acestuia. Mai bine fac scurtă la click decât scurtă la taste. Îmi mai trebuie doar chef să fac un patch pentru phpVirtualBox.&lt;/p&gt;
&lt;p&gt;PS: ar mai fi de adăugat un mic detaliu elementar și anume faptul că mașina nu e oprită la stop, ci se folosește &amp;#8220;savestate&amp;#8221;, mai mult din motive ce țin de VirtualBox și mai puțin de opțiune personală. Pentru un shutdown, se recomandă metoda standard a sistemului de operare ce este găzduit.&lt;/p&gt;
&lt;p&gt;Ca actualizare de ultimă oră: este nevoie ca un serviciu de VirtualBox să ruleze în prealabil. Datorită faptului că aveam un init script pentru VirtualBox web service, scriptul meu funcționa. În pachetul standard de la Oracle, vine un serviciu vboxdrv. Pentru funcționare corectă, serviciul meu trebuie să ruleze &lt;strong&gt;după&lt;/strong&gt; acesta, deci fie scriptului din init.d i se dă un nume ce în ordinea lexicografică este după vboxdrv sau se mânărește prin update-rc.d sau scripturi de startup în funcție de runlevel / prioritate la pornire.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/VResEt3E-lI" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/virtualbox-ca-serviciu-de-sistem.html#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/virtualbox-ca-serviciu-de-sistem.html/feed/atom" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/virtualbox-ca-serviciu-de-sistem.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[Filtru pentru mesaje necitite în Gmail]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/vyFXIZbeH_8/filtru-pentru-mesaje-necitite-in-gmail.html" />
		<id>http://www.saltwaterc.net/?p=879</id>
		<updated>2010-11-11T16:10:00Z</updated>
		<published>2010-11-11T16:10:00Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Tech" /><category scheme="http://www.saltwaterc.ro" term="Web" />		<summary type="html"><![CDATA[De ceva vreme am depus eforturi substanțiale pentru a-mi muta tot emailul către Gmail, sătul fiind de varii clienți desktop și din dorința de a mă atașa acestui trend: de pe desktop pe web. Din nefericire, Gmail nu oferă o metodă de filtrare a mailurilor necitite. Așa ca pentru proști (a se citi un buton). [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/filtru-pentru-mesaje-necitite-in-gmail.html">&lt;p&gt;De ceva vreme am depus eforturi substanțiale pentru a-mi muta tot emailul către Gmail, sătul fiind de varii clienți desktop și din dorința de a mă atașa acestui trend: de pe desktop pe web. Din nefericire, Gmail nu oferă o metodă de filtrare a mailurilor necitite. Așa ca pentru proști (a se citi un buton). Deci am purces către un mic research. Soluția este cretin de simplă, dar în sensul în care un UNIX shell este simplu pentru cei ce știu, nu pentru afoni.&lt;/p&gt;
&lt;p&gt;În câmpul de căutare din Gmail se introduce: label:unread. Voila, apar doar mailurile necitite. Restul e can-can.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/vyFXIZbeH_8" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/filtru-pentru-mesaje-necitite-in-gmail.html#comments" thr:count="3" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/filtru-pentru-mesaje-necitite-in-gmail.html/feed/atom" thr:count="3" />
		<thr:total>3</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/filtru-pentru-mesaje-necitite-in-gmail.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[Pentru Internet Explorer]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/bfKVqSrRS2Y/pentru-internet-explorer.html" />
		<id>http://www.saltwaterc.net/?p=868</id>
		<updated>2010-11-11T16:16:00Z</updated>
		<published>2010-10-22T16:46:24Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Rant" /><category scheme="http://www.saltwaterc.ro" term="Web" />		<summary type="html"><![CDATA[Aplicaţia de plată este optimizată pentru Internet Explorer. Vă recomandăm să nu utilizaţi alte browsere, deoarece tranzacţia de plată poate fi întreruptă înainte de finalizare. Aceasta este metoda de a spune pe o limbă eufemistică: programatorii la care am apelat sunt niște incompetenți ce nu sunt în stare să implementeze un modul de plată și [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/pentru-internet-explorer.html">&lt;blockquote&gt;&lt;p&gt;&lt;span style="color: blue;"&gt;Aplicaţia de plată este optimizată pentru &lt;strong&gt;Internet Explorer&lt;/strong&gt;.&lt;br /&gt;
Vă recomandăm să nu utilizaţi alte browsere, deoarece tranzacţia de plată poate fi întreruptă înainte de finalizare.&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;div style="float:left;margin-right:10px"&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/7b/Usage_share_of_web_browsers_(Source_Net_Applications).svg/200px-Usage_share_of_web_browsers_(Source_Net_Applications).svg.png" alt="Usage share of web browsers" /&gt;&lt;/div&gt;
&lt;p&gt;Aceasta este metoda de a spune pe o limbă eufemistică: programatorii la care am apelat sunt niște incompetenți ce nu sunt în stare să implementeze un modul de plată și pe alte browsere. Iar cei de la &lt;a title="Electrica Furnizare Transilvania Sud" href="http://efts.ro/" target="_blank" rel="nofollow"&gt;Electrica Furnizare Transilvania Sud&lt;/a&gt; cu acel site jenant insistă pe această carte. De parcă toată lumea are Internet Explorer. Sau de parcă toată lumea care-l are chiar vrea să-l folosească.&lt;/p&gt;
&lt;p&gt;Wikipedia &lt;a title="Usage share of web browsers: Summary table" href="http://en.wikipedia.org/wiki/Usage_share_of_web_browsers#Summary_table" target="blank"&gt;ne anunță faptul că IE o cam ia la vale&lt;/a&gt; de ceva vreme.&lt;/p&gt;
&lt;p&gt;Dar evident, niște dinozauri de la Electrica par să nu țină cont de acest aspect. Ba mai mult, tratează problema cu cel mai pur românism, pardon, indiferență, așa cum a fost tratat și mailul subsemnatului trimis prin formularul de contact, în legătură cu acest aspect.&lt;/p&gt;
&lt;p&gt;Ultimul cui în grindă este faptul că aplicația de mai sus este scrisă-n PHP, ce între noi fie vorba rulează mai bine sub *nix. Dacă IIS 7.x (nu acel 6.0 folosit de către EFTS) e decent, PHP sub Windows nu mă convinge. Am mai zis-o și o mai zic. Atâta timp cât o să fie valabilă.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/bfKVqSrRS2Y" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/pentru-internet-explorer.html#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/pentru-internet-explorer.html/feed/atom" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/pentru-internet-explorer.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[mysqldump cu rename]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/nI8W36DoWYM/mysqldump-cu-rename.html" />
		<id>http://www.saltwaterc.net/?p=864</id>
		<updated>2010-10-12T11:53:00Z</updated>
		<published>2010-10-12T11:42:13Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Administrare" />		<summary type="html"><![CDATA[O chestie ce lipsește de multicel în mysqldump este opțiunea de a putea da un &#8220;rename&#8221; la o bază de date în fișierul de dump. Din moment ce nu pot aștepta la infinit pentru ca acest lucru să apară în versiunea standard, rămân două alternative: aplicații de dump ce știu deja să facă aceasta un [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/mysqldump-cu-rename.html">&lt;p&gt;O chestie ce lipsește de multicel în mysqldump este opțiunea de a putea da un &amp;#8220;rename&amp;#8221; la o bază de date în fișierul de dump. Din moment ce nu pot aștepta la infinit pentru ca acest lucru să apară în versiunea standard, rămân două alternative:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;aplicații de dump ce știu deja să facă aceasta&lt;/li&gt;
&lt;li&gt;un pic de lucru cu sed prin fișierul de dump&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Din moment ce nu am găsit decât o chestie în Python ce nu știu exact ce face, am ales a doua variantă, ceva mai rumegabilă. Să zicem că am scriptul dbdump în directorul curent, cu privilegiu de execuție:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="bash" style="font-family:monospace;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;#!/bin/sh&lt;/span&gt;
mysqldump &lt;span style="color: #660033;"&gt;-u&lt;/span&gt; &lt;span style="color: #007800;"&gt;$1&lt;/span&gt; &lt;span style="color: #660033;"&gt;-B&lt;/span&gt; &lt;span style="color: #007800;"&gt;$2&lt;/span&gt; &lt;span style="color: #660033;"&gt;--skip-comments&lt;/span&gt; &lt;span style="color: #660033;"&gt;-xvnp&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #007800;"&gt;$3&lt;/span&gt;.sql
&lt;span style="color: #c20cb9; font-weight: bold;"&gt;sed&lt;/span&gt; &lt;span style="color: #660033;"&gt;-i&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;&amp;quot;s/USE \&lt;span style="color: #780078;"&gt;`$2\`&lt;/span&gt;;/USE \&lt;span style="color: #780078;"&gt;`$3\`&lt;/span&gt;;/g&amp;quot;&lt;/span&gt; &lt;span style="color: #007800;"&gt;$3&lt;/span&gt;.sql
pbzip2 &lt;span style="color: #660033;"&gt;-fv&lt;/span&gt; &lt;span style="color: #007800;"&gt;$3&lt;/span&gt;.sql&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Invocarea este simplă: ./dbdump mysql_username database_to_dump new_name&lt;/p&gt;
&lt;p&gt;Mai departe face totul de unul singur. Dă dump, modifică numele bazei de date și face o compresie cu pbzip2 (Parallel bzip2). Se poate modifica să funcționeze cu bzip2 standard, dar pe servere multi-core și / sau multi-procesor merită efortul de a instala pbzip2.&lt;/p&gt;
&lt;p&gt;Opțional, pentru puturoși precum subsemnatul, se mai poate trânti o linie în script ce să mute arhiva pe noul server:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="bash" style="font-family:monospace;"&gt;&lt;span style="color: #c20cb9; font-weight: bold;"&gt;scp&lt;/span&gt; &lt;span style="color: #660033;"&gt;-i&lt;/span&gt; transfer.pem &lt;span style="color: #007800;"&gt;$3&lt;/span&gt;.sql.bz2 transfer&lt;span style="color: #000000; font-weight: bold;"&gt;@&lt;/span&gt;example.com:&lt;span style="color: #007800;"&gt;$3&lt;/span&gt;.sql.bz2&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Am pus sintaxa pentru oameni plictisiți de parole de SSH, recte subsemnatul, folosind o cheie privată. Nu e musai, dar e mai comod, în special dacă sunt mai multe baze de date de transferat.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/nI8W36DoWYM" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/mysqldump-cu-rename.html#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/mysqldump-cu-rename.html/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/mysqldump-cu-rename.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[Lookup Table în PHP]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/A6AcKpBPNmQ/lookup-table-in-php.html" />
		<id>http://www.saltwaterc.net/?p=839</id>
		<updated>2010-09-22T16:05:57Z</updated>
		<published>2010-09-21T14:47:47Z</published>
		<category scheme="http://www.saltwaterc.ro" term="PHP" /><category scheme="http://www.saltwaterc.ro" term="Programare" />		<summary type="html"><![CDATA[Problema implementării unui lookup table pare uneori simplă. În cazul în care se implementează ca un array indexat, iar obținerea unei valori se face prin metoda dă-mi valoarea Y de la cheia X, atunci problemele de performanță nu intervin. M-am lovit de altă bubă, și anume implementarea unui lookup table simplu bazat pe căutare liniară [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/lookup-table-in-php.html">&lt;p&gt;Problema implementării unui lookup table pare uneori simplă. În cazul în care se implementează ca un array indexat, iar obținerea unei valori se face prin metoda dă-mi valoarea Y de la cheia X, atunci problemele de performanță nu intervin.&lt;/p&gt;
&lt;p&gt;M-am lovit de altă bubă, și anume implementarea unui &lt;a title="Simple lookup in an array" href="http://en.wikipedia.org/wiki/Lookup_table#Simple_lookup_in_an_array.2C_an_associative_array_or_a_linked_list_.28unsorted_list.29" target="_blank"&gt;lookup table simplu bazat pe căutare liniară&lt;/a&gt; construit pe baza unui pre-fetch. Ideea este simplu de implementat, și deși procesul respectiv nu rulează prea des, numărul valorilor distincte complică problema destul de mult. Într-un lookup table de 70.000 &amp;#8211; 80.000 valori căutarea unui număr mai mare de valori durează &lt;strong&gt;peste jumătate de oră&lt;/strong&gt; (nu știu exact, am oprit benchmark-ul după 30 minute) cu procesorul (sau un core) la ~100% load, pe când restul operațiilor se execută în &lt;strong&gt;secunde&lt;/strong&gt;. Cam multicel pentru o căutare ce ar trebui să returneze TRUE / FALSE. Faptul că numărul de căutări este mai mare decât lookup table-ul în sine mai bate un cui în coșciugul metodei de mai sus. Se mai adaugă și faptul că deși în teorie valorie ar trebui să fie unice, datele din pre-fetch nu sunt neapărat validate în acest sens.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pre-fetch &amp;#8211; pseudo implementare&lt;/strong&gt;&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="php" style="font-family:monospace;"&gt;&lt;span style="color: #000088;"&gt;$haystack&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #990000;"&gt;array&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #b1b100;"&gt;while&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$value&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; get_data&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
	&lt;span style="color: #000088;"&gt;$haystack&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000088;"&gt;$value&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ideea este simplă. Stiva $haystack va conține toate valorile, inclusiv cele duplicat. Mă rog, pre-fetch-ul implementează ideea de &amp;#8220;stivă&amp;#8221; pentru că auto-indexarea cu [] are aceeași funcționalitate ca și array_push(), dar câștigă puțin la viteza de inserare a datelor. Durează câteva secunde, nu este o operație foarte complexă. De aici începe greul.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Căutare &amp;#8211; implementare uzuală&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Există tentația de a face căutarea pe baza lui in_array() sau array_search(). Ambele sunt aproximativ la fel de rapide (in_array() este cu maxim 1% mai lentă). Problema principală este căutarea liniară, fără indexare.&lt;/p&gt;
&lt;p&gt;Dau chiar exemplele din codul meu de benchmark:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="php" style="font-family:monospace;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; bench_in_array&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$needle&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;
	&lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
		&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #990000;"&gt;in_array&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$needle&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;haystack&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
	&lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; bench_array_search&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$needle&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;
	&lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
		&lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #990000;"&gt;array_search&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$needle&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;haystack&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #339933;"&gt;===&lt;/span&gt; &lt;span style="color: #009900; font-weight: bold;"&gt;FALSE&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;
			&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #009900; font-weight: bold;"&gt;FALSE&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
		&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #009900; font-weight: bold;"&gt;TRUE&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
	&lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Căutare &amp;#8211; soluția optimă&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ambele soluții anterioare sunt aproximativ la fel de rapide, dar aproximativ la fel de lente. Interesul este dacă există o valoare. Duplicatele doar încurcă.&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="php" style="font-family:monospace;"&gt;&lt;span style="color: #000088;"&gt;$haystack&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #990000;"&gt;array_flip&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$haystack&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Inversează valoarea cu cheile dintr-un array. Valorile duplicat dispar din moment ce un array (mă rog, devine ordered map) nu poate avea chei duplicat. Se pot aplica alte două metode distincte. Dau din nou exemplu din codul meu de benchmark:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="php" style="font-family:monospace;"&gt;	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; bench_array_flip_isset&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$needle&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;
	&lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
		&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #990000;"&gt;isset&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;flipped_haystack&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$needle&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
	&lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
	&lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; bench_array_flip_array_key_exists&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$needle&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;
	&lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
		&lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #990000;"&gt;array_key_exists&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$needle&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$this&lt;/span&gt;&lt;span style="color: #339933;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #004000;"&gt;flipped_haystack&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
	&lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Pentru o listă de $needle scurtă (1% din $haystack, valori 100% valide), sunt aproximativ echivalente. Pentru un input 50% valid de dimensiunea $haystack, array_key_exists() este cu aproximativ 80% &amp;#8211; 100% mai lent. Dar acum urmează partea frumoasă: căutarea se face indexat. Metoda este de cel puțin 2000 ori mai rapidă decât căutarea cu in_array() / array_search(). Adică în mod uzual căutarea de mai devreme de peste jumatate de oră durează aproximativ sub 3 secunde cu isset() și sub 5 secunde cu array_key_search(). Metodă testată pe un lookup table de 100.000 valori ce mi-a cam ucis browserul. Chrome a crăpat, Firefox a încărcat output-ul de la Codebench în vreo 3.5 GiB RAM. Atașez și imagini ce stau dovadă atrocității de mai devreme.&lt;/p&gt;
&lt;div style="text-align: center;"&gt;&lt;a href="http://www.saltwaterc.net/wp-content/uploads/lookup_table_both.png" rel="lightbox-lookup-table" title="isset() vs. array_key_search()"&gt;&lt;img class="alignnone size-thumbnail wp-image-840" style="padding: 10px;" title="lookup_table_both" src="http://www.saltwaterc.net/wp-content/uploads/lookup_table_both-150x150.png" alt="" width="150" height="150" /&gt;&lt;/a&gt;&lt;a href="http://www.saltwaterc.net/wp-content/uploads/lookup_table_isset.png" rel="lightbox-lookup-table" title="isset()"&gt;&lt;img class="alignnone size-thumbnail wp-image-841" style="padding: 10px;" title="lookup_table_isset" src="http://www.saltwaterc.net/wp-content/uploads/lookup_table_isset-150x150.png" alt="" width="150" height="150" /&gt;&lt;/a&gt;&lt;a href="http://www.saltwaterc.net/wp-content/uploads/lookup_table_array_key_exists.png" rel="lightbox-lookup-table" title="array_key_search()"&gt;&lt;img class="alignnone size-thumbnail wp-image-842" style="padding: 10px;" title="lookup_table_array_key_exists" src="http://www.saltwaterc.net/wp-content/uploads/lookup_table_array_key_exists-150x150.png" alt="" width="150" height="150" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/A6AcKpBPNmQ" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/lookup-table-in-php.html#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/lookup-table-in-php.html/feed/atom" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/lookup-table-in-php.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[Parole aleatoare în Linux, &#8220;extended ASCII&#8221;]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/nhGBpaLNnCo/parole-aleatoare-in-linux-extended-ascii.html" />
		<id>http://www.saltwaterc.net/?p=819</id>
		<updated>2010-08-09T15:47:33Z</updated>
		<published>2010-08-09T14:57:41Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Administrare" /><category scheme="http://www.saltwaterc.ro" term="Linux" /><category scheme="http://www.saltwaterc.ro" term="Programare" />		<summary type="html"><![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 [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/parole-aleatoare-in-linux-extended-ascii.html">&lt;p&gt;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:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="bash" style="font-family:monospace;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;function&lt;/span&gt; urandompass&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#41;&lt;/span&gt;
&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#123;&lt;/span&gt;
	&lt;span style="color: #c20cb9; font-weight: bold;"&gt;cat&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;dev&lt;span style="color: #000000; font-weight: bold;"&gt;/&lt;/span&gt;urandom &lt;span style="color: #000000; font-weight: bold;"&gt;|&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;tr&lt;/span&gt; &lt;span style="color: #660033;"&gt;-dc&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;'[\41-\176\241-\254\256-\376]'&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;|&lt;/span&gt; fold &lt;span style="color: #660033;"&gt;-w&lt;/span&gt; &lt;span style="color: #007800;"&gt;$1&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;|&lt;/span&gt; &lt;span style="color: #c20cb9; font-weight: bold;"&gt;head&lt;/span&gt; &lt;span style="color: #660033;"&gt;-n&lt;/span&gt; &lt;span style="color: #000000;"&gt;1&lt;/span&gt;
&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;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 &amp;#8220;block cipher&amp;#8221;.&lt;/p&gt;
&lt;p&gt;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, &amp;#8220;Terminal » Set Character Encoding » Add or Remove &amp;#8230;&amp;#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.&lt;/p&gt;
&lt;p&gt;Acum urmează partea pentru obsedații de detalii aka cei după chipul și asemănarea subsemnatului. &amp;#8220;Limitarea&amp;#8221; la extended ASCII, ce oricum oferă o complexitate mai bună decât majoritatea generatoarelor, provine de fapt din tr. Un info coreutils &amp;#8216;tr invocation&amp;#8217; în shell specifică destul de clar: &amp;#8220;Currently `tr&amp;#8217; fully supports only single-byte characters.&amp;#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.&lt;/p&gt;
&lt;p&gt;În DEC:&lt;/p&gt;
&lt;p&gt;33-126&lt;br /&gt;
161-172&lt;br /&gt;
174-254&lt;/p&gt;
&lt;p&gt;În OCT:&lt;/p&gt;
&lt;p&gt;41-176&lt;br /&gt;
241-254&lt;br /&gt;
256-376&lt;/p&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;p&gt;Pentru PHP-iști:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="php" style="font-family:monospace;"&gt;&lt;span style="color: #b1b100;"&gt;for&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$i&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #000088;"&gt;$i&lt;/span&gt; &lt;span style="color: #339933;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #cc66cc;"&gt;256&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #000088;"&gt;$i&lt;/span&gt;&lt;span style="color: #339933;"&gt;++&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
	&lt;span style="color: #b1b100;"&gt;echo&lt;/span&gt; &lt;span style="color: #000088;"&gt;$i&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;': '&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt;&lt;span style="color: #990000;"&gt;chr&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$i&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;.&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;quot;&lt;span style="color: #000099; font-weight: bold;"&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Iar pentru snobii cu C, avem alternativă &lt;img src='http://www.saltwaterc.ro/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /&gt;  :&lt;/p&gt;
&lt;/pre&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="c" style="font-family:monospace;"&gt;&lt;span style="color: #339933;"&gt;#include &lt;/span&gt;
&amp;nbsp;
&lt;span style="color: #993333;"&gt;int&lt;/span&gt; main&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
        &lt;span style="color: #b1b100;"&gt;for&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #993333;"&gt;int&lt;/span&gt; i &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #0000dd;"&gt;0&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; i &lt;span style="color: #339933;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #0000dd;"&gt;256&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; i&lt;span style="color: #339933;"&gt;++&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
                &lt;span style="color: #000066;"&gt;printf&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&amp;quot;%d: %c&lt;span style="color: #000099; font-weight: bold;"&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; i&lt;span style="color: #339933;"&gt;,&lt;/span&gt; i&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
        &lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;
        &lt;span style="color: #b1b100;"&gt;return&lt;/span&gt; &lt;span style="color: #0000dd;"&gt;0&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;gcc -std=c99 -o chars chars.c&lt;/p&gt;
&lt;p&gt;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:
&lt;/pre&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="bash" style="font-family:monospace;"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;#!/bin/bash&lt;/span&gt;
&amp;nbsp;
chr&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#41;&lt;/span&gt;
&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#123;&lt;/span&gt;
	&lt;span style="color: #7a0874; font-weight: bold;"&gt;printf&lt;/span&gt; \\$&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;printf&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;'%03o'&lt;/span&gt; &lt;span style="color: #007800;"&gt;$1&lt;/span&gt;&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#41;&lt;/span&gt;
&lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style="color: #007800;"&gt;i&lt;/span&gt;=&lt;span style="color: #000000;"&gt;0&lt;/span&gt;
&lt;span style="color: #000000; font-weight: bold;"&gt;while&lt;/span&gt; &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#91;&lt;/span&gt; &lt;span style="color: #007800;"&gt;$i&lt;/span&gt; &lt;span style="color: #660033;"&gt;-lt&lt;/span&gt; &lt;span style="color: #000000;"&gt;256&lt;/span&gt; &lt;span style="color: #7a0874; font-weight: bold;"&gt;&amp;#93;&lt;/span&gt;; &lt;span style="color: #000000; font-weight: bold;"&gt;do&lt;/span&gt;
	&lt;span style="color: #7a0874; font-weight: bold;"&gt;echo&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;&amp;quot;&lt;span style="color: #007800;"&gt;$i&lt;/span&gt;: &lt;span style="color: #780078;"&gt;`chr $i`&lt;/span&gt;&amp;quot;&lt;/span&gt;
	&lt;span style="color: #7a0874; font-weight: bold;"&gt;let&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;&amp;quot;i++&amp;quot;&lt;/span&gt;
&lt;span style="color: #000000; font-weight: bold;"&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/nhGBpaLNnCo" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/parole-aleatoare-in-linux-extended-ascii.html#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/parole-aleatoare-in-linux-extended-ascii.html/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/parole-aleatoare-in-linux-extended-ascii.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[Căi UNIX corecte în PHP]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/9bvq_RcqtCc/cai-unix-corecte-in-php.html" />
		<id>http://www.saltwaterc.net/?p=810</id>
		<updated>2010-06-05T16:17:21Z</updated>
		<published>2010-06-03T11:50:11Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Administrare" /><category scheme="http://www.saltwaterc.ro" term="PHP" /><category scheme="http://www.saltwaterc.ro" term="Programare" />		<summary type="html"><![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 [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/cai-unix-corecte-in-php.html">&lt;p&gt;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 &amp;#8220;boilerplate code&amp;#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 &amp;#8220;web oriented&amp;#8221;, funcționează bine merci și pentru &amp;#8220;general purpose&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Să revin la problema inițială. Practic se pot identifica două probleme: a) validarea unei căi inexistente &amp;#8211; deci apelăm la regex; b) validarea directorului &amp;#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ă.&lt;/p&gt;
&lt;p&gt;Rezumat, codul arată cam așa:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="php" style="font-family:monospace;"&gt;&lt;span style="color: #000088;"&gt;$validate&lt;/span&gt; &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #990000;"&gt;preg_match&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;'/^(\/[^\0]*?\/?)[^\0\/]+$/'&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$path&lt;/span&gt;&lt;span style="color: #339933;"&gt;,&lt;/span&gt; &lt;span style="color: #000088;"&gt;$matches&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
&lt;span style="color: #b1b100;"&gt;if&lt;/span&gt; &lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #990000;"&gt;empty&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$validate&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #339933;"&gt;===&lt;/span&gt; &lt;span style="color: #009900; font-weight: bold;"&gt;TRUE&lt;/span&gt; OR &lt;span style="color: #990000;"&gt;is_dir&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$matches&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;1&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #339933;"&gt;!==&lt;/span&gt; &lt;span style="color: #009900; font-weight: bold;"&gt;TRUE&lt;/span&gt; OR &lt;span style="color: #990000;"&gt;is_dir&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#40;&lt;/span&gt;&lt;span style="color: #000088;"&gt;$matches&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#91;&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#93;&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt; &lt;span style="color: #339933;"&gt;!==&lt;/span&gt; &lt;span style="color: #009900; font-weight: bold;"&gt;FALSE&lt;/span&gt;&lt;span style="color: #009900;"&gt;&amp;#41;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&amp;#123;&lt;/span&gt;
	&lt;span style="color: #666666; font-style: italic;"&gt;// handle error here&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;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 &amp;#8211; acesta fiind contextul în care operez. Cu toate acestea, soluția se poate adapta ușor pentru căi relative.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/9bvq_RcqtCc" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/cai-unix-corecte-in-php.html#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/cai-unix-corecte-in-php.html/feed/atom" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/cai-unix-corecte-in-php.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[SopCast sub Linux]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/XUGUm3BxaOM/sopcast-sub-linux.html" />
		<id>http://www.saltwaterc.net/?p=794</id>
		<updated>2010-06-03T10:49:32Z</updated>
		<published>2010-06-02T21:30:05Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Linux" />		<summary type="html"><![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 [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/sopcast-sub-linux.html">&lt;p&gt;Probabil că te întrebi ce e ăla &lt;a title="SopCast" href="http://www.sopcast.com/" target="_blank"&gt;SopCast&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;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 &amp;#8211; forțat trebuie să le plătesc abonament ăstora de la Televizunea Națională, măcar de atâta să mă bucur.&lt;/p&gt;
&lt;p&gt;Ceea ce incompetenții de mai sus cu site-urile lor au transformat în &amp;#8220;Rocket Science&amp;#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:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;a href="sop://broker.sopcast.com:3912/60707"&gt;sop://broker.sopcast.com:3912/60707&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;sudo apt-add-repository ppa:jason-scheunemann/ppa&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Se instalează pachetul sopcast-player și voila, gata de F1.&lt;/p&gt;
&lt;p&gt;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 &amp;#8220;Channel Guide&amp;#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.&lt;/p&gt;
&lt;p&gt;PS: în general, durează câteva secunde până stream-ul devine &amp;#8220;văzubil&amp;#8221;, până se curăță artefactele.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/XUGUm3BxaOM" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/sopcast-sub-linux.html#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/sopcast-sub-linux.html/feed/atom" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/sopcast-sub-linux.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[G-WAN &#8211; acceleratorul de web]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/xxp3nzQNls4/g-wan-acceleratorul-de-web.html" />
		<id>http://www.saltwaterc.net/?p=791</id>
		<updated>2010-11-11T16:16:31Z</updated>
		<published>2010-05-31T14:18:11Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Administrare" /><category scheme="http://www.saltwaterc.ro" term="Linux" /><category scheme="http://www.saltwaterc.ro" term="Programare" /><category scheme="http://www.saltwaterc.ro" term="Web" />		<summary type="html"><![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 [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/g-wan-acceleratorul-de-web.html">&lt;p&gt;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 &amp;#8220;&lt;a title="What every programmer should know about memory" href="https://lwn.net/Articles/250967/" target="_blank"&gt;What every programmer should know about memory&lt;/a&gt;&amp;#8220;, chestie pe care vreau să o parcurg pe îndelete pe când voi avea timp.&lt;/p&gt;
&lt;p&gt;Deci ce este acest &lt;a title="G-WAN is a FREE Web App. server using full ANSI C scripts" href="http://trustleap.com/" target="_blank"&gt;G-WAN&lt;/a&gt;? 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;amp; play folosită de PHP-iști. Și evident, caching, acea sperietoare de &amp;#8220;web developers&amp;#8221;, altfel nu ar fi fost chiar atât de rapide.&lt;/p&gt;
&lt;p&gt;Am urmărit îndeaproape proiectul de pe la v1.0.3 deoarece mi s-a părut interesantă prezentarea, dar fără aplicabilitate momentană &amp;#8220;in real life&amp;#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.&lt;/p&gt;
&lt;p&gt;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 &lt;a title="I can has Makavelis numbers" href="http://www.saltwaterc.net/programare/i-can-has-makavelis-numbers.html" target="_blank"&gt;despre care vorbeam aici&lt;/a&gt;, 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.&lt;/p&gt;
&lt;p&gt;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 &amp;#8220;rețea normală&amp;#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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;De altfel, la capitolul conținut static nu am observat o viteză mărită cu ordine de magnitudine față de &lt;a title="nginx" href="http://nginx.org/" target="_blank"&gt;nginx&lt;/a&gt;, 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 &amp;#8220;production ready&amp;#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 &amp;#8211; sau să se apeleze la hack-uri precum NAT prerouting în iptables ori *inetd &amp;#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.&lt;/p&gt;
&lt;p&gt;Configurația este &amp;#8230; ce configurație? De fapt până și pentru virtual hosting se folosește un sistem de &amp;#8220;convention over configuration&amp;#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 &amp;#8230; sunt specificații, mai mult sau mai puțin interesante.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; săpând puțin prin web, am dat de &lt;a title="CTPP" href="http://ctpp.havoc.ru/en/" target="_blank"&gt;CTPP&lt;/a&gt; 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.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/xxp3nzQNls4" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/g-wan-acceleratorul-de-web.html#comments" thr:count="4" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/g-wan-acceleratorul-de-web.html/feed/atom" thr:count="4" />
		<thr:total>4</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/g-wan-acceleratorul-de-web.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[Apache 2+mod_fcgid &#8211; setup rapid pentru test/dezvoltare]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/0hcUnpbNKyk/apache-2-mod-fcgid-setup-rapid-pentru-test-dezvoltare.html" />
		<id>http://www.saltwaterc.net/linux/apache-2-mod-fcgid-setup-rapid-pentru-test-dezvoltare.html</id>
		<updated>2010-05-25T10:14:08Z</updated>
		<published>2010-05-25T10:14:03Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Administrare" /><category scheme="http://www.saltwaterc.ro" term="Linux" />		<summary type="html"><![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 [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/apache-2-mod-fcgid-setup-rapid-pentru-test-dezvoltare.html">&lt;p&gt;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 &amp;#8220;yet another Apache smart-ass tweak&amp;#8221;. Problema nu este în viteza efectivă a soft-ului ci în arhitectura în sine. &lt;a target="_blank" href="http://ha.ckers.org/slowloris/"&gt;Să mai zic ceva de Slowloris&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;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;amp; friends se rezolvă simplu cu un:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;apt-get -y install libapache2-mod-fcgid&lt;br /&gt;a2dismod php5&lt;br /&gt;a2enmod fcgid&lt;br /&gt;/etc/init.d/apache2 force-reload&lt;br /&gt;apt-get -y install php5-cgi&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &amp;#8220;kewl, I just installd Lenux and PHP&amp;#8221;. Dar nu e nici &amp;#8220;rocket science&amp;#8221;. Ca idee: nano /etc/apache2/mods-enabled/fcgid.conf iar pe post de conținut:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;lt;IfModule mod_fcgid.c&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AddHandler fcgid-script .fcgi .php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DefaultInitEnv PHPRC /etc/php5/cgi&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DefaultInitEnv PHP_FCGI_MAX_REQUESTS 10000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MaxRequestsPerProcess 10000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MaxProcessCount 10&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IPCCommTimeout 240&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IdleTimeout 240&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FCGIWrapper /usr/bin/php-cgi .php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AddType application/x-httpd-php .php&lt;br /&gt;&amp;lt;/IfModule&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Aceasta este sintaxa &amp;#8220;sigură&amp;#8221;, deși ultimele versiuni ale mod_fcgid includ o sintaxă nouă iar cea veche este marcată ca &amp;#8220;deprecated&amp;#8221;. Pentru cei cu Ubuntu 10.04 LTS sau o altă distribuție relativ nouă, sintaxa actualizată este următoarea:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;lt;IfModule mod_fcgid.c&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AddHandler fcgid-script .fcgi .php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FcgidInitialEnv PHPRC /etc/php5/cgi&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 10000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FcgidMaxRequestsPerProcess 10000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FcgidMaxProcesses 10&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FcgidIOTimeout 240&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FcgidIdleTimeout 240&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FcgidWrapper /usr/bin/php-cgi .php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AddType application/x-httpd-php .php&lt;br /&gt;&amp;lt;/IfModule&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Atenție: nu va funcționa pe versiunile vechi de mod_fcgid!&lt;/p&gt;
&lt;p&gt;Î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 &amp;lt;Directory&amp;gt; din virtual host (nu e nevoie pentru &amp;lt;Directory /&amp;gt; în anumite cazuri) sau din .htaccess. Teoretic Options, conform documentației, poate fi setat în context &amp;lt;VirtualHost&amp;gt;, dar practic existența unui &amp;lt;Directory&amp;gt; cu Options o invalidează. Se poate seta doar pentru &amp;lt;Directory /&amp;gt; dacă toate celelalte definiții &amp;lt;Directory&amp;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ă &amp;#8220;manualul de securitate&amp;#8221; presupune configurare per virtual host și suEXEC versus rularea sub userul web serverului și un singur Dumnezeu pentru toate fișierele.&lt;/p&gt;
&lt;p&gt;Din punctul de vedere al eficienței, în idle (după restartul serviciului) cu setup-ul implicit sub Ubuntu Hardy:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; StartServers&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MaxClients&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 150&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MinSpareThreads&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 25&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MaxSpareThreads&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 75&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ThreadsPerChild&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 25&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MaxRequestsPerChild&amp;nbsp;&amp;nbsp; 0&lt;br /&gt;&amp;lt;/IfModule&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;și un singur PHP upstream, am obținut un record de memory footprint pentru Apache 2: 18MiB.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/0hcUnpbNKyk" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/apache-2-mod-fcgid-setup-rapid-pentru-test-dezvoltare.html#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/apache-2-mod-fcgid-setup-rapid-pentru-test-dezvoltare.html/feed/atom" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/apache-2-mod-fcgid-setup-rapid-pentru-test-dezvoltare.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[Ubuntu și network management-ul]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/Uhs2yY5qpDc/ubuntu-si-network-management-ul.html" />
		<id>http://www.saltwaterc.net/linux/ubuntu-si-network-management-ul.html</id>
		<updated>2010-05-21T23:08:37Z</updated>
		<published>2010-05-21T11:33:08Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Linux" />		<summary type="html"><![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 [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/ubuntu-si-network-management-ul.html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Din fericire nu sunt singurul nemulțumit de problemele inerente ale părții de network management din Gnome deci a apărut alternativa: &lt;a target="_blank" href="http://wicd.sourceforge.net/"&gt;wicd&lt;/a&gt;. 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) &lt;a target="_blank" href="http://www.netsetman.com/index.php?s=nsm"&gt;NetSetMan&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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ă &amp;#8220;posibilitate&amp;#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.&lt;/p&gt;
&lt;p&gt;Î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 &lt;a target="_blank" href="http://www.opendns.com/"&gt;OpenDNS&lt;/a&gt; și &lt;a target="_blank" href="http://code.google.com/speed/public-dns/"&gt;Google Public DNS&lt;/a&gt; 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ă.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/Uhs2yY5qpDc" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/ubuntu-si-network-management-ul.html#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/ubuntu-si-network-management-ul.html/feed/atom" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/ubuntu-si-network-management-ul.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[Ubuntu 10.04 Lucid Lynx și OpenVZ]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/gXqX3fBWFbM/ubuntu-10-04-lucid-lynx-si-openvz.html" />
		<id>http://www.saltwaterc.net/?p=768</id>
		<updated>2010-05-13T06:37:35Z</updated>
		<published>2010-05-13T06:30:13Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Linux" /><category scheme="http://www.saltwaterc.ro" term="Virtualizare" />		<summary type="html"><![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ă [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/ubuntu-10-04-lucid-lynx-si-openvz.html">&lt;p&gt;Vestea bună este faptul că a apărut Ubuntu 10.04. Vestea proastă este faptul că suportul pentru &lt;a href="http://community.livejournal.com/openvz/30998.html" target="_blank"&gt;OpenVZ în kernel 2.6.32&lt;/a&gt; a apărut prea târziu pentru a fi inclus în distribuție. Sunt conștient de faptul că &lt;a href="http://lxc.sourceforge.net/" target="_blank"&gt;LXC (Linux Containers)&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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 &lt;a href="http://pve.proxmox.com/wiki/Debian_Appliance_Builder" target="_blank"&gt;DAB (Debian Appliance Builder)&lt;/a&gt; nu a venit cu suport pentru Ubuntu 9.10, iar acum pentru 10.04. Noul sistem de init, &lt;a href="http://upstart.ubuntu.com/" target="_blank"&gt;upstart&lt;/a&gt;, 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 &lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html" target="_blank"&gt;udev&lt;/a&gt; și OpenVZ.&lt;/p&gt;
&lt;p&gt;Există mai sus vreo două întrebări din categoria &amp;#8220;momentan&amp;#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 &amp;#8220;won&amp;#8217;t fix / invalid&amp;#8221;, deci feedback-ul din partea comunității să se piardă. Sau să se ajungă la &amp;#8220;by popular demand&amp;#8221; &amp;#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 &lt;a href="http://www.linux-kvm.org/page/Main_Page" target="_blank"&gt;KVM&lt;/a&gt;). Între timp, Proxmox rulează și va adopta 2.6.32 și pentru OpenVZ. Momentan știe doar de KVM.&lt;/p&gt;
&lt;p&gt;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 &amp;#8220;backward compatibility&amp;#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ă: &amp;#8220;hack&amp;#8221; și &amp;#8220;patch&amp;#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.&lt;/p&gt;
&lt;p&gt;Pentru că nu dețin toate informațiile, dau următoarele link-uri de unde mă inspir și eu:&lt;br /&gt;
&lt;a href="http://blog.bodhizazen.net/linux/ubuntu-10-04-openvz-templates/" target="_blank"&gt;Ubuntu 10.04 OpenVZ Templates&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://blog.bodhizazen.net/linux/download-ubuntu-10-04-openvz-templates/" target="_blank"&gt;Download Ubuntu 10.04 OpenVZ Templates&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pentru că nu îmi place lucrul manual atâta timp cât există lucruri precreate:&lt;br /&gt;
&lt;a href="http://bodhizazen.fivebean.net/openvz/" target="_blank"&gt;http://bodhizazen.fivebean.net/openvz/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;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. &lt;em&gt;Less is more!&lt;/em&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/gXqX3fBWFbM" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/ubuntu-10-04-lucid-lynx-si-openvz.html#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/ubuntu-10-04-lucid-lynx-si-openvz.html/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/ubuntu-10-04-lucid-lynx-si-openvz.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[I can has Makavelis numbers]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/WTu7cfBrKnM/i-can-has-makavelis-numbers.html" />
		<id>http://www.saltwaterc.net/?p=771</id>
		<updated>2010-05-14T08:02:23Z</updated>
		<published>2010-05-12T22:00:42Z</published>
		<category scheme="http://www.saltwaterc.ro" term="PHP" /><category scheme="http://www.saltwaterc.ro" term="Programare" />		<summary type="html"><![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 [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/i-can-has-makavelis-numbers.html">&lt;p&gt;S-a găsit Google Reader să mă scoată cu nasul din shell cu următoarea problemă, &lt;a title="Uitati cum sta treaba" href="http://makavelis.com/2010/05/uitati-cum-sta-treaba.html" target="_blank"&gt;dată pe undeva pe aici&lt;/a&gt;. Practic rezolvarea problemei:&lt;/p&gt;
&lt;p&gt;AB + CD + AC + BD = 100&lt;/p&gt;
&lt;p&gt;Ca orice &amp;#8220;nerd&amp;#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&lt;sup&gt;4&lt;/sup&gt; ( 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ă.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Cod: PHP5/OOP&lt;/p&gt;
&lt;p&gt;Download: &lt;a title="I can has Makavelis numbers" href="http://saltwaterc.net/wp-download/I_can_has_Makavelis_numbers.zip" target="_self"&gt;I_can_has_Makavelis_numbers.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pentru cei născuți cu lene de a mai rula cod, acestea sunt soluțiile:&lt;/p&gt;
&lt;pre&gt;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
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Update: F (nu o să îi dezvălui numele din moment ce a decis să se semneze doar cu F &lt;img src='http://www.saltwaterc.ro/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /&gt; ) 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).&lt;/p&gt;
&lt;p&gt;Download: &lt;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"&gt;I_can_has_Makavelis_numbers_v0.2.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Sursa algoritmului propriu zis:&lt;/p&gt;
&lt;pre&gt;
for ($a = 0; $a &lt; = 5; $a++)
{
	$double_a = 2 * $a;
	$end_b = 8 - $double_a;
	$d = $a + 6;
	for ($b = 0; $b &lt;= $end_b; $b++)
	{
		$c = (8 - $double_a) - $b;

		if ($d % 10 === 0)
		{
			$a++;
			$d = 0;
		}

		$this-&gt;solutions[] = array
		(
			'a' =&gt; $a,
			'b' =&gt; $b,
			'c' =&gt; $c,
			'd' =&gt; $d,
		);
	}
}
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Download: &lt;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"&gt;I_can_has_Makavelis_numbers_v0.3.zip&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/WTu7cfBrKnM" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/i-can-has-makavelis-numbers.html#comments" thr:count="8" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/i-can-has-makavelis-numbers.html/feed/atom" thr:count="8" />
		<thr:total>8</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/i-can-has-makavelis-numbers.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[Scanarea disk-urilor sub Linux]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/o-Bg8-qjXLE/scanarea-disk-urilor-sub-linux.html" />
		<id>http://www.saltwaterc.net/?p=730</id>
		<updated>2010-04-16T08:49:14Z</updated>
		<published>2010-04-16T08:49:14Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Linux" />		<summary type="html"><![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 [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/scanarea-disk-urilor-sub-linux.html">&lt;p&gt;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ă, &amp;#8220;fat free, batteries not included&amp;#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.&lt;/p&gt;
&lt;p&gt;a) S.M.A.R.T.&lt;/p&gt;
&lt;p&gt;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ă &amp;#8220;geeky parameters&amp;#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.&lt;/p&gt;
&lt;p&gt;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;amp; Friends se face prin pachetul smartmontools. Utilitarul interesant este smartctl.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;smartctl -i /dev/sda&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Comanda va returna informaţiile de bază despre disk, dintre care cele mai importante pentru a continua sunt ultimele două:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;SMART support is: &lt;strong&gt;Available&lt;/strong&gt; &amp;#8211; device has SMART capability.&lt;br /&gt;
SMART support is: &lt;strong&gt;Enabled&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Dacă e &amp;#8220;Available&amp;#8221; şi e &amp;#8220;Disabled&amp;#8221;, atunci se poate activa şi fără reboot pentru a meşteri prin BIOS. Dacă e &amp;#8220;Unavailable&amp;#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.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;smartctl -s on /dev/sda&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Această comandă va activa S.M.A.R.T. dacă există. Dacă nu, citeşte paragraful anterior. Dacă da, lectură plăcută în continuare.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;smartctl -a /dev/sda&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Va da lista aceea de &amp;#8220;geeky parameters&amp;#8221; despre starea HDD-ului.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;SMART overall-health self-assessment test result: &lt;strong&gt;PASSED&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;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 &amp;#8220;Pre-fail&amp;#8221; ar trebui să fie OK.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;smartctl -t short /dev/sda&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;După ce trece timpul alocat testului se va rula:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;smartctl -t conveyance /dev/sda&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Atenţie, testele nu pot fi rulate în paralel sau puse în coadă. Execuţia unui nou test o va anula pe cea anterioară.&lt;/p&gt;
&lt;p&gt;Se poate trage cu ochiul la progres prin:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;smartctl -c /dev/sda&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Cu toate acestea, nu are vreo formă de &amp;#8220;progress bar&amp;#8221;, doar un procent rămas pâna la terminare, actualizat din 10% în 10%.&lt;/p&gt;
&lt;p&gt;Lista rezultatelor stocate în log-ul HDD-ului se poate afla prin:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;smartctl -l selftest /dev/sda&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;=== START OF READ SMART DATA SECTION ===&lt;br /&gt;
SMART Self-test log structure revision number 1&lt;br /&gt;
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error&lt;br /&gt;
# 1  Extended offline    Completed without error       00%     19368         -&lt;br /&gt;
# 2  Conveyance offline  Completed without error       00%     19366         -&lt;br /&gt;
# 3  Short offline       Completed without error       00%     19366         -&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Cam aşa arată la mine după cele 3 teste, iar acestea sunt rezultatele &amp;#8220;ochei&amp;#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:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;smartctl -t long /dev/sda&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Parametrul -c al smartctl pe lângă starea execuţiei unui test anume furnizează şi durata lor:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Short self-test routine&lt;br /&gt;
recommended polling time: 	 (   2) minutes.&lt;br /&gt;
Extended self-test routine&lt;br /&gt;
recommended polling time: 	 ( 147) minutes.&lt;br /&gt;
Conveyance self-test routine&lt;br /&gt;
recommended polling time: 	 (   5) minutes.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Î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.&lt;/p&gt;
&lt;p&gt;b) badblocks&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;badblocks -sv /dev/sda&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Va rula un read only test şi arată progresul operaţiei. Durează ceva vreme, cam o oră şi ceva în cazul meu.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;root@ubuntu:~# badblocks -sv /dev/sda&lt;br /&gt;
Checking blocks 0 to 488386583&lt;br /&gt;
Checking for bad blocks (read-only test): done&lt;br /&gt;
Pass completed, 0 bad blocks found.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;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ă.&lt;/p&gt;
&lt;p&gt;EOF&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/o-Bg8-qjXLE" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/scanarea-disk-urilor-sub-linux.html#comments" thr:count="3" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/scanarea-disk-urilor-sub-linux.html/feed/atom" thr:count="3" />
		<thr:total>3</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/scanarea-disk-urilor-sub-linux.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[Windows Automatic Updates și povestea reboot-ului automat]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/BaxsGjZn22g/windows-automatic-updates-si-povestea-reboot-ului-automat.html" />
		<id>http://www.saltwaterc.net/?p=721</id>
		<updated>2010-04-14T17:27:35Z</updated>
		<published>2010-04-14T17:11:32Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Windows" />		<summary type="html"><![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 [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/windows-automatic-updates-si-povestea-reboot-ului-automat.html">&lt;p&gt;Î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 &amp;#8220;gândire&amp;#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ă &amp;#8220;bugului&amp;#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).&lt;/p&gt;
&lt;pre&gt;Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU]
"NoAutoRebootWithLoggedOnUsers"=dword:00000001
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Ca idee, târla de mai sus se salvează într-un fișier text cu extensie .reg, se execută și voila, bug killed.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/BaxsGjZn22g" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/windows-automatic-updates-si-povestea-reboot-ului-automat.html#comments" thr:count="3" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/windows-automatic-updates-si-povestea-reboot-ului-automat.html/feed/atom" thr:count="3" />
		<thr:total>3</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/windows-automatic-updates-si-povestea-reboot-ului-automat.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[OpenVZ Debian Appliance Builder]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/aIANec29mFc/openvz-debian-appliance-builder.html" />
		<id>http://www.saltwaterc.net/?p=705</id>
		<updated>2010-03-26T20:22:00Z</updated>
		<published>2010-03-26T20:22:00Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Linux" /><category scheme="http://www.saltwaterc.ro" term="Virtualizare" />		<summary type="html"><![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 [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/openvz-debian-appliance-builder.html">&lt;p&gt;Băieții ăștia faini de la &lt;a title="Proxmox" href="http://proxmox.com/" target="_blank"&gt;Proxmox&lt;/a&gt; ce se ocupă de &lt;a title="Proxmox Virtual Environment" href="http://pve.proxmox.com/wiki/Main_Page" target="_blank"&gt;Proxmox VE&lt;/a&gt; printre altele, soluția de virtualizare ce o recomandam &lt;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"&gt;în articolul anterior&lt;/a&gt; pentru testarea de configurații, au mai scos un hit: &lt;a title="Debian Appliance Builder" href="http://pve.proxmox.com/wiki/Debian_Appliance_Builder" target="_blank"&gt;Debian Appliance Builder&lt;/a&gt;, pe scurt dab. Acum să nu se înțeleagă din fraza anterioară faptul că Proxmox VE nu ar fi bun în producție. &lt;a title="OVH: Proxmox" href="http://help.ovh.co.uk/Proxmox" target="_blank"&gt;Cel puțin OVH&lt;/a&gt; folosește în producție produsul menționat anterior.&lt;/p&gt;
&lt;p&gt;Dar să revenim la builder. Practic dab este un utilitar menit să subțieze destul de mult procesul de &lt;a title="Debian template creation" href="http://wiki.openvz.org/Debian_template_creation" target="_blank"&gt;creare al unui template Debian&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;Distribuții suportate de către Debian Appliance Builder:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Debian Etch (4.0) (Legacy Stable)&lt;/li&gt;
&lt;li&gt;Debian Lenny (5.0) (Stable)&lt;/li&gt;
&lt;li&gt;Ubuntu Hardy (8.04) (LTS)&lt;/li&gt;
&lt;li&gt;Ubuntu Intrepid (8.10)&lt;/li&gt;
&lt;li&gt;Ubuntu Jaunty (9.04)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Practic pașii necesari creării unui template au fost reduși la:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;crearea unui fișier de configurare (dab.conf) cu o sintaxă &amp;#8220;key: value&amp;#8221; relativ simplă, explicată în documentație. Joacă rol de &amp;#8220;metadata&amp;#8221;.&lt;/li&gt;
&lt;li&gt;init &amp;#8211; moment în care se citește lista de pachete din repo-urile distribuției alese&lt;/li&gt;
&lt;li&gt;bootstrap cu opțiuni, unde subsemnatul preferă &amp;#8220;&amp;#8211;minimal&amp;#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.&lt;/li&gt;
&lt;li&gt;[opțional] instalare de pachete suplimentare. Minimalul lor nu corespunde minimalului meu, ce presupune și: htop, sysv-rc-conf, sysvconfig, bzip2.&lt;/li&gt;
&lt;li&gt;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 &lt;a title="OpenSSH" href="http://www.openssh.com/" target="_blank"&gt;OpenSSH&lt;/a&gt;, &lt;a title="Two dozen operating system templates" href="http://www.intovps.com/blog/2009/08/23/two-dozen-operating-system-templates/" target="_blank"&gt;după cum se lăudau și cei de la IntoVPS&lt;/a&gt;. Recordul personal e de 1MiB pe un template Debian Lenny i386 și aș merge pe varianta cu &lt;a title="Dropbear SSH server and client" href="http://matt.ucc.asn.au/dropbear/dropbear.html" target="_blank"&gt;Dropbear&lt;/a&gt; în loc de OpenSSH doar de dragul virtualizării și a testării scenariului de &amp;#8220;VPS small&amp;#8221;. Timp pentru teste să găsesc. Ca dimensiune, ies în jur de 95MiB în urma arhivării gzip, în jur de 275MiB dezarhivat.&lt;/li&gt;
&lt;li&gt;finalizare &amp;#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ș.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Singura bubă ce i-am găsit-o până acum este lipsa unui suport bun pentru edit &amp;amp; deploy. Cel puțin mie de îndată ce am rulat dab finalize &amp;#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?).&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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&lt;strong&gt;™&lt;/strong&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/aIANec29mFc" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/openvz-debian-appliance-builder.html#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/openvz-debian-appliance-builder.html/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/openvz-debian-appliance-builder.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[Cum să reproduci setup-din din producție &#8211; pe local]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/C9PJKpPysZo/cum-sa-reproduci-setup-din-din-productie-pe-local.html" />
		<id>http://www.saltwaterc.net/?p=684</id>
		<updated>2010-03-16T10:56:30Z</updated>
		<published>2010-03-16T10:50:58Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Linux" /><category scheme="http://www.saltwaterc.ro" term="Virtualizare" />		<summary type="html"><![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ă [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/cum-sa-reproduci-setup-din-din-productie-pe-local.html">&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;a title="The FreeBSD jail mechanism is an implementation of operating system-level virtualization" href="http://en.wikipedia.org/wiki/FreeBSD_jail" target="_blank"&gt;FreeBSD Jails&lt;/a&gt; și &lt;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"&gt;Solaris Containers&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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 &lt;a title="OpenVZ is container-based virtualization for Linux" href="http://wiki.openvz.org/Main_Page" target="_blank"&gt;OpenVZ&lt;/a&gt; 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 &lt;a title="Proxmox Virtual Environment" href="http://pve.proxmox.com/wiki/Main_Page" target="_blank"&gt;Proxmox VE (Virtual Environment)&lt;/a&gt;. Băieții aceștia faini de la Proxmox au luat mai multe tehnologii de virtualizare și le-au pus sub același pachet: &lt;a title="Kernel-based Virtual Machine" href="http://en.wikipedia.org/wiki/Kernel-based_Virtual_Machine" target="_blank"&gt;KVM (Kernel-based Virtual Machine)&lt;/a&gt; și OpenVZ, plus o interfață web pentru administrare. Practic Proxmox VE este un &lt;a title="http://www.debian.org/releases/lenny/" href="http://www.debian.org/releases/lenny/" target="_blank"&gt;Debian Lenny&lt;/a&gt; împachetat cu tehnologiile despre care spuneam mai sus.&lt;/p&gt;
&lt;p&gt;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 &lt;a title="Logical Volume Manager (Linux)" href="http://en.wikipedia.org/wiki/Logical_Volume_Manager_%28Linux%29" target="_blank"&gt;LVM&lt;/a&gt;. Este recomandat minim 2GB de RAM disponibil dacă se folosesc mai multe containere, minim 1GB RAM pentru un container folosind pentru &amp;#8216;package maintenance&amp;#8217; ce are suport &lt;a title="Symmetric multiprocessing" href="http://en.wikipedia.org/wiki/Symmetric_multiprocessing" target="_blank"&gt;SMP&lt;/a&gt; ș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 &lt;a title="Do it yourself" href="http://en.wikipedia.org/wiki/Do_it_yourself" target="_blank"&gt;DIY&lt;/a&gt;, adică o distribuție de Linux ce folosește kernel cu patch pentru OpenVZ, preferabil din repo, plus o interfață web precum &lt;a title="OpenVZ Management Tool" href="http://webvz.sourceforge.net/" target="_blank"&gt;WebVZ&lt;/a&gt; sau &lt;a title="HyperVM" href="http://www.lxcenter.org/hypervm/installation.htm" target="_blank"&gt;HyperVM&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Proxmox VE se poate instala fie direct pe fier (bare-metal hypervisor), fie într-o mașină virtuală creată cu &lt;a title="VirtualBox" href="http://www.virtualbox.org/" target="_blank"&gt;VirtualBox&lt;/a&gt; ce este soluția pentru &amp;#8220;desktop&amp;#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 (&lt;a title="x86 virtualization" href="http://en.wikipedia.org/wiki/X86_virtualization" target="_blank"&gt;VT-x sau AMD-V&lt;/a&gt;) 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.&lt;/p&gt;
&lt;p&gt;Având în vedere faptul că pentru OpenVZ &lt;a title="openvz template creation" href="http://www.google.com/search?hl=en&amp;amp;source=hp&amp;amp;q=openvz+template+creation&amp;amp;aq=0&amp;amp;aqi=g1&amp;amp;aql=&amp;amp;oq=openvz+template+crea" target="_blank"&gt;se pot crea relativ ușor template-uri&lt;/a&gt;, 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.&lt;/p&gt;
&lt;p&gt;Î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 &lt;a title="Filesystem in Userspace" href="http://en.wikipedia.org/wiki/Filesystem_in_Userspace" target="_blank"&gt;FUSE&lt;/a&gt; dacă se sapă puțin prin vzctl, ceea ce deschide anumite posibilități în producție gen &lt;a title=" FUSE-based file system backed by Amazon S3  " href="http://code.google.com/p/s3fs/" target="_blank"&gt;s3fs&lt;/a&gt; (netestat sub OpenVZ de subsemnatul, am testat alte module FUSE) prin intermediul căruia se poate monta un bucket de &lt;a title="Amazon Simple Storage Service (Amazon S3)" href="http://aws.amazon.com/s3/" target="_blank"&gt;Amazon S3&lt;/a&gt; ca FS local. De altfel, am reprodus și un sistem desktop într-un container OpenVZ, &lt;a title="Ubuntu Hardy Heron" href="https://wiki.ubuntu.com/HardyHeron" target="_blank"&gt;Ubuntu Hardy&lt;/a&gt;, accesat prin &lt;a title="Ubuntu FreeNX" href="https://help.ubuntu.com/community/FreeNX" target="_blank"&gt;FreeNX&lt;/a&gt;, deci limitările sunt destul de puține gen lipsa unui suport civilizat pentru loop device.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/C9PJKpPysZo" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/cum-sa-reproduci-setup-din-din-productie-pe-local.html#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/cum-sa-reproduci-setup-din-din-productie-pe-local.html/feed/atom" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/cum-sa-reproduci-setup-din-din-productie-pe-local.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[Flash-ul lui Adobe și Windows-ul meu Mobile]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/JA3Mu1_9mS8/flash-ul-lui-adobe-%c8%99i-windows-ul-meu-mobile.html" />
		<id>http://saltwaterc.net/rant/flash-ul-lui-adobe-%c8%99i-windows-ul-meu-mobile.html</id>
		<updated>2010-11-11T16:27:02Z</updated>
		<published>2010-02-03T11:06:25Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Rant" /><category scheme="http://www.saltwaterc.ro" term="Tech" /><category scheme="http://www.saltwaterc.ro" term="Web" />		<summary type="html"><![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 [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/flash-ul-lui-adobe-%c8%99i-windows-ul-meu-mobile.html">&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; am &lt;em&gt;corectat&lt;/em&gt; 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 &amp;#8220;pierd&amp;#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.&lt;/p&gt;
&lt;p&gt;Era destul de evident faptul că va urma o replică de-a subsemnatului la adresa &lt;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"&gt;&lt;strike&gt;nesimțirii&lt;/strike&gt; celor de la Adobe legată de lipsa Flash Player pe iPad&lt;/a&gt;. De altfel, ideea a mai fost discutată și de către &lt;a href="http://www.euareblog.ro/catalin-nicolescu/piua-piua-pe-myadobe/" title="piua-piua pe myAdobe" target="_blank"&gt;Cătălin Nicolescu&lt;/a&gt;, dar eu iau o abordare diferită a problemei. Doar nu o să mă apuc să fac &amp;#8216;rant&amp;#8217; pe aceeași temă.&lt;/p&gt;
&lt;p&gt;Replica mea către Adobe ar fi: &lt;strike&gt;păi bine mă ipocriților,&lt;/strike&gt; 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ș?&lt;/p&gt;
&lt;p&gt;&lt;strike&gt;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.&lt;/strike&gt; Î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ă.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/JA3Mu1_9mS8" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/flash-ul-lui-adobe-%c8%99i-windows-ul-meu-mobile.html#comments" thr:count="9" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/flash-ul-lui-adobe-%c8%99i-windows-ul-meu-mobile.html/feed/atom" thr:count="9" />
		<thr:total>9</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/flash-ul-lui-adobe-%c8%99i-windows-ul-meu-mobile.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[Firebug 1.5 + Firefox 3.5.7 + Ubuntu Hardy amd64]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/Suiteck6qN4/firebug-15-firefox-357-ubuntu-hardy-amd64.html" />
		<id>http://saltwaterc.net/rant/firebug-15-firefox-357-ubuntu-hardy-amd64.html</id>
		<updated>2010-01-29T08:34:57Z</updated>
		<published>2010-01-29T08:34:57Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Linux" /><category scheme="http://www.saltwaterc.ro" term="Programare" /><category scheme="http://www.saltwaterc.ro" term="Rant" />		<summary type="html"><![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 [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/firebug-15-firefox-357-ubuntu-hardy-amd64.html">&lt;p&gt;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: &lt;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"&gt;64 bit Firefox on Linux crashes with Firebug 1.5.0&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;Soluția de moment: downgrade la Firebug 1.4: &lt;a href="http://getfirebug.com/releases/firebug/1.4/" title="Firebug 1.4" target="_blank"&gt;http://getfirebug.com/releases/firebug/1.4/ &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/Suiteck6qN4" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/firebug-15-firefox-357-ubuntu-hardy-amd64.html#comments" thr:count="4" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/firebug-15-firefox-357-ubuntu-hardy-amd64.html/feed/atom" thr:count="4" />
		<thr:total>4</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/firebug-15-firefox-357-ubuntu-hardy-amd64.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>SaltwaterC</name>
						<uri>http://saltwaterc.ro/</uri>
					</author>
		<title type="html"><![CDATA[Dragă programatorule, dacă îți vine a copy-paste, fă refactor!]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SaltwatersBlog/~3/YAyY_FPQq3k/draga-programatorule-daca-iti-vine-a-copy-paste-fa-refactor.html" />
		<id>http://saltwaterc.net/rant/draga-programatorule-daca-iti-vine-a-copy-paste-fa-refactor.html</id>
		<updated>2010-01-22T11:41:45Z</updated>
		<published>2010-01-22T11:41:45Z</published>
		<category scheme="http://www.saltwaterc.ro" term="Programare" /><category scheme="http://www.saltwaterc.ro" term="Rant" />		<summary type="html"><![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 [...]]]></summary>
		<content type="html" xml:base="http://www.saltwaterc.ro/draga-programatorule-daca-iti-vine-a-copy-paste-fa-refactor.html">&lt;p&gt;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-&lt;a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself" title="DRY" target="_blank"&gt;DRY&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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 &amp;#8230; touche: &amp;#8220;Ce-ai zis mă? Să copiezi?&amp;#8221;. Exact ce ziceam mai sus &amp;#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ă.&lt;/p&gt;
&lt;p&gt;În concluzie vreo câteva idei, departe de a oferi o imagine completă:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;o arhitectură bună, modulară, a aplicației, DRY (și preferabil &lt;a href="http://en.wikipedia.org/wiki/KISS_principle" title="Keep It Simple, Stupid" target="_blank"&gt;KISS&lt;/a&gt;) 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.&lt;/li&gt;
&lt;li&gt;dacă acea parte de &amp;#8216;unknown&amp;#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ă.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;refactor, OOP, clase, interfețe, &amp;#8216;design pattern&amp;#8217; (exemplu: singleton) ar trebui să nu fie doar cuvinte într-un vocabular de specialitate.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/SaltwatersBlog/~4/YAyY_FPQq3k" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.saltwaterc.ro/draga-programatorule-daca-iti-vine-a-copy-paste-fa-refactor.html#comments" thr:count="4" />
		<link rel="replies" type="application/atom+xml" href="http://www.saltwaterc.ro/draga-programatorule-daca-iti-vine-a-copy-paste-fa-refactor.html/feed/atom" thr:count="4" />
		<thr:total>4</thr:total>
	<feedburner:origLink>http://www.saltwaterc.ro/draga-programatorule-daca-iti-vine-a-copy-paste-fa-refactor.html</feedburner:origLink></entry>
	</feed>

