<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
> <channel><title>Blog do Bragil</title> <atom:link href="http://www.bragil.net/feed/" rel="self" type="application/rss+xml" /><link>http://www.bragil.net</link> <description>Tecnologia, programação e outras nerdices...</description> <lastBuildDate>Fri, 19 Aug 2011 16:33:47 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <item><title>Auto-complete com Django e JQuery UI</title><link>http://www.bragil.net/python/auto-complete-com-django-e-jquery-ui/</link> <comments>http://www.bragil.net/python/auto-complete-com-django-e-jquery-ui/#comments</comments> <pubDate>Fri, 19 Aug 2011 16:33:47 +0000</pubDate> <dc:creator>bragil</dc:creator> <category><![CDATA[Javascript/HTML/CSS]]></category> <category><![CDATA[Python]]></category> <category><![CDATA[django]]></category> <category><![CDATA[jquery]]></category> <guid
isPermaLink="false">http://www.bragil.net/?p=336</guid> <description><![CDATA[Auto-complete é aquele recurso usado por alguns sites, onde ao digitar alguma coisa em uma caixa de texto, aparecem sugestões que coincidam com os caracteres digitados, bastando clicar para selecionar a opção desejada. É algo que facilita a vida do usuário e também reduz o tráfego de informações entre a aplicação e o banco de [...]]]></description> <content:encoded><![CDATA[<p>Auto-complete é aquele recurso usado por <a
href="http://www.google.com.br/" target="_blank">alguns sites</a>, onde ao digitar alguma coisa em uma caixa de texto, aparecem sugestões que coincidam com os caracteres digitados, bastando clicar para selecionar a opção desejada. É algo que facilita a vida do usuário e também reduz o tráfego de informações entre a aplicação e o banco de dados, o que hoje em dia é algo que vale muito a pena considerar.</p><p>Vou apresentar como fazer isso usando o framework <a
href="http://www.djangoproject.org" target="_blank">Django</a> e a <a
href="http://jqueryui.com/" target="_blank">JQuery UI</a>. É necessário um conhecimento básico prévio de <a
href="http://www.djangoproject.org/" target="_blank">Django</a>, pois não vou mostrar todas as etapas da criação da aplicação.</p><p>Antes de qualquer coisa, adicione as referências para a <a
href="http://www.jquery.com/" target="_blank">JQuery</a> e <a
href="http://jqueryui.com/" target="_blank">JQuery UI</a> na página do auto-complete. É recomendável utilizar o <a
href="http://code.google.com/apis/libraries/devguide.html#jqueryUI" target="_blank">CDN do Google</a>, conforme indica na própria página do <a
href="http://jqueryui.com/" target="_blank">JQuery UI</a>:</p><div
class="wp_syntax"><div
class="code"><pre class="html" style="font-family:monospace;">&lt;link rel=&quot;stylesheet&quot; href=&quot;http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/base/jquery-ui.css&quot; type=&quot;text/css&quot; media=&quot;all&quot; /&gt;
&lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.15/jquery-ui.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre></div></div><p>Em primeiro lugar, o exemplo de um model que vamos usar, bem simples para focar na didática:</p><div
class="wp_syntax"><div
class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Livro<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:
	nome = models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;">100</span>, null=<span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__unicode__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">nome</span></pre></div></div><p>Uma simples classe Livro com um campo <strong>nome</strong>.</p><p>Agora, a <strong>view</strong> que responderá as requisições Ajax. Ela vai receber os caracteres digitados pelo usuário, efetuará uma busca no banco de dados, vai formatar os dados para o auto-complete e devolver a resposta para a requisição Ajax no formato JSON:</p><div
class="wp_syntax"><div
class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">http</span> <span style="color: #ff7700;font-weight:bold;">import</span> HttpResponse
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">utils</span> <span style="color: #ff7700;font-weight:bold;">import</span> simplejson
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> busca_autocomplete<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>:
	busca = request.<span style="color: black;">GET</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'term'</span><span style="color: black;">&#93;</span>
	livros = Livro.<span style="color: black;">objects</span>.<span style="color: #008000;">filter</span><span style="color: black;">&#40;</span>livro__istartswith=busca<span style="color: black;">&#41;</span>
	res = <span style="color: black;">&#91;</span> <span style="color: #008000;">dict</span><span style="color: black;">&#40;</span><span style="color: #008000;">id</span>=l.<span style="color: #008000;">id</span>, label=l.<span style="color: #0000cd;">__unicode__</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, value=l.<span style="color: #0000cd;">__unicode__</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> l <span style="color: #ff7700;font-weight:bold;">in</span> livros <span style="color: black;">&#93;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">return</span> HttpResponse<span style="color: black;">&#40;</span>simplejson.<span style="color: black;">dumps</span><span style="color: black;">&#40;</span>res<span style="color: black;">&#41;</span>, mimetype=<span style="color: #483d8b;">&quot;application/x-javascript&quot;</span><span style="color: black;">&#41;</span></pre></div></div><p>Criada a view, é necessário configurar a url para ela, no arquivo <b>urls.py</b>:</p><div
