terça-feira, 31 de julho de 2012




Introdução

Segundo plone.org, o Plone 4, é a versão mais rápida, poderosa e bela, o Estado da Arte do CMS Plone.



O Plone também conhecido por PZP – Python/Zope/Plone, assim chamado pela formação do ambiente, que envolve a linguagem de programação interpretada Python, o framework para desenvolvimento web Zope e o CMS – Content Management System – Plone.



O Plone está entre os CMS com menor índice de falhas de segurança, possui várias funcionalidades técnicas que podem ser comparadas com outros CMS na url http://cmsmatrix.org/matrix/cms-matrix/plone.



E de acordo com a pesquisa apresentada pela IBM, em manyeyes, foi o CMS que apresentou menos vulnerabilidades.



Trata-se de uma plataforma para gerenciamento de diversos tipos de conteúdo sem que sejam necessários conhecimentos técnicos em relação a estrutura codificada da plataforma.



Com o CMS Plone, pode-se construir um site completo, com diversas funcionalidades, sem a necessidade da construção de códigos complexos em linguagem de programação.



O Plone abre espaço para customização de sua aparência e estrutura de navegação, além de possibilitar personalização do site através da escolha de cores, imagens e posicionamentos de diversos componentes, que agora incluem Gadgets.



Em um nível mais avançado, a utilização do Plone dá conta da implementação de novas funcionalidades por parte de desenvolvedores de software, que podem ser agregadas a estrutura já existente, como sistemas de diretórios (AD/LDAP), Samba, e outros recursos estruturais.



O QUE É O PLONE?

O Plone, classificado como um Sistema Gerenciador de Conteúdo ou popularmente chamado pelo acrônimo em Inglês CMS – Content Management System, é um software livre e de código aberto.



Possui incorporado um sistema de workflow, diretivas de segurança e funções pré-configuradas, metadados para tipos conteúdo e suporte para múltiplos idiomas.



Além disto desenvolvedores e testadores de todo o mundo contribuem com a sua construção e melhoria.




