<?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>victorfontes</title>
	<atom:link href="http://victorfontes.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://victorfontes.com</link>
	<description>bohemio. empreendedor. geek.</description>
	<lastBuildDate>Sat, 03 Sep 2011 03:56:15 +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>Jquery, Redirects and Django</title>
		<link>http://victorfontes.com/2011/07/jquery-redirects-and-django/</link>
		<comments>http://victorfontes.com/2011/07/jquery-redirects-and-django/#comments</comments>
		<pubDate>Sat, 16 Jul 2011 19:25:04 +0000</pubDate>
		<dc:creator>Victor Fontes</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[djago]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://victorfontes.com/?p=604</guid>
		<description><![CDATA[Whenever Jquery performs an ajax call and the response has a 302 HTTP Status (redirect), the redirection is not performed. The response is handled by Jquery as it had a HTTP 200 status code, and that&#8217;s just not right ! I had this problem with an ajax login box: If username and password dont check, [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Whenever Jquery performs an ajax call and the response has a <a href="http://en.wikipedia.org/wiki/HTTP_302" title="HTTP 302" target="_blank">302 HTTP Status</a> (redirect), the redirection is not performed.</p>
<p>The response is handled by Jquery as it had a <a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#2xx_Success" title="HTTP 200" target="_blank">HTTP 200</a> status code, and that&#8217;s just not right !</p>
<p>I had this problem with an ajax login box:</p>
<ul>
<li>If username and password dont check, the server sends html, that goes to the login div.</li>
<li>When login is performed, server sends a redirect response that points to a private page.</li>
</ul>
<p>The usual solution is to send a reponse with a made up status code (usually 278), check it and handle the redirection yourself.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ready</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'body'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ajaxComplete</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #339933;">,</span> xhr<span style="color: #339933;">,</span> settings<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>xhr.<span style="color: #000066;">status</span> <span style="color: #339933;">==</span> <span style="color: #CC0000;">278</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            window.<span style="color: #660066;">location</span>.<span style="color: #660066;">href</span> <span style="color: #339933;">=</span> xhr.<span style="color: #660066;">getResponseHeader</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Location&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/\?.*$/</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;?next=&quot;</span><span style="color: #339933;">+</span>window.<span style="color: #660066;">location</span>.<span style="color: #660066;">pathname</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>To solve this problem with django, you can create a middleware that changes the status code from redirects performed from ajax requests:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">http</span> <span style="color: #ff7700;font-weight:bold;">import</span> HttpResponseRedirect
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> AjaxRedirect<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> process_response<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, request, response<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> request.<span style="color: black;">is_ajax</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">type</span><span style="color: black;">&#40;</span>response<span style="color: black;">&#41;</span> == HttpResponseRedirect:
                response.<span style="color: black;">status_code</span> = <span style="color: #ff4500;">278</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> response</pre></div></div>

<div class="shr-publisher-604"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://victorfontes.com/2011/07/jquery-redirects-and-django/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python e Django no TextMate</title>
		<link>http://victorfontes.com/2011/05/python-e-django-no-textmate/</link>
		<comments>http://victorfontes.com/2011/05/python-e-django-no-textmate/#comments</comments>
		<pubDate>Mon, 30 May 2011 20:23:08 +0000</pubDate>
		<dc:creator>Victor Fontes</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[IDEs]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[Text Mate]]></category>

		<guid isPermaLink="false">http://victorfontes.com/?p=577</guid>
		<description><![CDATA[Assim como muitos outros usuários de Mac OSX o TextMate é meu editor de textos favorito. Ele é leve, confiável e torna a atividade de programar muito mais prazerosa. Na minha opinião ele só tem duas desvantagens: é pago (U$58) e funciona apenas no Mac OSX (sinto falta dele em outros OSs). Nesse post vou [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Assim como muitos outros usuários de Mac OSX o TextMate é meu editor de textos favorito. Ele é leve, confiável e torna a atividade de programar muito mais prazerosa. Na minha opinião ele só tem duas desvantagens: é pago (U$58) e funciona apenas no Mac OSX (sinto falta dele em outros OSs).</p>
<p>Nesse post vou mostrar como configurá-lo para trabalhar com Python e Django, em uma outra oportunidade, tentarei focar em dicas mais genéricas.</p>
<p>Antes de instalar qualquer tema ou bundle é necessário definir o encoding da sua máquina no seu arquivo ~/.bash_profile, basta adicionar essa linha:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LC_CTYPE</span>=pt_BR.UTF-<span style="color: #000000;">8</span></pre></div></div>

<h2>Temas:</h2>
<p>Primeiramente vamos configurar a aparência do TextMate, isso é feito através de temas. É necessário criar a pasta em que os temas do usuário são armazenados:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #660033;">-p</span> <span style="color: #000000; font-weight: bold;">/</span>Library<span style="color: #000000; font-weight: bold;">/</span>Application\ Support<span style="color: #000000; font-weight: bold;">/</span>TextMate<span style="color: #000000; font-weight: bold;">/</span>Bundles
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>Library<span style="color: #000000; font-weight: bold;">/</span>Application\ Support<span style="color: #000000; font-weight: bold;">/</span>TextMate<span style="color: #000000; font-weight: bold;">/</span>Bundles</pre></div></div>

<p>Com a pasta criada basta copiar os arquivos de temas e reiniciar o textmate com o comando:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">osascript <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'tell app &quot;TextMate&quot; to reload bundles'</span></pre></div></div>

<p>Recomendo a criação de alguns alias para as tarefas mais comuns:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> tm-restart <span style="color: #7a0874; font-weight: bold;">&#123;</span> osascript <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'tell app &quot;TextMate&quot; to reload bundles'</span>; <span style="color: #7a0874; font-weight: bold;">&#125;</span>;
<span style="color: #7a0874; font-weight: bold;">alias</span> tm-bundles=<span style="color: #ff0000;">&quot;cd /Library/Application\ Support/TextMate/Bundles/&quot;</span>
<span style="color: #7a0874; font-weight: bold;">alias</span> tm-themes=<span style="color: #ff0000;">&quot;cd /Library/Application\ Support/TextMate/Themes/&quot;</span></pre></div></div>

<p>Você pode achar temas legais <a href="http://mashable.com/2010/07/07/textmate-themes-list/">aqui</a> ou na <a href="http://wiki.macromates.com/Themes/UserSubmittedThemes">wiki do textmate</a>. O meu favorito é o <a href="http://www.monokai.nl/blog/2006/07/15/textmate-color-theme/">Monokai</a></p>
<h2>Bundles</h2>
<h3>Hightlight e outros</h3>
<p>Basta instalar o bundle do <a href="https://bitbucket.org/bkerr/django-textmate-bundles/wiki/Home">Django</a> e um melhorado do <a href="https://github.com/textmate/python.tmbundle">python</a>.</p>
<p>Para não ficar perdido nos primeiros dias vale usar essa <a href="http://pt.scribd.com/doc/7759743/TextMate-PythonDjango-Cheat-Sheet">cheat sheet para python/django/rst</a></p>
<h3>Auto complete com Rope</h3>
<p>O bundle <a title="RopeMate" href="https://github.com/JulianEberius/RopeMate.tmbundle">RopeMate</a> utiliza a biblioteca <a title="Rope" href="http://rope.sourceforge.net/">Rope</a> para adiconar recursos de autocomplete e refatoração. Os que mais uso são:</p>
<ul>
<li>Auto complete: &lt;control&gt; + &lt;space&gt;</li>
<li>Organizar imports: &lt;shift&gt; + &lt;cmd&gt; + O</li>
<li>Ir para a declaração (do método ou classe): &lt;cmd&gt; + F3</li>
<li>Extrair linhas para método: &lt;cmd&gt; + &lt;return&gt;</li>
</ul>
<p>Para instalar:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">easy_install rope
<span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>Library<span style="color: #000000; font-weight: bold;">/</span>Application\ Support<span style="color: #000000; font-weight: bold;">/</span>TextMate<span style="color: #000000; font-weight: bold;">/</span>Bundles<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #c20cb9; font-weight: bold;">git</span> clone https:<span style="color: #000000; font-weight: bold;">//</span>github.com<span style="color: #000000; font-weight: bold;">/</span>JulianEberius<span style="color: #000000; font-weight: bold;">/</span>RopeMate.tmbundle.git
tm-restart</pre></div></div>

<h3>Debug</h3>
<p>O TextMate já possui um atalho para executar o script python com um terminal do pdb aberto: <shift> + <cmd> + D. Porém, podemos melhorar essa integração, realçando a linha que está sendo debugada na janela do textmate.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> easy_install PdbTextMateSupport
mate ~<span style="color: #000000; font-weight: bold;">/</span>.pdbrc</pre></div></div>

<p>Adicione as seguintes linhas:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">from PdbTextMateSupport import preloop, precmd
pdb.Pdb.preloop = preloop
pdb.Pdb.precmd = precmd</pre></div></div>

<p>Habilite o suporte marcando a opção “Highlight current line” no TextMate e executando o seguinte comando:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">pdbtmsupport <span style="color: #7a0874; font-weight: bold;">enable</span></pre></div></div>

<div class="shr-publisher-577"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://victorfontes.com/2011/05/python-e-django-no-textmate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Podcasts: Tecnologia</title>
		<link>http://victorfontes.com/2011/05/podcasts-tecnologia/</link>
		<comments>http://victorfontes.com/2011/05/podcasts-tecnologia/#comments</comments>
		<pubDate>Sun, 01 May 2011 23:45:35 +0000</pubDate>
		<dc:creator>Victor Fontes</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[podcasts]]></category>

		<guid isPermaLink="false">http://victorfontes.com/?p=569</guid>
		<description><![CDATA[Em 2008, ano que entrei na UNIRIO eu passava 4 horas diárias em um ônibus e felizmente foi ano em que descobri o Podcast, uma excelente maneira de se manter informado e entretido por áudio. A definição que costumo dar a meus amigos é: &#8220;Se trata de uma espécie de programa de rádio, feito por [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Em 2008, ano que entrei na UNIRIO eu passava 4 horas diárias em um ônibus e felizmente foi ano em que descobri o <a href="http://pt.wikipedia.org/wiki/Podcast">Podcast</a>, uma excelente maneira de se manter informado e entretido por áudio. </p>
<p>A definição que costumo dar a meus amigos é: &#8220;Se trata de uma espécie de programa de rádio, feito por blogueiros e distribuído em mp3&#8243;. É muito mais do que isso, mas a idéia é mais ou menos essa.</p>
<p>Existem temas para todos os gostos: humor, variedades, ensino de idiomas, notícias, discussões técnicas, etc. </p>
<p>Ao rechear seu dispositivo tocador de mp3 de podcasts, suas horas de atividade física/trânsito/trabalho/whatever passam a ser mais prazerosas, engraçadas e informativas.</p>
<p>Nesse post falarei sobre meus podcasts favoritos sobre tecnologia, nos próximos abordarei os de humor e variedades:</p>
<p><a href="http://5by5.tv/devshow">The Dev Show:</a> Meu favorito quando o assunto é tecnologia, apesar dos hosts serem rubystas, abordam todos os assuntos relacionados a desenvolvimento e sempre aparecem com links para verdadeiras pérolas do github.</p>
<p><a href="http://grokpodcast.com/">Grok Podcast:</a> Excelente podcast, episódios de duração média, excelentes temas e convidados.</p>
<p><a href="http://www.euandroid.com.br/category/podcasts/">AndroidCast:</a>Podcast nacional sobre android, o áudio ainda não está perfeito mas definitivamente vale pelo conteúdo.</p>
<p><a href="http://www.papotech.com.br/blog/">Papo Tech:</a> Um dos mais antigos no brasil, não se aprofunda muito e pode ser considerado um podcast feito por leigos, porém é bem engraçado e costuma trazer algumas dicas bem legais.</p>
<p><a href="http://www.twitter.com.br/databasecast">DatabaseCast:</a> Podcast brasileiro sobre banco de dados, áudio bem legal e excelente conteúdo.</p>
<p><a href="http://www.guanabara.info/guanacast/">Guanacast:</a> Trata de diversos assuntos, sempre com muito humor.</p>
<p><a href="http://podcast.simplesideias.com.br/">Simples Ideias:</a> um podcast curto com notícias interessantes para desenvolvedores.</p>
<div class="shr-publisher-569"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://victorfontes.com/2011/05/podcasts-tecnologia/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Flask: uma microframework web para Python</title>
		<link>http://victorfontes.com/2011/05/flask-uma-microframework-web-para-python/</link>
		<comments>http://victorfontes.com/2011/05/flask-uma-microframework-web-para-python/#comments</comments>
		<pubDate>Sun, 01 May 2011 23:20:14 +0000</pubDate>
		<dc:creator>Victor Fontes</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[flask]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://victorfontes.com/?p=566</guid>
		<description><![CDATA[É comum que cada linguagem possua uma ou mais frameworks web que sejam encaradas como &#8220;balas de prata&#8221;, com excelente documentação, extensões, comunidade ativa, etc &#8230; Em python possuímos Django, web2py e Zope. Cada um com suas vantagens e desvantagens, e o Django com a maior fatia de usuários, esse que vos fala incluso. Apesar [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>É comum que cada linguagem possua uma ou mais frameworks web que sejam encaradas como &#8220;balas de prata&#8221;, com excelente documentação, extensões, comunidade ativa, etc &#8230;</p>
<p>Em python possuímos <a href="http://www.djangoproject.com/">Django</a>, <a href="http://www.web2py.com/">web2py</a> e <a href="http://zope.org/">Zope</a>. Cada um com suas vantagens e desvantagens, e o Django com a maior fatia de usuários, esse que vos fala incluso.<br />
Apesar do Django ser excelente, <a href="http://djangocon.blip.tv/file/4112452/">ele possui suas desvantagens</a> e sabemos que não existe bala de prata.</p>
<p>Recentemente tive algumas idéias para projetos bem pequenos, e resolvi procurar alguma framework que fosse mais simples, foi aí que encontrei o <a href="http://flask.pocoo.org/">Flask</a>.</p>
<blockquote><p>Flask is a microframework for Python based on Werkzeug, Jinja 2 and good intentions. And before you ask: It&#8217;s BSD licensed! </p></blockquote>
<p>O código fonte é pequeno, simples e bem escrito. Inclusive, <a href="http://flask.pocoo.org/">Flask</a> possui mais linhas de documentação do que código.</p>
<p>Não temos um ORM, e uma série de outras facilidades comuns em outras frameworks. Na verdade, não temos quase nada e issó é ótimo. Ao desenvolver como uma microframework, cresci como programador. Tive a oportunidade de desenvolver minhas próprias soluções para problemas comuns em desenvolvimento web, compreendendo melhor os conceitos e chegando em resultados mais adequados para meu projeto.</p>
<p>Não vou me alongar muito nem mostrar code snippets, como falei, a <a href="http://flask.pocoo.org/docs/">documentação</a> é ótima. Com esse post quero apenas plantar essa idéia: Tente algo diferente, volte ao básico, e não mate formigas com uma bazuca.</p>
<div class="shr-publisher-566"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://victorfontes.com/2011/05/flask-uma-microframework-web-para-python/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hospedando um repositório Git em seu servidor</title>
		<link>http://victorfontes.com/2011/05/hospedando-um-repositorio-git-em-seu-servidor/</link>
		<comments>http://victorfontes.com/2011/05/hospedando-um-repositorio-git-em-seu-servidor/#comments</comments>
		<pubDate>Sun, 01 May 2011 23:01:40 +0000</pubDate>
		<dc:creator>Victor Fontes</dc:creator>
				<category><![CDATA[Tutoriais]]></category>
		<category><![CDATA[dvcs]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[sysadmin]]></category>

		<guid isPermaLink="false">http://victorfontes.com/?p=469</guid>
		<description><![CDATA[Atualmente o meu sistema de controle de versão favorito é o git. Para projetos de código aberto não é necessário pensar duas vezes: hospede no github. Na hora de trabalhar com código proprietário, o &#8220;segredo&#8221; do seu produto/empresa, você tem duas escolhas: pagar por uma conta no github ou hospedar em seu próprio servidor. Já [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Atualmente o meu sistema de controle de versão favorito é o <a href="http://git-scm.com/">git</a>. Para projetos de código aberto não é necessário pensar duas vezes: hospede no <a href="http://www.github.com">github</a>.</p>
<p>Na hora de trabalhar com código proprietário, o &#8220;segredo&#8221; do seu produto/empresa, você tem duas escolhas: pagar por uma conta no github ou hospedar em seu próprio servidor. Já experimentei os duas alternativas e posso afirmar que pago os U$12,00 mensais do github com muito prazer.</p>
<p>Porém, caso você goste de fortes emoções, esteja passando por tempos de vacas magras ou de paranóia, não custa nada relatar o que eu considero ser a melhor maneira de hospedar seu próprio repositório git: <a href="https://github.com/res0nat0r/gitosis">Gitosis</a> </p>
<p>Para instalar:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">git</span> clone <span style="color: #c20cb9; font-weight: bold;">git</span>:<span style="color: #000000; font-weight: bold;">//</span>eagain.net<span style="color: #000000; font-weight: bold;">/</span>gitosis.git
<span style="color: #7a0874; font-weight: bold;">cd</span> gitosis
python setup.py <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>

<p>Agora é a hora de adicionar o usuário que será dono dos repositórios, vamos chamá-lo de &#8230; git !</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> adduser \
    <span style="color: #660033;">--system</span> \
    <span style="color: #660033;">--shell</span> <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">sh</span> \
    <span style="color: #660033;">--gecos</span> <span style="color: #ff0000;">'git version control'</span> \
    <span style="color: #660033;">--group</span> \
    <span style="color: #660033;">--disabled-password</span> \
    <span style="color: #660033;">--home</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">git</span> \
    <span style="color: #c20cb9; font-weight: bold;">git</span></pre></div></div>

<p>Copie sua chave pública ($HOME/.ssh/id_rsa.pub) para o servidor git. Para gerar a chave:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ssh-keygen</span> <span style="color: #660033;">-t</span> rsa</pre></div></div>

<p>No servidor git, vamos adicionar sua chave à lista de chaves autorizadas:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #660033;">-H</span> <span style="color: #660033;">-u</span> <span style="color: #c20cb9; font-weight: bold;">git</span> gitosis-init <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>id_rsa.pub</pre></div></div>

<p>Agora &#8230; a magia do gitosis, em sua máquina local:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">git</span> clone <span style="color: #c20cb9; font-weight: bold;">git</span><span style="color: #000000; font-weight: bold;">@</span>SEU_SERVIDOR:gitosis-admin.git
<span style="color: #7a0874; font-weight: bold;">cd</span> gitosis-admin</pre></div></div>

<p>Voce terá um arquivo gitosis.conf e uma pasta keydir/<br />
Esse repositório que você acabou de clonar contém os arquivos necessários para criar e administrar os repositórios git no servidor. Assim que você fizer push, o gitosis irá automaticamente fazer as mudanças necessárias no servidor.</p>
<p>Ou seja, você gerenciará seu servidor git com o git ! Além disso, a partir desse momento o login no servidor não será mais necessário, afinal basta fazer as atualizações localmente e o commit/push.</p>
<p>Para criar um repositório, basta editar o arquivo gitosis.conf:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#91;</span>gitosis<span style="color: #7a0874; font-weight: bold;">&#93;</span>                  
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#91;</span>group gitosis-admin<span style="color: #7a0874; font-weight: bold;">&#93;</span>
writable = gitosis-admin
members = victor <span style="color: #666666; font-style: italic;"># nome do arquivo com a chave publica, sem o &quot;.pub&quot;             </span>
&nbsp;
<span style="color: #666666; font-style: italic;">#Para criar um novo repositório, bastar dar permissões de escrita nele:</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#91;</span>group minha_equipe<span style="color: #7a0874; font-weight: bold;">&#93;</span>
members = victor
writable = top_secrect
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">git</span> commit <span style="color: #660033;">-a</span> <span style="color: #660033;">-m</span> <span style="color: #ff0000;">&quot;Dando permissão a victor no repositorio top_secret&quot;</span>
<span style="color: #c20cb9; font-weight: bold;">git</span> push</pre></div></div>

<p>Agora, o usuário &#8220;victor&#8221; tem acesso ao respositório, porém este não foi criado ainda, isso precisa ser feito localmente, seguido de um push:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">mkdir</span> top_secrect
<span style="color: #7a0874; font-weight: bold;">cd</span> top_secrect
<span style="color: #c20cb9; font-weight: bold;">git</span> init
<span style="color: #c20cb9; font-weight: bold;">git</span> remote add origin <span style="color: #c20cb9; font-weight: bold;">git</span><span style="color: #000000; font-weight: bold;">@</span>SEU_SERVIDOR:top_secrect.git
touche README
<span style="color: #c20cb9; font-weight: bold;">git</span> add .
<span style="color: #c20cb9; font-weight: bold;">git</span> push origin master</pre></div></div>

<p>Com esse push o repositório já foi criado e agora é só usar normalmente. </p>
<p>Para adiconar mais usuários basta colocar a chave deles em keydir/username.pub</p>
<p>Aproveite seu servidor de repositórios git, ou não :)</p>
<div class="shr-publisher-469"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://victorfontes.com/2011/05/hospedando-um-repositorio-git-em-seu-servidor/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Django 1.3 &#8211; Vale a pena migrar ?</title>
		<link>http://victorfontes.com/2011/04/django-1-3-vale-a-pena-migrar/</link>
		<comments>http://victorfontes.com/2011/04/django-1-3-vale-a-pena-migrar/#comments</comments>
		<pubDate>Mon, 18 Apr 2011 02:24:04 +0000</pubDate>
		<dc:creator>Victor Fontes</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[django 1.3]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://victorfontes.com/?p=532</guid>
		<description><![CDATA[Se vale a pena migrar ? Como eu vou saber &#8230; você tem que conhecer as vantagens e as dificuldades de migração para ver se vale a pena no seu caso. E é sobre isso que vou falar aqui :) As duas maiores novidades são as views baseadas em classes e o gerenciamento de arquivos [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Se vale a pena migrar ? Como eu vou saber &#8230; você tem que conhecer as vantagens e as dificuldades de migração para ver se vale a pena no seu caso. E é sobre isso que vou falar aqui :)</p>
<p>As duas maiores novidades são as views baseadas em classes e o gerenciamento de arquivos estáticos. Os dois assuntos são bem extensos e cada um receberá seu próprio post em breve, vamos as outras novidades:</p>
<h2>Novidades:</h2>
<p>O python 2.7 melhorou muito a biblioteca unittest, para garantir que todos pudessem aproveita-las o pessoal do django fez um backport para python 2.4, chamado de unittest2.</p>
<p>A unittest2 está incluida no django e para aproveita-la em versões no python<2.7 basta usar o alias:<br />
<code>from django.utils import unittest</code></p>
<p>O nome de um template agora pode ser fornecido através de uma variável:<br />
<code><br />
{% extends some_var %}<br />
</code></p>
<p>O módulo Logging do python é muito poderoso, e agora ele funciona integrado com o Django. Agora fica muito mais fácil configurar o comportamento e a versosidade dos seus logs. Além disso, segundo a equipe de desenvolvimento várias chamadas de log foram adicionadas no código da framework.</p>
<p>Delete-Cascade: os campos ForeignKey e OneToOneField agora aceitam o argumento on_delete para definir o comportamento quando o objeto referenciado é apagado.</p>
<p>Marcadores de contexto para tradução de strings: Para strings com tradução ambígua, dependente do contexto foi disponibilizada a função pgettext para especificar o contexto.</p>
<p>Agora é possível definir mais de uma váriavel com apenas um bloco with :)</p>
<p>A tag include agora aceita as opções with (para definir um contexto) e  only (para excluir uma variavel do contexto atual) =D</p>
<p>A tag load aceita o argumento from, para carregar apenas um filtro ou tag.</p>
<h2>Para ficar de olho:</h2>
<p>Essa é a ultima versão do django com suporte a python2.4 , mas acho que pouca gente ainda está nessa versão. Mas fica o alerta: Se você usa python 2.5 a sua hora de migrar vai chegar.</p>
<p>A partir dessa versão a validação de segurança contra ataques CSRF também será obrigatória para requests AJAX.</p>
<p>Arquivos referênciados por um modelo através do FileField não serão mais apagados junto com o modelo e não há nenhuma maneira automática para que isso seja feito. O padrão sugerido é escrever um management command para apagar arquivos órfãos e colocar no cron.</p>
<p>A moderação automática de comentários não está mais sendo suportada, afinal é um problema de processamento de linguagem natural e foge do escopo da framework. Se você quiser restaurar o comportamento antigo basta colocar uma lista de palavras em PROFANITIES_LIST no settings.py</p>
<p>O uso de fixtures de teste no formato SQL não é mais suportado.</p>
<p>O suporte a mod_python foi removido, afinal um release não é feito desde 2007 e a fundação apache removeu esse módulo da lista de projetos ativos.</p>
<p>XMLField foi removido: nunca vi muita utilidade mesmo ...</p>
<p>Esses foram os pontos que considerei mais interessantes nessa release do django, espero que se você não foi convencido a migrar, mude de idéia nos próximos posts sobre class based views e static files.</p>
<div class="shr-publisher-532"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://victorfontes.com/2011/04/django-1-3-vale-a-pena-migrar/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>As ferramentas de um programador Python &#8211; 1</title>
		<link>http://victorfontes.com/2011/04/as-ferramentas-de-um-programador-python-1/</link>
		<comments>http://victorfontes.com/2011/04/as-ferramentas-de-um-programador-python-1/#comments</comments>
		<pubDate>Mon, 18 Apr 2011 01:27:48 +0000</pubDate>
		<dc:creator>Victor Fontes</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[pip]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://victorfontes.com/?p=527</guid>
		<description><![CDATA[Decidi fazer uma série de posts sobre as ferramentas que facilitam o desenvolvimento na linguagem Python. A idéia é ter um escopo bem aberto: começarei com gerenciamento de pacotes hoje, porém pretendo abordar bibliotecas, funcionalidades da biblioteca padrão, utilitários para teste, analisadores de sintaxe, etc. Easy Install Foi a primeira iniciativa de gerenciamento de pacotes [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Decidi fazer uma série de posts sobre as ferramentas que facilitam o desenvolvimento na linguagem Python. A idéia é ter um escopo bem aberto: começarei com gerenciamento de pacotes hoje, porém pretendo abordar bibliotecas, funcionalidades da biblioteca padrão, utilitários para teste, analisadores de sintaxe, etc.</p>
<h2>Easy Install</h2>
<p>Foi a primeira iniciativa de gerenciamento de pacotes com Python, e faz parte do pacote <a href="http://pypi.python.org/pypi/setuptools">setuptools</a>. O easy_install é bem simples: ele instala a ultima versão do pacote caso ele esteja disponível no <a href="http://pypi.python.org/pypi">PyPI</a> (Python Package Index) e não dá suporte a desinstalação ou atualização. Sua utilização é bem simples:<br />
<code>sudo easy_install Django</code></p>
<h2>Pip</h2>
<p>O <a href="http://www.pip-installer.org/en/latest/index.html">Pip</a> revolucionou completamente o gerenciamento de pacotes no Python, suas principais características são:</p>
<ul>
<li>Suporte a desinstalação e atualização dos pacotes</li>
<li>É possível especificar a versão desejada (desde que disponível no PyPI)</li>
<li>Instala pacotes a partir de arquivos compactados (bz,gz,zip) que podem ser especificados através de uma url para download </li>
<li>Suporte aos principais sistemas de controle de versão (svn, git, mercurial, bazaar). Basta especificar a url do projeto do github para instala-lo por exemplo</li>
<li>Gerencia dependências de forma inteligente </li>
<li>É possivel instalar vários pacotes de uma só vez, especificando um por linha em um arquivo de texto. Assim como é possivel exportar a lista de pacotes instalados para um arquivo </li>
</ul>
<p> Uma visão rápida na sintaxe do pip:<br />
<code><br />
# instalando do pypi (os operadores >,<,==,>=,<= são suportados para expressar a versão do pacote)<br />
pip install django>=1.3 </p>
<p># listando pacotes instalados<br />
pip freeze</p>
<p># fazendo upgrade para a versão mais recente<br />
pip -U django</p>
<p># instalação recursiva<br />
pip -r requirements.txt</p>
<p># instalando a partir de um repositório, suporta svn, hg, git e bzr<br />
pip -e git+https://github.com/SmileyChris/django-mailer-2.git#egg=django-mailer-2</p>
<p># desinstalando<br />
pip uninstall web2py<br />
</code></p>
<p>Um outro recurso interessante do pip, é a criação de bundles. Um arquivo .pybundle contém todas as dependências de sua aplicação e é muito útil para deploy em ambientes offline ou com internet precária. </p>
<p>Um pybundle não contém binários, apenas fontes, portanto é necessário que o ambiente de deploy já possua um compilador no caso de dependências que não são python puro, como no caso da PIL.</p>
<p><code><br />
pip bundle MinhaApp.pybundle MinhaApp</p>
<p>pip install MinhaApp.pybundle<br />
</code></p>
<p>No próximo post da série: virtualenv e virtualenvwrapper.</p>
<div class="shr-publisher-527"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://victorfontes.com/2011/04/as-ferramentas-de-um-programador-python-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Email, twitter, etc: Navegador ou App ? ( Mac OSX )</title>
		<link>http://victorfontes.com/2011/04/email-twitter-etc-navegador-ou-app-mac-osx/</link>
		<comments>http://victorfontes.com/2011/04/email-twitter-etc-navegador-ou-app-mac-osx/#comments</comments>
		<pubDate>Sun, 17 Apr 2011 14:22:39 +0000</pubDate>
		<dc:creator>Victor Fontes</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[apps]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://victorfontes.com/?p=520</guid>
		<description><![CDATA[Volta e meia quando estou mac a mac com meu amigo Pedro Marins e ele dá uma espiada no meu Dock para ver se tem algum programa imperdível para Mac OSX. Ontem, ele reparou que eu estava usando uma série de apps para acessar aplicativos/serviços web e redes sociais. Eu já tinha lhe recomendado o [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Volta e meia quando estou mac a mac com meu amigo <a href="http://www.pedromarins.com">Pedro Marins</a> e ele dá uma espiada no meu Dock</a> para ver se tem algum programa imperdível para Mac OSX. </p>
<p>Ontem, ele reparou que eu estava usando uma série de apps para acessar aplicativos/serviços web e redes sociais. Eu já tinha lhe recomendado o excelente <a href="http://nambu.com/">Nambu</a> (cliente twitter) e ele revolucionou minha experiência com feeds quando me recomendou o <a href="http://reederapp.com/">Reeder</a> (cliente Google Reader).</p>
<p>Além desses dois aplicativos, já incorporados em nossas rotinas, ele questionou o <a href="http://www.sparrowmailapp.com/">Sparrow</a> e o <a href="http://www.red-sweater.com/marsedit/">MarsEdit</a>, ambos fixos em minha dock. Expliquei: Cliente do Gmail e do WordPress. </p>
<p>Era de se esperar sua expressão de surpresa, afinal a interface web tanto do gmail quanto do wordpress são excelentes, o gmail funciona offline e o wordpress possui uma série de otimizações através do <a href="http://gears.google.com/">google gears</a>.</p>
<p>Antes de listar outros aplicativos que tenho usado do mesmo gênero, explico a minha incomum preferência. Mesmo após a série de melhorias que testemunhamos nos navegadores como, separação de processos por aba, motores JS e DOM cada vez mais rápidos, html5 (LocalStorage, Web Sql, Cache Manifest, IndexedDB, etc &#8230;), aplicativos dedicados tem algumas vantagens bem claras:</p>
<ul>
<li>A interface nativa de seu sistema operacional proporciona uma resposta mais rápida e é esteticamente mais agradável</li>
<li>As possibilidades que o programador tem para conceber a UI são ilimitadas, muito diferente quando se está preso aos elementos do DOM</li>
<li>A integração com o sistema operacional, traz muitas vantagens, como o acesso direto (e mudança do ícone para indicar estado pelo dock), notificações growl, início junto com OS e continua funcionando mesmo se o navegar travar (o que infelizmente ainda acontece, principalmente pra quem não abre mão dos betas)</li>
<li>Se você precisa trabalhar offline ou com internet lenta/intermitente apps desktop sempre proporcionam uma experiência melhor</li>
<li>Nas palavras do Pedro: &#8220;Fica tudo mais organizado&#8221;</li>
</ul>
<p>As desvantagens ? Em alguns casos as apps que realmente valem a pena são pagas e o consumo de memória também pode ser um problema se seu <a href="http://pt.wikipedia.org/wiki/MacBook_Air">notebook é fino</a> que nem o do Pedro :)</p>
<p>Vou agora listar os aplicativos que uso:</p>
<ul>
<li><a href="http://www.sparrowmailapp.com/">Sparrow</a>: Cliente IMAP para o Gmail, interface excelente, limpa e funcional. Atalhos de teclados, e a possibilidade de usar CMD + setas e tab na edição do corpo do email fazem valer os U$ 9.90</li>
<li><a href="http://reederapp.com/">Reeder</a>: Leitor de feeds, completamente integrado ao Google Reader, Read it Later, Instapaper e o que mais você imaginar</li>
<li><a href="http://nambu.com/">Nambu</a>: Twitter de maneira funcional e não invasiva, excelente ! (Não está mais sendo desenvolvido)</li>
<li><a href="http://www.red-sweater.com/marsedit/i">MarsEdit</a>: Editor de blogs, tenho usado nos meus últimos posts e melhorou muito a experiência de uso do WordPress</li>
<li><a href="http://en.wikipedia.org/wiki/ICalendar">iCalendar</a>: Já vem no Mac OSX e se integra perfeitamente com o Google Calendar </li>
<li><a href="http://itunes.apple.com/us/app/facebox-for-facebook/id420282643?mt=12">Facebox</a>: Facebook não é muito a minha praia, mas pra quem gosta de seguir a timeline de perto é uma excelente opção. </li>
</ul>
<div class="shr-publisher-520"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://victorfontes.com/2011/04/email-twitter-etc-navegador-ou-app-mac-osx/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Amazon Web Services e Python &#8211; S3</title>
		<link>http://victorfontes.com/2011/04/amazon-web-services-e-python-s3/</link>
		<comments>http://victorfontes.com/2011/04/amazon-web-services-e-python-s3/#comments</comments>
		<pubDate>Wed, 06 Apr 2011 19:44:12 +0000</pubDate>
		<dc:creator>Victor Fontes</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[s3]]></category>
		<category><![CDATA[web services]]></category>

		<guid isPermaLink="false">http://victorfontes.com/?p=508</guid>
		<description><![CDATA[AWS, ou Amazon Web Services é o conjunto de serviços de computação em nuvem que a Amazon oferece. Os produtos vão de Virtualização a Armazenamento, passando por monitoramento, bancos de dados, pagamentos, etc. Atualmente a melhor interface Python para esses serviços se chama boto. Seu desenvolvimento é ativo, com commits frequentes, oferece suporte a maioria [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><a href="http://aws.amazon.com/">AWS</a>, ou <a href="http://aws.amazon.com/">Amazon Web Services</a> é o conjunto de serviços de <a href="http://en.wikipedia.org/wiki/Cloud_computing">computação em nuvem</a> que a <a href="http://amazon.com">Amazon</a> oferece. Os produtos vão de <a href="http://aws.amazon.com/ec2/">Virtualização </a> a <a href="http://aws.amazon.com/s3/">Armazenamento</a>, passando por <a href="http://aws.amazon.com/cloudwatch/">monitoramento</a>, <a href="http://aws.amazon.com/rds/">bancos de dados</a>, <a href="http://aws.amazon.com/fps/">pagamentos</a>, etc.</p>
<p>Atualmente a melhor interface Python para esses serviços se chama <a href="http://github.com/boto/boto">boto</a>. Seu desenvolvimento é ativo, com commits frequentes, oferece suporte a maioria dos serviços da AWS, e até onde testei se mostrou estável .</p>
<p>Esse é o primeiro de uma série onde abordarei cada serviço da AWS e como usa-lo com Python e a lib <a title="Boto" href="https://github.com/boto/boto" target="_blank">boto</a></p>
<p>Começarei pelo mais comum: </p>
<p><a href="http://aws.amazon.com/s3/">Amazon Simple Storage Service (Amazon S3)</a>, um sistema de storage key-based, com uma excelente interface de acesso através de webservices e <a href="http://aws.amazon.com/s3/pricing/">preços extremamente atrativos</a>.<br />
A cobrança é feita mensalmente de acordo com o tráfego realizado, espaço alocado e quantidade de requests realizados.</p>
<p>No plano mais barato, que nas palavras da amazon é <em>&#8220;Designed for 99.99% Durability&#8221;</em>, temos:</p>
<ul>
<li>U$0,093/mês por GB armazenado</li>
<li>U$0,100/mês por GB enviado</li>
<li>U$0,150/mês por GB baixado (cobrado somente a partir de um 1GB)</li>
<li>U$0,01 por 1.000 requests PUT/COPY/POST/LIST</li>
<li>U$0,01 por 10.000 requests GET/DELETE</li>
</ul>
<p>Para instalar: <code>pip install boto</code></p>
<p>Criando a conexão:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> boto.<span style="color: black;">s3</span>.<span style="color: black;">connection</span> <span style="color: #ff7700;font-weight:bold;">import</span> S3Connection
conn_s3 = S3Connection<span style="color: black;">&#40;</span><span style="color: #483d8b;">'AWS_ACCESS_KEY_ID'</span>, <span style="color: #483d8b;">'AWS_SECRET_ACCESS_KEY'</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># ou de maneira mais direta ....</span>
<span style="color: #ff7700;font-weight:bold;">import</span> boto
conn_s3 = boto.<span style="color: black;">connect_s3</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'AWS_ACCESS_KEY_ID'</span>, <span style="color: #483d8b;">'AWS_SECRET_ACCESS_KEY'</span><span style="color: black;">&#41;</span></pre></div></div>

<p>No S3 os dados são armazenados em Bukets, que são containers para seus arquivos.</p>
<p>O nome dos buckets é compartilhado entre todos usuários do serviço, portanto é interessante adicionar um prefixo como &#8216;media.meusite.com&#8217; aos identificadores de seus buckets. </p>
<p>Outro aspecto importante é que cada bucket possui uma determinada localização geográfica, que deve ser definida no momento em que ele é criado.</p>
<p>Utilizar seu subdomínio como prefixo é recomendado pois lhe permite mapear seus dominio/subdominios diretamente para seu dados do s3 adicionando entradas CNAME, por exemplo:</p>
<p>O bucket &#8220;media.meusite.com&#8221; corresponderá ao endereço:<br />
<code> http://media.xyz.com.s3.amazonaws.com/ </code></p>
<p>Se você enviar o arquivo &#8220;imagem.jpg&#8221;, seu endereço será:<br />
<code>http://media.meusite.com.s3.amazonaws.com/imagem.jpg </code></p>
<p>Porém, ao mapear o domínio &#8220;media.meusite.com&#8221; para http://media.meusite.com.s3.amazonaws.com , o mesmo arquivo poderá ser acessado em:<br />
<code>http://media.meusite.com/imagem.jpg</code></p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> boto.<span style="color: black;">s3</span>.<span style="color: black;">connection</span> <span style="color: #ff7700;font-weight:bold;">import</span> Location
&nbsp;
<span style="color: #808080; font-style: italic;"># listando as localizações disponíveis:</span>
<span style="color: #008000;">dir</span><span style="color: black;">&#40;</span>Location<span style="color: black;">&#41;</span>
<span style="color: black;">&#91;</span><span style="color: #483d8b;">'DEFAULT'</span>, <span style="color: #483d8b;">'EU'</span>, <span style="color: #483d8b;">'USWest'</span>, <span style="color: #483d8b;">'APSoutheast'</span>, <span style="color: #483d8b;">'__doc__'</span>, <span style="color: #483d8b;">'__module__'</span><span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># criando um novo bucket</span>
balde = conn_s3.<span style="color: black;">create_bucket</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'meu_balde'</span>, location=Location.<span style="color: black;">DEFAULT</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">&lt;</span>/code<span style="color: #66cc66;">&gt;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># listando todos os buckets de sua conta:</span>
baldes = conn_s3.<span style="color: black;">get_all_buckets</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">&lt;</span>/code<span style="color: #66cc66;">&gt;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># instanciando um bucket existente</span>
balde = conn_s3.<span style="color: black;">get_bucket</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'meu_balde_velho'</span><span style="color: black;">&#41;</span></pre></div></div>

<p> O Bucket, é apenas um container de Keys que são os objetos que armazenam o conteúdo, suas características são:</p>
<ul>
<li>Uma Key é identificada por uma string que deve ser única dentro do Bucket</li>
<li>Apesar do indenficador ser sempre um string, muitos visualizadores de dados (inclusive o da própria amazon), interpretam &#8216;/&#8217; como separador de niveis em um path. E mostram as chaves organizadas em forma de pastas/subspastas</li>
<li>Seu conteúdo pode ser uma string ou um arquivo</li>
<li>É possível associar metadados a uma Key, assim como verificar seu tamanho em bytes, hash do conteúdo, etc</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">balde = conn_s3.<span style="color: black;">get_bucket</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'meu_balde'</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># criando uma chave que contém uma string</span>
k = Key<span style="color: black;">&#40;</span>balde, <span style="color: #483d8b;">'texto-1'</span><span style="color: black;">&#41;</span>
k.<span style="color: black;">set_contents_from_string</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'qwerty!'</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">&lt;</span>/code<span style="color: #66cc66;">&gt;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># criando uma chave que contém um arquivo</span>
k = Key<span style="color: black;">&#40;</span>balde, <span style="color: #483d8b;">'/fotos/imagem.jpg'</span><span style="color: black;">&#41;</span>  <span style="color: #808080; font-style: italic;"># vai ser exibido como um arquivo dentro da pasta fotos</span>
k.<span style="color: black;">set_contents_from_filename</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/path/para/imagem.jpg'</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">&lt;</span>/code<span style="color: #66cc66;">&gt;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Acessando o conteudo das chaves:</span>
texto_1 = Key<span style="color: black;">&#40;</span>balde, <span style="color: #483d8b;">'texto-1'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> texto_1.<span style="color: black;">get_contents_as_string</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">&lt;</span>/code<span style="color: #66cc66;">&gt;</span>
&nbsp;
img = Key<span style="color: black;">&#40;</span>balde, <span style="color: #483d8b;">'/fotos/imagem.jpg'</span><span style="color: black;">&#41;</span>
img.<span style="color: black;">get_contents_to_filename</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/onde/o/arquivo/sera/salvo.jpg'</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">&lt;</span>/code<span style="color: #66cc66;">&gt;</span></pre></div></div>

<p>É possível definir o controle de acesso para todo o Bucket ou para keys específicas. Por padrão o acesso é feito somente através de sua conta da AWS, porém ele também pode ser:</p>
<ul>
<li>Público</li>
<li>Para emails específicos (que possuem uma conta AWS associada)</li>
<li>Através de uma url assinado por sua conta, que possui um tempo de expiração pré-determinado</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># publico</span>
bucket.<span style="color: black;">set_acl</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'public-read'</span><span style="color: black;">&#41;</span>
key.<span style="color: black;">set_acl</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'public-read'</span><span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;"># ou</span>
key.<span style="color: black;">make_public</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># para um email</span>
key.<span style="color: black;">add_email_grant</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'READ'</span>, <span style="color: #483d8b;">'fulano@bol.com.br'</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">&lt;</span>/code<span style="color: #66cc66;">&gt;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># gerando a url:</span>
<span style="color: #808080; font-style: italic;"># esse método permite você controlar o acesso através de seu sistema, fazendo com que o s3 lide com todo o tráfego</span>
key.<span style="color: black;">generate_url</span><span style="color: black;">&#40;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>segundos para expirar<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Trabalhando com o objeto Key:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># apagando</span>
k.<span style="color: black;">delete</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># verificando se está armazenada na nuvem:</span>
k.<span style="color: black;">exists</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># copiando o conteudo para outra chave </span>
new_key = k.<span style="color: #dc143c;">copy</span><span style="color: black;">&#40;</span>balde_destino, chave_destino, metadata=<span style="color: #008000;">None</span>, preserve_acl=<span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Metadados:</span>
k.<span style="color: black;">set_metadata</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'meta1'</span>, <span style="color: #483d8b;">'alguma string'</span><span style="color: black;">&#41;</span>
k.<span style="color: black;">get_metadata</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'meta1'</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># mime-type que será utilizado na resposta de um GET</span>
k.<span style="color: black;">content_type</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># tamanho do arquivo em bytes</span>
k.<span style="color: black;">size</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># hash md5 do arquivo armazenado</span>
k.<span style="color: black;">etag</span>    <span style="color: #808080; font-style: italic;"># é igual a hashlib.md5( open('arquivo-enviado.jpg') ).hexdigest</span>
&nbsp;
k.<span style="color: black;">last_modified</span> <span style="color: #808080; font-style: italic;"># retorna uma string, não um datetime =(</span></pre></div></div>

<div class="shr-publisher-508"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://victorfontes.com/2011/04/amazon-web-services-e-python-s3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criando um Servidor FTP no Debian/Ubuntu Linux</title>
		<link>http://victorfontes.com/2011/03/criando-um-servidor-ftp-no-linux/</link>
		<comments>http://victorfontes.com/2011/03/criando-um-servidor-ftp-no-linux/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 21:20:31 +0000</pubDate>
		<dc:creator>Victor Fontes</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://victorfontes.com/?p=278</guid>
		<description><![CDATA[Um servidor de FTP pode ser muito útil. Tem sido uma excelente solução quando prestadores de serviços querem fornercer arquivos para seus clientes de maneira bem simples e direta. Segue o tutorial para implementação com o proftp. Testei no Ubuntu 10.04 mas deve funcionar em qualquer derivada do Debian 1 2 sudo apt-get install proftpd [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Um servidor de FTP pode ser muito útil. Tem sido uma excelente solução quando prestadores de serviços querem fornercer arquivos para seus clientes de maneira bem simples e direta.</p>
<p>Segue o tutorial para implementação com o proftp. Testei no Ubuntu 10.04 mas deve funcionar em qualquer derivada do Debian</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> proftpd 
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">vim</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>proftpd<span style="color: #000000; font-weight: bold;">/</span>proftpd.conf</pre></td></tr></table></div>

<p>Agora é só modicar os seguintes atributos:</p>
<p>ServerName: Nome do servidor que será mostrado.<br />
MaxClients = Numero máximo de clientes conectados.<br />
DefaultRoot ~ = Para que cada usuário veja apenas a sua pasta.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>proftpd restart
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>ww<span style="color: #000000; font-weight: bold;">/</span>ftp_clientes<span style="color: #000000; font-weight: bold;">/</span>usuario
adduser –home  <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>ftp_clientes<span style="color: #000000; font-weight: bold;">/</span>usuario –shell <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">false</span> –no-create-home usuario
<span style="color: #c20cb9; font-weight: bold;">chown</span> <span style="color: #660033;">-R</span> usuario:usuario <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>ftp_clientes<span style="color: #000000; font-weight: bold;">/</span>usuario</pre></td></tr></table></div>

<div class="shr-publisher-278"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://victorfontes.com/2011/03/criando-um-servidor-ftp-no-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