class="wp_syntax"><div
class="code"><pre class="python" style="font-family:monospace;"><span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'^livros/$'</span>, <span style="color: #483d8b;">'seu_projeto.sua_aplicacao.views.busca_autocomplete'</span><span style="color: black;">&#41;</span></pre></div></div><p>A view que criamos logo acima será acionada quando o browser solicitar a url /livros/.</p><p>E finalmente, o código Javascript que vai configurar o auto-complete. Ele deve ser colocado na página onde está o campo texto que o usuário vai digitar a informação e, conforme ele for digitando, o auto-complete vai apresentar sugestões baseadas no que ele digitou. Vamos considerar que o id do campo texto será &#8220;texto&#8221;.</p><div
class="wp_syntax"><div
class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	$<span style="color: #009900;">&#40;</span> <span style="color: #3366CC;">&quot;#texto&quot;</span> <span style="color: #009900;">&#41;</span>.<span style="color: #660066;">autocomplete</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
		source<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;/livros/&quot;</span><span style="color: #339933;">,</span>
		minLength<span style="color: #339933;">:</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">,</span>
		select<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span> event<span style="color: #339933;">,</span> ui <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;ID: &quot;</span> <span style="color: #339933;">+</span> ui.<span style="color: #000066; font-weight: bold;">item</span>.<span style="color: #660066;">id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div><p>Explicando resumidamente&#8230; o parâmetro <strong>source</strong> informa a URL que vai responder à requisição, o parâmetro <strong>minLength</strong> indica o número mínimo de caracteres que o usuário deverá digitar para acionar o auto-complete e o parâmetro <strong>select</strong> é a rotina que vai tratar o evento de seleção de uma opção do auto-complete (no nosso caso, exibir um alert com o ID do livro).</p> ]]></content:encoded> <wfw:commentRss>http://www.bragil.net/python/auto-complete-com-django-e-jquery-ui/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>[PostgreSQL] Obter locais próximos (fórmula de Haversine)</title><link>http://www.bragil.net/banco-de-dados/postgresql-obter-locais-proximos-formula-de-haversine/</link> <comments>http://www.bragil.net/banco-de-dados/postgresql-obter-locais-proximos-formula-de-haversine/#comments</comments> <pubDate>Tue, 16 Aug 2011 15:59:19 +0000</pubDate> <dc:creator>bragil</dc:creator> <category><![CDATA[Banco de Dados]]></category> <category><![CDATA[geolocalização]]></category> <category><![CDATA[haversine]]></category> <category><![CDATA[PostgreSQL]]></category> <guid
isPermaLink="false">http://www.bragil.net/?p=328</guid> <description><![CDATA[Sabe aquele recurso que algumas redes sociais têm, de exibir os pontos próximos à sua localização? Sim, é possível e bem simples de fazer. A fórmula matemática que faz tudo funcionar chama-se Fórmula de Haversine. Sem mais delongas, vamos ao código: -- Cálculo da distância entre dois pontos usando a fórmula de Haversine em PostgreSQL [...]]]></description> <content:encoded><![CDATA[<p>Sabe aquele recurso que algumas redes sociais têm, de exibir os pontos próximos à sua localização? Sim, é possível e bem simples de fazer. A fórmula matemática que faz tudo funcionar chama-se <a
href="http://pt.wikipedia.org/wiki/F%C3%B3rmula_de_Haversine" target="_blank">Fórmula de Haversine</a>. Sem mais delongas, vamos ao código:</p><div
class="wp_syntax"><div
class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">-- Cálculo da distância entre dois pontos usando a fórmula de Haversine em PostgreSQL</span>
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #993333; font-weight: bold;">REPLACE</span> <span style="color: #993333; font-weight: bold;">FUNCTION</span> distancia_km<span style="color: #66cc66;">&#40;</span>lat1 <span style="color: #993333; font-weight: bold;">NUMERIC</span><span style="color: #66cc66;">,</span> lng1 <span style="color: #993333; font-weight: bold;">NUMERIC</span><span style="color: #66cc66;">,</span> lat2 <span style="color: #993333; font-weight: bold;">NUMERIC</span><span style="color: #66cc66;">,</span> lng2 <span style="color: #993333; font-weight: bold;">NUMERIC</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold;">RETURNS</span> <span style="color: #993333; font-weight: bold;">DOUBLE</span> <span style="color: #993333; font-weight: bold;">PRECISION</span> <span style="color: #993333; font-weight: bold;">AS</span>
$BODY$
	<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #cc66cc;">6371</span> <span style="color: #66cc66;">*</span> acos<span style="color: #66cc66;">&#40;</span>
		sin<span style="color: #66cc66;">&#40;</span> radians<span style="color: #66cc66;">&#40;</span>$1<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> sin<span style="color: #66cc66;">&#40;</span> radians<span style="color: #66cc66;">&#40;</span> $3 <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	      <span style="color: #66cc66;">+</span> cos<span style="color: #66cc66;">&#40;</span> radians<span style="color: #66cc66;">&#40;</span>$1<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> cos<span style="color: #66cc66;">&#40;</span> radians<span style="color: #66cc66;">&#40;</span> $3 <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> cos<span style="color: #66cc66;">&#40;</span>radians<span style="color: #66cc66;">&#40;</span>$4<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">-</span> radians<span style="color: #66cc66;">&#40;</span>$2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>  <span style="color: #66cc66;">&#41;</span>
	<span style="color: #993333; font-weight: bold;">AS</span> distance;
$BODY$
  <span style="color: #993333; font-weight: bold;">LANGUAGE</span> <span style="color: #993333; font-weight: bold;">SQL</span> IMMUTABLE
  COST <span style="color: #cc66cc;">100</span>;</pre></div></div><p>Suponhamos que exista uma tabela de usuários onde exista os campos latitude e longitude. É fácil criar uma query usando a função acima para trazer os usuários mais próximos do seu local, em um raio de 10 Km:</p><div
