Ferramentas Pessoais

Ir para o conteúdo. | Ir para a navegação

Seções

Blog

Você está aqui: Home Blog

Blog

Participação da Simples Consultoria no World Plone Day Brasília

por André Nogueira em 02/05/2012 14:45

No último dia 25 de abril aconteceu em todo mundo o World Plone Day, uma iniciativa da comunidade Plone para divular o Plone com a realização de diversos eventos. Em 2012 foram realizados simultaneamente  34 eventos em 20 países diferentes.

Eu tive a oportunidade e a honra de participar do World Plone Day Brasília, organizado pela comunidade Plonegovbr e pelo Interlegis. Muito bem organizado diga-se de passagem. Diversas oficinas, palestras e uma excelente discussão sobre o compartilhamento de código pelo governo. Discussão que ainda vai render um post, mas fica para depois.

Durante o evento fiz duas palestras e uma oficina. Foram elas:

Estado do Plone

Como funciona a comunidade e o desenvolvimento do Plone.
Novidades das versões 4.2, 4,3 e 5.


Espero ter conseguido passar para as pessoas a necessidade de contribuir e participar da comunidade.

Oficina de Diazo

Conceitos básicos de Diazo, e um passo a passo bem simples para deixar claro os principais conceitos da utilização do Diazo.

Simplificando o Plone

Novidades apresentadas pela Simples Consultoria durante o World Plone Day: Core Developer Desk, Ploud.com.br e o novo Manual do Plone, que agora virou livro. Mais detalhes sobre essas novidades aqui no site.

| Comentários

Python: Google and April Fool's Day

por Cleber J Santos em 09/04/2012 00:16
Categoria: Python, Google

Como bem sabemos o dia da mentira é comemorado por todos e por muitas empresas, até mesmo o Google entrou nessa, e este ano não foi diferente, porém o que venho postar não é sobre o dia da mentira ou sobre as brincadeiras que o Google tem feito, apesar de serem muito divertidas.

O que me chamou a atenção foi o tal do Elegantizr que foi divulgado como um framework que promete deixar o site até 3 vezes mais rápido, e pior, muita gente mesmo caiu nessa!

Risadas a parte, a brincadeira foi tão legal que logo eu quis saber como foi feita. É bem provável que muitos venham a dizer que é algo super simples e etc, porém vale ainda assim blogar.

