sábado, 30 de janeiro de 2010

Mudando a Versão do Python no Ubuntu

Você instalou o Ubuntu novinho em folha e a versão atual do python é a 2.6 por exemplo, mas você deseja que a versão padrão seja a 2.4. Como mudar então?

Antes de mais nada, você precisa instalar a versão 2.4. Vá no seu gerenciador Synapitc e busque por python 2.4. Instale a linguagem.

Para ter certeza que ambas estão instaladas, digite python no seu console e veja qual é a versão padrão. Depois, saia do IDLE Python e digite "python2.4". A versão deve ser a 2.4

Depois, edit o arquivo /usr/share/python/debian_defaults e mude o default python para python2.4

Em seguida, execute os comandos abaixos para que a chamada "python" execute a versão que você quer.

sudo mv /usr/bin/python /usr/bin/python26
sudo ln -s /usr/bin/python2.4 /usr/bin/python

sábado, 23 de janeiro de 2010

Mais uma Mancada do Mercado Livre - Mercado Pago Obrigatório

Você, que como eu, detesta o Mercado Livre, tem cada vez mais motivos para parar de vender lá e migrar para o Toda Oferta.

A instituição vinha tentando melhorar algumas coisas após destruir o sistema de qualificação antigo e criou um anúncio "gratuito", que não é tão gratuito assim, afinal se você conseguir vender, pagará uma comissão altíssima ao ML. Parecia que as coisas estavam melhorando um pouco, já que o número de fotos voltou a ser maior e eles não estavam mais cobrando por vídeos demonstrativos dos produtos. Aí eles colocaram o Mercado Pago obrigatório. O vendedor é obrigado a aceitar aquela porcaria.

O Mercado Pago cobrava taxas das duas partes na negociação. O comprador e o vendedor tinham que pagar um percentual para usar essa ferramenta. Eles dizem que agora mudou, que só o comprador pagará alguma coisa caso queira utilizar o serviço, mas é mentira.

O vendedor precisa pagar 3 reais para cada retirada que faz no Mercado Pago. Para quem vende muito, ótimo, o cara vende 100 produtos e saca o dinheiro todo de uma vez só. Paga 3 reais e está ótimo, mas para pessoas que vendem pouco, não dá para ficar pagando mais 3 reais. Afinal, você já paga comissão ao site e não é pouco. Ainda tem que pagar mais coisas?

Todos os outros sites que oferecem o serviço de intermediação de pagamentos não cobram quando o usuário quer fazer o saque para grandes bancos e as taxas ainda são bem inferiores ao que o Mercado Livre cobra.

Quando vendo no Mercado Livre, deixo bem claro que não aceito o Mercado Pago, porque aquilo é um roubo. Para piorar, o Mercado Livre não permite que você anuncie outra forma de pagamento. Eu costuma oferecer a possibilidade de pagamento Pelo PagSeguro ou pelo Pagamento Digital para os clientes que desejavam. Fui repreendido pelo ML e tive o anúncio cancelado. Então, passei a oferecer o serviço durante a troca de e-mails com o comprador. E agora? #comofas?

O Toda Oferta está ai e não cobra nada. Se não cobra nada, significa uma coisa: O vendedor pode fazer um preço mais em conta para você porque paga taxas menores

sexta-feira, 22 de janeiro de 2010

Alterando Estado (review_state) de um Objeto do Plone via Programação

Você quer alterar um objetvo de esboço público para publicado no Plone 2.5, mas quer fazer isso via programação (script python) e não sabe como? Leia abaixo então.

Antes de mais nada, eu sei que isso funciona no Plone 2.5. No resto eu não sei se vai funcionar, mas o que você precisa fazer é utilizar o Workflow para mudar o estado do objeto. Até onde eu sei, não dá para fazer isso diretamente no objeto.
Então, em posse do objeto e não da referência dele no catálogo, você faz o seguinte:

context.portal_workflow.doActionFor(obj, 'publish');

Preste atenção. Você está usando uma action do seu workflow. O estado do objeto é "published", mas a action é "publish". Para tornar o objeto privado, você precisa fazer um "hide"

No Zope - global name 'type' is not defined