class="wp_syntax"><div
class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> usuarios <span style="color: #993333; font-weight: bold;">WHERE</span> distancia_km<span style="color: #66cc66;">&#40;</span>minha_latitude<span style="color: #66cc66;">,</span> minha_longitude<span style="color: #66cc66;">,</span> latitude<span style="color: #66cc66;">,</span> longitude<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #cc66cc;">10</span>
<span style="color: #993333; font-weight: bold;">AND</span> distancia_km<span style="color: #66cc66;">&#40;</span>minha_latitude<span style="color: #66cc66;">,</span> minha_longitude<span style="color: #66cc66;">,</span> latitude<span style="color: #66cc66;">,</span> longitude<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&lt;&gt;</span> <span style="color: #cc66cc;">0</span></pre></div></div><p>Serão listados os usuários que estão a menos de 10 Km de distância de você.</p><p>OBS: Se quiser usar milhas ao invés de quilômetros, use a constante 3959 ao invés de 6371 na função:</p><div
class="wp_syntax"><div
class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">-- Cálculo da distância entre dois pontos usando a fórmula de Haversine em PostgreSQL</span>
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #993333; font-weight: bold;">REPLACE</span> <span style="color: #993333; font-weight: bold;">FUNCTION</span> distancia_milhas<span style="color: #66cc66;">&#40;</span>lat1 <span style="color: #993333; font-weight: bold;">NUMERIC</span><span style="color: #66cc66;">,</span> lng1 <span style="color: #993333; font-weight: bold;">NUMERIC</span><span style="color: #66cc66;">,</span> lat2 <span style="color: #993333; font-weight: bold;">NUMERIC</span><span style="color: #66cc66;">,</span> lng2 <span style="color: #993333; font-weight: bold;">NUMERIC</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold;">RETURNS</span> <span style="color: #993333; font-weight: bold;">DOUBLE</span> <span style="color: #993333; font-weight: bold;">PRECISION</span> <span style="color: #993333; font-weight: bold;">AS</span>
$BODY$
	<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #cc66cc;">3959</span> <span style="color: #66cc66;">*</span> acos<span style="color: #66cc66;">&#40;</span>
		sin<span style="color: #66cc66;">&#40;</span> radians<span style="color: #66cc66;">&#40;</span>$1<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> sin<span style="color: #66cc66;">&#40;</span> radians<span style="color: #66cc66;">&#40;</span> $3 <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	      <span style="color: #66cc66;">+</span> cos<span style="color: #66cc66;">&#40;</span> radians<span style="color: #66cc66;">&#40;</span>$1<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> cos<span style="color: #66cc66;">&#40;</span> radians<span style="color: #66cc66;">&#40;</span> $3 <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> cos<span style="color: #66cc66;">&#40;</span>radians<span style="color: #66cc66;">&#40;</span>$4<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">-</span> radians<span style="color: #66cc66;">&#40;</span>$2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>  <span style="color: #66cc66;">&#41;</span>
	<span style="color: #993333; font-weight: bold;">AS</span> distance;
$BODY$
  <span style="color: #993333; font-weight: bold;">LANGUAGE</span> <span style="color: #993333; font-weight: bold;">SQL</span> IMMUTABLE
  COST <span style="color: #cc66cc;">100</span>;</pre></div></div> ]]></content:encoded> <wfw:commentRss>http://www.bragil.net/banco-de-dados/postgresql-obter-locais-proximos-formula-de-haversine/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>É hora de aprender uma nova linguagem! Escolhida: Python</title><link>http://www.bragil.net/python/e-hora-de-aprender-uma-nova-linguagem-escolhida-python/</link> <comments>http://www.bragil.net/python/e-hora-de-aprender-uma-nova-linguagem-escolhida-python/#comments</comments> <pubDate>Mon, 31 Jan 2011 14:38:08 +0000</pubDate> <dc:creator>bragil</dc:creator> <category><![CDATA[Python]]></category> <category><![CDATA[Programação]]></category> <guid
