<?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/"
	>

<channel>
	<title>Stiod Blog</title>
	<atom:link href="http://blog.stiod.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.stiod.com</link>
	<description>Just another WordPress weblog</description>
	<pubDate>Wed, 01 Apr 2009 19:24:26 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Migrando de Python para Java</title>
		<link>http://blog.stiod.com/2009/04/01/migrando-de-python-para-java/</link>
		<comments>http://blog.stiod.com/2009/04/01/migrando-de-python-para-java/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 15:40:17 +0000</pubDate>
		<dc:creator>Rafael Sierra</dc:creator>
		
		<category><![CDATA[Primeiro de Abril]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=339</guid>
		<description><![CDATA[É consenso que o fluxo natural de todos seja o amadurecimento, e é com vista nisso que passei a enchergar Java com outros olhos.
Antes eu via Java como uma linguagem muito prolixo, verboso, parecido com aquele momento em que você tem que documentar o seu TCC, porém, começo a sentir que isso é um mal [...]]]></description>
			<content:encoded><![CDATA[<p>É consenso que o fluxo natural de todos seja o amadurecimento, e é com vista nisso que passei a enchergar Java com outros olhos.</p>
<p>Antes eu via Java como uma linguagem muito prolixo, verboso, parecido com aquele momento em que você tem que documentar o seu TCC, porém, começo a sentir que isso é um mal necessário.</p>
<p>Como você pode confiar em um sistema que num determinado momento assume que uma variável é um inteiro e no outro é uma conexão em um servidor <a href="http://en.wikipedia.org/wiki/Botnet">IRC pronta para receber comandos de algum mestre</a>? Pois é, é exatamente assim que as linguagens com tipagem dinâmica se comportam, uma vez que o invasor alcança seu objetivo, ele poderá fazer o que quiser. Mas pode ficar tranquilo, esse tipo de coisa não acontece em Java, pois sua estrutura rígida impede que o invasor (ou mesmo o desenvolvedor, por que não?) faça o que bem entende do seu aplicativo.</p>
<p>Outro ponto que considerei, foi com relação a segurança de distribuição do seu sistema. Em linguagens dinâmicas e de script como <a href="http://www.python.org/">Python</a>, <a href="http://php.net">PHP</a> e <a href="http://ruby-lang.org/">Ruby</a>, você normalmente é obrigado a entregar o código-fonte de seus scripts (!!), existem soluções de obscuração de código, mas nada se compara ao excelente sistema de bytecodes do Java, com ele, você pode tranquilamente (sem trema) compilar seu programa e entregar a seu cliente, simples assim <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>E claro, não posso concluir sem antes falar sobre o número de pacotes de terceiros disponíveis, de acordo com o gráfico claro e lúcido que pode ser encontrado em <a href="http://www.cs.berkeley.edu/~flab/languages.html">http://www.cs.berkeley.edu/~flab/languages.html</a>, a linguagem Java (uma das linhas vermelhas) é a que em 2006 mais possui projetos no <a href="http://sourceforge.net">SourceForge</a>, ou seja, é muita gente criando projetos que com certeza serão úteis a você.</p>
<p>Então não perca tempo, comece logo a estudar Java, pois definitivamente esse será o futuro.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2009/04/01/migrando-de-python-para-java/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Shell Script - Tratamento de querystring como cgi</title>
		<link>http://blog.stiod.com/2009/03/24/shell-script-tratamento-de-querystring-como-cgi/</link>
		<comments>http://blog.stiod.com/2009/03/24/shell-script-tratamento-de-querystring-como-cgi/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 17:16:38 +0000</pubDate>
		<dc:creator>gabriel</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[querystring]]></category>

		<category><![CDATA[script]]></category>

		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=316</guid>
		<description><![CDATA[Como fazemos para pegar os valores de uma querystring rodando um shell script por cgi?
Vamos ao código:

for var in `echo $QUERY_STRING &#124; tr "&#38;" "\t"`
do
key=$(echo $var &#124; tr = " " &#124; awk '{print $1}';);
value=$(echo $var &#124; tr = " " &#124; awk '{print $2}';);
declare "query_$key"="$value";
done

Agora a lógica:
Quando chamamos um script via cgi, este cria [...]]]></description>
			<content:encoded><![CDATA[<p>Como fazemos para pegar os valores de uma querystring rodando um shell script por cgi?</p>
<p>Vamos ao código:</p>
<p><code><br />
for var in `echo $QUERY_STRING | tr "&amp;" "\t"`<br />
do<br />
key=$(echo $var | tr = " " | awk '{print $1}';);<br />
value=$(echo $var | tr = " " | awk '{print $2}';);<br />
declare "query_$key"="$value";<br />
done<br />
</code></p>
<p>Agora a lógica:</p>
<p>Quando chamamos um script via cgi, este cria a variavel de ambiente <em>QUERY_STRING</em>, que conterá o valor do GET em uma string única. Assim temos que tratar esta string para que tenhamos as variáveis com os valores que enviamos.</p>
<p>Vamos começar com este trecho:<br />
<code><br />
`echo $QUERY_STRING | tr "&amp;" "\t"`<br />
</code><br />
Neste estamos mandando exibir o valor da variável QUERY_STRING e jogando a saida para o comando tr, que faz uma tradução de um texto em outro, transformando todos os &amp; em \t no caso.<br />
E o que é esta ` (crase) antes e depois do comando? Serve para você efetivamente executar um comando do shell, onde o resultado é retornado para o script.</p>
<p>Vamos para a próxima linha do script:<br />
<code><br />
key=$(echo $var | tr = " " | awk '{print $1}';);<br />
</code></p>
<p>A partir desta linha, dentro do for, já temos a variavel <em>var</em> com o valor parametro=valor, então temos que pegar este parametro e valor. Exibimos o valor de var, jogando a saída padrão para o tr novamente, só que agora transformamos = em espaço, para aí jogarmos esta saída em outro programa para separar os argumentos, no caso o <a href="http://pt.wikipedia.org/wiki/Awk">awk</a>, onde mandamos exibir somente o primeiro parâmetro, rodando direto no shell seria algo como:</p>
<p><code><br />
$ awk '{print $1}';<br />
parametro valor<br />
parametro<br />
</code></p>
<p>Digitando parametro e valor no awk e mandando exibir apenas o primeiro parâmetro ele retorna somente o primeiro.</p>
<p>Na linha seguinte do nosso script, a mesma coisa é feita, com a diferença de que o segundo parâmetro é pego para termos o valor e não a chave desta vez.</p>
<p>Agora já temos key com a chave do parâmetro do GET, e value com o valor da chave. Vamos a próxima linha:<br />
<code><br />
declare "query_$key"="$value";<br />
</code></p>
<p>Agora estamos criando a variável com o valor de key com o valor de value. Como assim?</p>
<p>Se no GET tivessemos algo como stiod=nozes, $key teria o valor de stiod e $value o valor nozes. Então estariamos criando uma variável stiod com o valor nozes. Seria algo como se estivessemos digitado stiod=nozes no código. Ou seja, a partir deste momento, com o fim do for, temos uma variável com cada chave do GET com o prefixo "query_", e seus respectivos valores.</p>
<p>Seguindo o exemplo anterior, se tivessemos passado arquivo.sh?stiod=nozes, mandando exibir o valor da variável query_stiod seria exibido o valor nozes (echo $query_stiod)</p>
<p>É isso ai,<br />
 <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2009/03/24/shell-script-tratamento-de-querystring-como-cgi/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Como extrair o conteúdo de um arquivo rpm?</title>
		<link>http://blog.stiod.com/2009/03/16/como-extrair-o-conteudo-de-um-arquivo-rpm/</link>
		<comments>http://blog.stiod.com/2009/03/16/como-extrair-o-conteudo-de-um-arquivo-rpm/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 01:16:13 +0000</pubDate>
		<dc:creator>gabriel</dc:creator>
		
		<category><![CDATA[Design]]></category>

		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Windows]]></category>

		<category><![CDATA[Xapian]]></category>

		<category><![CDATA[extract]]></category>

		<category><![CDATA[rpm]]></category>

		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=306</guid>
		<description><![CDATA[O comando que extrai todo o conteudo de um arquivo rpm, criando as pastas que o rpm criaria a partir do diretório atual:
rpm2cpio arquivo.rpm &#124; cpio -idmv
  

Link sobre cpio
]]></description>
			<content:encoded><![CDATA[<p>O comando que extrai todo o conteudo de um arquivo rpm, criando as pastas que o rpm criaria a partir do diretório atual:</p>
<p><code>rpm2cpio arquivo.rpm | cpio -idmv</code><br />
 <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>
<a href="http://www.gnu.org/software/cpio/">Link sobre cpio</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2009/03/16/como-extrair-o-conteudo-de-um-arquivo-rpm/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Migration no Codeigniter</title>
		<link>http://blog.stiod.com/2009/03/13/migration-no-codeigniter/</link>
		<comments>http://blog.stiod.com/2009/03/13/migration-no-codeigniter/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 03:19:23 +0000</pubDate>
		<dc:creator>Rafael Monteiro</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[codeigniter]]></category>

		<category><![CDATA[database]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=289</guid>
		<description><![CDATA[Olá !
Nesse post abordarei uma implementação básica de migration utilizando como base o framework Codeigniter.
Cenário
Para aqueles que desconhecem, o recurso de Migration consiste na abstração das alterações em bases de dados para uma classe que automatiza essa tarefa. Isso é particularmente útil quando trabalhamos em equipe e cada profissional desenvolve em seu ambiente, eventualmente modelando [...]]]></description>
			<content:encoded><![CDATA[<p>Olá !</p>
<p>Nesse post abordarei uma implementação básica de migration utilizando como base o framework Codeigniter.</p>
<p><strong>Cenário</strong></p>
<p>Para aqueles que desconhecem, o recurso de Migration consiste na abstração das alterações em bases de dados para uma classe que automatiza essa tarefa. Isso é particularmente útil quando trabalhamos em equipe e cada profissional desenvolve em seu ambiente, eventualmente modelando novas tabelas ou adicionando campos as já existentes. Dessa forma, evita-se trabalhar diretamente com o SQL (o que possibilita uma independência do SGBD) e o processo de atualização dos diversos ambientes (inclusive o de produção, quando for o caso) se torna mais simples e ágil.</p>
<p><span id="more-289"></span></p>
<p><strong>Instalação</strong></p>
<p>Por padrão, essa funcionalidade não vem integrada ao CI, entretanto, pode ser facilmente acoplada mediante o download do arquivo <a title="migrations.1.0.zip" href="http://codeigniter.com/wiki/File:migrations.1.0.zip/" target="_blank">http://codeigniter.com/wiki/File:migrations.1.0.zip/</a> seguido da descompactação do mesmo na pasta "application" do seu projeto.</p>
<p>Essa classe acompanha um helper que facilita a criação dos migrates: <a title="Database Utilities helper" href="http://codeigniter.com/wiki/Database_Utilities_helper/" target="_blank">http://codeigniter.com/wiki/Database_Utilities_helper/</a>, no qual é possível adicionar funções específicas, de acordo com a necessidade.</p>
<p><strong>Utilização</strong></p>
<p>A implementação de Migration para o Codeigniter foi inspirada na do Ruby on Rails, portanto segue a sua mesma estrutura.</p>
<p>Juntamente com a instalação do Migration existe uma pasta chamada "example_migrations" que contém alguns exemplos para a utilização e formatação.</p>
<p>O arquivo migrate deve possuir o seguinte padrão de nomenclatura:</p>
<p>###_migration_unique_name.php</p>
<p>(onde ### é o número da versão)</p>
<p>Observações:</p>
<ul>
<li>O nome da classe deve acompanhar o nome único (após o número da versão) e seguir o camel case (primeira letra em maiúscula e as demais minúsculas).</li>
<li>Tanto o prefixo quanto o nome devem ser únicos para não acarretar em conflitos entre os migrates.</li>
<li>O nome do arquivo deve ser intuitivo e descritivo, acompanhando o que ele se propõe a fazer.</li>
</ul>
<ul>
<li>A classe deve, obrigatoriamente, implementar os métodos "up()" e "down()" responsáveis por "instalar" e "desinstalar" o migrate, respectivamente. O método down() deve ser implementado de modo a desfazer o que foi realizado pelo up().</li>
</ul>
<p>São duas as opções para a utilização: <em>version</em> e <em>install</em>.<br />
Na primeira você especifica a versão do migrate a se utilizar, caso o sistema esteja em uma versão inferior a ela, ele será atualizado, caso contrário, retornará à versão especificada (desfazendo os migrates das versões posteriores à informada).</p>
<p>Dessa forma, para aplicar a versão 4, seria utilizada uma URL como essa:</p>
<p>http://dominio/index.php/migrate/version/4</p>
<p>A segunda opção verificará todos os migrates disponíveis, aplicando-os ao schema. Ela é útil quando movemos a aplicação para um novo servidor, ou quando um novo membro junta-se à equipe.</p>
<p><strong>Exemplo</strong></p>
<pre class="php">&nbsp;
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> Rename_articles <span style="color: #66cc66;">&#123;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">function</span> up<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
        <a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> <span style="color: #ff0000;">&quot;Renaming table...&quot;</span>;
        rename_table<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;articles&quot;</span>, <span style="color: #ff0000;">&quot;blogs&quot;</span><span style="color: #66cc66;">&#41;</span>;
        <a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> <span style="color: #ff0000;">&quot;DONE&quot;</span>;
&nbsp;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">function</span> down<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
        <a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> <span style="color: #ff0000;">&quot;Renaming table...&quot;</span>;
        rename_table<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;blogs&quot;</span>, <span style="color: #ff0000;">&quot;articles&quot;</span><span style="color: #66cc66;">&#41;</span>;
        <a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> <span style="color: #ff0000;">&quot;DONE&quot;</span>;
&nbsp;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
&nbsp;</pre>
<p>O exemplo acima renomeia a tabela "articles" para "blogs".</p>
<p>Maiores informações: <a href="http://codeigniter.com/wiki/Migrations/" target="_blank">http://codeigniter.com/wiki/Migrations/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2009/03/13/migration-no-codeigniter/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PDFTK - Merge de arquivos FDF e PDF</title>
		<link>http://blog.stiod.com/2009/03/10/pdftk-merge-de-arquivos-fdf-e-pdf/</link>
		<comments>http://blog.stiod.com/2009/03/10/pdftk-merge-de-arquivos-fdf-e-pdf/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 03:26:42 +0000</pubDate>
		<dc:creator>gabriel</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=284</guid>
		<description><![CDATA[Estava com um problema onde eu precisava preencher um formulário de um arquivo PDF, e conseguia fazer isso gerando um arquivo FDF no PHP. Porém não era tão agradável o usuário baixar o arquivo no formato FDF, que nem é tão conhecido assim, e quando este arquivo fosse aberto, seria feito o download do PDF [...]]]></description>
			<content:encoded><![CDATA[<p>Estava com um problema onde eu precisava preencher um formulário de um arquivo PDF, e conseguia fazer isso gerando um arquivo <a href="http://br.php.net/fdf">FDF</a> no PHP. Porém não era tão agradável o usuário baixar o arquivo no formato FDF, que nem é tão conhecido assim, e quando este arquivo fosse aberto, seria feito o download do PDF remoto com o formulário preenchido e ainda só depois de aberto este conseguir salvar uma versão final do arquivo PDF.<br />
Foi então que o <a href="http://www.accesspdf.com/pdftk/">PDFTK</a> resolveu o meu problema onde consigo fazer o "merge" destes 2 arquivos através do seguinte comando:<br />
<code><br />
pdftk entrada.pdf fill_form formulario.fdf output saida.pdf<br />
</code></p>
<p>Além deste, também tinha outro problema onde eu precisava juntar vários arquivos pdf para gerar um dinamicamente, e através do PDFTK também conseguimos fazer este merge de PDFs da seguinte forma:<br />
<code><br />
pdftk arquivo1.pdf arquivo2.pdf cat output saida.pdf<br />
</code></p>
<p>É isso ai! =)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2009/03/10/pdftk-merge-de-arquivos-fdf-e-pdf/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Postfix II</title>
		<link>http://blog.stiod.com/2009/02/26/postfix-ii/</link>
		<comments>http://blog.stiod.com/2009/02/26/postfix-ii/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 01:56:02 +0000</pubDate>
		<dc:creator>pathi</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=276</guid>
		<description><![CDATA[Demorou mas chegou!!
Ai está a segunda parte do servidor de email que subi com Postfix + Squirrelmail um tempo atrás...
Instalando o Squirrelmail:
  
  # aptitude install squirrelmail
  # aptitude install php5
  
Quando instalarmos o pacote do squirrelmail, será instalado também o apache2 e outros pacotes e dependências necessárias para o funcionamento dessas ferramentas. 
Depois de instalado, uma das [...]]]></description>
			<content:encoded><![CDATA[<p>Demorou mas chegou!!</p>
<p>Ai está a segunda parte do servidor de email que subi com Postfix + Squirrelmail um tempo atrás...</p>
<p>Instalando o Squirrelmail:</p>
<p>  <br />
<strong>  # aptitude install squirrelmail<br />
  # aptitude install php5</strong><br />
  <br />
Quando instalarmos o pacote do squirrelmail, será instalado também o apache2 e outros pacotes e dependências necessárias para o funcionamento dessas ferramentas. <br />
Depois de instalado, uma das primeiras coisas que temos que fazer, é criar uma espécie de alias para abrir o squirrelmail no browser. Portanto, adicione as duas linhas abaixo no httpd.conf:</p>
<p><strong>  # vim /etc/apache2/httpd.conf<br />
  Alias /webmail "/usr/share/squirrelmail/"<br />
  DirectoryIndex index.php</strong></p>
<p>  Para definir algumas configurações do Squirrelmail, basta usar o comando abaixo. Esse comando abre várias opções de configurações que podemor alterar para deixar o squirrelmail com uma cara mais pessoal. <br />
<strong>  # squirrelmail-configure</strong></p>
<p>  Para acessar o squirrelmail do seu browser, basta usar:<br />
 <strong> http://IP.IP.IP.IP/webmail</strong><br />
  ou<br />
<strong>  http://www.dominio.com.br/webmail</strong></p>
<p>  Lembrando que a principio, os logins dos usuários são os mesmos usuários que estão criados dentro de /etc/passwd.<br />
  Execute agora o comando que cria a pasta dentro do diretório /etc/skel, para que todos os homes dos novos usuários criados daqui em diante já sejam criados com o diretório Maildir, fundamental para o armazenamento de mensagens no Postfix:</p>
<p> <strong> # maildirmake /etc/skel/Maildir</strong></p>
<p> Se você já tem usuários criados mas não tem o Maildir dentro do home deles, basta usar o comando abaixo que será criado o Maildir de maneira correta. Caso não seja criado, é bem provável que apareçam erros quando tentar enviar/receber emails:</p>
<p> <strong> # maildirmake /home/usuario/Maildir</strong></p>
<p>  Para trabalhar com o Postfix autenticado usando o módulo SASL e TLS.</p>
<p><strong>  # aptitude install libsasl2 sasl2-bin libsasl2-modules libdb3-util procmail<br />
  # vim /etc/default/saslauthd</strong><br />
  <br />
  Substitua a linha "START=no" por: <strong>"START=yes"</strong><br />
E confirme se a linha abaixo está igual:</p>
<p><strong>MECHANISMS="pam"</strong></p>
<p><strong><span style="normal;">Também é necessário fazer mais algumas alterações:</span></strong></p>
<p><strong>  # vim /etc/postfix/sasl/smtpd.conf"</strong></p>
<p><strong>pwcheck_method: saslauthd</strong></p>
<p><strong>mech_list: plain login</strong></p>
<p>Crie o diretório:</p>
<p><strong># mkdir -p /var/spool/postfix/var/run/saslauthd</strong></p>
<p>  Novamente edite o arquivo e substitua uma linha:</p>
<p><strong># vim /etc/default/saslauthd<br />
  <span style="normal;">OPTIONS="-c"  por:</span> OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"</strong></p>
<p>  Reinicie o serviço:</p>
<p><strong>  # /etc/init.d/saslauthd restart</strong><br />
    <br />
  Adicione no postfix o  grupo SASL:</p>
<p><strong>  # adduser postfix sasl</strong></p>
<p>  O proximo passo é adicionar o SASL no  Postfix:</p>
<p><strong>  # vim /etc/postfix/main.cf</strong><br />
  <br />
  Adicione as seguintes linhas:</p>
<p> <strong> smtpd_sasl_local_domain =<br />
  smtpd_sasl_auth_enable = yes<br />
  smtpd_sasl_security_options = noanonymous<br />
  broken_sasl_auth_clients = yes<br />
  smtpd_recipient_restrictions = permit_sasl_authenticated,<br />
  permit_mynetworks,<br />
  reject_unauth_destination<br />
  smtpd_tls_auth_only = no</strong></p>
<p>  Reinicie o Postfix:</p>
<p><strong>  # /etc/init.d/postfix reload<br />
  # /etc/init.d/postfix restart</strong></p>
<p> </p>
<p>E então, desfrute!! <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2009/02/26/postfix-ii/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Lendo o valor de um Endereço da memória em C++</title>
		<link>http://blog.stiod.com/2009/02/16/lendo-o-valor-de-um-endereco-da-memoria-em-c/</link>
		<comments>http://blog.stiod.com/2009/02/16/lendo-o-valor-de-um-endereco-da-memoria-em-c/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 22:32:22 +0000</pubDate>
		<dc:creator>Yoshio Iwamoto</dc:creator>
		
		<category><![CDATA[C/C++]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=254</guid>
		<description><![CDATA[Para quem está estudando C++ aqui vai uma dica de como ler o valor de um endereço de memória. Basicamente o que vamos fazer são apenas conversões ou “casts” com os valores numéricos.

Por exemplo, para converter um “float” para “int” fazemos assim:
float a = 1.0;int b = &#40;int&#41; a;  // cast
Para transformar um número [...]]]></description>
			<content:encoded><![CDATA[<p>Para quem está estudando C++ aqui vai uma dica de como ler o valor de um endereço de memória. Basicamente o que vamos fazer são apenas conversões ou “casts” com os valores numéricos.<br />
<span id="more-254"></span><br />
Por exemplo, para converter um “float” para “int” fazemos assim:</p>
<pre class="c"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">float</span> a = <span style="color: #cc66cc;">1.0</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">int</span> b = <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span><span style="color: #66cc66;">&#41;</span> a;  <span style="color: #808080; font-style: italic;">// cast</span></div></li></ol></pre>
<p>Para transformar um número em ponteiro é a mesma coisa, a diferença é que para ler a memória byte-a-byte o ponteiro deve ser um “char”. Por exemplo, um “(char*) 255” irá converter 255 para um ponteiro que aponta para o endereço 0xFF.</p>
<p>Mas nós só convertemos para ponteiro, para ler o conteúdo ainda é necessário colocar um “*” antes do ponteiro, como se faz normalmente para se ler o conteúdo de um ponteiro normal. Como é um ponteiro do tipo “char” o seu retorno pode ser exibido na tela.</p>
<p>Abaixo segue um programa que pede para o usuário digitar um endereço de memória em hexadecimal e quantidade de bytes que devem ser lidos, em seguida ele exibe o conteúdo da memória.</p>
<pre class="c"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #339933;">#include&lt;iostream&gt;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #339933;">#include&lt;sstream&gt;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">using namespace std;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">// Funcao para exibir apenas caracteres imprimiveis</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">char</span> ChangeToPrintable<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">char</span> C<span style="color: #66cc66;">&#41;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">    <span style="color: #b1b100;">return</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>C &lt; <span style="color: #cc66cc;">32</span><span style="color: #66cc66;">&#41;</span> || <span style="color: #66cc66;">&#40;</span>C &gt; <span style="color: #cc66cc;">126</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>?<span style="color: #ff0000;">'?'</span>:C;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">int</span> main<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> argc, <span style="color: #993333;">char</span>** argv<span style="color: #66cc66;">&#41;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span> addr_i, i, len;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">    <span style="color: #993333;">string</span> addr_str;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">    cout&lt;&lt;<span style="color: #ff0000;">&quot;Endereço de memória em hex.: &quot;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">    cin&gt;&gt;addr_str;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">    cout&lt;&lt;<span style="color: #ff0000;">&quot;Quantidade de bytes: &quot;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">    cin&gt;&gt;len;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">    cout&lt;&lt;endl;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">    <span style="color: #808080; font-style: italic;">// Converte a string hex. em inteiro</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">    stringstream convert<span style="color: #66cc66;">&#40;</span>addr_str<span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">    convert&gt;&gt;hex&gt;&gt;addr_i;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">    <span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span>i = addr_i; i &lt; <span style="color: #66cc66;">&#40;</span>addr_i + len<span style="color: #66cc66;">&#41;</span>; i++<span style="color: #66cc66;">&#41;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">    <span style="color: #66cc66;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">        cout&lt;&lt;changeToPrintable<span style="color: #66cc66;">&#40;</span>*<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">char</span>*<span style="color: #66cc66;">&#41;</span> i<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">    <span style="color: #66cc66;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">    cout&lt;&lt;endl;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">    <span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div></li></ol></pre>
<p>O interessante sobre o programa é que se ele rodar irá exibir um “segmentation fault”. Isso está correto, porque o sistema operacional não deve permitir que um programa leia (invada) a memória de outro. Mas você pode ler a memória alocada para o próprio programa que está rodando. Você pode tentar, por exemplo, ler a partir da área onde a função “main” está alocada, colocando o seguinte código antes do “for” que realiza a leitura dos dados:</p>
<pre class="c"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">addr_i = <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">long</span><span style="color: #66cc66;">&#41;</span> &amp;main; <span style="color: #808080; font-style: italic;">// Converte o endereço para inteiro</span></div></li></ol></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2009/02/16/lendo-o-valor-de-um-endereco-da-memoria-em-c/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Django RequestContext</title>
		<link>http://blog.stiod.com/2009/01/19/django-requestcontext/</link>
		<comments>http://blog.stiod.com/2009/01/19/django-requestcontext/#comments</comments>
		<pubDate>Mon, 19 Jan 2009 17:28:34 +0000</pubDate>
		<dc:creator>ricardo</dc:creator>
		
		<category><![CDATA[Django]]></category>

		<category><![CDATA[Python]]></category>

		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[django templates]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=227</guid>
		<description><![CDATA[O RequestContext do django serve para popular o template com variavés padrões, ou seja váriaveis comum aos templates. Quando você usar o RequestContext como parâmetro no render_to_response de sua view, ele usará os chamados context_processor setados na váriavel TEMPLATE_CONTEXT_PROCESSOR do settings.py do projeto(por padrão esta váriavel não esta no settings), funções que retornão um dicionário [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://docs.djangoproject.com/en/dev/ref/templates/api/?from=olddocs#id1" target="_blank">RequestContext</a> do django serve para popular o template com variavés padrões, ou seja váriaveis comum aos templates. Quando você usar o RequestContext como parâmetro no <a href="http://docs.djangoproject.com/en/dev/topics/http/shortcuts/?from=olddocs#render-to-response">render_to_response</a> de sua view, ele usará os chamados context_processor setados na váriavel <a href="http://docs.djangoproject.com/en/dev/ref/settings/#setting-TEMPLATE_CONTEXT_PROCESSORS">TEMPLATE_CONTEXT_PROCESSOR</a> do settings.py do projeto(por padrão esta váriavel não esta no settings), funções que retornão um dicionário de dados.</p>
<pre class="python">&nbsp;
TEMPLATE_CONTEXT_PROCESSORS = <span style="color: black;">&#40;</span>
    <span style="color: #483d8b;">&quot;django.core.context_processors.auth&quot;</span>,
    <span style="color: #483d8b;">&quot;django.core.context_processors.debug&quot;</span>,
    <span style="color: #483d8b;">&quot;django.core.context_processors.i18n&quot;</span>,
    <span style="color: #483d8b;">&quot;django.core.context_processors.media&quot;</span>,
<span style="color: black;">&#41;</span>
&nbsp;</pre>
<p>Para criar um contex_processor é só criar uma função da seguinte maneira, você pode criar um arquivo context_processor.py na pasta de sua app.</p>
<pre class="python">&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> teste_contex_processor<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>:
    <span style="color: #dc143c;">user</span> = request.<span style="color: #dc143c;">user</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span>
      <span style="color: #483d8b;">'user'</span>:<span style="color: #dc143c;">user</span>,
      <span style="color: #483d8b;">'ip_address'</span>: request.<span style="color: black;">META</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'REMOTE_ADDR'</span><span style="color: black;">&#93;</span>
    <span style="color: black;">&#125;</span>
&nbsp;</pre>
<p>e colocar o context_processor criado no settings</p>
<pre class="python">&nbsp;
TEMPLATE_CONTEXT_PROCESSORS = <span style="color: black;">&#40;</span>
    ...,
    <span style="color: #483d8b;">&quot;meuprojeto.app.context_processor.teste_context_processor&quot;</span>,
<span style="color: black;">&#41;</span>
&nbsp;</pre>
<p>Para usar o RequestContext no render_to_response, basta fazer o seguinte:</p>
<pre class="python">&nbsp;
    ...
    <span style="color: #ff7700;font-weight:bold;">return</span> render_to_response<span style="color: black;">&#40;</span>
        <span style="color: #483d8b;">'templates/index.html'</span>,
        dicionario_de_dados,
        context_instance=RequestContext<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>
    <span style="color: black;">&#41;</span>
&nbsp;</pre>
<p>*lembrando que você tem que passar <em>request</em> como parâmetro.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2009/01/19/django-requestcontext/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Postfix I</title>
		<link>http://blog.stiod.com/2009/01/07/postfix-i/</link>
		<comments>http://blog.stiod.com/2009/01/07/postfix-i/#comments</comments>
		<pubDate>Wed, 07 Jan 2009 23:40:24 +0000</pubDate>
		<dc:creator>pathi</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=222</guid>
		<description><![CDATA[People,
Esses dias tive que estudar um pouco sobre Postfix para entender marromenos como que funciona um server de email. Então ai vai um passo-a-passo do que eu fiz para subir  esse servidor de email com Postfix usando o squirrelmail para testar os envios e recebimentos dos emails 
Usei Ubuntu Server (não gosto muito mas era [...]]]></description>
			<content:encoded><![CDATA[<p>People,</p>
<p>Esses dias tive que estudar um pouco sobre Postfix para entender marromenos como que funciona um server de email. Então ai vai um passo-a-passo do que eu fiz para subir  esse servidor de email com Postfix usando o squirrelmail para testar os envios e recebimentos dos emails <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Usei Ubuntu Server (não gosto muito mas era o que eu tinha na mão) e gerenciador de pacote aptitude. O mesmo funciona com apt-get se preferir :-p</p>
<p>Primeiramente, vamos instalar os pacotes básicos na máquina. Esses pacotes não são necessariamente só do Postfix.</p>
<p><strong> # aptitude install openssh-server vim-full mutt nmap postfix</strong></p>
<p>Durante a instalação, provavelmente serão feitas algumas perguntas. Por enquanto, apenas dê ENTER para todas elas. Porque assim que a instalação terminar, iremos reconfigurar algumas opções e depois editar o arquivo de configuração direto.</p>
<p>Feita a instalação, vamos reconfigurar algumas opções básicas:</p>
<p><strong> # dpkg-reconfigure postfix</strong></p>
<p>Abaixo, segue um exemplo de configuração que foi definida:</p>
<p><em> =&gt; OK<br />
=&gt; Internet Site<br />
=&gt; dominio.com.br<br />
=&gt; (em branco)<br />
=&gt; $myhostname, localhost.$mydomain, $mydomain<br />
=&gt; yes<br />
=&gt; 127.0.0.0/8 192.168.1.0/24<br />
=&gt; yes<br />
=&gt; 0<br />
=&gt; +<br />
=&gt; all</em></p>
<p>Depois que definirmos todas essas configurações, então automaticamente o postfix será recarregado (reload) e reiniciado.<br />
Nesse server básico de Postfix, estou usando a mesma base de usuários comuns do sistema, como usuários que terão email no postfix. Lembrando que todos esses usuários comuns, são os que possuem ID maior que 1000 e estão dentro de /etc/passwd.</p>
<p>Para esse primeiro teste, vou adicionar um usuário novo no sistema:</p>
<p><strong> # adduser joao</strong></p>
<p>Como o postfix já está instalado e com uma pré-configuração, então vamos enviar alguns emails entre os usuários comuns do sistema. Para isso, vamos usar o telnet mesmo:</p>
<p><em> $ telnet localhost 25</em></p>
<p><em>HELO smtp.dominio.com.br<br />
MAIL From: user@dominio.com.br<br />
RCPT to: joao@dominio.com.br<br />
DATA<br />
Mensagem do email.<br />
.<br />
QUIT</em></p>
<p>Como estamos fazendo tudo na máquina local por enquanto, então usei um telnet localhost na porta 25. Na linha HELO como o próprio nome já fala, estou dando um "Olá" para o meu server de email e domínio. Na linha MAIL From estou avisando qual o usuário que irá enviar o email e na linha RCPT to está o usuário que irá receber o email. Para escrever a mensagem, chamamos o DATA e então basta escrever o que você quiser. Para finalizar a mensagem, basta dar um . único e ele entenderá como fim da mensagem. E para finalizar o telnet, basta dar um QUIT.<br />
É importante prestar atenção nas palavras e letras maiúsculas.</p>
<p>Quando enviarmos esse email para o joao@dominio.com.br, será criado um arquivo com o nome do usuário em /var/mail/.<br />
Por exemplo:</p>
<p><strong> # ls /var/mail</strong><br />
joao</p>
<p>Então para ler o email, pode-se dar um cat nesse arquivo, ou então usar uma ferramenta chamada mutt, que lê emails em linha de comando.</p>
<p><strong> # cat /var/mail/joao</strong><br />
ou<br />
<strong> # su joao<br />
$ mutt<br />
</strong><br />
Abaixo, segue a estrutura do arquivo /etc/hostname:<br />
<strong><br />
# cat /etc/hostname<br />
dominio.com.br</strong></p>
<p>Abaixo, segue a estrutura do arquivo /etc/hosts:</p>
<p><strong> # cat /etc/hosts</strong><br />
<em> 127.0.0.1 localhost<br />
127.0.1.1 dominio.com.br dominio.com.br<br />
IP.ex.ter.no dominio.com.br dominio.com.br</em></p>
<p>A estrutura desses arquivos é importante, porque dependendo dos casos, o hostname e o domínio tem que estar com o mesmo nome.</p>
<p>O arquivo de configuração do Postfix está localizado em /etc/postfix/main.cf.<br />
Abaixo vou colocar umas linhas básicas desse arquivo de configuração para analisar o conteúdo. Não vou explicar o que todas as linhas fazem, mas sites como o do próprio postfix explica o conteúdo de cada linha e muitas vezes cita exemplos =p</p>
<p><strong> # vim /etc/postfix/main.cf</strong><br />
<em> myhostname = IP.ex.ter.no.dominio.com.br<br />
mydomain = dominio.com.br<br />
alias_maps = hash:/etc/aliases<br />
alias_database = hash:/etc/aliases<br />
myorigin = /etc/mailname<br />
mydestination = $myhostname, localhost.$mydomain, $mydomain<br />
relayhost =<br />
relay_domains = $mydomain<br />
mynetworks = 127.0.0.0/8 192.168.1.0/24<br />
home_mailbox = Maildir/<br />
recipient_delimiter = +<br />
inet_interfaces = all<br />
inet_protocols = all<br />
mailbox_size_limit = 0</em></p>
<p>Vamos configurar os serviços de pop e imap. Para isso, será necessário instalar os seguintes pacotes:</p>
<p><strong> # aptitude install courier-pop courier-pop-ssl<br />
# aptitude install courier-imap courier-imap-ssl</strong></p>
<p>Quando instalarmoas esses pacotes, será criado um diretório courier dentro do /etc/ e dentro desse diretório, teremos diversos arquivos. Antesde editar os arquivos e fazer as alterações, aconselho renomear os arquivos originais:<br />
<strong><br />
# cd /etc/courier<br />
# mv imapd.pem imapd.pem.old<br />
# mv pop3d.pem pop3d.pem.old</strong></p>
<p>O próximo passo, é editar os arquivos imap.cnf e pop3d.cnf e alterar as informações necessárias. Por exemplo coloque em Country=BR, State=Sao Paulo e etc:</p>
<p><strong> # vim imapd.cnf<br />
# vim pop3d.cnf</strong></p>
<p>Quando os arquivos forem alterados, devemos devemos criar novamente os arquivos imapd.pem e pop3d.pem com os comandos:</p>
<p><strong> # mkimapdcert<br />
# mkpop3dcert</strong></p>
<p>O próximo passo agora é instalar o squirrelmail, que é uma ferramenta para testar o envio e recebimento de mensagens de email através de uma interface web mesmo. Se preferir, pode usar alguma outra ferramenta, como eu já tinha comentado antes:</p>
<p><strong> # aptitude install squirrelmail<br />
# aptitude install php5</strong></p>
<p>Continua... :-p</p>
<p>Links de Referências:</p>
<p><a href="http://www.postfix.org/documentation.html">http://www.postfix.org/documentation.html</a></p>
<p><a href="https://help.ubuntu.com/7.04/server/C/postfix.html">https://help.ubuntu.com/7.04/server/C/postfix.html</a></p>
<p><a href="http://virtual01.lncc.br/~licht/linux/servidores.postfix.arq.html">http://virtual01.lncc.br/~licht/linux/servidores.postfix.arq.html</a></p>
<p><a href="http://www.gdhpress.com.br/redeseservidores/leia/index.php?p=cap10-2">http://www.gdhpress.com.br/redeseservidores/leia/index.php?p=cap10-2</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2009/01/07/postfix-i/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Reaproveitando a inteface do Admin do Django</title>
		<link>http://blog.stiod.com/2008/12/16/reaproveitando-a-inteface-do-admin-do-django/</link>
		<comments>http://blog.stiod.com/2008/12/16/reaproveitando-a-inteface-do-admin-do-django/#comments</comments>
		<pubDate>Wed, 17 Dec 2008 02:59:55 +0000</pubDate>
		<dc:creator>Rafael Sierra</dc:creator>
		
		<category><![CDATA[Django]]></category>

		<category><![CDATA[Python]]></category>

		<category><![CDATA[python django admin]]></category>

		<guid isPermaLink="false">http://blog.stiod.com/?p=213</guid>
		<description><![CDATA[Finalmente o Django pra mim atingiu a perfeição, depois da minha surpresa com o {{ block.super }}, agora foi a vez de eu realizar um sonho meu: Aproveitar as interfaces maravilhosas de administração do Django.
Sempre é um verdadeiro pé no saco ter que ficar escrevendo código que você sabe que ta pronto, e mais sacal [...]]]></description>
			<content:encoded><![CDATA[<p>Finalmente o <a href="http://www.djangoproject.com/">Django</a> pra mim atingiu a perfeição, depois da minha surpresa com o <a href="http://blog.stiod.com/2008/12/16/acessando-block-tags-parentes-em-templates-django/">{{ block.super }}</a>, agora foi a vez de eu realizar um sonho meu: Aproveitar as interfaces maravilhosas de administração do Django.</p>
<p>Sempre é um verdadeiro pé no saco ter que ficar escrevendo código que você sabe que ta pronto, e mais sacal ainda quando o código ta a apenas "../../" de você, mas agora é um trabalho a menos que eu tenho <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> (especialmente considerando a minha "super habilidade" com CSS).</p>
<p>Agora vamos ao que interessa, o conhecimento necessário pra fazer isso funcionar levou cerca de 4 horas pra ser adiquirido, foram 4 horas engolindo e reengolindo código do Django, mas no final resultou em uma view como a seguinte (ignorem os imports desnecessários):</p>
<pre class="python">&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">shortcuts</span> <span style="color: #ff7700;font-weight:bold;">import</span> render_to_response
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">template</span> <span style="color: #ff7700;font-weight:bold;">import</span> RequestContext
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">utils</span>.<span style="color: black;">text</span> <span style="color: #ff7700;font-weight:bold;">import</span> ugettext_lazy as _
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span>.<span style="color: black;">auth</span>.<span style="color: black;">decorators</span> <span style="color: #ff7700;font-weight:bold;">import</span> login_required
<span style="color: #ff7700;font-weight:bold;">from</span> mysearch.<span style="color: black;">profiles</span>.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> Profile
<span style="color: #ff7700;font-weight:bold;">from</span> mysearch.<span style="color: black;">profiles</span>.<span style="color: black;">admin</span> <span style="color: #ff7700;font-weight:bold;">import</span> ProfileAdmin
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span> <span style="color: #ff7700;font-weight:bold;">import</span> admin
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span>.<span style="color: black;">admin</span>.<span style="color: black;">views</span>.<span style="color: black;">main</span> <span style="color: #ff7700;font-weight:bold;">import</span> ChangeList
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span>.<span style="color: black;">auth</span>.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> User
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span>.<span style="color: black;">auth</span>.<span style="color: black;">forms</span> <span style="color: #ff7700;font-weight:bold;">import</span> UserCreationForm
&nbsp;
@login_required
<span style="color: #ff7700;font-weight:bold;">def</span> index<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>:
    admin_model = admin.<span style="color: #dc143c;">site</span>._registry<span style="color: black;">&#91;</span>Profile<span style="color: black;">&#93;</span>
    admin_model.<span style="color: black;">admin_site</span>.<span style="color: black;">root_path</span> = request.<span style="color: black;">path</span>
    cl = ChangeList<span style="color: black;">&#40;</span>
        request,
        Profile,
        ProfileAdmin.<span style="color: black;">list_display</span>,
        ProfileAdmin.<span style="color: black;">list_display_links</span>,
        ProfileAdmin.<span style="color: black;">list_filter</span>,
        ProfileAdmin.<span style="color: black;">date_hierarchy</span>,
        ProfileAdmin.<span style="color: black;">search_fields</span>,
        ProfileAdmin.<span style="color: black;">list_select_related</span>,
        ProfileAdmin.<span style="color: black;">list_per_page</span>,
        admin_model<span style="color: black;">&#41;</span>
    cl.<span style="color: black;">query_set</span> = cl.<span style="color: black;">query_set</span>.<span style="color: #008000;">filter</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">user</span>=request.<span style="color: #dc143c;">user</span><span style="color: black;">&#41;</span>
    cl.<span style="color: black;">get_results</span><span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>
&nbsp;
    context = <span style="color: black;">&#123;</span>
        <span style="color: #483d8b;">'title'</span>: cl.<span style="color: black;">title</span>,
        <span style="color: #483d8b;">'is_popup'</span>: cl.<span style="color: black;">is_popup</span>,
        <span style="color: #483d8b;">'cl'</span>: cl,
        <span style="color: #483d8b;">'has_add_permission'</span>: admin_model.<span style="color: black;">has_add_permission</span><span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>,
        <span style="color: #483d8b;">'root_path'</span>: admin_model.<span style="color: black;">admin_site</span>.<span style="color: black;">root_path</span>,
        <span style="color: #483d8b;">'app_label'</span>: _<span style="color: black;">&#40;</span><span style="color: #483d8b;">'Profile'</span><span style="color: black;">&#41;</span>,
    <span style="color: black;">&#125;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> render_to_response<span style="color: black;">&#40;</span><span style="color: #483d8b;">'admin/change_list.html'</span>,
        context, context_instance=RequestContext<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;</pre>
<p>Vamos as explicações agora. Primeiramente, pra que isso funcione é preciso que seu model tenha sido <a href="http://docs.djangoproject.com/en/dev/ref/contrib/admin/#ref-contrib-admin">registrado no Admin do Django</a>, no meu caso o model utilizado foi esse chamado <strong>Profile</strong>.</p>
<p>Depois disso é criado um objeto do tipo `django.contrib.admin.views.main.ChangeList`, infelizmente <strong>todos</strong> os parametros devem ser passados, e essa foi a parte que mais me decepcionou, uma vez que todos os atributos poderiam ser resgatados com base no último argumento, ou simplesmente pedindo a classe que define o model, mas tudo bem, é um pequeno preço a se pagar pelo beneficio.</p>
<p>Após criar a variável `cl`, vem o ponto que meu deu maior dor de cabeça: Filtrar o que eu quero que apareca para o usuário. Nesse caso eu precisava que o usuário tivesse acesso apenas ao próprio conteudo, e pra isso adicionei o `.filter(user=request.user)`, porém, isso não basta, é preciso chamar a função `cl.get_results(request)` pra que ele possa atualizar a lista de resultados que vai ser usada</p>
<p>A váriavel `context`, neste caso, é usada pelo template `admin/change_list.html`, sinta-se a vontade para copiar o template da pasta do Django e colocar na sua pra editar.</p>
<p>Por fim, basta retornar o template que vai pegar o resultado e imprimir na tela pro seu usuário que será muito feliz <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /><br />
<strong>Observações</strong><br />
O template `admin/change_list.html` não imprime a tabela propriamente dia, ela utiliza uma tag (não documentada no site) chamada `result_list`, essa tag recebe um objeto do tipo `ChangeList` que é o nosso `cl`.</p>
<p>Você ainda vai precisa escrever uma view (ou aproveitar a do Admin) para fazer o handle quando o usuário clicar no objeto, mas essa é a parte fácil <img src='http://blog.stiod.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.stiod.com/2008/12/16/reaproveitando-a-inteface-do-admin-do-django/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