Esse erro, normalmente é significa que você não declarou alguma variável, mas quando ele acontece no ZOPE e você está tentando utilizar o método type() dentro de um script python é por um outro motivo.

O método type não está disponível para ser utilizado no ZOPE. Por isso, quando você tenta utilizar este método, o python informa que a variável não foi definida. Naturalmente, você fica com cara de idiota, imaginando o motivo disso.

O motivo é simples e você pode ler em inglês abaixo:

"type" applied to almost any Zope object will not give you "Instance" (as you would expect in a pure Python application) but "ImplicitAcquirer Wrapper" (or something like this)

Isso significa que o zope possui inumeras gambiarras para funcionar e todo tipo acaba sendo encapsulado dentro de alguma coisa.

Uma mente brilhante, entretanto, inventou o seguindo método:

same_type(x,y)

onde x pode ser o seu objeto e y um objeto do typo que você quer testar. Por exemplo: vamos supor que você deseja saber se algo é uma string. Faça assim:

Veja as duas linhas abaixo com muita atenção.

same_type(x," ")  //ISSO SIM É UMA GAMBIARRA

Você pode substituir a string pelo objeto que desejar, uma lista seria [], ou um dicionário: {}.

É isso, espero que ajude.

segunda-feira, 18 de janeiro de 2010

Criando um Objeto Usando Generic Plone Content Via Python

Como eu faço para criar um objeto que é um AT Content, ou um objeto que o tipo foi feito com Generic Plone Content diretamente do meu código python? A idéia desse código é mostrar exatamente isso.

Esse manual foi caradepaumente copiado de um tutorial em inglês. Porque eu fiz isso? Porque passei horas procurando por "Generic Plone Content" e não achei quase nada. Esse tutorial serve para você criar um conteúdo gerado via Archetypes ou Generic, porque no final das contas, o Generic usa Archetypes. Então, vamos ao que interessa. Leia atentamente, pricipalmente a próxima linha.

E ai? Leu a linha de cima? Pois é, ela só serve para me beneficiar. Vamos ao que insteressa.

Normalmente, criamos conteúdo usando "here". Que é o nosso contexto atual. Isso criaria um objeto na pasta em que estamos. E é isso que fazemos via Plone. Navegamos até uma pasta e criamos o conteúdo. Em Python, chamamos isso de "context" em um script ou Page Template, ou "self" em um produto. Aqui, usaremos a variável "container". Porque o container vai conter o que queremos. :_)

Então teremos "self" ou "context", dependendo da situação. Vou assumir context daqui pra frente.

container = context

Mas e se você quiser que o container seja uma outra pasta? Então você faz:

container = context.nomeDaPasta #A pasta ja deve existir

reparem que acima, nomeDaPasta será hard coded, ou podemos fazer:

#Retorna none caso nao exista a pasta
container = getattr(context, 'nomeDaPasta', None)

Nesse exemplo, o nome da pasta é uma string. Ou seja, pode ser parametrizado. Agora, muita atenção para a linha verdade logo abaixo. Ela é importante (para mim).

Você também pode fazer deste jeito:

container = context['nomeDaPasta']

Você não fica restrito a um nível, pode descer o quanto achar conveniente:

container = context.pasta1.subPasta1

Da forma abaixo você busca a pasta pai em relação ao contexto atual

container = context.aq_inner.aq_parent

Existe também a opção de encontrar uma pasta utilizando a raiz do portal:

from Products.CMFCore.utils import getToolByName
urltool = getToolByName(context, 'portal_url')
portal = urltool.getPortalObject()
container = portal.animais.cachorros.retrievers

Agora que você sabe como escolher o container, você pode criar seu objeto nele.
Veja o comandinho abaixo.

id = "nowHearThis"
container.invokeFactory(type_name="News Item", id=id)

Você precisa atribuir um ID ao objeto e dizer qual é o tipo de conteudo: type_name="seu tipo"

Segundo o autor do tutorial, invokeFactory vai obedecer restrições difinidas no tipo de conteúdo, como as opções de implicitly addable e filtros. Pode ser que você tenha definido que um tipo de conteúdo não é adicionavel pelo usuário. E mesmo assim você pode querer criá-lo via script. Veja abaixo