isPermaLink="false">http://www.bragil.net/?p=322</guid> <description><![CDATA[Sabe aquela velha máxima que diz que um programador deve aprender uma nova linguagem por ano? Pois então, resolvi botar a mão na massa e seguir esta regra. Mas aí vem a pergunta: qual linguagem aprender?? Para decidir, enumerei alguns requisitos: ser orientada a objetos e também funcional, sintaxe simples mas com bastante recursos, comunidade [...]]]></description> <content:encoded><![CDATA[<p><img
class="alignleft" title="Python" src="http://www.python.org/community/logos/python-logo.png" alt="Python" width="211" height="71" />Sabe aquela velha máxima que diz que um programador deve aprender uma nova linguagem por ano? Pois então, resolvi botar a mão na massa e seguir esta regra. Mas aí vem a pergunta: qual linguagem aprender?? Para decidir, enumerei alguns requisitos: ser orientada a objetos e também funcional, sintaxe simples mas com bastante recursos, comunidade vasta e ativa e ser adequada para desenvolvimento web. De imediato selecionei <a
href="http://ruby-lang.org">Ruby</a>, <a
href="http://www.python.org">Python</a> e <a
href="http://www.scala-lang.org">Scala</a>, mas logo excluí <a
href="http://www.scala-lang.org">Scala</a> da lista, pelo fato de ser uma linguagem bem mais recente e por isso sua comunidade ainda é menor que <a
href="http://ruby-lang.org">Ruby</a> e <a
href="http://www.python.org">Python</a>. Entretanto, é uma linguagem que promete muito, talvez ano que vem.</p><p>Aí começou o dilema&#8230; <a
href="http://ruby-lang.org">Ruby</a> ou <a
href="http://www.python.org">Python</a>? Ambas as linguagens atendem perfeitamente os requisitos que eu coloquei, mas a escolha por <a
href="http://www.python.org">Python</a> foi mais pela maturidade da linguagem e também por um framework web que me interessou bastante: <a
href="http://www.djangoproject.com">Django</a>. É incrível a simplicidade e a objetividade do framework <a
href="http://www.djangoproject.com">Django</a>, com muito pouco tempo é possível desenvolver uma aplicação simples, como um blog, por exemplo. Além disso, há uma infinidade de aplicações e bibliotecas prontas, o que torna a produtividade ainda maior.</p><p>Para quem procura uma linguagem simples, <a
href="http://www.python.org">Python</a> é perfeita. Ela consegue aliar simplicidade com uma gama de recursos comparável a linguagens como C/C++ e Java. Para quem possui experiência em C, é possível criar extensões para <a
href="http://www.python.org">Python</a>. Há também uma variante de <a
href="http://www.python.org">Python</a> que executa na máquina virtual Java, chamada <a
href="http://www.jython.org">Jython</a>. Ideal quando a aplicação <a
href="http://www.python.org">Python</a> necessita usar rotinas em Java. Precisa desenvolver aplicações para desktop? Sim, é possível&#8230; <a
href="http://www.wxpython.org">WxWindows</a>, GTK, Qt, Tk, etc, é só escolher. Para a web, além do <a
href="http://www.djangoproject.com">Django</a>, existem vários outros frameworks, como <a
href="http://turbogears.org">TurboGears</a>, <a
href="http://pylonshq.com">Pylons</a>, <a
href="http://web2py.com">Web2Py</a>, etc. O próprio <a
href="http://www.google.com.br">Google</a> escolheu <a
href="http://www.python.org">Python</a> como a primeira linguagem para o desenvolvimento de aplicações para a sua plataforma de cloud computing, Google App Engine.</p><p>Resumindo, estou aprendendo, mas estou gostando muito de <a
href="http://www.python.org">Python</a>. É o tipo de linguagem que a gente fica se perguntando porque não aprendeu antes.</p> ]]></content:encoded> <wfw:commentRss>http://www.bragil.net/python/e-hora-de-aprender-uma-nova-linguagem-escolhida-python/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Nginx + Apache + PHP5 + APC + Linux + Memcached = PERFORMANCE!! (parte 2)</title><link>http://www.bragil.net/linux-unix/nginx-apache-php5-apc-linux-memcached-performance-parte-2/</link> <comments>http://www.bragil.net/linux-unix/nginx-apache-php5-apc-linux-memcached-performance-parte-2/#comments</comments> <pubDate>Mon, 24 Jan 2011 15:56:42 +0000</pubDate> <dc:creator>bragil</dc:creator> <category><![CDATA[Linux/Unix]]></category> <category><![CDATA[apache]]></category> <category><![CDATA[apc]]></category> <category><![CDATA[Linux]]></category> <category><![CDATA[Nginx]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[PHP]]></category> <guid
isPermaLink="false">http://www.bragil.net/?p=300</guid> <description><![CDATA[Depois de apresentar a configuração do Apache, PHP, APC e Memcached na primeira parte, agora é hora do Nginx. Basicamente, vamos utilizar o Nginx para servir apenas conteúdo estático (imagens, css, javascript, etc), pois ele possui recursos que garantem uma boa performance para este fim, como por exemplo usar o Memcached como cache. Quando ele [...]]]></description> <content:encoded><![CDATA[<p>Depois de apresentar a configuração do <a
href="http://httpd.apache.org/" target="_blank">Apache</a>, <a
href="http://www.php.net" target="_blank">PHP</a>, <a
href="http://pecl.php.net/package/APC" target="_blank">APC</a> e <a
href="http://memcached.org/" target="_blank">Memcached</a> na <a
href="http://www.bragil.net/linux-unix/nginx-apache-php5-apc-memcached-linux-performance-1/" target="_self">primeira parte</a>, agora é hora do <a
href="http://wiki.nginx.org/Main" target="_blank">Nginx</a>. Basicamente, vamos utilizar o <a
href="http://wiki.nginx.org/Main" target="_blank">Nginx</a> para servir apenas conteúdo estático (imagens, css, javascript, etc), pois ele possui recursos que garantem uma boa performance para este fim, como por exemplo usar o <a
href="http://memcached.org/" target="_blank">Memcached</a> como cache. Quando ele recebe uma requisição para processar um arquivo <a
href="http://www.php.net/" target="_blank">PHP</a>, ele &#8220;passa a bola&#8221; para o <a
href="http://httpd.apache.org/" target="_blank">Apache</a>, servindo também como um proxy. Fica mais fácil de entender olhando o fluxo abaixo:</p><pre style="color: maroon; font-size: 12px;">                                PHP
requisição --&gt; [Nginx] ------------&gt; [Apache] ---&gt; (PHP + APC)
                  |
                  |
                  |
                  | conteúdo estático
                  | (imagens, js, css, etc)
                  |
            (Memcached)</pre><p>Após o famoso comando <strong>apt-get install nginx</strong>, devemos editar os arquivos de configuração e acertar os detalhes para que tudo isso aí em cima funcione corretamente. Vamos começar pelo arquivo <strong>/etc/nginx/nginx.conf</strong>, onde estão as configurações globais:</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;">user www-data;
worker_processes  <span style="color: #000000;">2</span>;
&nbsp;
error_log  <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>error.log;
pid        <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>run<span style="color: #000000; font-weight: bold;">/</span>nginx.pid;
&nbsp;
events <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    worker_connections  <span style="color: #000000;">1024</span>;
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
http <span style="color: #7a0874; font-weight: bold;">&#123;</span>
    include       <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>mime.types;
    default_type  application<span style="color: #000000; font-weight: bold;">/</span>octet-stream;
&nbsp;
    access_log  <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>access.log;
    client_body_temp_path <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>body <span style="color: #000000;">1</span> <span style="color: #000000;">2</span>;
    sendfile        on;
&nbsp;
    keepalive_timeout  <span style="color: #000000;">65</span>;
    tcp_nodelay        on;
&nbsp;
    <span style="color: #666666; font-style: italic;"># Habilitar a compressão gzip</span>
    <span style="color: #c20cb9; font-weight: bold;">gzip</span>  on;
    gzip_buffers <span style="color: #000000;">32</span> 8k;
    gzip_comp_level   <span style="color: #000000;">6</span>;
    gzip_http_version <span style="color: #000000;">1.0</span>;
    gzip_min_length   <span style="color: #000000;">0</span>;
    gzip_types        text<span style="color: #000000; font-weight: bold;">/</span>html text<span style="color: #000000; font-weight: bold;">/</span>css image<span style="color: #000000; font-weight: bold;">/</span>x-icon
        application<span style="color: #000000; font-weight: bold;">/</span>x-javascript application<span style="color: #000000; font-weight: bold;">/</span>javascript text<span style="color: #000000; font-weight: bold;">/</span>javascript application<span style="color: #000000; font-weight: bold;">/</span>atom+xml application<span style="color: #000000; font-weight: bold;">/</span>xml ;
