<?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>Renato CRON</title>
	<atom:link href="http://renatocron.com/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://renatocron.com/blog</link>
	<description></description>
	<lastBuildDate>Wed, 26 Oct 2011 14:10:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>SEO &#8211; Múltiplos sites no mesmo endereço IP</title>
		<link>http://renatocron.com/blog/topicos/seo-multiplos-sites-no-mesmo-endereco-ip/74</link>
		<comments>http://renatocron.com/blog/topicos/seo-multiplos-sites-no-mesmo-endereco-ip/74#comments</comments>
		<pubDate>Wed, 26 Oct 2011 14:00:48 +0000</pubDate>
		<dc:creator>Renato CRON</dc:creator>
				<category><![CDATA[programas]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[seo]]></category>
		<guid isPermaLink="false">http://renatocron.com/blog/?p=74</guid>
		<description><![CDATA[O assunto de hoje é SEO! depois de meses sem postar algo ^^ Há algum tempo, compartilho de um servidor com mais um amigo, e tenho um site &#8220;pornô&#8220;, digo &#8220;pornô&#8221; porque ele não é exatamente isso, ele é sobre &#8230; <a href="http://renatocron.com/blog/topicos/seo-multiplos-sites-no-mesmo-endereco-ip/74">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>O assunto de hoje é SEO! depois de meses sem postar algo ^^</p>
<p><span>Há algum tempo, <span>compartilho</span> de um servidor com mais um amigo, e tenho um site &#8220;<span>pornô</span>&#8220;, digo &#8220;<span>pornô</span>&#8221; porque ele não é <span>exatamente</span> isso, ele é sobre Peitos, e </span><strong>Peito é natureza</strong>.</p>
<p>Vamos ao <strong><span>um site hospedado junto com outro, pode interferir no <span>ranking</span> dos sites &#8216;vizinhos de IP&#8217;?</span></strong></p>
<h2>Reposta muito curta:</h2>
<p><strong>NÃO</strong>.</p>
<h2><span>Resposta curta:</span></h2>
<p>Depende da troca de <span>links</span> entre os sites envolvidos.</p>
<h2>Resposta:</h2>
<p>Supondo que um site A, com o domínio <em><span>www.site1.com.<span>br</span></span></em>, está hospedado no mesmo local (não importa se é o mesmo servidor físico, detalhes em abaixo) do site B, cujo domínio é <em><span>www.segundo.com.<span>br</span>. </span></em>Ambos os sites estão no IP 187.10.200.15.</p>
<p><span id="more-74"></span></p>
<p>
<strong>Basicamente</strong><span> o google não se importa com isso (o google se importa mais com o domínio em questão, veja o vídeo do <span>Matt</span> <span>Cutts</span> aqui: </span><a href="http://video.google.com/videoplay?docid=3583760678227172395">http://video.google.com/videoplay?docid=3583760678227172395)</a>.
</p>
<p>
O que acontece é que, <strong>se</strong><span> o site A contiver um link para o site B, hospedados sob o mesmo IP/classe C, ou seja, todos os 254 <span>IPs</span> da rede, terão um menor </span><em><a title="juice" href="http://www.techzilo.com/what-is-google-juice/" target="_blank">juice</a> </em>repassado para o site B, porém isso, <strong>se, e apenas se</strong>, o site A passar um link para o site B.
</p>
<p>&nbsp;</p>
<p>
<span>Ou seja, mesmo que você compre novos <span>IPs</span>, </span><em>google knows</em><span> e você teria que comprar uma rede inteira de <span>IPs</span> apenas para algo, que teoricamente, não vai fazer tanta diferença, pois quem faz <span>cross</span>-<span>links</span> não naturais (afinal, 3 ou 4 links, ou até mesmo 100 <span>links</span> de um site grande para outro grande não terá diferenças <span>significativas</span></span>), afinal, você não está fazendo black-hat com link-building né?</p>
<h2>Fonte:</h2>
<p>
<a href="http://www.seroundtable.com/archives/013543.html"><span>http://www.<span>seroundtable</span>.com/<span>archives</span>/013543.html</span></a></p>
<p>Neste post, existem links para outros blogs, onde também foi discutido sobre o assunto.
</p>
<p>&nbsp;</p>
<p style="text-align: right;">Não sou nenhum especialista em SEO, afinal, não sou <a title="especialista" href="http://pt.wikipedia.org/wiki/Especialista" target="_blank">especialista</a> em nenhuma área, mas uma coisa é fato, não sou <del>muito</del> burro.</p>
<p>
Observações: com toda essa onda de IPV6, eu não sei como isso irá parar, porque cada &#8220;usário&#8221; final irá receber em média 254 ips, ou até mesmo, em servidores, 65 redes por maquina.</p>
]]></content:encoded>
			<wfw:commentRss>http://renatocron.com/blog/topicos/seo-multiplos-sites-no-mesmo-endereco-ip/74/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Postgres &#8211; Campos arrays, perl, hash e &#8230; pog</title>
		<link>http://renatocron.com/blog/topicos/postgres-campos-arrays-perl-hash-pog/53</link>
		<comments>http://renatocron.com/blog/topicos/postgres-campos-arrays-perl-hash-pog/53#comments</comments>
		<pubDate>Thu, 26 May 2011 17:40:51 +0000</pubDate>
		<dc:creator>Renato CRON</dc:creator>
				<category><![CDATA[Databases]]></category>
		<guid isPermaLink="false">http://www.renatocron.com/blog/?p=53</guid>
		<description><![CDATA[Primeiros, a definição: POG: Postgres Oriented Gambis! Brincadeiras a parte, vamos lá: eu tenho certeza que você já quis colocar uma array no banco (por exemplo, todos os telefones de uma pessoa) sem ter que criar outra tabela para criar &#8230; <a href="http://renatocron.com/blog/topicos/postgres-campos-arrays-perl-hash-pog/53">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Primeiros, a definição: POG: Postgres Oriented Gambis!</p>
<p>Brincadeiras a parte, vamos lá: eu tenho certeza que você já quis colocar uma array no banco<br />
<em>(por exemplo, todos os telefones de uma pessoa)</em> sem ter que criar outra tabela para criar a relação.</p>
<p>Agora que você esta ciente dos riscos, da quantidade de POG [dessa vez programação orientada a gambi mesmo] que você irá fazer, continuaremos.</p>
<p>Adicionar um novo campo com os telefones seria fácil demais:</p>
<pre name="code" class="sql">create table blabla (
	id_blabla bigiserial,
	telefones text[]
);</pre>
<p>Porém, você só poderia ter os telefones assim:</p>
<pre name="code" class="js">{
    '1234-2222', 123342123, 23212
}</pre>
<p>Mas aí surgem necessidades como, separar o DDD, saber se é FAX, se tem ramal, etc&#8230;</p>
<p>Então, na mais <strong>pura maldade</strong> pensei:<br />
<em>&#8220;pow, seria muito legal ter um HASH ai nesse campo&#8230;&#8221;</em></p>
<p>Como a preguiça também é grande, não quis criar um TYPE do postgres, pois seria dispersão de tempo,<br />
afinal este campo não precisa de search, é so um lugar pra jogar esta informação antes dela ser mais refinada.</p>
<p>Aí pensei, “Hmm, uma array de array resolveria o problema, ‘bora fazê’”:</p>
<p>Deixe assim:</p>
<pre name="code" class="sql">create table blabla (
	id_blabla bigiserial,
	telefones text[][]
);</pre>
<p>Pronto, agora você pode fazer isto:</p>
<pre name="code" class="js">{
    {tel,'1234-2222'},
    {tel,123342123},
    {tel,23212}
}</pre>
<p>Assim, você salva chave, valor, chave, valor&#8230;.</p>
<p>Em perl, é bem simples transformar um HASH em Array [tem várias formas também]:<br />
A que eu utilizei foi esta:</p>
<pre name="code" class="php">        # Array de HASH
        my $array_de_hash = [{tel =&gt; 123, ddd =&gt; 11}, ... ];
        # array que vc vai colocar enviar ao banco
        my @as_array;
        foreach my $i (@$array_de_hash ) {
	        if (ref $i eq 'HASH') {
	                my @sub_array;
                        foreach my $k (keys %$i){
                                push(@sub_array, $k, $i-&gt;{$k});
                        }
                        push(@as_array, @sub_array);
                }else{
                        push(@as_array, $i);
                }
        }
        $array_de_hash = $database-&gt;quote( @as_array );</pre>
<p>Este é um exemplo muito básico, e não tem recursividade, mas funciona para casos simples.</p>
<p>Falta o código perl pra montar o $array_de_hash novamente, mas acho que é só você fazer um foreach seguido de %hash = @valores;</p>
<p>&nbsp;</p>
<pre name="code" class="js">{
    {matchkey,6868465D6A6E5660,telephone,11111111,extension,"",
      other,"",status,000000000000001,ddd,11}
}</pre>
<p>Cheers</p>
]]></content:encoded>
			<wfw:commentRss>http://renatocron.com/blog/topicos/postgres-campos-arrays-perl-hash-pog/53/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>II São Paulo Perl Workshop: Larry Wall e Brad Fitzpatrick no Brasil</title>
		<link>http://renatocron.com/blog/topicos/workshop-larry-wall-e-brad-fitzpatrick/50</link>
		<comments>http://renatocron.com/blog/topicos/workshop-larry-wall-e-brad-fitzpatrick/50#comments</comments>
		<pubDate>Mon, 02 May 2011 17:23:05 +0000</pubDate>
		<dc:creator>Renato CRON</dc:creator>
				<category><![CDATA[geral]]></category>
		<guid isPermaLink="false">http://www.renatocron.com/blog/?p=50</guid>
		<description><![CDATA[Este mês teremos um grande evento em São Paulo. No dia 7 de maio [daqui a 5 dias] teremos o segundo encontro realizado pelos São Paulo Perl Mongers, que trará pessoas como Larry Wall e Brad Fitzpatrick. Larry é o criador do &#8230; <a href="http://renatocron.com/blog/topicos/workshop-larry-wall-e-brad-fitzpatrick/50">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Este mês teremos um grande evento em São Paulo.<br />
<a href="http://www.perlworkshop.com.br" target="sppw"><img src="http://www.perlworkshop.com.br/static/images/logo_divulgacao.png" border="0" alt="" /></a></p>
<p><span id="more-50"></span></p>
<p>No dia 7 de maio [daqui a 5 dias] teremos o segundo encontro realizado pelos São Paulo Perl Mongers, que trará pessoas como <strong>Larry Wall</strong> e <strong>Brad Fitzpatrick.<img class="alignright" src="http://perlworkshop.com.br/static/images/site/camel.png" alt="" /></strong></p>
<p>Larry é o criador do Perl! Isso mesmo, o criador do Perl, aqui, em SP!</p>
<p>&nbsp;</p>
<p>Fora isso, teremos palestras sobre MongoDB, Capacity Planning. Participações <a href="http://perlworkshop.com.br/palestrantes#vagnerdiniz">Vagner Diniz</a> e <a href="http://perlworkshop.com.br/palestrantes#carlinhos">Carlinhos Cecconi</a> discutindo sobre o futuro da web segundo a W3c.</p>
<p>&nbsp;</p>
<p>Eden Cardim, falando sobre Classes Remotas (mais uma coisa que só vem da cabeça dele!).</p>
<p>Você que AMA Perl, ou apenas quer saber como fazer sites com grande volume de carga, esse é o dia e o local ideal para você encontrar pessoas que podem fazer isso, e principalmente, aprender!</p>
<p>&nbsp;</p>
<p>As inscrições estão, por enquanto, a R$ 200 reais, incluindo café da manhã e almoço e café da tarde! Ah, além da comida você pode falar com as pessoas!</p>
<p>&nbsp;</p>
<p>Não sabe inglês? isso não é desculpa! Teremos tradução simultânea fornecida por uma empresa especializada nisso.<br />
Para fazer sua inscrição, basta preencher o formulário abaixo.</p>
<p>&nbsp;</p>
<p>O valor da inscrição é de R$ 200. Você pode parcelar sua inscrição em até 3x sem juros no cartão.</p>
<p>Não perca tempo, as vagas são limitadas!</p>
<p><a href="http://perlworkshop.com.br/inscricao">http://perlworkshop.com.br/inscricao</a></p>
<p>Veja a programação:</p>
<p><a href="http://perlworkshop.com.br/programacao">http://perlworkshop.com.br/programacao</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://renatocron.com/blog/topicos/workshop-larry-wall-e-brad-fitzpatrick/50/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mínimo e Máximo no postgres dentro de arrays</title>
		<link>http://renatocron.com/blog/topicos/maximo-no-postgres-arrays/46</link>
		<comments>http://renatocron.com/blog/topicos/maximo-no-postgres-arrays/46#comments</comments>
		<pubDate>Mon, 14 Feb 2011 17:47:37 +0000</pubDate>
		<dc:creator>Renato CRON</dc:creator>
				<category><![CDATA[geral]]></category>
		<guid isPermaLink="false">http://www.renatocron.com/blog/?p=46</guid>
		<description><![CDATA[Estava procurando na internet e achei várias soluções, porém, a melhor foi esta: Menor valor create function minimum(anyarray) returns anyelement as $$ SELECT min($1[i]) FROM generate_series(array_lower($1,1), array_upper($1,1)) g(i); $$ language sql immutable strict; Maior valor create function maximum(anyarray) returns anyelement &#8230; <a href="http://renatocron.com/blog/topicos/maximo-no-postgres-arrays/46">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Estava procurando na internet e achei várias soluções, porém, a melhor foi esta:</p>
<p>Menor valor</p>
<pre class="brush: sql">create function minimum(anyarray)
returns anyelement as $$
   SELECT min($1[i])
   FROM generate_series(array_lower($1,1), array_upper($1,1)) g(i);
$$ language sql immutable strict;
</pre>
<p>Maior valor</p>
<pre class="brush: sql">create function maximum(anyarray)
returns anyelement as $$
   SELECT max($1[i])
   FROM generate_series(array_lower($1,1), array_upper($1,1)) g(i);
$$ language sql immutable strict;
</pre>
<p>Testando:</p>
<pre class="brush: sql">SELECT *, minimum(abc), maximum(abc)
FROM qualquer_tabela;</pre>
<p>Legal eim? Porém, diga-se de passagem, não é aconselhável usar campos arrays para fazer pesquisas de dados. Para isso, existem as FKs, que usam indexes.</p>
<p>Consultas:</p>
<ul>
<li><strong>procurar array o Máximo e Mínimo postgres</strong></li>
<li><strong>consultar o mínimo e máximo numa array no postgres</strong><strong> </strong></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://renatocron.com/blog/topicos/maximo-no-postgres-arrays/46/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Salvar quantas pessoas acessaram uma página com php *</title>
		<link>http://renatocron.com/blog/topicos/salvar-quem-acessou-pagina-php/44</link>
		<comments>http://renatocron.com/blog/topicos/salvar-quem-acessou-pagina-php/44#comments</comments>
		<pubDate>Mon, 14 Feb 2011 17:10:55 +0000</pubDate>
		<dc:creator>Renato CRON</dc:creator>
				<category><![CDATA[geral]]></category>
		<guid isPermaLink="false">http://www.renatocron.com/blog/?p=44</guid>
		<description><![CDATA[Olá! Pediram-me para fazer, apenas um arquivo com todos os acessos do site usando PHP. Outra regra e que se retorna uma imagem transparente com 1px/1px. Então fiz uma rotinas em PHP bem simples: $item = array( 'REMOTE_ADDR' =&#62; $_SERVER['REMOTE_ADDR'], &#8230; <a href="http://renatocron.com/blog/topicos/salvar-quem-acessou-pagina-php/44">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Olá!</p>
<p>Pediram-me para fazer, apenas um arquivo com todos os acessos do site usando PHP.<br />
<a rel="attachment wp-att-49" href="http://www.renatocron.com/blog/topicos/salvar-quem-acessou-pagina-php/44/log-conexao"><img class="alignright size-full wp-image-49" title="Estátisticas dos usuários" src="http://renatocron.com/blog/wp-content/uploads/2011/02/log-conexao.jpg" alt="atividades do usuário" width="68" height="64" /></a></p>
<p>Outra regra e que se retorna uma imagem transparente com 1px/1px.</p>
<p><span id="more-44"></span></p>
<p>Então fiz uma rotinas em PHP bem simples:</p>
<pre class="brush: php">		$item = array(
			'REMOTE_ADDR' =&gt; $_SERVER['REMOTE_ADDR'],
			'REQUEST_TIME' =&gt; $_SERVER['REQUEST_TIME'],
			'PATH_INFO'    =&gt; $_SERVER['PATH_INFO'],
			'HTTP_USER_AGENT' =&gt; $_SERVER['HTTP_USER_AGENT'],
			'get' =&gt; @$_GET,
			'post' =&gt; @$_POST,
		);
		$myFile = "testFile.txt";
		$fh = fopen($myFile, 'a') or die("can't open file");
		$stringData = json_encode($item). "n";
		fwrite($fh, $stringData);
		fclose($fh);
		Header( "Content-type: image/gif");
		Header( "Expires: Wed, 11 Nov 1998 11:11:11 GMT");
		Header( "Cache-Control: no-cache");
		Header( "Cache-Control: must-revalidate");
		printf ("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",
                  71,73,70,56,57,97,1,0,1,0,128,255,0,192,192,192,0,0,0,33,249,4,1,0,0,0,0,44,0,0,0,0,1,0,1,0,0 ,2,2,68,1,0,59);
		exit;</pre>
<p>Bom, neste caso, estou apenas fazendo &#8220;append&#8221; num arquivo, depois, quando for necessário, farei um perl (ou um PHP) para analisar tais dados.</p>
<p>Cada linha do arquivo é comporta por um JSON com a estrutura igual ao do array $item.</p>
<p>Um ponto positivo nesta opção é que pode-se usar tanto num e-mail quanto numa página qualquer do site, pois, não é necessário um javascript.</p>
<p>Assim você pode <strong>salvar quantas pessoas acessam uma pagina</strong> de forma eficiente e consultar executando um &#8220;grep&#8221;!</p>
<hr />
<p>Mas continue lendo!</p>
<p>Depois de entregar o script, fiz algumas alterações nele script acima para poder permitir que seja executado algum processamento sem fazer o GIF demorar em responder.</p>
<p>Basicamente desabilita o gzip e fecha a conexão e continua executando o código.</p>
<p>Para saber mais pesquise sobre <strong>como executar código PHP depois de fechar a conexão com php</strong>, ou <strong>executar comando demorados no php</strong>.</p>
<p>&nbsp;</p>
<p><span style="text-decoration: underline;">arquivo.php</span></p>
<pre class="brush: php">	@apache_setenv('no-gzip', 1);
	@ini_set('zlib.output_compression', 0);
	@ini_set('output_buffering', 'off');
	ob_end_clean();
	header("Connection: close");
	ignore_user_abort(); // optional
	ob_start();
	header( "Content-type: image/gif");
	header( "Expires: Wed, 11 Nov 1998 11:11:11 GMT");
	header( "Cache-Control: no-cache");
	header( "Cache-Control: must-revalidate");
	printf ("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",
		71,73,70,56,57,97,1,0,1,0,128,255,0,192,192,192,0,0,0,33,249,4,1,0,0,0,0,44,0,0,0,0,1,0,1,0,0 ,2,2,68,1,0,59);
	$size = ob_get_length();
	header("Content-Length: $size");
	ob_end_flush();
	flush();
	# da qui pra baixo nao adianta mudar o conteudo da tela...
	$item = array(
		'REMOTE_ADDR' =&gt; $_SERVER['REMOTE_ADDR'],
		'REQUEST_TIME' =&gt; $_SERVER['REQUEST_TIME'],
		'PATH_INFO'    =&gt; $_SERVER['PATH_INFO'],
		'HTTP_USER_AGENT' =&gt; $_SERVER['HTTP_USER_AGENT'],
		'get' =&gt; @$_GET,
		'post' =&gt; @$_POST,
	);
	$myDir     = "/home/renato/log";
	$importDir = "/home/renato/log-para-processar";
	$run_perl  = array ('/projetos/processador-de-logs', 'importador-de-logs.pl', 'log.txt');
	$today = "log-".date('Y-m-d').".txt";
	$myFile = $myDir . "/$today";
	# escreve no arquivo o log do get
	$fh = fopen($myFile, 'a') or die("can't open file");
	$stringData = json_encode($item). "n";
	fwrite($fh, $stringData);
	fclose($fh);
	$proc = 0;
	# pega a lista de todos os arquivos que estão dentro de $myDir para mover para o $importDir ao menos que seja o $myFile
	$myDirectory = opendir($myDir);
	// get each entry
	while($entryName = readdir($myDirectory)) {
		if (substr($entryName, 0, 3) == 'log' &amp;&amp; is_file("$myDir/$entryName") &amp;&amp; $entryName != $today){
			rename("$myDir/$entryName", "$importDir/$entryName");
			$proc++;
		}
	}
	closedir($myDirectory);
	if ($proc){
		# executa o perl
		`(cd $run_perl[0]; perl $run_perl[1] 1&gt;&gt; $run_perl[2] 2&gt;&amp;1 &amp;)&gt;/dev/null`;
	}</pre>
<p>Claro que você pode remover o código perl que é executado, ou até mesmo a separação de arquivos.</p>
<p>Fica a seu critério!</p>
]]></content:encoded>
			<wfw:commentRss>http://renatocron.com/blog/topicos/salvar-quem-acessou-pagina-php/44/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FMU – Ciência da computação &#8211; Segundo dia</title>
		<link>http://renatocron.com/blog/topicos/fmu-%e2%80%93-ciencia-da-computacao-dia/42</link>
		<comments>http://renatocron.com/blog/topicos/fmu-%e2%80%93-ciencia-da-computacao-dia/42#comments</comments>
		<pubDate>Wed, 09 Feb 2011 02:54:46 +0000</pubDate>
		<dc:creator>Renato CRON</dc:creator>
				<category><![CDATA[geral]]></category>
		<guid isPermaLink="false">http://www.renatocron.com/blog/?p=42</guid>
		<description><![CDATA[Olá, Hoje, terça-feira, tivemos aula com o prof. Nilson, de Cálculo diferencial e integral I [aka: matemática]. Explicou o básico sobre funções, e passou a grade deste semestre junto com a bibliografia. Já são quase 1 da manhã, então não &#8230; <a href="http://renatocron.com/blog/topicos/fmu-%e2%80%93-ciencia-da-computacao-dia/42">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Olá,</p>
<p>Hoje, terça-feira, tivemos aula com o prof. Nilson, de Cálculo diferencial e integral I [aka: matemática].</p>
<p>Explicou o básico sobre funções, e passou a grade deste semestre junto com a bibliografia.</p>
<p>Já são quase 1 da manhã, então não vou colocar agora uma tabela aqui com a grade.</p>
<p>Porém, como já esta sendo dito várias vezes, eu criei um grupo no Google Grupos,</p>
<p>o e-mail é <a href="mailto:ciencia-da-computacao-019201a01@googlegroups.com">ciencia-da-computacao-019201a01@googlegroups.com</a> um pouco grande, porém é bem simples: nosso curso separado por traço seguido pelo código da nossa turma. Assim não atrapalhamos mais nenhuma outra sala.</p>
<form action="http://groups.google.com/group/ciencia-da-computacao-019201a01/boxsubscribe">
<input name="hl" type="hidden" value="pt-BR" />
<table style="background-color: #fff; padding: 5px;" border="0" cellspacing="0">
<tbody>
<tr>
<td><img src="http://groups.google.com/intl/pt-BR/images/logos/groups_logo_sm.gif" alt="Grupos do Google" width="140" height="30" /></td>
</tr>
<tr>
<td style="padding-left: 5px;"><strong>Participe do grupo FMU Ciência da Computação 2011</strong></td>
</tr>
<tr>
<td style="padding-left: 5px;">E-mail:</p>
<input name="email" type="text" />
<input name="sub" type="submit" value="Inscrever" /></td>
</tr>
<tr>
<td align="right"><a href="http://groups.google.com/group/ciencia-da-computacao-019201a01?hl=pt-BR">Visitar este grupo</a></td>
</tr>
</tbody>
</table>
</form>
<p>Apenas vou deixar liberado o grupo para pessoas da sala, afinal, nem todos os documentos que ficarão em anexo no google docs (preciso testar se da pra enviar e-mail com anexo)  são públicos.</p>
<p>Já foi passada uma lista para um aluno (que não sei porque eu sempre fico pensando que se chama Igor, mas não é) com nome/email.</p>
<p>Ele é programador Python, e vai me passar um TXT com a relação para eu já enviar os convites.</p>
<p>Também teve outro aluno, que disse que vai criar um grupo no MSN, quem quiser, pode usar. Ele disse que ia colocar no orkut, mas a comunidade que ele disse, necessita de aprovação do moderar, ou seja =&gt; não sei qual é o e-mail do grupo do msn.</p>
<p>Por agora é só.</p>
]]></content:encoded>
			<wfw:commentRss>http://renatocron.com/blog/topicos/fmu-%e2%80%93-ciencia-da-computacao-dia/42/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FMU &#8211; Ciência da computação &#8211; Primeiro dia</title>
		<link>http://renatocron.com/blog/topicos/fmu-ciencia-da-computacao-dia/40</link>
		<comments>http://renatocron.com/blog/topicos/fmu-ciencia-da-computacao-dia/40#comments</comments>
		<pubDate>Mon, 07 Feb 2011 12:10:49 +0000</pubDate>
		<dc:creator>Renato CRON</dc:creator>
				<category><![CDATA[geral]]></category>
		<category><![CDATA[pessoal]]></category>
		<guid isPermaLink="false">http://www.renatocron.com/blog/?p=40</guid>
		<description><![CDATA[Olá ! Hoje teoricamente é o primeiro dia da faculdade, curso de ciencia da computação, na FMU (http://www.fmu.br). Teoricamente, pois dependendo do horário/trânsito/tranbriques, não vou conseguir chegar a tempo lá. Eu recebi um e-mail no dia 28/jan da FMU sendo &#8230; <a href="http://renatocron.com/blog/topicos/fmu-ciencia-da-computacao-dia/40">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Olá !</p>
<p>Hoje teoricamente é o primeiro dia da faculdade, curso de ciencia da computação, na FMU (<a href="http://www.fmu.br/">http://www.fmu.br</a>).<br />
Teoricamente, pois dependendo do horário/trânsito/tranbriques, não vou conseguir chegar a tempo lá.</p>
<p><span id="more-40"></span></p>
<p>Eu recebi um e-mail no dia 28/jan da FMU sendo informado  que eu estaria no prédio Brigadeiro, campus Liberdade, e que receberia outro e-mail confirmando o prédio/horário. Apenas recebi um e-mail avisando sobre os boletos e que não é permitida a entrada sem a carteira (tal carteira que não sei como obter ainda).</p>
<p>Esquecendo-se destes detalhes, apresento os professores e as aulas:<br />
<del><br />
<strong><em>Segunda-feira:</em> MARCOS JOSE SANVIDOTTI </strong>=&gt; Eu estou em dúvida qual curso ele irá lecionar, porém, achei alguns textos na internet, cujo nome dele é citado, e falam sobre a construção de um protótipo para próteses (1).<br />
Possíveis cursos:  CALCULO DIFERENCIAL E INTEGRAL I, INTRODUCAO A CIENCIA DA COMPUTACAO, INTRODUCAO A LOGICA, INTRODUCAO AO PROJETO DE ALGORITMO</del><br />
<ins><strong><em>Segunda-feira:</em>NILSON GESSONI SAPATA AGUILAR FERREIRA</strong></ins> Professor muito gente fina, mesmo sendo um curso de ciência da computação, já esperava que não fosse ver uma linha de código por algum tempo (ainda bem, já vejo o dia inteiro&#8230;). Não estou puxando saco, e que é melhor entregar as coisas via uma lista de e-mail, do que ficar copiando textos &#8220;a toa&#8221;.<br />
Curso: Administração</p>
<p><strong><em>Terça-feira: </em>NELSON DIAS LEME</strong>=&gt; Achei um resumo dele falando um estudo que ele realizou em conjunto com seus alunos para ensinar matemática financeira.<br />
Curso: CALCULO DIFERENCIAL E INTEGRAL I</p>
<p><strong><em>Quarta-feira:</em> </strong>corretamente na quarta o <strong>MARCOS JOSE SANVIDOTTI</strong>,<br />
leciona o curso de introdução a lógica. Como já foi dito, achei alguns textos na internet, cujo nome dele é citado, e falam sobre a construção de um protótipo para próteses (1)</p>
<p><strong><em>Quinta-feira: </em>MARIA DO CARMO GARCIA NORONHA </strong>=&gt; encontrei mais material sobre ela! Parece uma pessoa legal, afinal, tenho certeza que tal é programadora! Provavelmente ainda tem as 3 filhas (Karina, Fernanda e Beatriz). Fez um projeto de analises automáticas léxicas sobre textos usando LeX (<a href="http://en.wikipedia.org/wiki/Lex_(software)">http://en.wikipedia.org/wiki/Lex_(software)</a>) [deve conhecer perl] e deve saber bastante sobre Regular Expressions! (3)<br />
Cursos:  INTRODUCAO A CIENCIA DA COMPUTACAO</p>
<p><strong><em>Sexta-feira:</em> HIROMASA NAGATA</strong> =&gt; Mais um programador! Dessa vez, COBOL. O único conteúdo sobre ele que encontrei, foi num fórum, onde o nome dele foi citado dizendo que &#8220;excelente curso, ministrado por um ótimo, experiente e exigente professor&#8221; (2)<br />
Possíveis cursos:  INTRODUCAO AO PROJETO DE ALGORITMO</p>
<p>Detalhes sobre o site eu vou deixar para depois&#8230; Acho que vou fazer um javascript para arrumar a pagina <a rel="nofollow" href="http://www.fmu.br/aluno/consultas.asp?m=4&amp;s=79&amp;o=7&amp;rnd=40581,3516898148">http://www.fmu.br/aluno/consultas.asp?m=4&amp;s=79&amp;o=7&amp;rnd=40581,3516898148</a> pois, se você é aluno, só quer ver os cursos da onde você estuda, certo?</p>
<p>Endereço do curso de ciência da computação: AV. BRIG. LUIS ANTONIO, 1089<br />
O lugar é conhecido como PRÉDIO 39. Somos privilegiados e estamos no primeiro andar, na sala 101 (pelo menos a minha turma: <strong>019201A01</strong>)<br />
Como cheguei lá hoje (segunda-feira): eu estava próximo a estação Trianon &#8211; Masp do metro [pois é onde trabalho] portanto, simplesmente andei até quase a estação brigadeiro (15 minutos) e desci em direção a Av. Brigadeiro.</p>
<p>Curiosamente, se você precisar traçar uma rota pelo google maps, utilize o número 1030, pois é onde o google acha que é.</p>
<p><a title="FMU brigadeiros" href="http://maps.google.com.br/maps?f=q&amp;source=s_q&amp;hl=pt-BR&amp;geocode=&amp;q=Av.+Brg.+Lu%C3%ADs+Ant%C3%B4nio,+1089+-+Bela+Vista,+S%C3%A3o+Paulo+-+S%C3%A3o+Paulo,+01317-001&amp;aq=1&amp;sll=-23.558175,-46.641362&amp;sspn=0.005153,0.010568&amp;g=Av.+Brg.+Lu%C3%ADs+Ant%C3%B4nio,+1089+-+Bela+Vista,+S%C3%A3o+Paulo+-+S%C3%A3o+Paulo,+01317-001&amp;ie=UTF8&amp;hq=&amp;hnear=Av.+Brg.+Lu%C3%ADs+Ant%C3%B4nio,+1089+-+Bela+Vista,+S%C3%A3o+Paulo,+01317-001&amp;ll=-23.559161,-46.642196&amp;spn=0.001288,0.002642&amp;t=h&amp;z=19&amp;layer=c&amp;cbll=-23.559094,-46.642131&amp;panoid=-ktDQxcCJqWWqM44FnnsLA&amp;cbp=13,124.35,,0,0.35" target="_blank">Click aqui para ver o lugar</a></p>
<div>
<small><a style="color: #0000ff; text-align: left;" href="http://maps.google.com.br/maps?f=q&amp;source=embed&amp;hl=pt-BR&amp;geocode=&amp;q=Av.+Brg.+Lu%C3%ADs+Ant%C3%B4nio,+1089+-+Bela+Vista,+S%C3%A3o+Paulo+-+S%C3%A3o+Paulo,+01317-001&amp;aq=1&amp;sll=-23.558175,-46.641362&amp;sspn=0.005153,0.010568&amp;ie=UTF8&amp;hq=&amp;hnear=Av.+Brg.+Lu%C3%ADs+Ant%C3%B4nio,+1089+-+Bela+Vista,+S%C3%A3o+Paulo,+01317-001&amp;t=h&amp;layer=c&amp;cbll=-23.559094,-46.642131&amp;panoid=-ktDQxcCJqWWqM44FnnsLA&amp;cbp=13,124.35,,0,0.35&amp;ll=-23.559188,-46.642113&amp;spn=0,0.048237&amp;z=14">Exibir mapa ampliado</a></small></div>
<p>Pelo Google Analytics hoje percebi que teve muita procura por &#8220;como chegar na fmu de brigadeiro&#8221;, então já fica ai explicado para outras pessoas!<br />
Links:</p>
<p>(1): <a rel="nofollow" href="http://www.unicamp.br/unicamp/unicamp_hoje/ju/marco2006/ju317pag9.html">http://www.unicamp.br/unicamp/unicamp_hoje/ju/marco2006/ju317pag9.html</a></p>
<p>(2): <a rel="nofollow" href="http://www.hardware.com.br/comunidade/assembly-cobol/968411/1.html">http://www.hardware.com.br/comunidade/assembly-cobol/968411/1.html</a></p>
<p>(3): <a rel="nofollow" href="http://www.uscs.edu.br/comu/noticias.php?ind=1216">http://www.uscs.edu.br/comu/noticias.php?ind=1216</a></p>
]]></content:encoded>
			<wfw:commentRss>http://renatocron.com/blog/topicos/fmu-ciencia-da-computacao-dia/40/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Campus party acabou</title>
		<link>http://renatocron.com/blog/topicos/campus-party-acabou/38</link>
		<comments>http://renatocron.com/blog/topicos/campus-party-acabou/38#comments</comments>
		<pubDate>Sun, 23 Jan 2011 16:28:07 +0000</pubDate>
		<dc:creator>Renato CRON</dc:creator>
				<category><![CDATA[geral]]></category>
		<guid isPermaLink="false">http://www.renatocron.com/blog/?p=38</guid>
		<description><![CDATA[Enfim, a campus party ja era&#8230; sem link de 100mb (pois eh isso q vc recebe, culpa do switch) nao tem mais graca! Acabei q voltei ontem mesmo de carona com um amigo que me deixou na penha, mas&#8230; esqueci &#8230; <a href="http://renatocron.com/blog/topicos/campus-party-acabou/38">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Enfim,</p>
<p>a campus party ja era&#8230;</p>
<p>sem link de 100mb (pois eh isso q vc recebe, culpa do switch) nao tem mais graca!</p>
<p>Acabei q voltei ontem mesmo de carona com um amigo que me deixou na penha, mas&#8230;</p>
<p>esqueci o teclado no carro dele, e nao to com ele em lugar nenhum (msn, face, twiter&#8230;)</p>
<p>o jeito e eu levantar da cama e ir comparar outro, mas nem sai do lugar ainda (serio, meu notebook dormiu aqui do lado)</p>
]]></content:encoded>
			<wfw:commentRss>http://renatocron.com/blog/topicos/campus-party-acabou/38/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Campus Party 2011 &#8211; Meus preparativos</title>
		<link>http://renatocron.com/blog/topicos/campus-party-2011-meus-preparativos/36</link>
		<comments>http://renatocron.com/blog/topicos/campus-party-2011-meus-preparativos/36#comments</comments>
		<pubDate>Sun, 16 Jan 2011 17:33:08 +0000</pubDate>
		<dc:creator>Renato CRON</dc:creator>
				<category><![CDATA[geral]]></category>
		<guid isPermaLink="false">http://www.renatocron.com/blog/?p=36</guid>
		<description><![CDATA[E como todos sabem (rs, NÂO!) eu vou pra CP2011 e seja o que quiser. Internet tem lá, então o pessoal do trabalho pode me chamar a vontade, exceto nestas horas das palestras de: Palestra: MongoDB &#8211; um banco de &#8230; <a href="http://renatocron.com/blog/topicos/campus-party-2011-meus-preparativos/36">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>E como todos sabem (rs, NÂO!) eu vou pra CP2011 e seja o que quiser.</p>
<p>Internet tem lá, então o pessoal do trabalho pode me chamar a vontade, exceto nestas horas das palestras de:</p>
<ul>
<li>Palestra: MongoDB &#8211; um banco de dados orientado a documento, fácil e divertido</li>
<li>Palestra: Trilhando o Caminho PHP</li>
<li>Palestra: Psicologia nos jogos</li>
<li>Palestra: MongoDB &#8211; um banco de dados orientado a documento, fácil e divertido</li>
<li>Palestra: Simbolismo nos jogos</li>
<li>Palestra: Futuro da Web, HTML5 e W3C</li>
<li>Palestra: Como ganhar dinheiro criando jogos</li>
<li>Palestra: Unreal Engine</li>
<li>Palestra: O Jogo da Vida</li>
<li>Palestra: HTML 5</li>
</ul>
<p>Estou tentando seguir o kit de sobrevivencia do estadão (<a href="http://www.estadao.com.br/especiais/kit-de-sobrevivencia-para-a-campus-party,44230.htm" target="_blank">http://www.estadao.com.br/especiais/kit-de-sobrevivencia-para-a-campus-party,44230.htm</a>) mas ta complicado&#8230;<br />
Eu tenho uma mochila, falta por as roupas/toalhas,<br />
agora certas coisas eu não tenho: chinelos de dedo (<a href="http://www.facebook.com/group.php?gid=75595168586" target="_blank">I HATE HAVAIANAs</a>) e muito menos vou levar dois!</p>
<p>Eu vou ficar com o tênis o tempo todo e so vou tirar pra tomar banho, ai eu uso meu Rider!</p>
<p>Já comprei 1 plug adaptador para o padrão novo das tomadas, e vou levar a regua daqui de casa também, assim, só preciso de 1 adapatador.</p>
<p>O notebook vai continuar com a gambi (look <a href="http://twitpic.com/399xqi">http://twitpic.com/399xqi</a>) e só tiro se me pedirem.</p>
<p>Estou planejando de ir pro trampo, pegar minhas coisas (o meu fone de ouvido ta lá) e voltar pra casa, pra ir de carro pra CP, pois ainda preciso pensar numa foram de levar o computador e o monitor&#8230;</p>
<p>Quarta feira eu saio pra ir numa reunião, e sexta também, mas volto pra CP do mesmo jeito.</p>
<p>Estou fingido que vou dormi em cima do teclado, pois não estou nada a fim de levar cobertores, nem nada do tipo! Qualquer coisa o metro é perto (menos de 2km), e ja estou preparando minha conta do megaupload, pois comprei 2 TB só pra ir pra CP.</p>
<p>Tambem, em algum dia desses, vai ter apresentação do opendata (<a href="http://marciodesouzaferreira.blogspot.com/2011/01/hack-de-dados-publicos.html">http://marciodesouzaferreira.blogspot.com/2011/01/hack-de-dados-publicos.html</a>) e eu vou assitir!</p>
<p>&#8212; UPDATE 18:13</p>
<p>Vai ser na quarta feita, apresentada pelo Maluco (<a href="http://www.maluco.com.br/blog/">http://www.maluco.com.br/blog/</a>)</p>
<p>Ah, outra coisa, minha mãe ta fazendo minha mala, rs! Ela tem uma mochila de viagem, eu uma de notebook!</p>
]]></content:encoded>
			<wfw:commentRss>http://renatocron.com/blog/topicos/campus-party-2011-meus-preparativos/36/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Postgres Copy e Vacuum</title>
		<link>http://renatocron.com/blog/topicos/postgres-copy-vacuum/34</link>
		<comments>http://renatocron.com/blog/topicos/postgres-copy-vacuum/34#comments</comments>
		<pubDate>Thu, 30 Dec 2010 11:58:47 +0000</pubDate>
		<dc:creator>Renato CRON</dc:creator>
				<category><![CDATA[Databases]]></category>
		<guid isPermaLink="false">http://www.renatocron.com/blog/?p=34</guid>
		<description><![CDATA[O assunto de hoje vai ser Postgres. Como todos deveriam saber, o postgres usa o conceito de MVCC (see more on http://en.wikipedia.org/wiki/Multiversion_concurrency_control), ou seja, ele tem o histórico de todas as linhas que de alguma forma entraram no banco. Isso &#8230; <a href="http://renatocron.com/blog/topicos/postgres-copy-vacuum/34">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>O assunto de hoje vai ser Postgres.</p>
<p>Como todos deveriam saber, o postgres usa o conceito de MVCC (see more on http://en.wikipedia.org/wiki/Multiversion_concurrency_control), ou seja, ele tem o histórico de todas as linhas que de alguma forma entraram no banco.<br />
Isso é feito para ganhar velocidade e permitir consultas em várias transações ao mesmo tempo. Esta regra só é quebrada no truncate (TRUNCATE is transaction-safe, however: the truncation will be safely rolled back if the surrounding transaction does not commit.)</p>
<p>Isso basicamente quer dizer, quando você faz um UPDATE/DELETE o &#8220;valor&#8221; do registro antigo ainda está no disco, de alguma forma, guardado, que pode, ocasionalmente, ser lido por uma transação, ou ser esquecido como se fosse uma &#8220;memory leak&#8221;.</p>
<p>Mas calma, isso é normal.</p>
<p>Quando você faz um truncate, o banco remove todos os registros no disco, por isso é tão rápido, e libera também todo o espaço no disco.(após o commit).</p>
<h2>Vacuum</h2>
<p>O vacuum no postgres, foi criado para fazer a limpeza desses registros &#8220;mortos&#8221;, melhorando a velocidade do banco de dados, geralmente ele é utilizado junto com o comando Analyse, que já faz algumas estatísticas para melhorar o GEQO (planejador das estratégias para executar a query).</p>
<p>Porém, o vacuum, sem ser utilizado o parâmetro FULL, apenas analisa os dados mortos, tira dos índices e se, no não tiver ninguém usando aquela tabela, ele talvez vai tirar os dados mortos, se ele estiverem no &#8220;final&#8221; do arquivo.</p>
<blockquote><p>There are two variants of the VACUUM command. The first form, known as &#8220;lazy vacuum&#8221; or just VACUUM, marks expired data in tables and indexes for future reuse; it does not attempt to reclaim the space used by this expired data unless the space is at the end of the table and an exclusive table lock can be easily obtained.)</p></blockquote>
<p>O VACUUM FULL faz um lock exclusive na tabela e faz a limpa verdadeira e quando termina ele libera o espaço em disco.<span id="more-34"></span></p>
<p>Na versão nova do postgres (9.0) que já estou com esta versão instalada, mas ainda não tive a oportunidade de ver esse maravilhoso banco rodado em produção, ao executar o VACUUM FULL, ele faz algumas verificações, e se você tiver espaço o suficiente em disco, ele &#8220;clona&#8221; os registros ativos da tabela e remove completamente a antiga.</p>
<p>A própria documentação diz que se deve utilizar o VACUUM FULL apenas nas tabelas grandes, que são mexidas com freqüência, pois em tabelas pequenas não têm muita importância.</p>
<p>O VACUUM FULL foi feito para reduzir o tamanho da tabela em disco, em tempos que o custo de armazenamento era caro!</p>
<p>Todavia, às vezes, acontece que até nos dias de hoje, ficamos sem espaço!</p>
<p><span style="font-size: 13px; line-height: 19px;">fazendo a kagada!</span></p>
<h2>Copy</h2>
<p>Estávamos com um problema em alguns registros, e seria necessário o reprocessamento, cerca de 6 milhões.<br />
Extraímos os registros e reprocessamos numa ferramenta externa (não é nossa), porém, a maldita, fez uma caca em alguns registros e &#8220;descolunou&#8221; alguns registros que tinham erros de encoding.<br />
Isso ferrou com o Copy, pois no lugar da linha correta, tínhamos isto:<br />
<code>ENDEREÇO INCOMPLE|TO20-10-12|31RUA</code><br />
No lugar de:<br />
<code>ENDEREÇO INCOMPLETO|20-10-1231|RUA</code></p>
<h3><span style="color: #ff0000;">Bad idea, but works</span></h3>
<p>A solução adotada foi: tenta subir o arquivo, em caso de erro, remove a linha e tenta subir o copy novamente</p>
<p>Os arquivos estavam divididos em lotes de 10,000 registros, então, cada &#8220;tentativa&#8221; demorava em torno de 5 segundos para &#8220;dar pau&#8221;.</p>
<p>Como não sabia quantos registros teriam errados, e seria um porre fazer isso na mão, fizemos um script perl porco, algo como: while(1){tenta subir/remove linha em caso de erro, sair se deu certo}</p>
<p>Resultado, depois de umas 18 horas rodando, o script terminou todo os arquivos (aeee!)</p>
<p>Porém, depois disso, percebemos que o banco todo tava uma lesma, não saia do lugar.<br />
Fizemos um &#8220;df -h&#8221; e percebemos que não tínhamos quase mais espaço:</p>
<pre>Filesystem            Size  Used Avail Use% Mounted on
/dev/sdb2             273G  257G   17G  95% /dados</pre>
<p>WTF?! O banco quadruplicou de tamanho em 1 dia? como?</p>
<p>&#8220;Precisamos fazer um dump/restore o rodar o vacuum full no banco.&#8221;</p>
<p>VACUUM FULL: MEU MEDO!</p>
<p>O vacuum full no banco todo iria demorar sabe-se lá quantas horas, queria fazer um dump/restore, mas com que espaço?<br />
Eu tinha mais 60GB em outra máquina, mas como saber se agora o banco não tinha realmente 200GB?</p>
<p>Inicialmente, mandei rodar o VACUUM na tabela que ficou recebendo o COPYs por 18 horas e paralelamente, fiz a query:</p>
<pre class="brush: sql">select
      pg_size_pretty(
           sum(
               pg_total_relation_size(table_schema||'.'||table_name)::numeric
           )::bigint
    )
from information_schema.tables
where table_name != 'tabela_do_copy' ;</pre>
<p>Hmm, o resultado foi 44 GBs, &#8220;ótimo&#8221;, vendo um pouco, apaguei uma tabela com 7GB, mas nada adiantou, ainda estava sem espaço no disco para fazer um dump/restore.</p>
<p>Enquanto pensava no que ia fazer (fazendo outras coisas, rs) o LOG do VACUUM FULL foi:</p>
<pre>INFO:  "tabela_do_copy": encontrados 165572175 versões de registros removíveis e 5288751 não-removíveis em 19412081 páginas
DETAIL:  0 versões de registros não vigentes não podem ser removidas ainda.
Versões de registros não-removíveis estão no intervalo de 132 a 620 bytes.
Havia 348616357 ponteiros de itens não utilizados.
Espaço livre total (incluindo versões de registros removíveis) é 154874208912 bytes.</pre>
<p>EITA FUCK! 154874208912 bytes, hmm, translators cafe&#8230; 144 GB WILL BE FREE!</p>
<p>Todo o espaço estava sendo usado numa mesma tabela, que beleza!</p>
<p>Quando terminasse o VACUUM FULL eu poderia fazer o dump/restore e rodar um ANALYSE no banco inteiro (pois recentimente, troquei alguns bigints/numeric/int para smallint, mas não dei vacuum full ainda, ou seja, as versões com tipagem erradas ainda estão la no disco.</p>
<p>Escrevi este post apenas para lembrar que COPYs mal sucedidos também ocupam espaço, coisa que eu não pensava, pois &#8220;teoricamente&#8221; &#8220;não subiu&#8221;.</p>
<h2>Perl</h2>
<p>No CPAN temos um modulo que têm este comportamento ao mandar subir um copy, o <a href="http://search.cpan.org/~brainbuz/Pg-BulkCopy-0.16/lib/Pg/BulkCopy.pm">Pg::BulkCopy</a>, ele automaticamente quebra os registros que você passou para ele em lotes de 10 mil e tenta subir, em caso de erro, ele remove este registro e tenta novamente.</p>
<p>Então se você faz uso do Pg::BulkCopy ou faz copys que dão errado com frequencia, é uma boa pensar em VACUUM FULL nessas tabelas!</p>
]]></content:encoded>
			<wfw:commentRss>http://renatocron.com/blog/topicos/postgres-copy-vacuum/34/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Served from: renatocron.com @ 2012-02-23 08:03:41 -->