typestool = getToolByName(context, 'portal_types')
typestool.constructContent(type_name="News Item", container=container, id=id)

O conteúdo já foi criado. E agora? Você pode inserir mais informações no objeto da seguinte forma: primeiro, pegamos o objeto.

obj = container[id]

Depois, setamos uma informação:

obj.setTitle("Now Hear This!")

Em seguida, você pode reindexar o objeto no catálogo da seguinte forma:

obj.reindexObject()

domingo, 17 de janeiro de 2010

Chrome Não Acessa Sites em Plone

Toda vez que você tenta acessar um site em Plone utilizando o Chrome acontece um erro que não carrega o site.
O erro relatado pelo Chrome é:

Erro 320 (net::ERR_INVALID_RESPONSE): Erro desconhecido

O Chrome não consegue acessar as páginas do Zope que estão em cache e com o cabeçalho compactado. O que você precisa fazer é: Dizer para o Cache-Fu nunca compactar os cabeçalhos. Pronto, o Chrome conseguirá ler.

Vá em Configurações do Site -> Cache Configuration Tool  e na opção Compression selecione Never.

Depois clique em Salvar e pronto.
Basta acessar com o Chrome e tudo irá funcionar

sábado, 16 de janeiro de 2010

Como Reclamar no Mercado Livre. Link Direto.

****** Esse post é um pouco antigo e estava no meu outro site. De lá para cá o Mercado Livre já melhorou algumas coisas que irritavam todo mundo, como a cobraça abusiva por tudo. Por outro lado, passou a colocar o Mercado Pago automaticamente nos anúncios para tentar tirar mais dinheiro das pessoas.

Então, o link de reclamação abaixo ainda funciona e como muita coisa ruim ainda permanece, vou deixar tudo registrado aqui como histórico de como o ML costuma fazer as coisas. ******


Antes de mais nada, gostaria de dizer que existe um concorrente do Mercado Livre, que é o TODA OFERTA, site do UOL, onde o anúncio é grátis, não se paga comissão por vendas se você não usar PagSeguro e se usar o PagSeguro, a coisa fica bem mais em conta do que usar o Mercado Pago, mas vamos ao que interessa.

Se você quer só o link para reclamar no Mercado Livre. Faça seu login no site deles e clique neste endereço:

http://www.mercadolivre.com.br/jm/ml.faqs.framework.main.FaqsController?pageId=frmContact&faqId=2748&categId=CNTC
Ainda tem o e-mail direto de lá: crm.ml@mercadolivre.com


Pode reclamar, reclame de tudo mesmo. Solte o verbo, aqueles idiotas merecem.

Se você quer entender porque eu coloquei o link aqui, bom ai vão os motivos. Tudo começou quando eles iniciaram cobranças por qualquer coisa. Eram 6 fotos por anúncio, agora são 3. As outras 3 são pagas. Inventaram o subtítulo e reduziram o tamanho do título principal, já que o subtítulo também é pago. (A pouco tempo, inventaram taxa de modificação de anúncio.)

Depois eles pioraram a busca e a forma de vizualizar os produtos. Ficou muito mais difícil localizar os produtos que você quer. A busca trás coisas genéricas muitas vezes. Também proíbem que usemos formas de pagamentos como PagSeguro ou Pagamento Digital. Isso me parece venda casada ou prática anti-competitiva. Temos que o usar o sugador de dinheiro que é o Mercado Pago, que rouba dinheiro das duas partes na transação.

No meio do caminho, graças a Deus (UOL), veio o Toda Oferta, para ajudar mais ainda o ML a afundar. Como se não bastasse, ele fizeram a estupidez de tirar dos vendedores a possibilidade de ver a quantidade de visualizações dos anúncios, que depois de muita reclamação, voltou quase ao normal.

Para piorar, eles dificultaram muito que o comprador indentificasse o vendedor do produto e vice-versa. Agora você nem sabe mais o apelido da pessoa que está vendendo o produto. Você precisa clicar em mais informações e depois pedir para ver o perfil do vendendor. 2 clique a mais.

O vendedor, quando responde uma pergunta, também não consegue mais ver quem fez qual pergunta. Acreditem, é bizarro. Enquanto isso, no Toda Oferta você pode até usar o messenger do UOL.