&nbsp;
    include <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>conf.d<span style="color: #000000; font-weight: bold;">/*</span>.conf;
    include <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>sites-enabled<span style="color: #000000; font-weight: bold;">/*</span>;
<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></div></div><p>Não há muito segredo, principalmente se você já mexeu com os arquivos de configuração de outros web servers, como o <a
href="http://httpd.apache.org/" target="_blank">Apache</a>. O próximo passo agora é a configuração do virtual server, onde ficam os detalhes mais importantes. O arquivo para configuração do virtual server default é o <strong>/etc/nginx/sites-enabled/default</strong>:</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># O alias &quot;wordpressapache&quot; aponta para o servidor Apache,</span>
<span style="color: #666666; font-style: italic;"># onde serão redirecionados os scripts PHP para processamento.</span>
upstream wordpressapache <span style="color: #7a0874; font-weight: bold;">&#123;</span>
        server dominio.com:<span style="color: #000000;">8080</span> <span style="color: #007800;">weight</span>=<span style="color: #000000;">1</span> <span style="color: #007800;">fail_timeout</span>=120s;
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
server <span style="color: #7a0874; font-weight: bold;">&#123;</span>
        listen   <span style="color: #000000;">80</span>;
        server_name www.dominio.com;
        access_log  <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>wordpressapache.access.log;
&nbsp;
        location <span style="color: #000000; font-weight: bold;">/</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span>
                <span style="color: #666666; font-style: italic;"># Diretório raiz do site</span>
                root <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>site;
                <span style="color: #666666; font-style: italic;"># As linhas abaixo servem para configurar o redirecionamento</span>
                <span style="color: #666666; font-style: italic;"># para o servidor Apache, quando necessário.</span>
                proxy_pass      http:<span style="color: #000000; font-weight: bold;">//</span>wordpressapache;
                proxy_redirect off;
                proxy_set_header Host <span style="color: #007800;">$host</span>;
                proxy_set_header X-Real-IP <span style="color: #007800;">$remote_addr</span>;
                proxy_set_header X-Forwarded-For <span style="color: #007800;">$proxy_add_x_forwarded_for</span>;
                client_max_body_size 10m;
                client_body_buffer_size 128k;
                proxy_connect_timeout <span style="color: #000000;">90</span>;
                proxy_send_timeout <span style="color: #000000;">90</span>;
                proxy_read_timeout <span style="color: #000000;">90</span>;
                proxy_buffer_size 4k;
                proxy_buffers <span style="color: #000000;">4</span> 32k;
                proxy_busy_buffers_size 64k;
                proxy_temp_file_write_size 64k;
&nbsp;
                <span style="color: #666666; font-style: italic;"># Aqui vão as configurações para que o Nginx use o Memcached</span>
                <span style="color: #666666; font-style: italic;"># como cache, para aumentar a performance.</span>
                <span style="color: #000000; font-weight: bold;">set</span> <span style="color: #007800;">$memcached_key</span> <span style="color: #007800;">$uri</span>;
                memcached_pass 127.0.0.1:<span style="color: #000000;">11211</span>;
                error_page <span style="color: #000000;">404</span> = <span style="color: #000000; font-weight: bold;">@</span>fallback;
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;"># Caso a página não seja encontrada no memcached, passa para o Apache.</span>
        location <span style="color: #000000; font-weight: bold;">@</span>fallback <span style="color: #7a0874; font-weight: bold;">&#123;</span>
                proxy_pass      http:<span style="color: #000000; font-weight: bold;">//</span>wordpressapache;
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;"># Quando forem requisitados scripts PHP, redireciona para o Apache.</span>
        location ~<span style="color: #000000; font-weight: bold;">*</span> wp\-.<span style="color: #000000; font-weight: bold;">*</span>\.php<span style="color: #000000; font-weight: bold;">|</span>wp\-admin <span style="color: #7a0874; font-weight: bold;">&#123;</span>
                proxy_pass      http:<span style="color: #000000; font-weight: bold;">//</span>wordpressapache;
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;"># Todo o conteúdo estático será processado pelo Nginx.</span>
        location ~<span style="color: #000000; font-weight: bold;">*</span> \.<span style="color: #7a0874; font-weight: bold;">&#40;</span>htm<span style="color: #000000; font-weight: bold;">|</span>html<span style="color: #000000; font-weight: bold;">|</span>jpg<span style="color: #000000; font-weight: bold;">|</span>jpeg<span style="color: #000000; font-weight: bold;">|</span>gif<span style="color: #000000; font-weight: bold;">|</span>png<span style="color: #000000; font-weight: bold;">|</span>ico<span style="color: #000000; font-weight: bold;">|</span>css<span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">zip</span><span style="color: #000000; font-weight: bold;">|</span>tgz<span style="color: #000000; font-weight: bold;">|</span>gz<span style="color: #000000; font-weight: bold;">|</span>rar<span style="color: #000000; font-weight: bold;">|</span>bz2<span style="color: #000000; font-weight: bold;">|</span>doc<span style="color: #000000; font-weight: bold;">|</span>xls<span style="color: #000000; font-weight: bold;">|</span>exe<span style="color: #000000; font-weight: bold;">|</span>pdf<span style="color: #000000; font-weight: bold;">|</span>ppt<span style="color: #000000; font-weight: bold;">|</span>txt<span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">tar</span><span style="color: #000000; font-weight: bold;">|</span>mid<span style="color: #000000; font-weight: bold;">|</span>midi<span style="color: #000000; font-weight: bold;">|</span>wav<span style="color: #000000; font-weight: bold;">|</span>bmp<span style="color: #000000; font-weight: bold;">|</span>rtf<span style="color: #000000; font-weight: bold;">|</span>js<span style="color: #7a0874; font-weight: bold;">&#41;</span>$ <span style="color: #7a0874; font-weight: bold;">&#123;</span>
                root <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>site;
                expires max;
                <span style="color: #7a0874; font-weight: bold;">break</span>;
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>-f <span style="color: #007800;">$request_filename</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span>
                <span style="color: #7a0874; font-weight: bold;">break</span>;
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;"># Nega o acesso aos arquivos .htaccess</span>
        location ~ <span style="color: #000000; font-weight: bold;">/</span>\.ht <span style="color: #7a0874; font-weight: bold;">&#123;</span>
                deny all;
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></div></div><p>Após acertar as configurações, reinicie o daemon do <a
href="http://wiki.nginx.org/Main" target="_blank">Nginx</a> com o comando <strong>/etc/init.d/nginx restart</strong>. Podemos conferir o benchmark usando o Apache Benchmark:</p><div
class="wp_syntax"><div
class="code"><pre class="plain" style="font-family:monospace;"> ab -n 1000 -c 5 http://www.dominio.com:80/
This is ApacheBench, Version 2.3 &amp;lt;$Revision: 655654 $&amp;gt;
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
&nbsp;
Benchmarking www.dominio.com (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
&nbsp;
Server Software:        nginx/0.6.32
Server Hostname:        www.dominio.com
Server Port:            80
&nbsp;
Document Path:          /
Document Length:        91427 bytes
&nbsp;
Concurrency Level:      5
Time taken for tests:   1.230 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      91715000 bytes
HTML transferred:       91427000 bytes
Requests per second:    812.80 [#/sec] (mean)
Time per request:       6.152 [ms] (mean)
Time per request:       1.230 [ms] (mean, across all concurrent requests)
Transfer rate:          72798.78 [Kbytes/sec] received
&nbsp;
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       1
Processing:     2    6   1.8      6      12
Waiting:        1    5   1.4      5      10
Total:          2    6   1.8      6      12
&nbsp;
Percentage of the requests served within a certain time (ms)
  50%      6
  66%      7
  75%      7
  80%      7
  90%      8
  95%      9
  98%     10
  99%     10
 100%     12 (longest request)</pre></div></div> ]]></content:encoded> <wfw:commentRss>http://www.bragil.net/linux-unix/nginx-apache-php5-apc-linux-memcached-performance-parte-2/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Nginx + Apache + PHP5 + APC + Linux + Memcached = PERFORMANCE!! (parte 1)</title><link>http://www.bragil.net/linux-unix/nginx-apache-php5-apc-memcached-linux-performance-1/</link> <comments>http://www.bragil.net/linux-unix/nginx-apache-php5-apc-memcached-linux-performance-1/#comments</comments> <pubDate>Wed, 05 Jan 2011 15:38:11 +0000</pubDate> <dc:creator>bragil</dc:creator> <category><![CDATA[Linux/Unix]]></category> <category><![CDATA[apache]]></category> <category><![CDATA[apc]]></category> <category><![CDATA[Linux]]></category> <category><![CDATA[Nginx]]></category> <category><![CDATA[Performance]]></category> <category><![CDATA[PHP]]></category> <guid
isPermaLink="false">http://www.bragil.net/?p=252</guid> <description><![CDATA[O blog www.bragil.net passou por várias reformulações, dentre elas, a migração para WordPress 3 e a mudança de hosting para um Linux virtualizado. Graças a toda liberdade proporcionada por um ambiente com acesso root, foi possível fazer uma configuração de hosting bastante performática, que pode servir de base para outras aplicações. A seguir vou detalhar [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://www.bragil.net/wp-content/uploads/Foguete1.jpg"><img
style="float: left; margin-right: 6px; margin-bottom: 4px;" title="Performance" src="http://www.bragil.net/wp-content/uploads/Foguete1.jpg" alt="Performance" width="189" height="267" /></a>O blog <a
href="www.bragil.net">www.bragil.net</a> passou por várias reformulações, dentre elas, a migração para <a
href="http://www.wordpress.org" target="_blank">WordPress 3</a> e a mudança de hosting para um Linux virtualizado. Graças a toda liberdade proporcionada por um ambiente com acesso root, foi possível fazer uma configuração de hosting bastante performática, que pode servir de base para outras aplicações.</p><p>A seguir vou detalhar o passo-a-passo resumido da configuração usada, que eu apelidei carinhosamente de <strong>NAPALM</strong> (sigla para <a
href="http://wiki.nginx.org/Main">Nginx</a> + <a
href="http://httpd.apache.org/" target="_blank">Apache</a> + <a
href="http://www.php.net/" target="_blank">PHP</a> + <a
href="http://pecl.php.net/package/APC" target="_blank">APC</a> + Linux + <a
href="http://memcached.org/" target="_blank">Memcached</a>).</p><p><a
href="http://wiki.nginx.org/Main">Nginx</a> é um servidor web que tem ganhado fama por ser extremamente rápido e também por ser uma excelente escolha para servir conteúdo estático, sendo usado como proxy para servidores de aplicação.</p><p>O <a
href="http://httpd.apache.org" target="_blank">Apache </a>dispensa apresentações, assim como o <a
href="http://www.php.net/" target="_blank">PHP</a>.</p><p>O <a
href="http://pecl.php.net/package/APC" target="_blank">APC</a> é uma extensão para o <a
href="http://www.php.net/" target="_blank">PHP</a> que otimiza o código intermediário e mantém um cache dos dados e do código compilado na memória compartilhada. Isto faz aumentar sensivelmente a performance de aplicações <a
href="http://www.php.net/" target="_blank">PHP</a>.</p><p>O <a
href="http://memcached.org/" target="_blank">Memcached</a> é um sistema de cache em memória de alta performance, bastante usado por grandes nomes da Internet, como <a
href="http://twitter.com" target="_blank">Twitter</a>, <a
href="http://www.flickr.com/" target="_blank">Flickr</a>, <a
href="http://www.wikipedia.org/" target="_blank">Wikipedia</a>, <a
href="http://www.youtube.com" target="_blank">Youtube</a>, dentre outros.</p><p>Quer performance para sua aplicação <a
href="http://www.php.net/" target="_blank">PHP</a>? Basta misturar isso tudo!! E o melhor, a configuração é tranquila.</p><p>Para começar, instale o <a
href="http://httpd.apache.org/" target="_blank">Apache</a> 2 e o <a
href="http://www.php.net/" target="_blank">PHP</a> 5. Não vou abordar a instalação e configuração do servidor <a
href="http://httpd.apache.org/" target="_blank">Apache</a> 2 + <a
href="http://www.php.net/" target="_blank">PHP</a> 5, pois basta ir no Google, você encontrará bastante coisa.</p><p><strong>Configuração do Apache</strong></p><p>Depois do <a
href="http://httpd.apache.org/" target="_blank">Apache</a> + <a
href="http://www.php.net/" target="_blank">PHP</a> instalados e configurados, altere a porta onde o <a
href="http://httpd.apache.org/" target="_blank">Apache</a> receberá as conexões para 8080. No Debian, edite as seguintes linhas do arquivo /etc/apache2/ports.conf para o seguinte:</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;">NameVirtualHost dominio.com:<span style="color: #000000;">8080</span>
Listen <span style="color: #000000;">8080</span></pre></div></div><p>E altere também a porta na configuração do virtual host:</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;">VirtualHost dominio.com:<span style="color: #000000;">8088</span></pre></div></div><p>Isto significa que o <a
href="http://httpd.apache.org/" target="_blank">Apache</a> deixará de atender as requisições na porta 80 (padrão). Ou seja, usaremos o <a
href="http://httpd.apache.org/" target="_blank">Apache</a> apenas para processar os arquivos <a
href="http://www.php.net/" target="_blank">PHP</a>, deixando todo o conteúdo estático (imagens, javascript, css, etc) para o <a
href="http://wiki.nginx.org/Main">Nginx</a>.</p><p>Reinicie o servidor <a
href="http://httpd.apache.org/" target="_blank">Apache</a>. No Debian, o comando é <strong>/etc/init.d/apache2 restart</strong>.</p><p><strong>Instalação e Configuração do APC</strong></p><p>Agora é a instalação do <a
href="http://pecl.php.net/package/APC" target="_blank">APC</a>. No Debian 5, isso é extremamente simples:</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> php-apc</pre></div></div><p>Após instalar, edite o arquivo /etc/php5/conf.d/apc.ini, adicionando as seguintes linhas:</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">extension</span>=apc.so
apc.enabled=<span style="color: #000000;">1</span></pre></div></div><p>É possível configurar vários parâmetros, consulte a documentação do <a
href="http://pecl.php.net/package/APC" target="_blank">APC</a>.</p><p>Para a nova configuração surtir efeito, reinicie o <a
href="http://httpd.apache.org/" target="_blank">Apache</a>:</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>apache2 restart</pre></div></div><p><strong>Instalação e Configuração do Memcached</strong></p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> memcached</pre></div></div><p>Após a instalação, edite o arquivo <strong>/etc/memcached.conf</strong>. Geralmente não é necessário mudar muita coisa, a não ser o tamanho máximo da memória para o <a
href="http://memcached.org/" target="_blank">Memcached</a> (o default é 64 MB). O <a
href="http://memcached.org/" target="_blank">Memcached</a> usa a porta 11211 por padrão, mas também é possível mudar. O arquivo de configuração vem todo comentado, não há segredo.</p><p>Para alterar o tamanho do espaço de memória, altere a linha <strong>-m 64</strong> para o quanto for necessário (128, 256, 512, 1024,&#8230;). Lembrando que o <a
href="http://memcached.org/" target="_blank">Memcached</a> só ocupa o espaço de memória que estiver em uso pelo cache, ele não reserva todo o espaço inicialmente. Feita a configuração, reinicie o daemon do <a
href="http://memcached.org/" target="_blank">Memcached</a> com o comando:</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>memcached restart</pre></div></div><p>Agora só falta o <a
href="http://wiki.nginx.org/Main">Nginx</a>.</p><p><strong>Instalação do Nginx</strong></p><p>Adivinhem?</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> nginx</pre></div></div><p>Vamos abordar a configuração em um outro artigo. Até lá, que tal dar uma olhada nos arquivos de configuração do Nginx, em <strong>/etc/nginx </strong>? Bons estudos!</p> ]]></content:encoded> <wfw:commentRss>http://www.bragil.net/linux-unix/nginx-apache-php5-apc-memcached-linux-performance-1/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>[PHP] Incrível, mas isso funciona!</title><link>http://www.bragil.net/php/php-incrivel-mas-isso-funciona/</link> <comments>http://www.bragil.net/php/php-incrivel-mas-isso-funciona/#comments</comments> <pubDate>Wed, 24 Nov 2010 10:40:00 +0000</pubDate> <dc:creator>bragil</dc:creator> <category><![CDATA[PHP]]></category> <category><![CDATA[POG]]></category> <guid
isPermaLink="false">/post/PHP-Incrivel-mas-isso-funciona!.aspx</guid> <description><![CDATA[Por incr&#237;vel que pare&#231;a, o resultado da condi&#231;&#227;o abaixo em PHP &#233; true, e com isso a mensagem &#8220;s&#227;o iguais&#8221; &#233; exibida: 1 2 3 if &#40;&#40;'1 galinha' + '2 pardais'&#41; == '3 aves'&#41; &#123; echo 'são iguais!!!'; &#125; Fonte: http://desciclo.pedia.ws/wiki/PHP]]></description> <content:encoded><![CDATA[<p>Por incr&iacute;vel que pare&ccedil;a, o resultado da condi&ccedil;&atilde;o abaixo em PHP &eacute; <strong>true</strong>, e com isso a mensagem &#8220;s&atilde;o iguais&#8221; &eacute; exibida:</p><div
class="wp_syntax"><table><tr><td
class="line_numbers"><pre>1
2
3
</pre></td><td
class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'1 galinha'</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">'2 pardais'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'3 aves'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'são iguais!!!'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div><p>Fonte: <a
title="Desciclop&eacute;dia" href="http://desciclo.pedia.ws/wiki/PHP" target="_blank">http://desciclo.pedia.ws/wiki/PHP</a></p> ]]></content:encoded> <wfw:commentRss>http://www.bragil.net/php/php-incrivel-mas-isso-funciona/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Concatenação de strings em C# – um simples teste de performance</title><link>http://www.bragil.net/csharp/concatenacao-de-strings-em-c-%e2%80%93-um-simples-teste-de-performance/</link> <comments>http://www.bragil.net/csharp/concatenacao-de-strings-em-c-%e2%80%93-um-simples-teste-de-performance/#comments</comments> <pubDate>Tue, 16 Mar 2010 17:28:31 +0000</pubDate> <dc:creator>bragil</dc:creator> <category><![CDATA[.Net]]></category> <category><![CDATA[C#]]></category> <category><![CDATA[Performance]]></category> <guid
isPermaLink="false">/post/Concatenacao-de-strings-em-C-e28093-um-simples-teste-de-performance.aspx</guid> <description><![CDATA[Resolvi fazer este simples teste de performance para ver a diferença de tempo entre duas formas de concatenação de strings: usando a classe StringBuilder e usando o operador + para concatenação de strings em C#. O trecho de código que mede o tempo de execução entre as duas abordagens é bem simples, como segue: 1 [...]]]></description> <content:encoded><![CDATA[<p>Resolvi fazer este simples teste de performance para ver a diferença de tempo entre duas formas de concatenação de strings: usando a classe <font
color="#0000ff">StringBuilder</font> e usando o operador + para concatenação de strings em C#. O trecho de código que mede o tempo de execução entre as duas abordagens é bem simples, como segue:</p><div
class="wp_syntax"><table><tr><td
class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
</pre></td><td
class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Text</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Diagnostics</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> TesteConcatStrings
<span style="color: #008000;">&#123;</span>
    <span style="color: #6666cc; font-weight: bold;">class</span> Program
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Stopwatch watch <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Stopwatch<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #008080; font-style: italic;">// Testar concatenação usando StringBuilder</span>
            StringBuilder sb <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> StringBuilder<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            watch<span style="color: #008000;">.</span><span style="color: #0000FF;">Start</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&lt;</span> <span style="color: #FF0000;">10000</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                sb<span style="color: #008000;">.</span><span style="color: #0000FF;">Append</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Testando a performance de concatenação de strings. &quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
            watch<span style="color: #008000;">.</span><span style="color: #0000FF;">Stop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Format</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Usando StringBuilder: {0} ms&quot;</span>,
                                watch<span style="color: #008000;">.</span><span style="color: #0000FF;">ElapsedMilliseconds</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #6666cc; font-weight: bold;">string</span> str <span style="color: #008000;">=</span> <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Empty</span><span style="color: #008000;">;</span>
&nbsp;
 			<span style="color: #008080; font-style: italic;">// Teste de concatenação usando o operador +</span>
            watch<span style="color: #008000;">.</span><span style="color: #0000FF;">Start</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&lt;</span> <span style="color: #FF0000;">10000</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                str <span style="color: #008000;">+=</span> <span style="color: #666666;">&quot;Testando a performance de concatenação de strings. &quot;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
            watch<span style="color: #008000;">.</span><span style="color: #0000FF;">Stop</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Format</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Usando operador + em string: {0} ms&quot;</span>,
                                watch<span style="color: #008000;">.</span><span style="color: #0000FF;">ElapsedMilliseconds</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">ReadKey</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div><p>Como podemos ver, cada teste é um loop for de 10000 iterações, onde em cada iteração é feita uma concatenação de strings. No primeiro usamos a classe <font
color="#0000ff"><strong>StringBuilder</strong></font> e no segundo o operador + de concatenação de strings. Para medir o tempo, usamos a classe <font
color="#0000ff"><strong>Stopwatch</strong></font> e os métodos <font
color="#0000ff">Start()</font> e <font
color="#0000ff">Stop()</font>. Ao fim da execução de cada teste, a propriedade <font
color="#0000ff">ElapsedMilisecondes</font> da classe <font
color="#0000ff"><strong>Stopwatch</strong></font> retorna o resultado em milissegundos.</p><p>Agora, o resultado:</p><p><img
style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="strconcat" border="0" alt="strconcat" src="http://www.bragil.net/images/strconcat.png" width="525" height="317" /></p><p>Realmente a diferença é impressionante! É claro que o resultado pode (e com certeza vai) variar de máquina para máquina, mas já dá para ter noção do tamanho da diferença de cada uma das abordagens de concatenação de strings.</p><p>E se você ainda não tem o hábito de usar <font
color="#0000ff"><strong>StringBuilder</strong></font> em seus projetos, reveja seus conceitos… =)</p><p><strong>Referências externas:</strong></p><ul><li><a
href="http://msdn.microsoft.com/pt-br/library/2839d5h5.aspx" target="_blank">Usando a classe StringBuilder</a></li><li><a
href="http://www.macoratti.net/vbn_strb.htm" target="_blank">StringBuilder – tratando Strings de modo mais eficiente</a></li></ul> ]]></content:encoded> <wfw:commentRss>http://www.bragil.net/csharp/concatenacao-de-strings-em-c-%e2%80%93-um-simples-teste-de-performance/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