A brincadeira.

 Trata-se de um arquivo de CSS (http://www.google.com/landing/elegantizr/elegantizr.css) que deve ser incorporado no site:
 
<link rel="stylesheet" href="http://www.google.com/landing/elegantizr/elegantizr.css" />
Analisando o conteúdo do arquivo teremos o seguinte código:
 
:before {
  content: '\41\50\52\49\4C\20\46\4F\4F\4C\20\F4\BF\F4';
}
 
Não entendo muito das mágicas do CSS, e tive que recorrer a pessoas mais confiáveis no assunto como o @agnogueira, @Tamosauskas e o @google, no qual me informaram que  trata-se de pseudo-elementos e que neste caso temos vários, dentre eles temos o before e after que são usados para gerar conteúdos antes e depois do conteúdo de um elemento.
 
A seguir uma exemplo de como :before e :after podem ser usados para inserir a URL logo após o texto de um link ou antes de um texto de um link:
 
Antes do texto de um link.
a:link:before {
  content: " (" attr(href) ") ";
}

Depois do texto de um link.

a:link:after {
   content: " (" attr(href) ") ";
}
Agora não quero me focar em CSS, então espero que os amigos @agnogueira@Tamosauskas possam blogar algo sobre os pseudo-elementos de CSS :D
 

Como fazer.

Agora entramos na parte que gosto, notem que destaquei o trecho do código que é:
 
'\41\50\52\49\4C\20\46\4F\4F\4C\20\F4\BF\F4'
Aqui é onde a brincadeira acontece, este código ai acima trata-se de um texto (string) convertido em hexadecimal, vamos para um exemplo rápido:
 
 
>>> text = 'APRIL FOOL ô¿ô'
>>> text.encode('hex').upper()
'415052494C20464F4F4C20C3B4C2BFC3B4'
 
Note que no meu exemplo o código aparece diferente, isso por que o meu Python está usando encode utf8 como padrão, vejamos agora usando iso-8859-1.
 
>>> text = 'APRIL FOOL ô¿ô'
>>> text.encode('iso-8859-1').encode('hex').upper()
'415052494C20464F4F4C20F4BFF4'
 
Agora o que nos falta é adicionar a cada dois objetos uma barra invertida '\', e teremos:
 
'\41\50\52\49\4C\20\46\4F\4F\4C\20\F4\BF\F4'
A idéia não é mostrar exatamente como foi feito claro, ou seja, fica por conta colocar as barras a cada duas strings como feito acima, porém isso pode ser feito também com Python.
 
Para finalizar fiz este abaixo que irá imprimir a frase Python antes de cada item, note que o procedimento é o mesmo.
 
A conversão.
>>> text = 'Python'
>>> text.encode('iso-8859-1').encode('hex').upper()
'507974686F6E'

O Css.
:before {
  content: '\50\79\74\68\6F\6E';
}


Até a próxima.

| Comentários

Design responsivo com Plone tem novo release

por Érico Andrei em 21/03/2012 17:55
Categoria: Tablet, Plone 4, Design, Tema, Plone

Acabamos de fazer o release da versão 0.3 do beyondskins.responsive, design responsivo para sites Plone com a tecnologia Diazo.

Design responsivo com Plone tem novo release | Comentários

Leia mais…

Dropbox como serviço em servidores Windows

por Érico Andrei em 20/03/2012 12:33
Categoria: Windows, SysAdmin, Dropbox

Não é Python, não é Plone, não é Web, mas é útil. Se você tem um servidor Windows e quer usar o Dropbox como serviço, este é o passo a passo.

Dropbox como serviço em servidores Windows | Comentários

Leia mais…

JavaScript Minify com Python

por Cleber J Santos em 17/03/2012 18:30
JavaScript Minify com Python

Trabalhando em um projeto recentemente precisei gerar um arquivo menor do jQuery que eu havia modificado, e com isso comecei a me perguntar como o jquery.com o fazia com seus arquivos por exemplo: 

  • jquery-1.7.1.js 244K
  • jquery-1.7.1.min.js 92K

Notaram  a diferença de tamanho? Pois bem, isso me levou a pesquisas, que por sua vez me levou a diversos resultados, uma delas é o link http://www.refresh-sf.com/yui/ que nada mais é que uma interface Web que reduz o arquivo como eu queria fazer.
 
Porém que queria mais que isso, não quero depender de entrar em um site para gerar um arquivo menor, então achei Egg que faz exatamente o que eu queria, e melhor que isso, é pytonica :D http://pypi.python.org/pypi/jsmin
 
Vamos então a solução, para isso vamos usar o próprio jQuery só para testarmos que funciona após ter minimizado o tamanho do arquivo, é claro que isso é apenas um teste, pois o jQuery já lhe dará o arquivo dele como mostrado acima, compactado.
 
Vamos criar uma pasta chamada cobaia, dentro dessa pasta baixe o arquivo mencionado e visualize o tamanho dele:
 
$ mkdir cobaia
$ curl -O http://code.jquery.com/jquery-1.4.4.js
$ ls -hs *.js
No momento você verá o que o arquivo contém 180K, agora vamos criar um arquivo menor. Instale o egg jsmin no seu python com o comando:
 
$ easy_install jsmin
Ou 
$ pip install jsmin
Feito isso acesse o prompt do Python (Estou usando Python 2.6) e vamos converter assim:
$ python
>>> from os import path
>>> from os.path import join
>>>
>>> # Usei o cStringIO por ser mais rápido que o StringIO implementado em Python
>>> from cStringIO import StringIO
>>> 
>>> # As linha abaixo é o que nos garante o uso do jsmin
>>> import jsmin
>>> jmin = jsmin.JavascriptMinify()
>>>
>>> base = path.dirname(path.abspath(path.realpath(__name__)))
>>>
>>> # Abrimos o arquivo original apenas como leitura 
>>> filejs = open(join(base, 'jquery-1.4.4.js'),'r')
>>>
>>> # Pegamos o nome do arquivo original e concatenamos com .min.js
>>> filename_out =  str(str(filejs.name.split('/')[-1]).split('.js')[0] + '.min.js')
>>>
>>> file_out = StringIO()
>>> file_out.write("")
>>>
>>> # Gerando um novo arquivo com modo de escrita
>>> file_out = open(join(base, filename_out),'wb')
>>>
>>> # Por fim passamos para o minify um arquivo de entrada e o de saída
>>> jmin.minify(filejs,file_out)
>>> file_out.close()
 
CTRL+D para sair do console python.
 
Mantive o exemplo acima comentado para que possam melhor entender o que foi feito. Agora podemos usar novamente o comando para ver o tamanho dos arquivos, antes e depois.
$ ls -hs *.js
Note que agora temos um novo arquivo com o nome de jquery-1.4.4.min.js com apenas 112k, pode não parecer muito, mas tenha certeza que isso ajuda muito no desempenho do seu site, ainda mais se você tiver bem mais arquivos.
 
Fiz este mesmo teste em um arquivo que eu tinha de 152k e ele foi para 64k, então veja bem a diferença. Vale testar com seus arquivos, claro que é sempre bom fazer um backup antes ;)

Outra forma de fazer.

Essa é a outra forma de fazer, mas não é pythonica. Achei importante mencionar essa outra forma de fazer, que na verdade é exatamente de onde partiu a idéia em Python e provavelmente as demais ;)
 
O código e projeto original do JSMin é escrito e mantido por Douglas Crockford em C e pode ser acessado em https://github.com/douglascrockford/JSMin.
 
Jsmin é um filtro que omite ou modifica alguns caracteres. Isto não altera o comportamento do programa que estamos reduzindo. O resultado pode ser mais difícil depurar. Vai ser mais difícil de ler.
 
Após baixar o jsmin.c, vamos compilar e usar, abaixo mostro como compilar e como usar, lembrando que estamos usando o arquivo do jquery como modelo. O comando segue o mesmo modelo que em Python, neste caso o binário do jsmin também requer um arquivo de entrada e outro de saída.
 
$ gcc jsmin.c -o jsmin
$ ./jsmin < jquery-1.4.4.js > jquery-1.4.4.min.js
Pronto! Agora temos um arquivo com 108k, menor ainda que o gerado em Python :D
 

O pulo do gato.