O fim da picada foi o novo sistema de qualificação, que jogou a qualificação de todo mundo pro buraco só porque alguns compradores fantasmas não compram. Quem tem 40 ou 50 vendas também SE FUDEU BONITO, porque ficou no meio da tabela. 50% de qualificação. Mesmo que você não tenha nenhuma qualificação negativa.

Só quem se deu bem nessa história são os super vendedores. Lojas que já tem mais de 500 vendas. Então, o que fazer?

No meu caso, é obvio, mesmo com 100% positivo, eu fico com 50% de qualificação, então, não vou vender mais porque ninguém vai comprar. Meus anúncios já estão no Toda Oferta a um tempo. Vende menos, mas vende. O negócio é migrarmos para o Toda Oferta, fazermos uma campanha e torcer para que o Ebay venha para o Brasil e chute a bunda do Mercado Livre. No Ebay a política é completamente diferente.

Vamos lá, aqui está o link das reclamações novamente.

http://www.mercadolivre.com.br/jm/ml.faqs.framework.main.FaqsController?pageId=frmContact&faqId=2748&categId=CNTC

 Ainda tem o e-mail direto de lá: crm.ml@mercadolivre.com

Existem outras coisas que o ML fez para piorar a vida dos vendedores que eu nem mesmo lembro agora, mas que outras pessoas lembrarão. Você que entrou aqui deve lembrar.

Net Virtua Caindo com Roteador Wireless e Modem Arris

Eu já escrevi um post aqui no blog sobre como resolver o problema do roteador Belkin Wireless caindo com o modem da Arris no Net Virtua e percebi que tem muita gente procurando por isso.

A solução apareceu quando eu troquei meu Beklin por um D-link. O Belkin era infinitamente melhor, mas não funciona com o cable modem Arris.

Eu havia me esquecido de contar uma coisa. Liguei na net pedindo para trocar o Arris por um Motorola porque conversei com algumas pessoas que tinham o motorola e tudo funcionava perfeitamente. A maldita NET se recusou, falou que só trocaria se eu estivesse com algum problema no maldito cable modem.

Bom, o meu roteador Belking funcionava com a Brasil Telecom (Oi) perfeitamente, porque não funcionava coma NET? O problema estava onde então? Não adiantava clonar o MacAdress, não funcionava direito, vivia caindo.

Eu juro que quase fritei o cable modem da Arris para obrigá-los a trocar. Seria simples. Era só ligar dois cabos 110V ou 220V no meu do Arris, passando os cabos pela ventilação do modem. Ai eles teriam que trocar e eu ia dizer que queimou. Deu um pique de luz. Eles só tem técnicos incompetentes, não iam diagnosticar nada mesmo. Não que eu esteja incentivando alguém a fazer isso. Não é isso.

Mas ai apareceu uma alma querendo trocar meu Belkin pelo D-link e eu não precisei fazer aquilo que passava pela minha cabeça insistentemente. De qualquer forma, queria deixar registrado que não recomendo o NET Virtua para ninguém. Me irritei infinitamente com o suporte deles diversas vezes.

quinta-feira, 14 de janeiro de 2010

Como separar um data.fs para cada site no Zope

Muita gente que começa a trabalhar com Plone e Zope tem problemas com o banco de dados unificado e quer saber como separar um banco de dados para cada site que está no servidor por exemplo. Veja abaixo como se faz. É bem simples.

   A separação do arquivo de banco de dados do Zope (data.fs) em um arquivo por site é interessante. Primeiro, você consegue saber quanto espaço cada site ocupa com muita facilidade. Você pode fazer um pack e limpar os objetos do historico sem a necessidade de apagar o histórico dos outros sites. Em caso de restauração de backup, você não perde informações de todos os sites. Apenas de um.

    O conceito envolvido na separação é o de ponto de montagem, como no linux. Você vai dizer para o zope que tudo que for colocado naquele ponto de montagem será armazenado dentro de um certo arquivo.

    A primeira coisa a fazer é abrir o arquivo zope.conf que está dentro de INSTANCE_HOME/etc. Dentro dele, procure pelo texto "". Deve estar próximo ao final do arquivo. Em seguida, logo abaixo, adicione o código como o exemplo abaixo

