<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Blog do Ruhan</title>
	<atom:link href="http://barraproc.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://barraproc.wordpress.com</link>
	<description>Just another WordPress.com site</description>
	<lastBuildDate>Thu, 23 Sep 2010 13:25:04 +0000</lastBuildDate>
	<language></language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='barraproc.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/f0503cad0dcad4baf322fd44bf9d16d0?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Blog do Ruhan</title>
		<link>http://barraproc.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://barraproc.wordpress.com/osd.xml" title="Blog do Ruhan" />
	<atom:link rel='hub' href='http://barraproc.wordpress.com/?pushpress=hub'/>
		<item>
		<title>PostgreSQL 9.0, novas funcionalidades</title>
		<link>http://barraproc.wordpress.com/2010/09/22/postgresql-9-0-novas-funcionalidades/</link>
		<comments>http://barraproc.wordpress.com/2010/09/22/postgresql-9-0-novas-funcionalidades/#comments</comments>
		<pubDate>Wed, 22 Sep 2010 00:32:55 +0000</pubDate>
		<dc:creator>ruhanbidart</dc:creator>
				<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://barraproc.wordpress.com/?p=22</guid>
		<description><![CDATA[Este é um post feito bem rapidamente sobre algumas novas funcionalidades que gostei no PostgreSQL 9.0 (e algumas que eu nem conhecia já de outros carnavais). Bom, vamos ao que interessa: Window Funcions (desde a 8.4) [1]: maneira de fazer funções de agregação (sum, avg, etc.) em pedaços retornados da sua query sem ter que [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barraproc.wordpress.com&amp;blog=13332924&amp;post=22&amp;subd=barraproc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Este é um post feito bem rapidamente sobre algumas novas funcionalidades que gostei no PostgreSQL 9.0 (e algumas que eu nem conhecia já de outros carnavais).</p>
<p style="text-align:center;border:0;"><a href="http://barraproc.files.wordpress.com/2010/09/postgresql.png"><img class="size-full wp-image-25 aligncenter" style="border:0;" title="Caneca Postgresql" src="http://barraproc.files.wordpress.com/2010/09/postgresql.png?w=468" alt=""   /></a></p>
<p>Bom, vamos ao que interessa:</p>
<ol>
<li><strong>Window Funcions</strong> (desde a 8.4) [1]: maneira de fazer funções de agregação (sum, avg, etc.) em pedaços retornados da sua query sem ter que fazer group by e retornar uma linha, simplesmente fantástico. Para relatórios é algo crucial, principalmente em relatórios comerciais. Aqui na empresa estamos a desenvolver um relatório destes e, como não sabíamos destas novas funcionalidades, passamos maus bocados.</li>
<li><strong>When Triggers</strong>: possibilidade de colocar condições para execução de triggers como:
<pre><span style="color:#3366ff;"> CREATE TRIGGER log_update
 AFTER UPDATE ON accounts
 FOR EACH ROW
 WHEN (OLD.* IS DISTINCT FROM NEW.*)
 EXECUTE PROCEDURE log_account_update();</span></pre>
<p>Assim, sua trigger só será executada quando algum valor for modificado, evitando as antigas e complicadas verificações que fazíamos dentro das triggers em nossos famigerados OLD&#8217;s e NEW&#8217;s.</li>
<li><strong>Colum Triggers</strong>:<br />
Condicionamento da execução de uma trigger através da modificação de uma coluna, algo bem útil também e mais direto que o dito acima.</p>
<pre><span style="color:#3366ff;"> CREATE TRIGGER foo
 BEFORE UPDATE OF some_column ON table1
</span><span style="color:#3366ff;"> FOR EACH ROW EXECUTE PROCEDURE </span><span style="color:#3366ff;">my_trigger()</span></pre>
</li>
<li><strong>Hot Standby</strong> e <strong>Stream Replication</strong>: duas ferramentas de replicação de dados contínua que podem trabalhar em conjunto. A ideia básica é ter bancos replicados que possam servir tanto de backup ou quanto, por exemplo, um para pesquisas e outro para atualizações DML. Isto pode diminuir a carga de um determinado sistema. Além disto é uma ferramenta &#8220;included&#8221; que irá fazer algo que antigamente só era feito por ferramentas de terceiros, um dos grandes diferenciais desta nova versão.</li>
<li><strong>Ordenação em funções de agregação</strong>: primeiro observem a nova e sensacional ferramenta, string_agg (uma função de agregação para strings, bem como a outra nova array_agg). Desta forma estamos fazendo a agregação  dos nomes com muita facilidade.
<pre><span style="color:#3366ff;"> marc=# SELECT entity,string_agg(name,', ')
        FROM salary GROUP BY entity;
 entity     |          string_agg
 -----------+-------------------------------
 Accounting | stephanie, etienne
 R&amp;D        | marc, maria, kevin, john, tom</span></pre>
<p>Mas o mais legal não é isto. Estas funções novas também aceitam uma simples e fácil ordenação, vejam:</p>
<pre><span style="color:#3366ff;"> marc=# SELECT entity,string_agg(name,', ' ORDER BY name)
</span><span style="color:#3366ff;">        FROM salary GROUP BY entity;</span>
<span style="color:#3366ff;"> entity     |          string_agg
 -----------+-------------------------------
 Accounting | etienne, stephanie
 R&amp;D        | john, kevin, marc, maria, tom</span></pre>
<p>Percebam que esta ordenação é feita no pequeno conjunto de dados da agregação conforme sempre sonhamos.</li>
<li><strong>Melhores mensagens de erro</strong>:<br />
Com 8.4:</p>
<pre><span style="color:#3366ff;"> marc=# INSERT INTO test VALUES (1);
 ERROR:  duplicate key value violates unique
         constraint "test_a_key"</span></pre>
<p>Com 9.0:</p>
<pre><span style="color:#3366ff;"> marc=# INSERT INTO test VALUES (1);
 ERROR:  duplicate key value violates unique
         constraint "test_a_key"
 DETAIL:  Key (a)=(1) already exists.</span></pre>
<p>Estes detalhes ajudam muito a encontrar erros na hora do desenvolvimento.</li>
<li><strong>Remoção de Join desnecessário</strong>:<br />
A ideia é basicamente otimizar queries automaticamente. Se eu tenho 3 tabelas:</li>
<pre><span style="color:#3366ff;">CREATE TABLE t1 (a int);
CREATE TABLE t2 (b int);
CREATE TABLE t3 (c int);</span>
Com o campo c na tabela t3 tendo uma constraint unique,
feita por:
<span style="color:#3366ff;">ALTER TABLE t3 ADD UNIQUE (c);</span>
<pre>E fizermos um:
<span style="color:#3366ff;">EXPLAIN SELECT t1.a,t2.b from t1 join t2 on (t1.a=t2.b) 
</span><span style="color:#3366ff;">left join t3 on (t1.a=t3.c);</span>

<strong>No</strong> <strong>8.4</strong> teremos este resultado, sem nenhuma otimização 
"automática", veja:
<span style="color:#888888;">                            QUERY PLAN
------------------------------------------------------------------
Merge Join  (cost=338.76..790.56 rows=28800 width=8)
  Merge Cond: (t1.a = t2.b)
  -&gt;  Merge Left Join  (cost=170.01..183.81 rows=2400 width=4)
      Merge Cond: (t1.a = t3.c)
      -&gt;  Sort  (cost=168.75..174.75 rows=2400 width=4)
          Sort Key: t1.a
          -&gt;  Seq Scan on t1  (cost=0.00..34.00 rows=2400 width=4)
      -&gt;  Sort  (cost=1.27..1.29 rows=10 width=4)
          Sort Key: t3.c
          -&gt;  Seq Scan on t3  (cost=0.00..1.10 rows=10 width=4)
  -&gt;  Sort  (cost=168.75..174.75 rows=2400 width=4)
          Sort Key: t2.b
          -&gt;  Seq Scan on t2  (cost=0.00..34.00 rows=2400 width=4)</span>
<div id="_mcePaste">Com este mesmo script executado <strong>no 9.0</strong>, teremos um resultado
otimizado, veja:</div>
<div id="_mcePaste"><span style="color:#808080;">                            QUERY PLAN
------------------------------------------------------------------
Merge Join  (cost=337.49..781.49 rows=28800 width=8)
  Merge Cond: (t1.a = t2.b)
  -&gt;  Sort  (cost=168.75..174.75 rows=2400 width=4)
        Sort Key: t1.a
        -&gt;  Seq Scan on t1  (cost=0.00..34.00 rows=2400 width=4)
  -&gt;  Sort  (cost=168.75..174.75 rows=2400 width=4)
        Sort Key: t2.b
        -&gt;  Seq Scan on t2  (cost=0.00..34.00 rows=2400 width=4)</span></div>
<div id="_mcePaste">Isto ocorre porque nesta nova versão, o PostgreSQL consegue
identificar que o campo c é um campo com uma <span style="color:#3366ff;">constraint unique</span>,
assim, o <span style="color:#3366ff;">LEFT JOIN</span> entre as tabelas t2 e t3
(como temos um <span style="color:#3366ff;">on (t1.a = t3.c</span>)) nunca retornarão mais rows,
uma vez que c é única e ele decide por <strong>não</strong> executar este <span style="color:#3366ff;">join</span>,
uma vez que ele é desnecessário.</div>
</pre>
</pre>
<li><strong>IS NOT NULL agora utiliza indexes</strong>:<br />
Quando queries que envolvem campos nulos são executadas nas versões<br />
8.* os filtros checam arbitrariamente  nas tabelas pelos valores, nesta nova<br />
versão, a nulidade do campo também é indexada, assim, ao fazer uma query<br />
que envolve esta questão, o PostgreSQL irá apenas escanear o index para<br />
encontrar o elemento necessário, o que faz com que, em muitos casos,<br />
consultas executem dezenas de vezes (e até centenas) mais rapidamente.</li>
<li><strong> Chamadas de parâmetro (em <span style="font-weight:normal;"><strong>procedures) </strong></span>nomeadas</strong>: esta é uma outra functionalidade<br />
sensacional. Se temos uma função teste com dois parâmetros a e b, antigamente só podíamos chamá-la assim:<br />
<span style="color:#3366ff;">SELECT test(&#8216;valor1&#8242;, &#8216;valor2&#8242;);<br />
</span><br />
Agora podemos fazer também:<br />
<span style="color:#3366ff;">SELECT test( a := &#8216;valor1&#8242;, b:= &#8216;valor2&#8242;);<br />
</span><br />
Isto dá mais legibilidade ao código e mais flexibilidade.</li>
</ol>
<p>Quem quiser saber mais leia [2], tem-se uma descrição bem mais completa de cada nova funcionalidade e seus pormenores, alguns até mesmo sobre implementação.</p>
<p>1 &#8211; http://www.depesz.com/index.php/2009/01/21/waiting-for-84-window-functions<br />
2 &#8211; <a href="http://wiki.postgresql.org/wiki/What%27s_new_in_PostgreSQL_9.0">http://wiki.postgresql.org/wiki/What&#8217;s_new_in_PostgreSQL_9.0</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/barraproc.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/barraproc.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/barraproc.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/barraproc.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/barraproc.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/barraproc.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/barraproc.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/barraproc.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/barraproc.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/barraproc.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/barraproc.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/barraproc.wordpress.com/22/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/barraproc.wordpress.com/22/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/barraproc.wordpress.com/22/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barraproc.wordpress.com&amp;blog=13332924&amp;post=22&amp;subd=barraproc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://barraproc.wordpress.com/2010/09/22/postgresql-9-0-novas-funcionalidades/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/dea87749ef370cc8222b548426e74bbb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ruhanbidart</media:title>
		</media:content>

		<media:content url="http://barraproc.files.wordpress.com/2010/09/postgresql.png" medium="image">
			<media:title type="html">Caneca Postgresql</media:title>
		</media:content>
	</item>
		<item>
		<title>Comunidade Python MG</title>
		<link>http://barraproc.wordpress.com/2010/04/27/comunidade-python-mg/</link>
		<comments>http://barraproc.wordpress.com/2010/04/27/comunidade-python-mg/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 00:52:26 +0000</pubDate>
		<dc:creator>ruhanbidart</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Python MG]]></category>

		<guid isPermaLink="false">http://barraproc.wordpress.com/?p=3</guid>
		<description><![CDATA[A Largada Este meu primeiro post que me integra à blogosfera tem um caráter muito especial para mim. Ele denota o início de um trabalho que tem um intuito categórico: difundir a linguagem Python em Minas Gerais e criar uma comunidade forte de usuários desta linguagem em nosso estado. A história Nunca entendi o porquê [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barraproc.wordpress.com&amp;blog=13332924&amp;post=3&amp;subd=barraproc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>A Largada</strong><br />
<img class="alignnone" title="Largada" src="http://esportesocial.com/wp-content/uploads/2009/07/semifinals2mens100mbeijing2008.jpg" alt="" width="594" height="303" /></p>
<p>Este meu primeiro post que me integra à blogosfera tem um caráter muito especial para mim. Ele denota o início de um trabalho que tem um intuito categórico: difundir a linguagem Python em Minas Gerais e criar uma comunidade forte de usuários desta linguagem em nosso estado.</p>
<p><strong>A história</strong></p>
<p style="text-align:left;"><img class="aligncenter" title="Python's Logo" src="http://www.macosx.com.br/wp-content/uploads/2009/01/python-logo-master-flat-symbolonly.png" alt="" width="271" height="263" /></p>
<p>Nunca entendi o porquê de Minas Gerais não ter uma comunidade forte desta linguagem. Nós temos aqui uma sede do Google (que é um marketing e tanto para o Python), temos boas universidades como UFMG e PUC onde conheço alguns entusiastas e desenvolvedores Python e temos algumas empresas (como a <a href="http://www.2xt.com.br" target="_blank">2XT</a> na qual trabalho) que tem parte da sua tecnologia baseada na linguagem do <a href="http://twitter.com/gvanrossum" target="_blank">Guido</a>, e mesmo assim não formamos <strong>ainda</strong> nenhum grupo ou comunidade relacionado a estudos nesta linguagem.<br />
Trabalho com Python há alguns anos e sou apaixonado pela linguagem. Tenho experiência com outras linguagens como C, C++, Java e Object Pascal e em nenhuma delas tive tão fácil aprendizado com tanta desenvoltura como tive em Python, a facilidade simplesmente me impressionou. Desta forma penso que quando se é beneficiado com algo surge a responsabilidade de beneficiar à outras pessoas conforme fui beneficiado por aquele que me indicou Python pela primeira vez. Esta responsabilidade se transformou em vontade que impulsionada pelo <a href="http://smallactsmanifesto.org/">Small Acts Manifesto</a> me faz escrever este post chamando a todos os mineiros pythonistas a participarem e fortalecerem o Python em Minas Gerais e, por conseguinte, no Mundo.</p>
<p><strong>Os objetivos</strong></p>
<p><strong><img class="alignnone" title="Jogo War (Rio =D) - Objetivos" src="http://www.pluhma.com/maperna/blog/images/war-in-rio-01.jpg" alt="" width="550" height="356" /><br />
</strong></p>
<p>Como já não sou o único nesta empreitada à partir daqui me referirei a nós, não a mim. A comunidade já conta com alguns participantes mesmo antes de ser criada (cerca de 5 pessoas). Gostaria que todos tivessem em mente que o intuito desta comunidade não é somente aprender e disseminar Python. Este é apenas o <strong>motivo</strong> principal pelo qual nos unimos. O <strong>objetivo</strong> principal desta comunidade é cultivar e difundir o conhecimento.</p>
<p><strong>Conclusão</strong></p>
<p style="text-align:center;"><img class="aligncenter" title="Logo Small Acts Manifesto" src="http://smallactsmanifesto.org/media/images/logo-small-acts.png" alt="" width="280" height="201" /></p>
<p>Portanto, chamo a todos os mineiros que gostam de Python, querem conhecer a linguagem ou são curiosos para participar conosco. Lembrem-se de informar aos seus amigos que este movimento se inicia. Vamos fazer esta comunidade crescer, afinal <em>&#8220;Small Acts Make Great Revolutions&#8221;</em>.</p>
<ul>
<li>Agrupe-se na <a href="http://groups.google.com.br/group/python-mg" target="_blank">python-mg</a>.</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/barraproc.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/barraproc.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/barraproc.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/barraproc.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/barraproc.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/barraproc.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/barraproc.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/barraproc.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/barraproc.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/barraproc.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/barraproc.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/barraproc.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/barraproc.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/barraproc.wordpress.com/3/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barraproc.wordpress.com&amp;blog=13332924&amp;post=3&amp;subd=barraproc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://barraproc.wordpress.com/2010/04/27/comunidade-python-mg/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/dea87749ef370cc8222b548426e74bbb?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">ruhanbidart</media:title>
		</media:content>

		<media:content url="http://esportesocial.com/wp-content/uploads/2009/07/semifinals2mens100mbeijing2008.jpg" medium="image">
			<media:title type="html">Largada</media:title>
		</media:content>

		<media:content url="http://www.macosx.com.br/wp-content/uploads/2009/01/python-logo-master-flat-symbolonly.png" medium="image">
			<media:title type="html">Python&#039;s Logo</media:title>
		</media:content>

		<media:content url="http://www.pluhma.com/maperna/blog/images/war-in-rio-01.jpg" medium="image">
			<media:title type="html">Jogo War (Rio =D) - Objetivos</media:title>
		</media:content>

		<media:content url="http://smallactsmanifesto.org/media/images/logo-small-acts.png" medium="image">
			<media:title type="html">Logo Small Acts Manifesto</media:title>
		</media:content>
	</item>
	</channel>
</rss>