Descobri ainda que o jQuery usa o chamado packer (http://dean.edwards.name/packer/) que nada mais é que um compressor de JavaScript, após passar o arquivo que temos de 108k o resultado foi 60k, então aqui descobrimos o pulo do grato usado pelo jQuery.
 
É isso ai, agora você já pode começar a se divertir e colocar um pouco mais de performance em seu site.
| Comentários

World Plone Day 2012 já tem data definida

por André Nogueira em 22/02/2012 15:52
World Plone Day 2012 já tem data definida

O World Plone Day é um evento realizado pela Comunidade Internacional de Plone em diversas cidades do mundo, com o objetivo de divulgar o Plone. A edição de 2012 já tem data definida: será realizado no dia 25 de abril.

No Brasil, diversos grupos de usuários já se movimentaram para organizar eventos e até agora temos a confirmação de eventos em 5 cidades:  

  • Aracaju
  • Brasília
  • João Pessoa
  • São Bernardo
  • São Paulo

Mais eventos

Ainda estamos em busca de novas cidades para aumentar essa lista. Se você conhece Plone e mora em uma cidade que não faz parte da lista acima você é um sério candidato a realizar um evento. Entre em contado comigo pelo twitter @agnogueira ou pelo formulário de contato aqui do site que podemos orienta-lo. E não se preocupe, não precisa ser um grande evento, pode ser apenas uma pequena palestra ou reunião de amigos.
 
Mais informações sobre o evento podem ser encontradas no site do evento: http://plone.org/events/wpd/

| Comentários

Como instalar Plone no Windows com o instalador

por André Nogueira em 08/02/2012 14:41

Ano passado fiz um post aqui no Blog da Simples mostrando o passo a passo para instalar o Plone no Windows utilizando o instalador disponibilizado no Plone.org. Mas nos meses seguintes o processo mudou um pouco. Na verdade ele foi simplificado, removendo diversos passos da instalação, como a definição de senha e diversas autorizações necessárias.

Para manter o blog atualizado vou refazer o passo a passo aqui, mostrando o funcionamento novo.

Baixando o arquivo e iniciando a instalação

Para começar, acesse o site do Plone e baixe a versão mais recente do instalador. Isso pode ser feito diretamente nesta página: http://plone.org/products/plone.

Escolha o arquivo de instalação para o windows e faça o download. Nesse tutorial vamos usar como exemplo a instalação para windows utilizando o windows 7. 

O arquivo para windows tem 32MB e deve demorar alguns minutos para baixar. Assim que terminar, basta executar o arquivo para iniciar o processo.

Ao executar o arquivo, você deve receber uma mensagem perguntando se você realmente deseja executar o arquivo.

Instalador do Plone 413 - 01

Clique no botão "Executar" para permitir a instalação. Em alguns casos, de acordo coma configuração de seu computador, você pode ver uma segunda janela perguntando se você autoriza o programa Plone.exe a realizar modificações em seu computador. Dê a permissão para continuar.

A próxima tela que você vai ver é a tela do inicio da instalação propriamente dita:

Instalador do Plone 413 - 02

 

Clique no botão "Next" e você será redirecionado a seguinte tela:

Instalador do Plone 413 - 03

Basta clicar em "Instal" que a mágica vai começar. O instalador vai fazer tudo sozinho, criar pastas, rodar buildout, criar usuários. VOcê só terá que aguardar alguns minutos até que a seguinte tela apareça:

Instalador do Plone 413 - 04

Basta clicar no botão finalizar e pronto, não será necessário nem reiniciar os eu computador. Basta acessar o endereço http://localhost:8080/ em seu navegador para criar seu novo site:

Instalador do Plone 413 - 04

Clique no botão "Criar novo site Plone". Quando perguntado, informe o usuário admin e a senha admin que são criados automaticamente pelo instalador.

Na tela seguinte basta escolher o id e o nome do seu site, clicar no botão 'Criar Plone site' e começar a se divertir com seu site Plone.

Qualquer dúvida com o processo, deixe seu recado nos comentários

| Comentários

Search Engine Optimization (SEO) e o Plone

por André Nogueira em 31/01/2012 17:11

Uma das perguntas que mais escuto durante os cursos de Gestão de Conteúdo que ministramos pelo Brasil é como podemos melhorar o desempenho de um site nos mecanismos de Busca. Para ajudar com a resposta, fiz essa apresentação no ano passado durante o World Plone Day que realizamos aqui em São Paulo.

Nela mostro tudo o que o Plone já faz a respeito e as principais ações que você pode ter com seu conteúdo para alcançar melhor resultados. Confira:

 

| Comentários

As Melhores Intranets de 2012

por André Nogueira em 20/01/2012 11:42

O Ano de 2012 mal começou e o pessoal do use.it já divulgou sua lista com as 10 melhores intranets de 2012. Jakob Nielsen e sua turma prepararam um relatório de mais de 400 páginas com muitas imagens de tela para explicar o motivo da escolha dos vencedores.

Veja a seguir algumas das principais constatações do relatório sobre o perfil dessas empresas e como elas encaram seu portal corporativo:

Evolução contínua da Intranet

Um portal corporativo não pode ser lançado e esquecido. O design e as funcionalidades devem evoluir constantemente para atender as necessidades da empresa e do ambiente ao redor, que mudam diariamente. Entre os vencedores apenas um foi vencedor anteriormente, o que demostra claramente a necessidade de renovação constante.

Empresas menores possuem Intranets melhores

Entre os dez vencedores a média do número de funcionários é de 19.700. Três das empresas vencedoras possuem menos de 10 mil funcionários.  Esse número é bem menor do que os anos anteriores, quando a média era maior do que 30 mil funcionários.

As equipes cresceram

Apesar da queda no número de funcionários das empresas vencedoras, o número de profissionais envolvidos com o desenvolvimento do portal aumentou. Entre os vencedores a média passou para 15 profissionais, o que nos dá um número mágico aproximado de 1 especialista de internet para cada mil funcionários. Nesse número estão incluídos os especialistas da empresa e tambem parceiros externos de consultorias e agências.

Parceria

Oito dos dez vencedores contam com a ajuda externa no desenvolvimento e no design de sua solução de intranet. Na maioria dos casos existe uma grande parceria entre a equipe interna, que possui um grande conhecimento da empresa e do negócio e uma consultoria externa, que possui o conhecimento sobre a tecnologia e as práticas de design.

Mais detalhes sobre o relatório pode ser encontrado num rápido resumo publicado no use.it:
http://www.useit.com/alertbox/intranet_design.html

Além disso o relatório completo pode ser adquirido no website da Nielsen Norman Group por U$248,00. http://www.nngroup.com/reports/intranet/design/

Interessado em construir uma intranet de sucesso? Entre em contato e conheça o que a Simples Consultoria e o Plone podem oferecer.

| Comentários

Varnish 3, Plone 4: Discutindo a Relação.

por Cleber J Santos em 06/10/2011 10:45

Não preciso dizer o quanto a PythonBrasil [7] foi um sucesso :-D , infelizmente não tive como ver todas as palestras o que seria bizarro conseguir, dado que não sou onipresente. Apesar da minha palestra ter sido em uma sexta-feira no final do dia eu pude extrapolar o tempo, e ainda ficou faltando diversos detalhes.

Um detalhe importante é que o @ericof apareceu e também participou da palestra,  conhecidencia ou não, ocorreu após eu ter invocado seu nome 3 vezes. Em minha apresentação pude mostrar o quanto o Varnish é poderoso, e o quanto a combinação Varnish [3] e Plone [4] pode ser igual a [42]

| Comentários

Plone e JQuery ao gosto do Cliente

Dando sequência a série de posts sobre as palestras ministradas durante a PythonBrasil [7], apresentamos agora os slides da apresentação "Plone e JQuery ao gosto do Cliente" executada pelos simplificadores @cleberjsantos e @Tamosauskas

Na oportunidade foram mostrados alguns exemplos práticos de como aprimorar a interface de sites em Plone usando alguns recursos de jQuery. Em especial são mostradas maneiras de integrar os métodos e atributos dos objetos do Zope em seus scripts jQuery.

 

| Comentários

Cmsui: Uma nova maneira de editar conteúdo no Plone

por André Nogueira em 03/10/2011 10:39

Nos próximos dias vamos começar a publicar aqui no blog todas as palestras ministradas pelos simplificadores durante a PythonBrasil [7] , que foi realizada em São Paulo entre os dias 28 de setembro e 1 de outubro.

A primeira a ser publicada é a palestra Cmsui: Uma nova maneira de editar conteúdo no Plone que ministrei na sexta-feira. A idéia principal da palestra era mostrar a evolução da edição de conteúdo no Plone e os caminhos que estamos seguindo para as próximas versões. Aproveitem e aguardem as outras palestras que serão publicadas nos próximos dias.

 

| Comentários

Plone é finalista do Open Source Awards 2011 - Deixe seu voto!

por Thiago Tamosauskas em 26/09/2011 11:58
Plone é finalista do Open Source Awards 2011 - Deixe seu voto!

Mais uma vez o Plone chega aos finalistas da premiação Open Source Awards promovida pela Packt Publishing na categoria Open Source CMS. O Plone também está concorrendo nas seguintes novas  subcategorias:

  • Best Open Source CMS for performance (Melhor performance de CMS Open Source)
  • Best CMS for Best Community:  (Melhor Comunidade de CSM Open Source)
  • Best CMS for Ease of Use: (CMS Open Source Mais Fácil de Usar)


Os votos podem ser feitos até dia 31 de Outubro, logo antes do início da Plone Conference  em São Francisco. Mas se você faz parte da comunidade Plone, deixe seu voto agora para não correr o risco de esquecer.

Plone já ganhou prêmios neste concurso em 2008 e 2009. As  subcategorias devem ser votadas separadamente da categoria principal. Veja abaixo como proceder:

  1. Clique aqui e vote no Plone na categoria CMS.
  2. Clique aqui e adicione o Plone nas subcategorias Performance, Community e Ease of Use, respectivamente Performance, Comunidade e Facilidade de Uso.


Dica: Coloque "N/A” e “http://example.com” na categoria .NET se você não tiver nenhum favorito em mente.

A Comunidade Plone Agradece.

| Comentários

Regras do Diazo: questão de ordem

por Thiago Tamosauskas em 26/09/2011 10:55
Regras do Diazo: questão de ordem

Ao desenhar as regras do seu tema feito em diazo para o Plone, pode ser bastante útil entender um pouco melhor como o compilador do Diazo trabalhará. Entre várias coisas importantes temos a  ordem exata na qual o diazo lerá as regras.

Independente de qual regra aparecer primeiro no seu arquivo xml, o diazo sempre levará em consideração a seguinte hierarquia:

1º lugar: <before css:theme="" /> (mas não theme-children)

2º lugar: <drop />

3º lugar: <replace css:theme="" /> (mas não theme-children)

4º lugar: <strip />.

5º lugar: Regras que usam attributes.

6º lugar: <before />, <replace /> e <after /> usando "theme-children" 

7º e último lugar: <after  css:theme="" /> (mas não theme-children).

Esta ordem explica porque não adianta usar uma regra <replace> se em qualquer lugar do xml você aplicar uma regra <drop> ou uma regra <replace> no mesmo elemento. Assim, se uma as mudanças  insistirem em não aparecer no seu tema, vale a pena dar uma revisada na sua ordem de execução.

| Comentários

Google Analytics e a busca dentro do seu Plone Site

por André Nogueira em 01/09/2011 11:24
Google Analytics e a busca dentro do seu Plone Site

Muita gente gostaria de poder conhecer melhor as estatísticas da busca interna do seu Plone site. Imagine só saber informações como quais são os conteúdos mais buscados, a quantidade de vezes que a busca foi utilizada, os objetos mais encontrados, entre outras coisas.

A boa notícia é que se você usa  o Google Analytics para gerar as estatísticas do seu Plone site é muito fácil ter acesso a esses dados. Basta fazer um pequeno ajuste de configuração no próprio Analytics para que ele começe a analisar a busca do seu site.

Segue um passo a passo bem rápido:

  1. Faça Login no Google Analytics;
  2. Clique em 'edit' ao lado do perfil do site que deseja configurar;
  3. Na página seguinte, clique no link 'edit' que fica na caixa 'Main Website Profile Information';
  4. Na área 'Site Search' marque a opção 'Do Track Site Search';
  5. No campo 'Query Parameter' informe o valor 'SearchableText';
  6. Clique no botão 'Save Changes' que fica no final da página.


Pronto, a partir de agora o Google Analytics vai começar a analisar a busca do seu site e você terá acesso aos dados. Esses dados estarão disponíveis dentro da das estatísticas dentro do menu 'Content' do seu relatório, na opção 'Site Search'

| Comentários

VMODs: O lego do Varnish 3

por Cleber J Santos em 21/08/2011 23:10
VMODs: O lego do Varnish 3

VMODs, ou simplesmente Varnish Modules é, segundo da documentação de modificações, um dos grandes sucessos obtidos na versão 3: "VMODs on the other hand, was an instant success, because they make it much easier for people to extend Varnish with new functionality".

E realmente, é o mesmo que tenho achado, como bem sabemos desde o Varnish 2.1 podemos usar C inline para criar e estender funcionalidades que por padrão o Varnish não trás, e com a chegada dos módulos essa brincadeira tona-se ainda melhor, por tudo que podemos fazer na VCL.

Sabermos ainda que existem coisas que não temos como fazer na VCL, por exemplo: Procurar um número de IP em um arquivo de banco de dados. Usando código C inline até temos como resolver este problema, já que o Varnish nos provê isso, e lá você pode fazer tudo, mas não é uma forma conveniente ou mesmo legível para resolver tais problemas. Eis o lugar onde VMODs entram em cena.

 

O que é a VMOD?

Trata-se de uma biblioteca compartilhada com algumas funções C que pode ser chamado a partir do código VCL.

A interface entre o VMOD o compilador VCL ("VCC") e o tempo de execução VCL ("VRT") é definido em um arquivo de nome vmod.vcc que um script python de nome "vmod.py" que faz todo o trabalho duro

Executando o vmod.py no arquivo vmod.vcc, será produzido dois arquivos, que são: "vcc_if.c" e "vcc_if.h", no qual devemos usar para construir o nosso arquivo de biblioteca compartilhada.

o vcc_if.c até pode ser esquecido em nosso VMOD, mas o vcc_if.h é importante, ele contém os protótipos para as funções que desejamos exportar para a VCL.

Nota: Uma informação importante, você ainda pode dizer ao Varnish em tempo de execução para qual diretório ele deve olhar para buscar os VMODs. 
vmod_dir
Default: ${VARNISH:DIR}/lib/varnish/vmods


Na prática.

Agora que já temos base do que é um VMOD e como ele funciona, vamos aos exemplos :) , estou usando alguns que encontrei na internet então vamos lá:
 
  • 1º Exemplo.