<zodb_db NOME_SITE1>
# Armazenamento do NOME_SITE2
<filestorage>
      path $INSTANCE/var/NOME_SITE3.fs    
</filestorage>    
mount-point /NOME_SITE4
</zodb_db>

Repare que eu coloquei NOME_SITE1 até 4. Normalmente, coloco o mesmo nome em todos os lugares, mas isso não é obrigatório. Apenas facilita a vida na hora de identificar as coisas.

NOME_SITE1 é o que vai aparecer no ZOPE. O nome do armazenamento na hora de criar o ponto de montagem.

NOME_SITE2 é apenas um comentário

NOME_SITE3 é o nome do arquivo que vai armazenar seus dados

NOME_SITE4 é o ponto de montagem em sí. A pasta onde você terá que gardar seu site e tudo referente a ele. Deste ponto em diante.

Altere seu arquivo de configuração, envie para o servidor e reinicie o zope. Como exemplo, vou criar um data.fs para um site chamado WICS.

Acesse a ZMI e escolha a opção de adicionar novo Mount Point, conforme a imagem a seguir:


Depois disso você será enviado para uma outra tela que mostrará quais são os data.fs que estão prontos para serem criados. Você seleciona os que desejar e clica em "Create Selected Mount Points". Veja a imagem abaixo para maiores detalhes.


No meu caso, foi criada uma pasta WICS na raiz do meu servidor zope. Tudo que for criado dentro desta pasta ou eu seus sub-diretórios também será armazenado dentro do data.fs exclusívo do ponto de montagem.

Se você tentar mover um site que esteja fora desta pasta para dentro dela, o site será movido, mas continuará no data.fs antigo. Para mover um portal de um data.fs para outro é necessário exportá-lo e importá-lo novamente dentro do local desejado.

Alterando Dados do Usuário (Member) no Plone 2.5

Você quer fazer alteração em Massa nos dados dos seus usuários  no Plone e não sabe como? Tenta de tudo e só consegue alterar os dados do seu usuário ou da privilégios insuficientes? Você está no lugar certo então.

O que está escrito aqui, eu tenho certeza que é verdade para o Plone 2.5. Ainda não utilizei a versão 3 direito. Estou atrasando este encontro ao máximo.

Mas o problema dos usuários é o seguinte: Se você tentar utilizar o código member.setProperties() para alterar informações dos usuários (Members do Plone) que não seja o usuário logado, nada vai acontecer.
Este método só altera informações do usuário logado. O método que você precisa usar é: member.setMemberProperties(). Esse método fará a alteração no usuário que está na variável member, o outro não. Faça algo como

member.setMemberProperties({"nomePropriedade",valor})

Só tem um probleminha. Este método não é autorizado a ser chamado no Plone via ZMI. Então, vai dar erro de privilégios insuficientes e você vai ficar morrendo de raiva. Se quiser utilizá-lo. Tem três formas: External Method (é a mais simples), criar um produto ou autorizar este método em um script python que sobre junto com o Plone.
Faça um External Method. Como? Bom, ai é uma outra dica. Não essa.

segunda-feira, 4 de janeiro de 2010

Problemas com Charset no GWT + Google App Engine no Eclipse

Assim que comecei a usar o GWT com o Google App Engine no Eclipse e no windows, notei um problema, a acentuação. Tenho quase certeza que isso não acontece no Ubuntu porque lá é tudo UTF-8, pelo menos era da última vez que mexi.

Como o windows não usa UTF-8, a primeira coisa que eu tentei foi mudar o encode do HTML para ISO-8859-1 e não funcionou. Então, a solução é: deixe o HTML como UTF-8 e mude o workspace do eclipse para UTF-8. Vá no menu window -> preferences e veja a imagem abaixo.



Pronto, seu workspace está configurado corretamente. O detalhe é que eu estou usando um workspace só para os projetos do GWT + Google App Engine. Se você estiver com outros projetos que usam outras configurações de charset no mesmo workspace, aí você precisa procurar em preferences de cada projeto e fazer essa alteração.