<?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>Rômulo Jales</title>
	<atom:link href="http://romulojales.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://romulojales.com</link>
	<description>divagaçõe baseadas na fé na catucagem...</description>
	<lastBuildDate>Tue, 31 Aug 2010 14:08:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Blogagem Coletiva de repudio ao AI5 Digital – 31/08</title>
		<link>http://romulojales.com/20100831/blogagem-coletiva-de-repudio-ao-ai5-digital-%e2%80%93-3108/</link>
		<comments>http://romulojales.com/20100831/blogagem-coletiva-de-repudio-ao-ai5-digital-%e2%80%93-3108/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 14:08:45 +0000</pubDate>
		<dc:creator>Romulo Jales</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://romulojales.com/?p=247</guid>
		<description><![CDATA[Amigos, os adoradores do AI5Digital e da ditadura,  os amantes do vigilantismo, os defensores dos direitos econômicos em detrimento dos direitos civis que formam o tripé do atraso, estão se movimentando para aprovar o famigerado e monstruoso AI5Digital que há &#8230; <a href="http://romulojales.com/20100831/blogagem-coletiva-de-repudio-ao-ai5-digital-%e2%80%93-3108/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Amigos, os adoradores do <a href="http://meganao.wordpress.com/o-mega-nao/o-que-combatemos/">AI5Digital</a> e da ditadura,  os amantes do vigilantismo, os defensores dos direitos  econômicos em detrimento dos direitos civis que formam o <a href="http://entropia.blog.br/2010/04/23/acta-e-o-tripe-do-atraso/">tripé  do atraso</a>, estão se movimentando para aprovar o famigerado e  monstruoso AI5Digital que há muito deveria ter sido fulminado, destruído  e acabado.</p>
<p>A turma do Grande Irmão: Azeredo, Febraban, Fecomercio e outros do  mesmo quilate estão fazendo uma força tremenda para nos empurrar o  AI5Digital guela abaixo de qualquer forma, vamos aos fatos:</p>
<ol>
<li>A mídia continua repetindo o <a href="http://entropia.blog.br/2009/01/10/mantras-da-irracionalidade/">Mantra  da Irracionalidade</a> contra a Internet</li>
<li>No dia 05/08/10  O Deputado Pinto Itamaraty do PSDB apresentou <a href="http://www.camara.gov.br/internet/sileg/Prop_Detalhe.asp?id=15028">parecer  favorável ao AI5Digital</a>, ignorando todos os argumentos e movimentos  sociais dos últimos três anos.</li>
<li>Seis dias depois aparece uma <a href="http://www2.camara.gov.br/agencia/noticias/150005-DEPUTADOS-BUSCARAO-ACORDO-PARA-VOTAR-LEI-DE-CRIMES-NA-INTERNET.html">matéria  dizendo que os Deputados buscarão acordo para votar a lei de crimes na  Internet</a>.</li>
<li>E agora um evento para lá de esquisito organizado pela revista <a href="http://www.decisionreport.com.br/">Decision Report</a>, uma  publicação que parece estar à serviço do Azeredo e do vigilantismo, se  anuncia para o dia 31/08 com o título oportuno (para o tripé do atraso)  de: <a href="http://www.decisionreport.com.br/meeting/CrimesEletronicos/presen%C3%A7a/confirmados.html">Crimes  Eletrônicos – A urgência da lei</a>. O curioso e que este evento conta  com 19 palestrantes para falarem em 2:30h, o que dá um pouco mais de 7  minutos para cada um.</li>
</ol>
<p>Por estas e por outras que estamos convocando uma blogagem coletiva  para o dia 31/08/10, justamente no dia do tal evento à serviço do  Azeredo e do AI5digital, vamos fazer uma blogagem coletiva contra o  AI5Digital para lembrar a todos que queremos a Internet como um espaço  livre e democrático!!!</p>
<p>UPDATE 31/08/10 – Hoje é dia da Blogagem Coletiva, faça seu post e  linke para cá, assim teremos como acompanhar a evolução da blogagem.</p>
<p>fonte: <a href="http://meganao.wordpress.com/2010/08/27/blogagem-coletiva-de-repudio-ao-ai5-digital/">http://meganao.wordpress.com/2010/08/27/blogagem-coletiva-de-repudio-ao-ai5-digital/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://romulojales.com/20100831/blogagem-coletiva-de-repudio-ao-ai5-digital-%e2%80%93-3108/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A pasta .disk da remasterização do Ubuntu 10.04</title>
		<link>http://romulojales.com/20100817/a-pasta-disk-da-remasterizacao-do-ubuntu-10-04/</link>
		<comments>http://romulojales.com/20100817/a-pasta-disk-da-remasterizacao-do-ubuntu-10-04/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 18:52:46 +0000</pubDate>
		<dc:creator>Romulo Jales</dc:creator>
				<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[.disk]]></category>
		<category><![CDATA[livecd]]></category>

		<guid isPermaLink="false">http://romulojales.com/?p=243</guid>
		<description><![CDATA[Um erro voltou a me a tormentar quando estava brincando de gerar um Live CD customizável do Ubuntu 10.04: Please provide a name for this Disc, such as 'Debian 5.0.3  Disk 1': Isto ocorre com certa frequência com quem está &#8230; <a href="http://romulojales.com/20100817/a-pasta-disk-da-remasterizacao-do-ubuntu-10-04/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Um erro voltou a me a tormentar quando estava brincando de gerar um Live CD customizável do Ubuntu 10.04:</p>
<pre>Please provide a name for this Disc, such as 'Debian 5.0.3  Disk 1':
</pre>
<p>Isto ocorre com certa frequência com quem está brincando com customização. O problema é por que você esqueceu o .disk na raiz do sistema.</p>
<p>A solução é copia-la para a sua raiz de edição!</p>
<p>Mas por que esta pasta é tão importante? Qual o conteúdo dela?</p>
<p>A pasta contém 5 arquivos:</p>
<ul>
<li>base_installable</li>
<li>casper-uuid-generic</li>
<li>cd_type</li>
<li>info</li>
<li>release_notes_urls</li>
</ul>
<p>Estes arquivos são utilizados no processo de inicialização do Live CD e na instalação.</p>
<p>O release_notes_urls , como o nome sugere, contém a url que com as notas de lançamento.</p>
<p>O info é crítico, sem ele o livecd não termina de dá Boot. Ele contém uma string que é processado pelo casper no processo de adição de usuário. Ela usa a versão (10.04) e o tipo do ubuntu (LTS) que preprocessam o arquivo de desktop do ubiquity.</p>
<p>Já casper-uuid-generic contem a uuid do sistema de arquivos. Útil na hora de inicializar o cd-rom.</p>
<p>Os arquivos base_installable e cd_type são usados pelo <em>aptitude</em> para gerencia da base de pacotes debs que está incluída na imagem.</p>
]]></content:encoded>
			<wfw:commentRss>http://romulojales.com/20100817/a-pasta-disk-da-remasterizacao-do-ubuntu-10-04/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Navegação de histórico e função duplo tab para interpretador Python</title>
		<link>http://romulojales.com/20100813/navegacao-de-historico-e-funcao-duplo-tab-para-interpretador-python/</link>
		<comments>http://romulojales.com/20100813/navegacao-de-historico-e-funcao-duplo-tab-para-interpretador-python/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 14:20:37 +0000</pubDate>
		<dc:creator>Romulo Jales</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[autocompletar]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://romulojales.com/?p=241</guid>
		<description><![CDATA[Quantas vezes você abriu o interpretador do python e apertou para cima para repetir um comando? E apertar o tab para autocompletar? Pois  é&#8230; eu já fiz isso várias vezes. Mas a boa notícia é que tem como fazer isso! &#8230; <a href="http://romulojales.com/20100813/navegacao-de-historico-e-funcao-duplo-tab-para-interpretador-python/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Quantas vezes você abriu o interpretador do python e apertou para cima para repetir um comando? E apertar o tab para autocompletar? Pois  é&#8230; eu já fiz isso várias vezes.</p>
<p>Mas a boa notícia é que tem como fazer isso!</p>
<p>A dica vem de:<a href="http://docs.python.org/tutorial/interactive.html"> Interactive Input Editing and History Substitution</a></p>
<p>Então para ativar o histórico e o autocompletar no interpretador crie um arquivo no seu home chamado .pystartup (note que tem . antes do nome, é para ter. Isto indica que o arquivo é oculto)</p>
<p>Preencha o arquivo com o seguinte conteúdo.<br />
[python]<br />
import atexit<br />
import os<br />
import readline<br />
import rlcompleter</p>
<p>import rlcompleter, readline<br />
#Linha que executa o autocompletar com tab<br />
readline.parse_and_bind(&#8216;tab: complete&#8217;)</p>
<p>#Caminho do arquivo que armazenará o histórico do python<br />
historyPath = os.path.expanduser(&#8220;~/.pyhistory&#8221;)</p>
<p>def save_history(historyPath=historyPath):<br />
   import readline<br />
   readline.write_history_file(historyPath)</p>
<p>if os.path.exists(historyPath):<br />
   readline.read_history_file(historyPath)</p>
<p>atexit.register(save_history)</p>
<p>del os, atexit, readline, rlcompleter, save_history, historyPath<br />
[/python]<br />
Salvo o arquivo é necessário configurar a variável de ambiente PYTHONSTARTUP. Neste momento você já pode testar a navegação acrescentando no arquivo  ~/.bashrc com: export PYTHONSTARTUP=~/.pystartup e fazendo:</p>
<pre>source ~/.bashrc
</pre>
<p>Pronto desta forma você sempre terá a opção de navegação quando evocar o interpretador python.<br />
O bom é que também funciona para modo interativo do django (./manager shell)</p>
]]></content:encoded>
			<wfw:commentRss>http://romulojales.com/20100813/navegacao-de-historico-e-funcao-duplo-tab-para-interpretador-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como procurar pacotes via yum no fedora e o comando whois</title>
		<link>http://romulojales.com/20100811/como-procurar-pacotes-via-yum-no-fedora-e-o-comando-whois/</link>
		<comments>http://romulojales.com/20100811/como-procurar-pacotes-via-yum-no-fedora-e-o-comando-whois/#comments</comments>
		<pubDate>Wed, 11 Aug 2010 03:08:30 +0000</pubDate>
		<dc:creator>Romulo Jales</dc:creator>
				<category><![CDATA[Fedora]]></category>
		<category><![CDATA[whois]]></category>
		<category><![CDATA[yum]]></category>

		<guid isPermaLink="false">http://romulojales.com/?p=231</guid>
		<description><![CDATA[Não sei se posso considerar estranho, mas o whois não está no live-cd do Fedora 13. Aparentemente não vem desde o 11. Para resolver esse problema basta evocar o yum. Mas se você digitar puramente yum install whois obterá uma &#8230; <a href="http://romulojales.com/20100811/como-procurar-pacotes-via-yum-no-fedora-e-o-comando-whois/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Não sei se posso considerar estranho, mas o whois não está no live-cd  do Fedora 13. Aparentemente não vem desde o 11.</p>
<p>Para resolver esse problema basta evocar o yum. Mas se você digitar  puramente yum install whois obterá uma mensagem de erro.</p>
<pre>yum install whois
Plugins carregados: presto, refresh-packagekit
Configurando o processo de instalação
Nenhum pacote whois disponível.
Nada a ser feito</pre>
<p>O motivo do post é como se livrar desse erro.</p>
<p>Bom a primeira atitude a ser tomada quando temos um erro desses é executar o search.</p>
<pre>yum search [o que procura]</pre>
<p>O search é legal por que você pode, por exemplo,  fazer uma busca por uma biblioteca ou arquivo. Tente:</p>
<pre>yum search linux.so
Plugins carregados: presto, refresh-packagekit
========Matched: linux.so ===============
jd.x86_64 : A 2ch browser
mod_selinux.x86_64 : Apache/SELinux plus module
uml_utilities.x86_64 : Utilities for user-mode linux kernel</pre>
<p>Veja que ele retornou uma lista de pacotes que contém o arquivo linux.so</p>
<p>Para o comando whois:</p>
<pre>yum search whois
Plugins carregados: presto, refresh-packagekit
======================== Matched: whois =======================
jwhois.x86_64 : Internet whois/nicname client
perl-Net-Whois.noarch : Get and parse "whois" domain data from InterNIC
perl-Net-Whois-IP.noarch : Perl extension for looking up the whois information for ip addresses
echoping-whois.i686 : WHOIS plugin for checking response times of Whois servers
echoping-whois.x86_64 : WHOIS plugin for checking response times of Whois servers
dnsenum.noarch : A tool to enumerate DNS info about domains
gnome-nettool.x86_64 : Network information tool for GNOME
jakarta-commons-net.noarch : Internet protocol suite Java library
perl-IP-Country.noarch : Fast lookup of country codes from IP addresses
prewikka.noarch : Graphical front-end analysis console for the Prelude Hybrid IDS Framework</pre>
<p>Observe a quantidade de pacotes que ele retorna&#8230; qual desses prove o whois?<br />
Bom, o caminho a seguir é usar o comando provides (provê em português). Este comando aceita wildcards. Como estou a procura de um comando e este está em algum path, que por padrão deve está contido num certo diretório bin, posso fazer:</p>
<pre>yum provides *bin/whois</pre>
<p>Que gera:</p>
<pre>yum provides *bin/whois
Plugins carregados: presto, refresh-packagekit
jwhois-4.0-19.fc13.x86_64 : Internet whois/nicname client
Repo        : fedora
Resultado a partir de:
Nome de arquivo    : /usr/bin/whois

jwhois-4.0-20.fc13.x86_64 : Internet whois/nicname client
Repo        : updates
Resultado a partir de:
Nome de arquivo    : /usr/bin/whois</pre>
<p>Ora, resultou em dois pacotes que a diferença é apenas a versão.<br />
Caso geresse dois pacotes diferente a soluçao seria usar o comando info para obter mais detalhes a cerca do pacote e decidir qual instalar.</p>
<p>Assim, para instalar o pacote whois:</p>
<pre>yum install whois</pre>
<p>Uma segunda via ao search seria o comando resolvedep que traria um resultado mais e direto. Eu prefiro usar o search para ele me mostrar outras opções e versões.</p>
<p>Em relação ao comando whois no Ubuntu, ele já vem por padrão.</p>
]]></content:encoded>
			<wfw:commentRss>http://romulojales.com/20100811/como-procurar-pacotes-via-yum-no-fedora-e-o-comando-whois/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Implementando suporte a múltiplos banco de dados ao Django 1.1.x &#8211; Parte teórica</title>
		<link>http://romulojales.com/20100804/implementando-suporte-a-multiplos-banco-de-dados-ao-django-1-1-x-parte-teorica/</link>
		<comments>http://romulojales.com/20100804/implementando-suporte-a-multiplos-banco-de-dados-ao-django-1-1-x-parte-teorica/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 18:58:11 +0000</pubDate>
		<dc:creator>Romulo Jales</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[multiplos bancos de dados]]></category>

		<guid isPermaLink="false">http://romulojales.com/?p=206</guid>
		<description><![CDATA[A teoria para acessar vários bancos de dados com o django 1.1.x <a href="http://romulojales.com/20100804/implementando-suporte-a-multiplos-banco-de-dados-ao-django-1-1-x-parte-teorica/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Eu sei que a versão mais recente do <a href="http://www.djangoproject.com/download/">django é a 1.2</a> e que já trás suporte a múltiplos bancos de dados e que esse post está meio atrasado, sim eu leio press release! Mas o mundo não é tão simples assim: &#8220;ah vc precisa dessa função que a versão X já implementa! Coloca ai na produção&#8221; . Quem pensa assim com certeza não sabe no que está se metendo.</p>
<p>Também sei que podemos fazer consultas ao banco. Mas isso é burrice, por que já tenho isso implementado no django e teria que fazer as consultas individualmente.</p>
<p>A minha atividade atualmente é implementar acesso a um segundo banco de dados num projeto. Então tive que estudar a fundo como é que o django &#8220;brinca&#8221; com banco de dados. (E percebo o quanto o django é organizado!) Na verdade a experiência de entender a stack de persistência do Django vem desde quando precisei implementar acesso a chamadas de sistema operacional com gerencia de arquivos.</p>
<p>Mas deixemos de bla-bla-bla e vamos a análise. Em outro post eu mostro os códigos implementados. Ainda estão em dev.</p>
<h1>Um tiquinho de models.Manager</h1>
<p><a href="http://docs.djangoproject.com/en/dev/topics/db/managers/">A documentação do django</a> diz como você pode sobre-escrever métodos de persistência. Aí já contém uma pista por onde começar. Lá fala como customizar o comportamento de Managers, que são as classes que interfaceiam com os bancos de dados. Caso você queira mudar a forma como é feito uma consulta, a forma como é feito um insert recomendo a leitura da documentação já ligada.</p>
<p>Bom, dentro de cada model há pelo menos um Manager, mesmo que esse model seja abstrato. O manager prove o acesso a uma coleção de dados.</p>
<p>Mas do jeito que está a documentação, você não pode mudar qual banco de dados você quer acessar e apenas descreve como adicionar managers e nada em relação a esse manager padrão presente em todas as classes.</p>
<h1>Models e Managers</h1>
<p><em>&#8220;Ora, se com managers eu não posso mudar a forma como acesso ao banco porque você fala dele?&#8221;</em></p>
<p>Bom, o manager é a classe que faz a interface com o banco de dados. A deixa foi dada. Tenho que investigar o atributo da classe Model que é um manager.</p>
<p>A análise mostra que existe um objeto chamado manager em Model. Mas ele não é um atributo da classe e sim uma variável de um método. Mas essa variavel é _default_manager, um atributo de ModelBase, o super de Model. Assim, posso modificar o Manager padrão da classe Model em questão.</p>
<p>Assim:</p>
<p><em>class PessoaDeOutroBanco(Models):</em></p>
<p style="padding-left: 30px;"><em>_default_manager = MeuManager()</em></p>
<p>Desta forma mudei o meu manager padrão  (&#8221; &#8211; eu sei lê inglês, Rômulo!&#8221; ¬¬&#8217;).</p>
<h1><em> </em>O Manager</h1>
<p>O Manager, a classe! Não mesmo! Ela é escrava da classe QuerySet, vai no código que você descobre! Pobre coitada, falei tanto dela&#8230;</p>
<h1>QuerySet</h1>
<p>Dica: veja esse <a href="http://romulojales.com/?p=155">post</a> e veja o quanto é simples navegar no código python, foi muito útil neste estudo.</p>
<p>Quando você abre a classe QuerySet, logo na função __init__ vem: <em>self.query = query or sql.Query(self.model, connection) .</em> query é default nulo. Logo por padrão cai em sql.Query. Continuando a submersão no código,  vou na definição de Query e vejo a dependência pelo parâmetro connection.</p>
<p>Muito sugestivo esse atributo connection. E de fato, como ele sugere, é o wrapper de conexão com o banco.</p>
<p>Aprofundando, quem é connection? Ele é uma entidade importada de django.db, do arquivo __init__.py</p>
<p>Quando você cai na definição de connection vem:</p>
<p><strong><em>connection = backend.DatabaseWrapper({<br />
&#8216;DATABASE_HOST&#8217;: settings.DATABASE_HOST,<br />
&#8216;DATABASE_NAME&#8217;: settings.DATABASE_NAME,<br />
&#8216;DATABASE_OPTIONS&#8217;: settings.DATABASE_OPTIONS,<br />
&#8216;DATABASE_PASSWORD&#8217;: settings.DATABASE_PASSWORD,<br />
&#8216;DATABASE_PORT&#8217;: settings.DATABASE_PORT,<br />
&#8216;DATABASE_USER&#8217;: settings.DATABASE_USER,<br />
&#8216;TIME_ZONE&#8217;: settings.TIME_ZONE,<br />
})</em></strong></p>
<p><em>CARAMBOLAS E PIPOCAS! Connection é um wrapper de banco parametrizado pelas definições contidas no settings?!<br />
</em></p>
<p>Ora, voltando ao Query, vejo que connection é uma atributo publico! De fácil acesso.</p>
<h1>Concluindo</h1>
<p>Vamos rever as coisas&#8230;</p>
<p>Se para cada Model criado é instanciado um Manger no atributo _default_manager, que é instanciado um QuerySet que é instanciado um Query que é instanciado um DatabaseWrapper que, por fim, é baseado no settings. Logo, para eu acessar um outro banco de dados&#8230; eu preciso ter um outro wrapper  do banco.</p>
<p>Assim em termos de implementação eu preciso ter um wrapper de banco usando uma configuração diferente.</p>
<p>O backend é definido assim: <em>backend = load_backend(settings.DATABASE_ENGINE) , </em>em tempo de execução.</p>
<p>Logo, em teoria, é configurar um novo connection, chamando a função DatabaseWrapper com o dicionário de configuração de banco. Em teoria&#8230;</p>
<p>Digo-lhes que a implementação da análise funciona. Já está funcionando comigo, e será tema de um outro post.</p>
<p>A implementação de um outro Manager usando um connection diferente é o jeito mais correto de fazer a configuração de acesso a múltiplos bancos de dados.</p>
]]></content:encoded>
			<wfw:commentRss>http://romulojales.com/20100804/implementando-suporte-a-multiplos-banco-de-dados-ao-django-1-1-x-parte-teorica/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