Autor: Martin Blix Grydeland
Descrição: O módulo implementa o "Olá Mundo!", sendo bem pequeno e simples para entender.
Nota: Após instalar o módulo (como instalar em README) basta executar o seguinte trecho de código em sua VCL.
import example;

sub vcl_deliver {
	# Vamos definit o  resp.http.hello para "Hello, World"
	set resp.http.hello = example.hello("World");
}

 

  • 2º Exemplo

Módulo: https://github.com/leed25d/geoip-vmod
Autor: David Newhall
Descrição: Provê a capacidade de retornar a localização geográfica de um endereço IP.
Nota: Após instalar o módulo (como instalar em README) basta executar o seguinte trecho de código em sua VCL.

import geoip;

sub vcl_recv {
   # Definimos um cabeçalho de solicitação X-GeoIP
   # para o geo do solicitante (ou desconhecido).
   set req.http.X-Forwarded-For = client.ip;
   set req.http.X-GeoIP = geoip.country(req.http.X-Forwarded-For)
}

  • 3º Exemplo
Módulo: https://github.com/varnish/libvmod-curl
Autor: Tollef Fog Heen
Descrião: Este vmod é um dos que mais gosto, ele provê o curls para o Varnish, então podemos usar o varnish como um cliente HTTP e buscar cabeçalhos e corpo nos backends.
Nota: Após instalar o módulo (como instalar em README) basta executar o seguinte trecho de código em sua VCL.
 
import curl;

sub vcl_recv {
    curl.fetch("http://example.com/test");
    if (curl.header("X-Foo") == "bar") {
        …
    }
    curl.free();
}

Estes são alguns dos exemplos que podemos seguir para criar nosso próprio VMOD, nota-se que precisamos saber C para isso, algumas idéias de módulos seria usar C + libxml para fazer parse de arquivos XMLs diretamente no Varnish e já manter em cache, ainda com analise de cabeçalho e etc.. Ou Usar o PIL para gerar imagens ou qualquer outra coisa que sua imaginação desejar, você agora tem o poder do C e do Varnish nas suas mãos.
 

Um pouco mais antes de terminar.

Agora que já estamos mais acostumados e empolgados em poder criar VMODs para trabalhar com o Vanrish, veja alguns exemplos do que podemos fazer com o que já existe. 
 
Nota. Lembre-se que é necessário importar o módulo std ou qualquer outro que iremos utilizar, uma única vez e usar em toda a VCL.
 
  • Adicionando o std.collect(), coletamos vários cabeçalhos HTTP para um único cabeçalho.
import std;

sub vcl_recv {
   std.collect(req.http.foo);
}

sub vcl_fetch {
   std.collect(beresp.http.bar);
}
  • Retornando uma URL em caixa alta ou uma string.
sub vcl_deliver {
        set resp.http.foo = std.toupper(req.url);
}
ou
set beresp.http.x-scream = std.toupper("yes!");
  • Retorna o contrário do toupper, ou seja, strings todas em caixa baixa.
set beresp.http.x-nice = std.tolower("VerY");

Ainda temos random, log, set_up_tos, syslog, fileread, duration e integer, no qual adoraria escrever sobre, mas fica a dica para quem desejar conhecer, o VMOD é realmente uma verdadeira caixa de legos, e o mais legal é que você ainda pode criar novas peças e encaixar nas já existentes. Espero que tenha sido u bom post para você entender e começar a montar a sua VMOD, e espero que post aqui sobre a experiência.

Até a próxima.


Leia também:

| Comentários

Como adicionar Eventos do Plone no Google Calendar

por Thiago Tamosauskas em 19/08/2011 11:35
Categoria: Google, Plone, ZPT
Como adicionar Eventos do Plone no Google Calendar

O 'Evento' e um tipo padrão do Plone que, entre outros recursos, possui alguns links (iCal e vCal) que permitem adicionar o evento do seu site ao calendário de aplicativos como o Mozilla Sunbird, Microsoft Outlook e similares... Este é um recurso maravilhoso, que nunca vi ninguém usar o_O .

Por outro lado todos os meus heróis que não morreram de overdose usam hoje o Google Calendar para organizar seu dia a dia. Pensando nisso imaginei uma maneira de termos um link nos eventos do Plone que adicione ele as agendas do Google Calendar.

Você vai precisar:

1 - Um script python para formatar a data, que chamaremos, Dataformat.py:

from DateTime import DateTime
if not dt:
 dt = DateTime()

if not format:
 format = "%Y%m%dT%H%M00"

if not same_type(dt, DateTime()):
 dt = DateTime(dt)

print dt.strftime(format)
return printed

Este script é necessário para formatar as datas iniciais e finais do evento no formato usado pelo Google Calendar

2 - Colocar a seguinte expressão em Zope Page Template no seu template event_view.pt

<a href="#" title="Add to Google Calendar" target="_blank" 
            tal:define="atDate here/start;
                        inicio python: context.Dataformata(atDate);
                        fim python: context.Dataformata(atDate)"
            tal:attributes="href string:http://www.google.com/calendar/render?
action=TEMPLATE&text=${context/Title}&dates=${inicio}/${fim}&location=
${context/getLocation}&details=Detalhes:${context/absolute_url}&trp=false">
    Google Calendar
</a>

Seguindo os passos acima você terá um link que incluirá o evento em questão a sua agenda do Google Calendar. Veja um exemplo no site de um de nossos clientes: http://www.proparts.esp.br/events/copa-sram-1a-etapa-sram-50k/view

| Comentários

Migrando Varnish 2.1 para Varnish 3.0

por Cleber J Santos em 13/08/2011 23:35
Migrando Varnish 2.1 para Varnish 3.0

Nas últimas semanas tenho tido a oportunidade de ficar mais próximo do Varnish, e nas últimas três semanas comecei a migrar do varnish 2.1 para Varnish 3, posso dizer desde já que teve um grande salto de melhorias e também de implementações. Mas neste post irei tratar apenas de como preparar sua configuração de vcl para não ser pego de supresa quando fazer um upgrade da versão.

O exemplo de vcl a seguir foi retirado do svn do Varnish: https://www.varnish-cache.org/trac/browser/etc/zope-plone.vcl e será com base neste vcl que iremos efetuar a migração.

Breve resumo das mudanças de 2.1.5 para 3.0.0

  • Suporte ao módulo VMODs [3].
  • Suporte a Compressão e descompressão, incluindo compressão de fragmentos ESI.
  • Suporte a carregamento preliminar de streaming, tanto em cache ou não.
  • Melhor documentação.
  • Melhor valores padrão para parâmetros.
  • varnishncsa agora com suporte de log com formatos personalizado.
  • varnishlog, varnishncsa  e varnishhist agora com suporte a filtros de registros que correspondem múltiplas expressões.

Para uma lista mais detalhada de alterações leia o documento de alterações.
 

Alterações na VCL.

  

  • log foi movido para o vmod std.[4]

log "Olá mundo";
torna-se
import std;
std.log "Olá mundo";
Nota. A importação do std só é preciso ser feito uma única vez e usada por toda a VCL.
 
 

  • purge agora torna-se o chamadas ban, ou como dito na VCL, são funções ban.

purge() e purge_url() são agora, respectivamente ban() e ban_url(), sendo assim deve-se substituir todas as ocorrências: 
purge(“req.url = ” req.url);
para
ban(“req.url = ” + req.url);

purge
 continua existindo porém não leva nenhum argumento mais, e ainda pode ser usado em vcl_hit ou vcl_miss para fazer purge de itens do cache, onde você iria reduzir o ttl a 0 no Varnish 2.1.
 sub vcl_hit {
   if (req.request == “PURGE”) {
      set obj.ttl = 0s; error 200 “Purged.”;
   }
}
torna-se
sub vcl_hit {
   if (req.request == “PURGE”) {
      purge; error 200 “Purged.”;
   }
}

 

  • beresp.cacheable está fora.

beresp.cacheable está fora do Varnish 3, mas pode ser substituído por beresp.ttl> 0s

 

  • returns agora é feito com a função return()

pass, pipe, lookup, deliver, fetch, hash, pipe e restart não são mais palavras-chave, mas argumentos para a função return(), então:

sub vcl_pass {
   pass;
}

torna-se

sub vcl_pass {
   return(pass);
}

 

  • req.hash foi substituído por hash_data()

Não apendamos mais o hash com +=
set req.hash += req.url;
Agora torna-se
hash_data(req.url);

 

  • esi substituído por beresp.do_esi

Não habilitamos ESI com esi.
esi;
no vcl_fetch tonar-se
set beresp.do_esi = true;

 

pass em vcl_fetch foi renomeado para hit_for_pass