O QUE PODE SER FEITO COM O PLONE?


  • Criar sites facilmente;



  • Gerenciar todo o conteúdo do site através de uma interface amigável;



  • Delegar sub-tarefas em áreas especificas do sítio sem comprometer a escalabilidade e a segurança;



  • Criar e organizar conteúdo de forma colaborativa através de um fluxo de trabalho;



  • Personalizar do aspecto visual básico do site através de interface intuitiva;



  • Divulgar notícias, feed, eventos e links;



  • Publicar fotos, arquivos e vídeos;



  • Organizar hierarquicamente seu conteúdo através de menus de navegação;





  • QUAIS RECURSOS SÃO OFERECIDOS PELO PLONE?


  • Criação e manutenção de conteúdo;



  • Todo gerenciamento de conteúdo realizado através do navegador Web;



  • Gerenciamento de usuários com níveis hierárquicos;



  • Fluxo de publicação colaborativa de conteúdo (workflow);



  • Geração automática de infra-estrutura de navegação;



  • Mecanismo de busca avançada;



  • Possibilidade de criação de portais de Internet ou Intranet;



  • Criação de blog corporativo;



  • Ferramentas colaborativas para groupware;



  • Repositório de conteúdos como imagens, documentos e vídeos;



  • Agendamento e divulgação de eventos;



  • Galeria de imagens;



  • Área integrada de notícias;



  • Segurança e integridade dos dados;



  • Suporte a internacionalização;






  • ESCOPO

    O escopo de customização está limitado ao seguinte Ambiente:



    Sistema Operacional Linux
    http://distrowatch.com/



    Plone-4.1.6-UnifiedInstaller
    https://launchpad.net/plone/4.1/4.1.6/+download/Plone-4.1.6-UnifiedInstaller-20120708.tgz



    plone.app.blob
    plone.app.blob-1.5.2 via buildout em modo ZEO



    O Plone 4.1.6 é a ultima revisão estável da versão 4.1, e possui os seguintes pacotes incorporados e respectivas versões:
    • packages/buildout-cache.tar.bz2
    • packages/distribute-0.6.19.tar.gz
    • packages/issue12012-sslv2.txt
    • packages/issue9670-v2.txt
    • packages/jpegsrc.v8c.tar.bz2
    • packages/multiarch-patch.txt
    • packages/Python-2.6.8.tar.bz2
    • packages/readline-6.2.tar.bz2
    • packages/virtualenv-1.6.1.tar.bz2
    • packages/zlib-1.2.5.tar.bz2

    Dependências

    Considerando que o sistema operacional esteja instalado e configurado corretamente, execute:
    Debian Like

    sudo aptitude install build-essential libssl-dev;
    RedHat Like

    sudo yum install gcc cpp gcc-c++ make openssl-devel;

    INSTALAÇÃO DO PZP

    Nesta etapa cria-se o invólucro completamente independente do Sistema Operacional, para que o ambiente não sofra quebra de configuração devido a atualizações de segurança ou afins.

    O invólucro /opt/p416, conterá todos os programas necessários para funcionamento do ambiente PZP, incluindo zlib, jpeg, python e as demais dependências.

    1. Baixe e descompacte primeiramente o Plone-4.1.6-UnifiedInstaller.
    2. wget https://launchpad.net/plone/4.1/4.1.6/+download/Plone-4.1.6-UnifiedInstaller-20120708.tgz
    3. tar xvzf ~/Downloads/Plone-4.1.6-UnifiedInstaller-20120708.tgz -C /tmp/
    4. cd /tmp/Plone-4.1.6-UnifiedInstaller
    5. ./install.sh zeo --zlib=local --jpeg=local \

      --user=admin --password=admin --target=/opt/p416 --clients=4 --instance=modelo


    As Opções do comando install.sh, informam que a instalação é modo zeo, sendo que as bibliotecas zlib e jpeg, serão locais, o usuário admin e senha admin, no diretório /opt/p416, com 4 clientes zope e o nome do cluster modelo.


    Virtualenv

    Nesta etapa Instala-se o Ambiente Virtual, do inglês Virtual Environment, sob acronimo virtualenv. O virtualenv possibilita a utilização de um encapsulamento de subinstâncias python, que permite a total personalização, sem a modificação da instalação principal. O ambiente plone a partir da versão 3, já vem disponibilizado o easy_install, que é instalador para módulos python, o qual será usado neste artigo.
    1. cd /opt/p416/
    2. ./Python-2.6/bin/easy_install virtualenv
    Para melhor entendimento, com a finalidade de organização, o diretório app (applications), conterá todos os ambientes criados. Agora cria-se o ambiente virtual, da seguinte forma:
    ./Python-2.6/bin/virtualenv app/env001

    Buildout

    Buildout é uma ferramenta open source de construção de software, desenvolvida utilizando-se da linguagem de programação Python, para fornecer suporte à criação de instâncias de aplicações, principalmente àquelas escritas em Python. O Buildout fornece ferramentas para criação de aplicações através segmentos, denominados parts, que podem ser módulos Python, servidores web, servidores de aplicação e qualquer elemento de aplicação para infraestrutura. Há como configurar o buildout para utilizar os arquivos de configuração diretamente pela web, mas deste artigo, usaremos o modelo da própria estrutura do invólucro.
    cp -vf modelo/*.{py,cfg} app/env001/
    Os seguintes arquivos serão copiados:
    • modelo/bootstrap.py
    • modelo/base.cfg
    • modelo/buildout.cfg
    • modelo/develop.cfg
    • modelo/lxml_static.cfg
    • modelo/versions.cfg
    • modelo/zopeapp-versions.cfg
    • modelo/zope-versions.cfg
    • modelo/ztk-versions.cfg

    Configuração

    1. cd app/env001/
    2. vim buildout.cfg
    Para personalizar as portas localize o trecho a seguir, no arquivo buildout.cfg:
    56 ############################################
     57 # Ports
     58 # -----
     59 # Specify the ports on which your Zope installation
     60 # will listen.
     61 # ZEO Server
     62 zeo-address = 127.0.0.1:8100
     63 # Zope client 1
     64 http-address = 8080
     65 # Additional clients:
     66 client2-address = 8081
    
    E modifique para as portas desejadas, tal como exemplo, zeo aceitando apenas conexões locais na porta 8100, e os clientes zope rodando nas portas 8101 e 8102 respectivamente.
    56 ############################################
     57 # Ports
     58 # -----
     59 # Specify the ports on which your Zope installation
     60 # will listen.
     61 # ZEO Server
     62 zeo-address = 127.0.0.1:8100
     63 # Zope client 1
     64 http-address = 8101
     65 # Additional clients:
     66 client2-address = 8102
    
    No Plone 4, também faz-se necessário modificar algumas permissões, e criar alguns diretórios para o bom funcionamento do ambiente, façamos pelo buildout, no arquivo base.cfg.
    98 [chown-zeo]
     99 # This recipe is used to set permissions for root mode installs
    100 # For options see http://pypi.python.org/pypi/plone.recipe.command
    101 recipe = plone.recipe.command
    102 command =
    103     echo Dummy references to force this to execute after referenced parts
    104     echo ${backup:location} ${unifiedinstaller:sudo-command}
    105     chmod 600 .installed.cfg
    106     touch ${buildout:directory}/var/zeoserver/zeoserver.log
    107     find ${buildout:directory}/var -type d -exec chmod 700 {} \;
    108     chmod 744 ${buildout:directory}/bin/*
    109 update-command = ${chown-zeo:command}
    
    Acrescente o trecho que compreende as linas 109 a 111, como abaixo:
    98 [chown-zeo]
    [..]
    108     chmod 744 ${buildout:directory}/bin/*
    109     chmod 755 ${buildout:directory}/bin/python
    110     mkdir -pm 755 ${buildout:directory}/{products,src}
    111     chown -R ${buildout:effective-user} ${buildout:directory}/var
    112 update-command = ${chown-zeo:command}
    

    Instalação

    Considerando que esteja no diretório /opt/p416/app/env001/, execute os comandos abaixo:
    1. mkdir -pv ../buildout-cache/{eggs,downloads};
    2. export http_proxy=http://10.1.101.101:8080; [Se houver proxy na rede, coloque o IP e porta do proxy]
    3. ./bin/python bootstrap.py;
    A etapa três pode ser substituída por:
    • cp -va /opt/p416/buildout-cache/ /opt/p416; ou
    • ln -sv /opt/p416/buildout-cache/ /opt/p416
    O objetivo desta substituição, é simplificar o processo de download dos módulos eggs, que já foram baixados quando o modelo foi criado, lembrando que é opcional a substituição, restando para tanto o novo downloads dos módulos eggs.
    ./bin/buildout -v -t 30
    • -v — Incrementa o nível de detalhamento;
    • -t 30 — Define o timeout em 30s para cada repositório;
    Faz-se necessário executar o comando ./bin/buildout para cada atualização realizada no ambiente.

    Mount Point

    O Moint Point não necessita de instação, pois é apenas um recurso de configuração do ZODB (Zope Object Data Base), em modo ZEO (Zope Enterprise Objects), que permite utilização de múltiplos arquivos .fs, na mesma instância. O ZEO com Mount Point ativado funciona como um SGBD (Sistema Gerenciador de Banco de Dados), que gerencia acessos concorrentes, a multiplas bases de dados em um SGBD relacional, tais como Postgresql, Oracle, MySQL e MSSQL Server. No artigo Brito: Plone 3.3.5 + buildout + mount point, destaquei onde deve ser modificado no arquivo buildout.cfg, e algumas premissas que deve ser contempladas, ou melhor tomadas por regras. Entre as premissas destaca-se usar algo que identifique a aplicação adequadamente, e nomes com as regras abaixo, que funcionam com louvor.
    1. letras minusculas (caixa baixa);
    2. não utilizar caracteres especiais;
    3. não utilizar traço(-);

    Vantagens

    Como toda solução há vantagens e desvantagens. A vantagem em relação a configuração sem Mount Point, está na hora de recuperar o backup de apenas uma das aplicações, que neste caso é pontual, e bastante facilitada com o repozo, aplicação que já compõe a estrutura. Minimiza o tempo de ociosidade dos processos PZP, pois uma instancia serve vários Plone sites;

    Desvantagens

    Realizar o backup individual em cada arquivo.

    Configuração

    Diferentemente do Plone 3, o Plone 4 possui uma gama de novos arquivos, e uma nova estrutura de configuração, e as alterações para Mount Point ZEO, deverão ser realizadas no arquivo base.cfg.
    vim base.cfg
    No trecho do [zeoserver], aproximadamente na linha 81, como segue abaixo:
    81 [zeoserver]
     82 # Use this section to install and configure a Zope
     83 # Enterprise Objects server.
     84 # For options see http://pypi.python.org/pypi/plone.recipe.zeoserver
     85 recipe = plone.recipe.zeoserver
     86 zeo-address = ${buildout:zeo-address}
     87 # if we try to start as root, Zope will switch to the user below
     88 effective-user = ${buildout:effective-user}
     89 # Put the log, pid and socket files in var/zeoserver
     90 zeo-log     = ${buildout:directory}/var/zeoserver/zeoserver.log
     91 pid-file    = ${buildout:directory}/var/zeoserver/zeoserver.pid
     92 socket-name = ${buildout:directory}/var/zeoserver/zeo.zdsock
     93 blob-storage = ${buildout:directory}/var/blobstorage
     94 # You may also control the environment variables for the zeoserver.
     95 environment-vars = ${buildout:environment-vars}
     96 
    
    Acrescenta-se a diretiva zeo-conf-additional ao final da sessão, para incrementar o filestorage do ZEO, como abaixo.
    81 [zeoserver]
    [...]
     96 eggs = tempstorage
     97 
     98 zeo-conf-additional =
     99      <filestorage mp001bd>
    100        path ${buildout:directory}/var/filestorage/mp001BD.fs
    101      </filestorage>
    102 
    103      <filestorage mp002bd>
    104        path ${buildout:directory}/var/filestorage/mp002BD.fs
    105      </filestorage>
    106 
    107      <filestorage mp003bd>
    108        path ${buildout:directory}/var/filestorage/mp003BD.fs
    109      </filestorage>
    110 
    111     %import tempstorage
    112     <temporarystorage temp>
    113        name temporary storage for sessioning
    114     </temporarystorage>
    115
    
    No trecho do [client1], aproximadamente na linha 129, como segue abaixo:
    132 [client1]
    133 # Use this section to install and configure a Zope
    134 # client instance.
    135 # For options see http://pypi.python.org/pypi/plone.recipe.zope2instance
    136 # Additional clients are a
    137 recipe = plone.recipe.zope2instance
    138 zeo-client = true
    139 zeo-address = ${zeoserver:zeo-address}
    140 # The line below sets only the initial password. It will not change an
    141 # existing password.
    142 user = ${buildout:user}
    143 # if we try to start as root, Zope will switch to the user below
    144 effective-user = ${buildout:effective-user}
    145 http-address = ${buildout:http-address}
    146 blob-storage = ${zeoserver:blob-storage}
    147 shared-blob = on
    148 # change debug-mode to "on" to run in development mode
    149 debug-mode = ${buildout:debug-mode}
    150 # change verbose-security to "on" for detailed security
    151 # errors while developing
    152 verbose-security = ${buildout:verbose-security}
    153 deprecation-warnings = ${buildout:deprecation-warnings}
    154 # Put the log, pid, lock files in var/client1
    155 event-log = ${buildout:directory}/var/client1/event.log
    156 z2-log    = ${buildout:directory}/var/client1/Z2.log
    157 pid-file  = ${buildout:directory}/var/client1/client1.pid
    158 lock-file = ${buildout:directory}/var/client1/client1.lock
    159 
    160 # If you want Zope to know about any additional eggs, list them here.
    161 # e.g. eggs = ${buildout:eggs} my.package
    162 eggs = ${buildout:eggs}
    163 
    164 # If you want to register ZCML slugs for any packages, list them here.
    165 # e.g. zcml = my.package my.other.package
    166 zcml = ${buildout:zcml}
    167 
    168 products = ${buildout:directory}/products
    169 
    170 # You may also control the environment variables for the instance.
    171 environment-vars = ${buildout:environment-vars}
    172 
    
    Acrescenta-se a diretiva zope-conf-additional ao final da sessão, para incrementar o filestorage do ZEO, como abaixo.
    132 [client1]
    [...]
    192 
    193 zope-conf-additional =
    194         <zodb_db mp001bd>
    195          mount-point /mp001bd
    196          cache-size 5000
    197          <zeoclient>
    198              name mp001bd
    199              server ${buildout:zeo-address}
    200              storage mp001bd
    201              var ${buildout:directory}/var
    202          </zeoclient>       
    203         </zodb_db>
    204          
    205         <zodb_db mp002bd>
    206          mount-point /mp002bd
    207          cache-size 5000
    208          <zeoclient> 
    209              name mp002bd
    210              server ${buildout:zeo-address}
    211              storage mp001bd
    212              var ${buildout:directory}/var
    213          </zeoclient>       
    214         </zodb_db>
    215          
    216         <zodb_db mp003bd>
    217          mount-point /mp003bd
    218          cache-size 5000
    219          <zeoclient> 
    220              name mp003bd
    221              server ${buildout:zeo-address}
    222              storage mp003bd
    223              var ${buildout:directory}/var
    224          </zeoclient>       
    225         </zodb_db>
    226          
    227 zodb-temporary-storage =
    228         <zodb_db temporary>
    229             <zeoclient>
    230               server ${buildout:zeo-address}
    231               storage temp
    232               name zeostorage
    233               var ${buildout:directory}/var
    234             </zeoclient>
    235             mount-point /temp_folder
    236             container-class Products.TemporaryFolder.TemporaryContainer
    237         </zodb_db>
    238
    
    Salve feche o arquivo, e execute o buildout novamente, e a sequencia seguinte.
    1. ./bin/buildout -v -t 30;
    2. ./bin/buildout -v -t 30;
    3. ./bin/plonectl stop;
    4. ./bin/plonectl start;
    5. Agora no navegador acesse http://ip.do.serv:8101/manage;
    6. Entre com o usuário e senha (admin e admin);
    7. Localize a combobox com o texto ATContentTipes tool;
    8. Nesta combobox selecione ZODB Mount Point;
    9. Na página seguinte Add ZODB Mount Points, selecione os mount points desejados e clique no botão Create selected mount points;
    10. Com esta ação será criado um diretório na raiz do ambiente, o qual mapeia a estrutura configurada anteriormente.
    OBS: a opção restart, pode não funcionar adequadamente, por esta razão recomendo executar o stop e start, nos passos 3 e 4. Se por ventura não aplicar a mudança, ou demorar demasiadamente, suba uma das instancias em modo foreground: ./bin/client1 fg.

    BLOB Storage

    o Binary Large OBject, identificado por seu acrônimo, BLOB, são tipicamente identificados por imagens, áudio ou outros objetos multimídia de grande volume. Usualmente as Base de Dados não suportam BLOBs. Este pacote é um complemento para o Plone, a partir da release Plone 3.0.4, que permite a integração de BLOB com ZODB 3,8; possibilitando que os dados binários sejam geridos pelo ZODB, mas separadamente do seu habitual FileStorage (Data.fs) de armazenamento para o banco de dados. Isto tem várias vantagens, sobretudo, uma redução real do FileStorage (Data.fs) e melhor desempenho tanto das CPU's, quanto em otimização de memória RAM. O Zope trabalha com BLOB's, através do pacote plone.app.blob, este pacote substitui a função executada pelo FileSystemStorage (FSS), configurado pelo buildout em plone 3, através do recipe=iw.recipe.fss, descontinuado na versão 4 do plone.

    Instalação

    A instalação através do buildout, é bem simples, basta acrescentar o pacote plone.app.blob, nas sessões eggs e zcml da diretiva buildout, como abaixo:
    [buildout]
    [..]
    eggs =
        Plone
        plone.app.blob
    [..]
    zcml = plone.app.blob
    
    Este procedimento não é necessário a partir do plone 4.1.4, que já vem com o plone.app.blob-1.5.1, instalado e necessitando apenas a sua configuração pertinente.

    Configuração

    O BLOB Storage, também possui duas modalidades de configuração, Stand Alone(Single) e ZEO, Seguindo o Escopo, abaixo a configuração para o modo ZEO. No arquivo base.cfg, localize o trecho abaixo:
    119 [chown-zeo]
    120 # This recipe is used to set permissions for root mode installs
    121 # For options see http://pypi.python.org/pypi/plone.recipe.command
    122 recipe = plone.recipe.command
    123 command =
    124     echo Dummy references to force this to execute after referenced parts
    125     echo ${backup:location} ${unifiedinstaller:sudo-command}
    126     chmod 600 .installed.cfg
    127     touch ${buildout:directory}/var/zeoserver/zeoserver.log
    128     find ${buildout:directory}/var -type d -exec chmod 700 {} \;
    129     chmod 744 ${buildout:directory}/bin/*
    130     chmod 755 ${buildout:directory}/bin/python
    131     mkdir -pm 755 ${buildout:directory}/{products,src}
    132     chown -R ${buildout:effective-user} ${buildout:directory}/var
    133 update-command = ${chown-zeo:command}
    
    Altere o trecho, acrescentando as linhas 116 e 117, como abaixo:
    119 [chown-zeo]
    [..]
    129     chmod 744 ${buildout:directory}/bin/*
    130     chmod 755 ${buildout:directory}/bin/python
    131     mkdir -pm 755 ${buildout:directory}/{products,src}
    132     
    133     mkdir -pm 755 ${buildout:directory}/var/blobstorage/mp00{1,2,3}bd/tmp
    134     chown -R ${buildout:effective-user} ${buildout:directory}/var
    135 update-command = ${chown-zeo:command}
    
    Esta modificação neste trecho, tem a finalidade de gerar os diretórios ao executar o buildout.cfg, criando os respectivos diretórios /opt/p416/app/env001/var/blobstorage/mp001bd, /opt/p416/app/env001/var/blobstorage/mp002bd e /opt/p416/app/env001/var/blobstorage/mp003bd, para os 3 mount points que serão criados. Agora para configurar o blobstorage, é necessário alterar tanto a configuração do Zope Server, quanto do Zope Client. Na sessão zeo-conf-additional, localize o trecho:
    97 zeo-conf-additional =
     98     <filestorage mp001bd>
     99       path ${buildout:directory}/var/filestorage/mp001BD.fs
    100     </filestorage>
    
    Acrescente a linha 100, conforme abaixo, referenciando o diretório do blobstorage acrescentado na sessão [chown-zeo].
    97 zeo-conf-additional =
     98     <filestorage mp001bd>
     99       path ${buildout:directory}/var/filestorage/mp001BD.fs
    100       blob-dir ${buildout:directory}/var/blobstorage/mp001bd
    101     </filestorage>
    
    Na sessão zope-conf-additional, localize o trecho:
    132 [client1]
    [...]
    192 
    193 zope-conf-additional =
    194         <zodb_db mp001bd>
    195          mount-point /mp001bd
    196          cache-size 5000
    197          <zeoclient>
    198              name mp001bd
    199              server ${buildout:zeo-address}
    200              storage mp001bd
    201              var ${buildout:directory}/var
    202          </zeoclient>       
    203         </zodb_db>
    
    Altere o trecho para:
    193 zope-conf-additional =
    194         <zodb_db mp001bd>
    195          mount-point /mp001bd
    196          cache-size 5000
    197          <zeoclient>
    
    198              blob-dir ${buildout:directory}/var/blobstorage/mp001bd
    199              shared-blob-dir on
    
    200              name mp001bd
    201              server ${buildout:zeo-address}
    202              storage mp001bd
    203              var ${buildout:directory}/var
    204          </zeoclient>
    205         </zodb_db>
    189 
    
    Salve, feche e execute novamente os comandos abaixo novamente.
    • ./bin/buildout -v -t 30;
    • ./bin/buildout -v -t 30;
    • ./bin/plonectl stop;
    • ./bin/plonectl start;

    Unicode UTF-8

    O unicode UTF-8 serve para evitar erros de codificação na língua portuguesa. Para implementa-lo basta adicionar o trecho abaixo no base.cfg.
    [unicode]
    recipe = plone.recipe.command
    update-command = ${unicode:command}
    command =
       cat > ${buildout:directory}/lib/python2.6/site-packages/sitecustomize.py << EOF
       import sys
       sys.setdefaultencoding('utf-8')
       EOF
    
    Salve, feche e execute novamente o buildout.
    ./bin/buildout -v -t 30

    Desfecho

    Agora para conclusão de todo o processo, acesse a Zope Manage Interface (ZMI), em seu navegador preferido, no IP da maquina e a porta, em que o Plone foi configurado. No exemplo deste artigo, 8101 e 8102, para as instâncias, client1 e client2 respectivamente.
    http://iphost:8101/manage; ou http://iphost:8102/manage;
    Exemplo:
    http://192.168.0.2:8102/manage;
    buildout.cfg completo: base.cfg completo:

    Referências

    http://brito.blog.incolume.com.br/2012/05/plone-335-buildout-virtualenv-mount.html
    http://brito.blog.incolume.com.br/2011/10/instalacao-plone-255-com-modulos.html
    http://pt.wikipedia.org/wiki/Buildout
    http://brito.blog.incolume.com.br/2012/05/plone-335-buildout-virtualenv-mount.html
    http://brito.blog.incolume.com.br/2012/05/total-de-vulnerabilidades-por-cms.html
    http://brito.blog.incolume.com.br/2012/06/como-definir-unicode-em-ambiente-plone.html

    0 comentários: