<?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>Samir Mamude</title>
	<atom:link href="http://samirmamude.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://samirmamude.com</link>
	<description>Simplicidade é a maior forma de sofisticação</description>
	<lastBuildDate>Fri, 26 Feb 2010 00:12:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Integração entre Django e ExtJs</title>
		<link>http://samirmamude.com/2010/02/25/integracao-entre-django-e-extjs/</link>
		<comments>http://samirmamude.com/2010/02/25/integracao-entre-django-e-extjs/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 23:32:01 +0000</pubDate>
		<dc:creator>Samir</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[ExtJs]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://samirmamude.com/?p=125</guid>
		<description><![CDATA[Recentemente voltei minhas atenções para a biblioteca javascript ExtJs. O projeto/sistema que venho trabalhando desde outubro de 2009 passou por várias mudanças e uma coisa que eu estava achando ruim era justamente a user interface, afinal não sou um designer  
Conversando com o cliente mostrei a biblioteca, expliquei suas vantagens e tive aprovação para [...]]]></description>
			<content:encoded><![CDATA[<p>Recentemente voltei minhas atenções para a biblioteca javascript <a href="http://www.extjs.com/" onclick="pageTracker._trackPageview('/outgoing/www.extjs.com/?referer=');">ExtJs</a>. O projeto/sistema que venho trabalhando desde outubro de 2009 passou por várias mudanças e uma coisa que eu estava achando ruim era justamente a <em>user interface</em>, afinal não sou um designer <img src='http://samirmamude.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Conversando com o cliente mostrei a biblioteca, expliquei suas vantagens e tive aprovação para refazer a interface. A primeira dúvida era como integrar a chamadas ajax com o Django, já que o mesmo não tem suporte nativo e como serializar objetos de forma flexível. O Django possui um sistema de serialização para os formatos mais conhecidos, mas a  forma como os objetos são serializados não me agrada, sendo assim comecei a procurar por alternativas.</p>
<p>Existem poucas alternativas de integração entre Python/ExtJs, das alternativas que  testei foram o <a href="http://pypi.python.org/pypi/extdirect.django/0.3" onclick="pageTracker._trackPageview('/outgoing/pypi.python.org/pypi/extdirect.django/0.3?referer=');">ExtDirect-Django</a> e <a href="http://bitbucket.org/jespern/django-piston/wiki/Home" onclick="pageTracker._trackPageview('/outgoing/bitbucket.org/jespern/django-piston/wiki/Home?referer=');">Piston.</a></p>
<p>No final das contas acabei criando uma classe bem simples para serializar objetos de acordo com a minha necessidade, até agora vem funcionando bem e quem quiser melhorar o código fique a vontade <img src='http://samirmamude.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Arquivo json.py</p>
<pre class="brush:python"># -*- coding:utf-8 -*-

from django.http import HttpResponse
from django.core import serializers
from django.utils import simplejson
from django.utils.encoding import smart_unicode

# ********************************************
def ext_date(d, date_format=1):
    """
    Renderizar Datetime no formato para ExtJs
    """
    if date_format==1:
        return d.strftime("%m/%d/%Y")
    elif date_format==2:
        return d.strftime("%d/%m/%Y")

# ********************************************
class JsonResponse(HttpResponse):
    """
    Renderizar Dicionrario Python para formato JSON
    """
    def __init__(self, params={}):
        HttpResponse.__init__(self, content=simplejson.dumps(params), mimetype='application/json')

# ********************************************
class JsonModelResponse(HttpResponse):
    """
    Renderizar Model para formato JSON
    """
    def __init__(self, queryset, **options):
        excludes = options.get('excludes')
        date_format = options.get('date_format')
        content = {'success': True}
        fields, many_to_many, foreignkeys = {},{},{}

        opts = queryset._meta # Extrai informação do Model

        # colunas
        for c in opts.fields:
            if excludes is not None:
                if c.name in excludes:
                    continue

            if c.__class__.__name__ == 'DateTimeField':
                if date_format is not None:
                    fields.update({c.name: ext_date(getattr(queryset, c.attname), date_format=date_format)})
                else:
                    fields.update({c.name: ext_date(getattr(queryset, c.attname))})
            elif c.__class__.__name__ == 'DecimalField':
                fields.update({c.name: str(getattr(queryset, c.attname))})
            elif c.__class__.__name__ == 'ForeignKey':
                pk = getattr(queryset, c.attname)
                # Usa o metodo smart_unicode para serializer um objeto model
                val = smart_unicode(getattr(queryset, c.name), strings_only=True)
                foreignkeys.update({c.name: [pk,val]})
            else:
                fields.update({c.name: getattr(queryset, c.attname)})

        # relaciomentos
        for c in opts.many_to_many:
            models = c.value_from_object(queryset) # Extrair models da lista
            many_to_many.update({c.name: [[{m.name:getattr(model, m.name)} for m in model._meta.fields] for model in models]})

        # atualiza dict
        content.update({'data': fields, 'foreignkeys': foreignkeys, 'many_to_many': many_to_many})
        # retorna a reposta no formato json
        HttpResponse.__init__(self, content=simplejson.dumps(content), mimetype='application/json')

# ********************************************
class JsonSuccess(HttpResponse):
    """
    Resposta JSON para requests efetuados com sucesso
    """
    def __init__(self, params={}):
        content = {'success':True}
        content.update(params)
        HttpResponse.__init__(self, content=simplejson.dumps(content), mimetype='application/json')

# ********************************************
class JsonFailure(HttpResponse):
    """
    Resposta JSON para requests efetuados com falha
    """
    def __init__(self, params={}):
        content = {'success':False}
        content.update(params)
        HttpResponse.__init__(self, content=simplejson.dumps(content), mimetype='application/json')</pre>
<p>A integração fica bem mais simples agora, veja um pequeno exemplo de uma chamada Ajax.</p>
<pre class="brush:javascript">Ext.onReady({
   Ext.Ajax.request({
      method:'GET',
      url:'/usuarios/show/1/'
   });
});</pre>
<p>No lado do servidor nossa view faz a utilização do módulo json que criamos acima e devolve  para o client no formato Json. Observe que na resposta não quero se seja serializado o campo password na resposta.</p>
<pre class="brush:python">from utils import json
from django.contrib.auth.models import User

def show(request,id):
     qs = User.objects.get(pk=id)
     return json.JsonModelResponse(qs, excludes=('password',))</pre>
<p>Observando a resposta do servidor pelo Firebug, temos o seguinte:<br />
<img class="aligncenter size-full wp-image-141" title="json" src="http://samirmamude.com/wp-content/uploads/2010/02/json.jpg" alt="json" width="690" height="402" /></p>
<p>Interessante não? <img src='http://samirmamude.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://samirmamude.com/2010/02/25/integracao-entre-django-e-extjs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Retrospectiva 2009</title>
		<link>http://samirmamude.com/2009/12/22/retrospectiva-2009/</link>
		<comments>http://samirmamude.com/2009/12/22/retrospectiva-2009/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 17:58:46 +0000</pubDate>
		<dc:creator>Samir</dc:creator>
				<category><![CDATA[Off-Topic]]></category>

		<guid isPermaLink="false">http://samirmamude.com/?p=106</guid>
		<description><![CDATA[Bom como último post do ano, gostaria de explicar o que aconteceu comigo em 2009 no qual passei por várias situações boas e ruins tanto na vida pessoal como profissional. Acredito que foi um ano de muito aprendizado e algumas conquistas, vamos lá.
(Janeiro até Abril)
No início de 2009 pra variar já comecei na correria pois [...]]]></description>
			<content:encoded><![CDATA[<p>Bom como último post do ano, gostaria de explicar o que aconteceu comigo em 2009 no qual passei por várias situações boas e ruins tanto na vida pessoal como profissional. Acredito que foi um ano de muito aprendizado e algumas conquistas, vamos lá.</p>
<h2><strong>(Janeiro até Abril)</strong></h2>
<p>No início de 2009 pra variar já comecei na correria pois ainda prestava serviços para <a href="http://www.arizonabay.com/" onclick="pageTracker._trackPageview('/outgoing/www.arizonabay.com/?referer=');"><strong>ArizonaBay</strong></a>, uma empresa americana localizada em São Francisco, CA. Foi minha melhor experiência de aprendizado profissional, pois melhorei meu inglês e trabalhei com pessoas incríveis. Fico eternamente grato pela oportunidade.</p>
<p>Em <strong>Março</strong>, tive a oportunidade de ver novamente o show do <strong><a href="http://pt.wikipedia.org/wiki/Morbid_Angel" onclick="pageTracker._trackPageview('/outgoing/pt.wikipedia.org/wiki/Morbid_Angel?referer=');">Morbid Angel</a></strong> que é uma das minhas bandas favoritas de Metal e não podia perder aquele show por nada.</p>
<p><strong> </strong>Continuando&#8230;.pra minha &#8220;sorte&#8221;, tive um problema muito grave de saúde e tive que ser operado as pressas, pois corri sério risco de morte. O problema foi que eu sempre sofri com problemas de estômago e crises de gastrite, juntando ao stress do trabalho, minha situação foi se agravando até  que cheguei a ponto de ser internado. Após uma série de exames meu médico constatou que eu estava com micro perfurações no intestino e precisava ser operado imediamente. O resultado da biopsia constatou a <a href="http://pt.wikipedia.org/wiki/Doença_de_Crohn" onclick="pageTracker._trackPageview('/outgoing/pt.wikipedia.org/wiki/Doen_a_de_Crohn?referer=');">Síndrome de Crohn</a>, uma doença causada principalmente por problemas emocionais. Enfim depois da cirurgia passei 8 meses de tratamento com anti-bióticos e hoje me recuperei totalmente, graças a Deus <img src='http://samirmamude.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>No início de <strong>Abril</strong> com o início da crise mundial, a empresa resolveu fazer cortes e lógico os primeiros a serem dispensando foram os brasileiros, mas todo mundo saiu numa boa e sem problemas.</p>
<h2>(Maio até Setembro)</h2>
<p>Consegui outro trabalho e desta vez para uma agência de Miami Beach chamada <strong><a href="http://www.hoodiny.com/" onclick="pageTracker._trackPageview('/outgoing/www.hoodiny.com/?referer=');">Hoodiny</a>, </strong>essa empresa tem como seu principal produto o <a href="http://br.msn.cyloop.com/" onclick="pageTracker._trackPageview('/outgoing/br.msn.cyloop.com/?referer=');"><strong>Cyloop</strong></a> que é uma rede social voltado para música.<strong><span style="font-weight: normal;"> Foi um projeto legal onde aprendi sobre como utilizar Cucumber e Rspec, melhorei meus conhecimentos sobre teste de software. </span></strong></p>
<p><span style="font-weight: normal;">No geral a experiência de trabalhar para esta empresa foi razoável, pois eu comecei a perceber que estava se afastando e perdendo cada vez mais meu interesse por Rails como expliquei neste <a href="http://samirmamude.com/2009/11/01/novo-blog/">post</a>. Terminado meu contrato, resolvi mudar o rumo da minha empresa e começar a andar pelas próprias pernas, por mais que prestação de serviço seja algo mais fácil de arrumar e ganhar dinheiro de forma mais rápida, não era o que eu pretendia futuramente.</span></p>
<h2><strong>(Outubro até Dezembro)</strong></h2>
<p><span style="font-weight: normal;">Em </span><span style="font-weight: normal;"><strong>Outubro</strong> tive a oportunidade de ir na </span><span style="font-weight: normal;"><strong>Rails Summit</strong> e conhecer amigos de trabalho, meu interesse no evento foi para assistir  as palestras voltadas exclusivamente para empreendedorismo como a do <strong><a href="http://improveit.com.br/empresa/vinicius" onclick="pageTracker._trackPageview('/outgoing/improveit.com.br/empresa/vinicius?referer=');">Vinícius Teles</a><span style="font-weight: normal;">, que sem dúvida foi a melhor na minha opinião. </span></strong></span></p>
<p><span style="font-weight: normal;">Também consegui fechar o primeiro projeto para minha empresa, no momento o que posso comentar é que se trata de um projeto voltado para oficinas mecânicas e acho que vai agregar muita qualidade e agilidade  ao cliente final. Como já havia comentado, resolvi de vez mudar para <strong>Python </strong>e <strong>Django</strong>, após 3 meses de projeto, o que posso constatar é que <strong>Python</strong> está resolvendo meus problemas muito diferente de toda a frescura do &#8220;</span><span style="font-weight: normal;"><strong>Opinionated Software&#8221;</strong> como o Ruby on Rails é. Eu sei que meu comentário pode ser ofensivo para as pessoas que adoram a linguagem e o framework, mas eu não me vejo mais trabalhando com esse framework por uma série de razões. Simplesmente não serve pra mim!</span></p>
<p>E pra finalizar em Dezembro completei 30 anos, to ficando velho urgh&#8230;&#8230;</p>
<h2>Finalizando&#8230;</h2>
<p>No mais eu gostaria de desejar um Feliz Natal com muita saúde, paz e felicidades a todos os amigos que conheço e que 2010 seja um ano de repleta conquistas e vitórias.</p>
<p>Boas festas <img src='http://samirmamude.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><span style="font-weight: normal;"><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://samirmamude.com/2009/12/22/retrospectiva-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Desenvolvendo Sistemas com Django</title>
		<link>http://samirmamude.com/2009/12/03/desenvolvendo-sistemas-com-django/</link>
		<comments>http://samirmamude.com/2009/12/03/desenvolvendo-sistemas-com-django/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 17:51:00 +0000</pubDate>
		<dc:creator>Samir</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://samirmamude.com/?p=77</guid>
		<description><![CDATA[Essa é uma questão comum que ja vi lista #django-brasil onde muitos desenvolvedores ficam na dúvida para escolher a melhor opção de criar sistemas usando o Django. Fazer tudo no &#8220;braço&#8221; mesmo criando suas próprias views, htmls, rotas, etc&#8230;tudo para ter a melhor flexibilidade possível. Ou como segunda opção usar o próprio admin e aprender [...]]]></description>
			<content:encoded><![CDATA[<p>Essa é uma questão comum que ja vi lista <a href="http://groups.google.com/group/django-brasil/" onclick="pageTracker._trackPageview('/outgoing/groups.google.com/group/django-brasil/?referer=');">#django-brasil</a> onde muitos desenvolvedores ficam na dúvida para escolher a melhor opção de criar sistemas usando o Django. Fazer tudo no &#8220;braço&#8221; mesmo criando suas próprias views, htmls, rotas, etc&#8230;tudo para ter a melhor flexibilidade possível. Ou como segunda opção usar o próprio admin e aprender como customizar quando necessário.</p>
<p>Antes de iniciar o projeto que ando trabalhando, testei muitas opções de frameworks. Queria algo que pudesse agilizar ao máximo meu trabalho, porque convenhamos, ficar fazendo tela de CRUD alem de ser um trabalho maçante, propenso a erros, é um verdadeiro <strong>pé no saco</strong>! Nessa época como ainda estava ligado muito no Rails, tentei algumas opções, mas tudo me levava a fazer o CRUD na mão. Voltei novamente a pesquisar opções em Python, nessa época eu já até conhecia bem o admin do Django, mas tinha um certo receio do tipo, <em>&#8220;esse negócio vai me deixar na mão&#8221;, </em>mas foi puro engano, vou explicar adiante<em>.</em></p>
<p>Continuando minha pesquisa, conheci o framework &#8220;cola&#8221; <a href="http://pylonshq.com/" onclick="pageTracker._trackPageview('/outgoing/pylonshq.com/?referer=');">Pylons</a>, na primeira vez fiquei impressionado, extremamente versátil e muito parecido com Rails, mas após alguns testes percebi que não tinha experiência o suficiente para usar essa ferramenta, acho que esse framework é para quem tem um conhecimento avançado em Python e não é meu caso.</p>
<p>Também testei o <a href="http://www.web2py.com/" onclick="pageTracker._trackPageview('/outgoing/www.web2py.com/?referer=');">web2py</a>, outro framework interessante e ágil para projetos pequenos, mas acho que a forma de trabalhar nele é muito estranha, você edita o código no próprio navegador como se fosse seu próprio IDE e assim por diante. Mas o que realmente me incomodou é que ele segue uma linha contrária do Python onde não existe importação de módulos como é de costume. E como tudo no Python é explícito e sem &#8220;mágicas&#8221;, deixei essa opção de lado e acabei voltando para o Django novamente usando o Admin.</p>
<p>A primeira coisa que recomendo antes de se aventurar a criar um sistema usando o Admin é, saiba bem como usar a <strong>Orientação a Objetos</strong> do Python e porque isso? No início tive a sensação do Admin ser aquele código &#8220;engessado&#8221; onde você fica amarrado e sem ter muito o que fazer. Mas com o tempo fui percebendo que você pode sobreescrever qualquer método da biblioteca padrão e customizar da maneira de achar necessário, vamos a um pequeno exemplo.</p>
<p>O sistema que estou criando, cada cliente possui seu sub-dominio e essa informação não pode ser editada como é por padrão, então imagine o seguinte trecho de código.</p>
<pre class="brush:python"># models.py
class Cliente(models.Models):
    dominio = models.CharField(max_length=50)
    nome_fantasia = models.CharField(max_length=100)
    plano_acesso = models.ForeignKey('PlanoAcesso')

# forms.py
class ClienteAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(ClienteAdminForm, self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        if instance and instance.id:
            self.fields['dominio'].widget.attrs['readonly'] = True
            self.fields['dominio'].help_text = 'Acesso: http://%s.dominio.com.br:8090' % instance.dominio

# admin.py
class ClienteAdmin(admin.ModelAdmin):
    form = ClienteAdminForm
    fields = ('dominio','nome_fantasia',...,)
register.admin.site(Cliente, ClienteAdmin)</pre>
<p>Observando bem o código, o que fiz ali foi sobreescrever o formulário padrão da classe <strong>ClienteAdmin</strong> pela classe <strong>ClienteAdminForm</strong> e no <span style="text-decoration: underline;">construtor</span> dessa classe eu verifico se o objeto está no modo de edição e travo o campo domínio como &#8220;readonly&#8221;. Isso é apenas uma pequena amostra do que é possível fazer, o Django é flexível o suficiente de acordo com sua necessidade.</p>
<p>Outra coisa muito interessante é que podemos trabalhar com herança nos templates sem ter a necessidade de modificar o arquivo original do admin, basta criar um novo arquivo com o mesmo nome e herdar do padrão, por exemplo. Na minha lista de clientes, eu quero somar o total do valor dos planos de acessos.</p>
<p>Primeiro mudo o comportamento padrão do método <strong>changelist_view</strong>:</p>
<pre class="brush:python"># admin.py
def changelist_view(self, request, extra_context={}):
   soma = PlanoAcesso.objects.all().aggregate(Sum('valor'))
   try:
      extra_context['soma'] = ("R$ %2.2f" % soma['valor__sum']).replace('.',',')
   except:
      extra_context['soma'] = "R$ 0,00"
   return super(ClienteAdmin, self).changelist_view(request, extra_context)</pre>
<p>Para criar o template vamos supor que essa aplicação seja chamada de <strong>clientes</strong>, dentro dessa pasta crie outra pasta chamada <strong>templates</strong> e dentro dela outra chamada <strong>admin</strong>, novamente dentro da pasta admin crie a pasta <strong>clientes</strong> e dentro de clientes cria a última pasta <strong>cliente</strong>, achou confuso? <img src='http://samirmamude.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Nessa última pasta, crie o arquivo <strong>change_list.html</strong> com o seguinte conteúdo.</p>
<pre class="brush:html">{% extends "admin/change_list.html" %}
{% block result_list %}
    {{ block.super }}
    Total: <strong>{{ soma }}</strong>
{% endblock result_list %}</pre>
<p>Se você observar, temos a listagem original porque no html chamamos a variável <strong>{{ block.super }}</strong> para herdar do template original e logo abaixo nosso conteúdo customizável, muito legal não?</p>
<p>Para finalizar, acho que ficou claro que podemos usar sim o Admin para criação de sistemas complexos e customizá-lo ao máximo, basta saber usar a ferramenta corretamente e sem gambiarras.</p>
]]></content:encoded>
			<wfw:commentRss>http://samirmamude.com/2009/12/03/desenvolvendo-sistemas-com-django/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utilizando MacPorts para desenvolvimento web com Python</title>
		<link>http://samirmamude.com/2009/11/09/macports-python/</link>
		<comments>http://samirmamude.com/2009/11/09/macports-python/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 17:21:14 +0000</pubDate>
		<dc:creator>Samir</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[macports]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://samirmamude.com/?p=17</guid>
		<description><![CDATA[Semana passada resolvi formatar meu Mac pois estava muito desorganizado minhas instalações de pacotes e tive uma série de dificuldades para instalar módulos no Apache como o mod_wsgi ou mod_python, ambos compilam mas necessitam de uma certa gambiarra no arquivo Makefile para se adequar na arquitetura do Mac, mas pra minha sorte o Apache não [...]]]></description>
			<content:encoded><![CDATA[<p>Semana passada resolvi formatar meu Mac pois estava muito desorganizado minhas instalações de pacotes e tive uma série de dificuldades para instalar módulos no Apache como o mod_wsgi ou mod_python, ambos compilam mas necessitam de uma certa gambiarra no arquivo Makefile para se adequar na arquitetura do Mac, mas pra minha sorte o Apache não reconhecia os módulos de jeito nenhum.</p>
<p>Como iria formatar e reinstalar tudo do zero, resolvi procurar por opções como <a href="http://github.com/mxcl/homebrew" onclick="pageTracker._trackPageview('/outgoing/github.com/mxcl/homebrew?referer=');"><strong>Homebrew</strong></a>, <a href="http://www.finkproject.org/" onclick="pageTracker._trackPageview('/outgoing/www.finkproject.org/?referer=');"><strong>Fink</strong></a> (me parece desatualizado) e o próprio <a href="http://www.macports.org/" onclick="pageTracker._trackPageview('/outgoing/www.macports.org/?referer=');"><strong>Macports</strong></a>.</p>
<p>Uma das vantagens que vejo no macports é a centralização da bibliotecas que ficam localizadas somente em um lugar e é fácil instalar ou remover algum pacote.</p>
<p>Antes de começar, o Mac Leopard já vem com uma versão instalada do Python (2.5.1), não precisa remover essa instalação, iremos configurar após a instalação via macports. Sendo assim, vou considerar caso você tenha um Mac <img src='http://samirmamude.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> , tenha instalado a última versão do MacPorts que é a 1.8.1 no momento.</p>
<p>Instalando Python 2.6:</p>
<pre class="brush:bash">sudo port install python26</pre>
<p>Essa instalação vai levar alguns minutos, pois muitos ports serão instalados. Agora muita atenção após o final da instalação, vai exibir uma mensagem informando que você  precisa instalar o &#8220;python_select&#8221; para selecionar a versão 2.6 como default do Mac.</p>
<p>Ativando o Python:</p>
<pre class="brush:bash">sudo port install python_select
sudo python_select python26</pre>
<p>Se tudo ocorreu bem, abra o console e digite &#8220;python&#8221;, o resultado deve ser:</p>
<pre class="brush:python">[samirmamude] ~
$ python
Python 2.6.4 (r264:75706, Nov  6 2009, 14:11:23)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
&gt;&gt;&gt;</pre>
<p>Instalando o Django (1.1.1) e o driver para Postgresql (no meu caso):</p>
<pre class="brush:bash">port install py26-django
port install py26-psycopg2</pre>
<p>Instalando o Postgresql 8.4:</p>
<pre class="brush:bash">sudo port install postgresql84
sudo port install postgresql84-server</pre>
<p>Após finalizar a instalação, rode este comando para o servidor inicializar automaticamente.</p>
<pre class="brush:bash">sudo launchctl load -w /Library/LaunchDaemons/org.macports.postgresql84-server.plist</pre>
<p>Por padrão o Mac também possui uma instalação do Apache, mas vamos instalar via macports e ativa-lo em seguida.</p>
<pre class="brush:bash">sudo port install apache2
sudo launchctl load -w /Library/LaunchDaemons/org.macports.apache2.plist</pre>
<p>Agora a instalação que me causou muitos transtornos foi o mod_wsgi, no macports a instalação funciona perfeitamente e o Apache reconhece o módulo sem problemas.</p>
<pre class="brush:bash">sudo port install mod_wsgi</pre>
<p>Veja as instruções na documentação do Apache para ativar esse módulo e logo após reinicie o servidor.</p>
<p>Pra terminar se quiser instale também o MacVim.</p>
<pre class="brush:bash">sudo port install mac_vim</pre>
<p>Uma dica para facilitar quais ports você tem instalado é instalar esse programinha interessante o <a href="http://porticus.alittledrop.com/" onclick="pageTracker._trackPageview('/outgoing/porticus.alittledrop.com/?referer=');"><strong>Porticus</strong></a>.</p>
<p>Isso foi apenas o básico, existem outros ports interessantes que também pode ser instalados como o Memcached, Ngnix e outros, de uma olhada nos <a href="http://www.macports.org/ports.php" onclick="pageTracker._trackPageview('/outgoing/www.macports.org/ports.php?referer=');"><strong>ports</strong></a> disponíveis.</p>
<p>É isso ai <img src='http://samirmamude.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://samirmamude.com/2009/11/09/macports-python/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Novo blog</title>
		<link>http://samirmamude.com/2009/11/01/novo-blog/</link>
		<comments>http://samirmamude.com/2009/11/01/novo-blog/#comments</comments>
		<pubDate>Sun, 01 Nov 2009 18:05:11 +0000</pubDate>
		<dc:creator>Samir</dc:creator>
				<category><![CDATA[Off-Topic]]></category>
		<category><![CDATA[trabalho]]></category>

		<guid isPermaLink="false">http://samirmamude.com/?p=6</guid>
		<description><![CDATA[Bom, estou voltando novamente com o blog depois da tentativa frustrada de escrever em inglês, achei melhor parar com aquilo pois meu inglês ainda continua uma&#8230;bom deu pra entender.
Muita coisa aconteceu nesses últimos 6 meses no qual pretendo fazer uma retrospectiva para o final do ano, mas vou escrever um breve resumo. Estive trabalhando no [...]]]></description>
			<content:encoded><![CDATA[<p>Bom, estou voltando novamente com o blog depois da tentativa frustrada de escrever em inglês, achei melhor parar com aquilo pois meu inglês ainda continua uma&#8230;bom deu pra entender.</p>
<p>Muita coisa aconteceu nesses últimos 6 meses no qual pretendo fazer uma retrospectiva para o final do ano, mas vou escrever um breve resumo. Estive trabalhando no projeto <a href="http://br.msn.cyloop.com/" onclick="pageTracker._trackPageview('/outgoing/br.msn.cyloop.com/?referer=');"><strong>Cyloop</strong></a> que é um portal de rede social voltado para música desenvolvido com <strong>Ruby on Rails</strong>, esse projeto foi tópico no <a href="http://www.railssummit.com.br/" onclick="pageTracker._trackPageview('/outgoing/www.railssummit.com.br/?referer=');"><strong>Rails Summit 2009</strong></a> apresentado pelo <a href="http://brunomiranda.com/blog" onclick="pageTracker._trackPageview('/outgoing/brunomiranda.com/blog?referer=');"><strong>Bruno Miranda</strong></a> no qual estive presente e pude conhecer amigos de trabalho e outras pessoas interessantes.</p>
<p>Terminado meu contrato, eu já tinha em mente que meu próximo projeto não seria com Rails, uma das razões foi por falta de motivação e tempo de ficar reaprendendo o framework a cada nova versão, talvez eu seja o único na comunidade com esse problema estranho, mas realmente tem me incomodado muito. Após 2 anos trabalhando com Ruby, percebi que não me sentia um expert na linguagem como nos tempos de C#, sendo assim era hora de mudar.</p>
<p>Nesse período que fiquei parado (foi poucos dias), o <a href="http://twitter.com/DavisCabral" onclick="pageTracker._trackPageview('/outgoing/twitter.com/DavisCabral?referer=');"><strong>Davis Cabral</strong></a> que é um amigo de longa data me indicou um projeto para um cliente de Curitiba no qual acabei fechando e estou trabalhando nesse case específico para minha <a href="http://www.samwebsolutions.com.br" onclick="pageTracker._trackPageview('/outgoing/www.samwebsolutions.com.br?referer=');"><strong>empresa</strong></a>. Pretendo falar desse projeto futuramente.</p>
<p>Como tive total poder de decisão sobre que linguagem usar, hospedagem, etc&#8230;Acabei optando por <strong>Python</strong> e <strong>Django</strong> que já venho estudando desde Setembro de 2008 e acredito ter sido a escolha ideal no momento. Com 3 semanas de projeto, estou obtendo resultados rápidos e um bom feedback do cliente ao mesmo tempo. Esse foi um dos motivos por voltar com o blog pois me sinto motivado novamente e acho legal poder compartilhar minhas idéias e também meu novo aprendizado.</p>
]]></content:encoded>
			<wfw:commentRss>http://samirmamude.com/2009/11/01/novo-blog/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