A diferença no comportamento do pass em vcl_recv e vcl_fetch confundem as pessoas, apenas para torna mais claro as coisas, eles são diferentes :) e agora devemos usar return(hit_for_pass) onde usava-se pass no vcl_fetch.

 

  • NOTA.

O Varnish 3 também teve uma mudança de comportamento, isso significa que ele irá retornar um erro quando cabeçalhos forem muito grandes ao em vez de apenas ignorá-los. E se os limites são muito baixos, retornará HTTP 413, então deve-se  alterar limits por http_req_hdr_len e http_req_size. Essas alterações devem ser feitas em tempo de execução, o que significa adicionar como parâmetro do executável varnishd,   exemplo (-p http_req_hdr_len=4096 -p http_req_size=1024).

Para maiores informações sobre parâmetros em tempo de execução acesse a documentação[5].

 

Migrando.

 

Eis aqui nosso exemplo retirado do svn do Varnish, porém convertido para a versão 3.0, retirei quais quer comentários da VCL e efetuei a migração, acredito que depois da explicação dos parâmetros acima você seja capaz de migrar a sua configuração.

 

backend default {
	.host = "127.0.0.1";
	.port = "9673";
}

acl purge {
	"localhost";
	"192.0.2.0"/24;
}

sub vcl_recv {
        if (req.http.host ~ "(www.)?example.com") {
                set req.http.host = "example.com";
		set req.url = regsub(req.url, "^", "/VirtualHostBase/http/example.com:80/example.com/VirtualHostRoot");
        } elsif (req.http.host ~ "(www.)?example.org") {
                set req.http.host = "example.org";
		set req.url = regsub(req.url, "^", "/VirtualHostBase/http/example.org:80/example.org/VirtualHostRoot");
        } else {
                error 404 "Unknown virtual host.";
        }

        if (req.request != "GET" && req.request != "HEAD") {
                if (req.request == "POST") {
                        return(pass);
                }
                
                if (req.request == "PURGE") {
                        if (!client.ip ~ purge) {
                                error 405 "Not allowed.";
                        }
                        return(lookup);
                }
        }
        if (req.http.Cookie && req.http.Cookie ~ "__ac(|_(name|password|persistent))=") {
		if (req.url ~ "\.(js|css)") {
                        remove req.http.cookie;
                        return(lookup);
                }
                return(pass);
        }
}

sub vcl_hit {
        if (req.request == "PURGE") {
                purge;
                error 200 "Purged";
        }
}

sub vcl_miss {
        if (req.request == "PURGE") {
                error 404 "Not in cache";
        }
}

sub vcl_fetch {
        if (beresp.ttl < 3600s) {
                set beresp.ttl = 3600s;
        }
} 

 

Indicação de leitura.

| Comentários

Como criar um tema para Plone usando o Diazo

por Thiago Tamosauskas em 26/07/2011 17:20

Diazo é uma nova forma de implementar layouts que o Plone está usando e que tem tudo para se tornar a maneira oficial para se desenvolver temas daqui para frente. Basicamente, ele permite que você aplique um tema de uma página com CSS e HTML estático e transformar em um site dinâmico com o mínimo de constrangimento. 

Existem várias vantagens nesta abordagem, entre elas:

  • Abrir a porta para que mais e novos designers possam trabalhar com o Plone.
  • Você pode usar um wireframe HTML criado por um webdesigner que nem conhece o Plone
  • Seu tema passa pode ser facilmente reaproveitado em outros CMS e vice versa.
  • É possível redesenhar uma interface do usuário sem sequer ter acesso ao código fonte da aplicação
  • Você pode implementar temas em um tempo muito mais reduzido.
  • O tema original permanece intocado facilitando a reutilização e manutenção.
  • Há ainda um ganho de performance pois recursos estáticos como imagens, css e javascripts são fornecidos sem passar pelo Plone

Meu primeiro tema


A maneira mais rápida de usar o Diazo é instalar o produto plone.app.theming, com ele você ganha uma nova opção nas configurações do site e então tudo o que precisará fazer é subir um arquivo zipado contendo o seu tema.  Vamos criar um tema bem simples para um fácil e rápido entendimento inicial:

Crie um diretório /meutema e coloque nele o arquivo tema.html:

<html>
    <head>
        <title>Meu Diazo Feliz</title>
        <link rel="stylesheet" href="estilos.css" />
    </head>
    <body>
        <h1 id="title">Meu tema para Diazo</h1>
        <div id="content">
            Lorem ipsum
        </div>
    </body>
</html>


Coloque também nesta pasta o arquivo estilos.css:

body {
    background: #fff repeat-x;
    color: #000;
    font-family: Arial, Helvetica, sans-serif;
}

#content {width: 960px; margin: 0 auto;}


Crie então um arquivo chamado rules.xml:

<rules
    xmlns="http://namespaces.plone.org/diazo"
    xmlns:css="http://namespaces.plone.org/diazo/css"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

   <theme href="tema.html" />

   <replace css:theme="#content" css:content="#portal-column-content" />
   <drop css:content="#plone-document-byline" />

</rules>


Por fim crie um arquivo zip desta pasta e suba pelo painel de configurações do Diazo em @@theming-controlpanel

Seu mini-tema deve então estar disponível em seu site.

As regras do jogo


É no arquivo rule.xml que a mágica acontece. Este arquivo contêm as regras que unem o Plone e o tema, substituindo com o espaço do html estático com o conteúdo de verdade. Vamos entender nosso exemplo simples:

<rules>  Aqui são definidos três namespaces que fazem o Diazo funcionar. Graças a eles o Diazo permite o uso de seletores completos de CSS3 e XPath, incluindo coisas como o pseudo seletor nth-child.

<theme> Dá a referencia para o arquivo de html estático que será usado no tema.

<drop> Usado para apagar elementos do tema ou do conteúdo. No nosso exemplo estamos eliminando a tag plone-document-byline e tudo o que há dentro dela.

<replace> Uma das mais usadas na implementação de um tema. Isso porque, como o nome já diz, ela substitui um conteúdo estático por um conteúdo dinâmico que você indicar. No nosso exemplo o Diazo colocará todo o #portal-column-content do Plone dentro da tag #content definida em nosso tema estático.


Existem ainda outras tags que podem ser usadas como <before>, <after>, <strip>. <copy>, <notheme> e <merge>. Para  um conhecimento mais aprofundado consulte a documentação do Diazo ou aguarde futuros posts aqui no nosso blog.

Perigos do Diazo


É necessário destacar que o Diazo facilitará bastante o desenvolvimento de temas no futuro, mas ele também abre a possibilidade de estragarmos o Plone no processo (Como fizemos neste tutorial). O Plone possui uma história de preocupação com a experiência de uso e possui uma interface poderosa que agora pode ser destruída com poucas linhas. Entre outras coisas o uso indiscriminado do Diazo pode significar:

  • Perda das validações de código
  • Perda de usabilidade
  • Perda de portabilidade
  • Perda de acessibilidade
  • Perda na otimização para buscas
  • Possível incompatibilidade com alguns produtos


Sendo assim é necessário mais do que nunca implementar um tema preocupando-se em manter estas e muitas outras vantagens nativas do Plone. Isso significa atenção aos detalhes, auto-crítica e constante acompanhamento do código gerado pelo Plone. Pode ser uma tarefa trabalhosa, mas o resultado é compensador.

| Comentários

Plone 4, velocidade e Chameleon tudo em comum.

por Cleber J Santos em 14/07/2011 13:30
Plone 4, velocidade e Chameleon tudo em comum.

Num post anterior escrito pelo amigo simplificador @Tamosauskas (Plone mais rápido com Chameleon), foi mencionado a preocupação e empenho que a comunidade Plone tem tido quando o assunto é desempenho. Pois bem, neste post pretendo reforçar este aspecto, lembrando que essa é umas das preocupações da comunidade, tenho também como maior delas a segurança é claro.

Como dito no post do @Tamosauskas, a cada nova versão do Plone percebemos um ganho de desempenho, desde a versão 2.5 até a mais atual em desenvolvimento 4.1rc3 (Atual até a data que estou escrevendo este post), e claro, ganho de novas funcionalidades mudanças significativas para  criação de novos produtos e tipos e a mudança da skin padrão.

O que exatamente é o tal do Chameleon?

No site oficial a melhor definição é "Chameleon is an open-source template engine written in Python.
", de fato, trata-se de um modelo de templates escrito em Python, ele foi escrito para gerar documentos de marcação HTML ou XML para aplicações Web.

Ele usa a linguagem do Page Template, só que sua implementação é bem mais rápida e independente, no qual trás um conjunto de novos recursos e podemos usar em qualquer aplicação escrita em Python (2.5 e superior, incluindo 3.x e PyPy), algumas de suas características são:
 
  • Rápido - Os templates são compilados para byte-code.
  • Extensível - É fácil de estender uma linguagem ou criar sua própria.
  • Testado - Testes automatizados que protege contra regressões.
 
Para o Python 2.7 e superior não existem dependências de bibliotecas, já nas versões 2.5 e 2.6 a ordereddict e unittest2 são pacotes definidos como dependências, mas para se ter uma idéia de como Chameleon é independente, seu sistema de tradução é plugável e baseado em gettext. 
 
Não há um suporte embutido para o pacote zope.i18n. Mas se o pacote for instalado, ele será usado por padrão. O pacote translationstring[3] oferece algumas das mesmas classes de utilidades auxiliares, sem a interface do Zope.
 

Usando Chameleon no seu buildout.

Adicione as linhas em seu buildout:
eggs = ... five.pt>=2.1
zcml = ... five.pt
Estes testes foram efetuados nas versões 4.0.7 e 4.1rc3 do Plone, para um teste simples crie um Page template e coloque o seguinte conteúdo:
 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
      xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:metal="http://xml.zope.org/namespaces/metal"
      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
      lang="en"
      metal:use-macro="context/main_template/macros/master"
      i18n:domain="plone">
 <body>
  <metal:main fill-slot="main" tal:define="name string:world">
   Hello ${name}!
  </metal:main>
 </body>
</html>
 
Note que não precisei colocar tal:content para imprimir o texto da variável name, abaixo mais 2 exemplos:
 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
      xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:metal="http://xml.zope.org/namespaces/metal"
      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
      lang="en"
      metal:use-macro="context/main_template/macros/master"
      i18n:domain="plone">

 <body>
  <metal:main fill-slot="main">
   <div tal:replace="python:'here==context:'+str(here==context)" />
   <div tal:replace="python:'here==container:'+str(here==container)" />
   <div tal:replace="string:root:${root/getPhysicalPath}" />
   <div tal:replace="string:nothing:${nothing}" />
   <div tal:define="cgi python:modules['cgi']"
        tal:replace="python: dir(cgi)" />
  </metal:main>
 </body>
</html>
 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
      xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:metal="http://xml.zope.org/namespaces/metal"
      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
      lang="en"
      metal:use-macro="context/main_template/macros/master"
      i18n:domain="plone">

 <body>
  <metal:main fill-slot="main">
    <table border="1">
      <tr tal:repeat="row python:['apple', 'banana', 'pineapple']">
        <td tal:repeat="col python:['juice', 'muffin', 'pie']">
           ${row/capitalize} ${col}
        </td>
      </tr>
    </table>
  </metal:main>
 </body>
</html>
Para realizar outros testes e aproveitar bem o Chameleon, leia a documentação[1] e sugiro a leitura dos códigos dos produtos Chameleon e five.pt.
 

| Comentários
Ações do documento
Spinner