Skip navigation.

Django & Tangos

Baby steps to a lovely web

.

agora eu entendo o que Ian Curtis queria dizer

Then love, love will tear us apart again

Coma menos sashimi

, ,

Ou melhor, o ideal é que não comessem, mas como ainda se acredita na "lei do mais forte" lembrem-se que apesar da Terra ser 70% de água, os peixes também podem entrar em extinção, entre eles, o Atum.

http://dotearth.blogs.nytimes.com/2008/11/26/the-tuna-tragedy-of-the-commons/

Log binário MySQL

Não entendo muito de MySQL, só sei que nunca fui muito com a cara dele. Preconceito puro, admito, mas se eu posso usar o PostgreSQL, eu uso.
Agora, tive um problema em um banco MySQL com relação à espaço em disco. Não entendia o que diacho estava consumindo todo meu diretório /var/lib/mysql até que brincando no PhpMyAdmin descobri um tal de log binário com dúzias de arquivos de até 1Gb. Procurando no Google encontrei um comandinho bem safado

 PURGE MASTER LOGS BEFORE '2008-11-07 22:46:26' 


e pronto, limpei esses arquivos.
Descobri que são usados para replicação, recuperação de dados e tudo mais, bacana, mas ainda assim não me convenceram que é melhor que o postgresql :wink:

Utilitários rápidos e projetos

, ,

Enquanto estou na correria da segunda etapa do projeto que estou envolvido me deparei com algumas necessidades.

Precisava de uma ferramenta de Wireframe, já tinha visto o Pencil para Firefox (e agora tem uma versão standalone), mas não gostei muito das imagens, então encontrei este tópico com uma coleção bacaninha no visual do Second Life. Tem uma postagem com um arquivo em anexo, basta baixar o arquivo, extrair e abrir e instalar o arquivo Zip do diretório extraído no Collection do Pencil.

Outra coisa também, precisava de um visualizador de PSD e encontrei o XNView, não sei se alguém tem uma sugestão melhor, mas eu gostei dele.

Aptana and Pydev

, ,

Aptana é um dos melhores programas para desenvolvimento web (baseado em Eclipse) e agora você não precisa mais ter conhecimentos um tanto especificos que o Eclipse necessita. Você pode baixar o PyDev agora para o Aptana Studio: http://www.aptana.com/python

Advanced Django search with Sphinx and Postgresql

, ,

Uma das maiores preocupações para o nosso projeto era fazer pesquisas Full Text Search sem sobrecarregar o banco de dados. Apesar de o Postgresql 8.3 ter integrado o TSearch, ainda não estávamos satisfeitos com a performance de maneira geral. Por isso optamos pelo Sphinx, um sistema de busca que faz a indexação e tem uma boa integração com o Django. Assim, não temos problema com sobrecarga do banco para a pesquisa e o resultado de muitas pesquisas é quase instantâneo. O maior processamento está na parte do ORM do Django para inicializar o valor de todos os itens, o que é esperado.


O tutorial do David Cramer é bem completinho, só quero complementar algumas coisas:

Ao fazer o sphinx.conf para o serviço do Sphinx, utilize uma classe padrão e herde para todos os seus índices, aqui vão exemplos do nosso arquivo, note que criamos um índice para as notícias do dia, podendo assim indexar em intervalos curtos sem sobrecarregar o servidor. Eu preferi fazer o arquivo na mão, mas o django-sphinx tem um comando
generate_config_for_model
que gera o arquivo de configuração para você, vale a pena dar uma olhada.

#classe base com informações de conexão
source base
{
type= pgsql

sql_host= 1.1.1.0
sql_user= user
sql_pass= password
sql_db= dbname
sql_port= 5432
}

#índice de notícias de hoje
source news_current : base
{

sql_query= \
SELECT id, section_id, DATE_PART('epoch',published_date) as published_date, headline, story \
FROM news_news WHERE published_date >= (current_date) 

sql_attr_uint= section_id
sql_attr_timestamp= published_date

sql_query_info= SELECT * FROM news_news WHERE id=$id
}


index news_latest
{
source= news_current
path= /var/data/news_general
docinfo= extern
charset_type= utf-8
}



#índice de notícias dos últimos 30 dias

source news_thisyear : base
{
sql_query= \
SELECT id, section_id, DATE_PART('epoch',published_date) as published_date, headline, story \
FROM news_news WHERE published_date >= (TIMESTAMP '2008-01-01 00:00:00') \
and published_date < (current_date)

sql_attr_uint= section_id
sql_attr_timestamp= published_date

sql_query_info= SELECT * FROM news_news WHERE id=$id
}


index news_recent
{
source= news_thisyear
path= /var/data/news_recent
docinfo= extern
charset_type= utf-8
}




Outro ponto que não fica muito claro é que é necessário recriar o índice de pesquisa do Sphinx sempre que possível pois ele só se conecta ao banco de dados quando você dá o comando
indexer --nome_indice
e pode ficar algum conteúdo desatualizado.
Por isso colocamos no cron um processo de indexação a cada 10 minutos da notícia do dia, um processo diário das notícias dos últimos 30 dias e um processo mensal de todo o arquivo de notícia do site, assim fica tudo sincronizado sem sobrecarregar o banco.

Outro ponto importante é como deve-se trabalhar com o Timestamp do Postgresql e o Sphinx. Tivemos que usar a função DATE_PART('epoch',published_date) para que ele devolva a data como um inteiro. Também tem um problema com boolean como mencionado aqui.

É isso aí, pesquisa eficiente e sem dor de cabeça é com o sphinx. Muito em breve vamos ter uma necessidade de pesquisa em muitos conteúdos diferentes com um projeto bem maior, postarei comentários :wink:




Abstract: We're using Postgresql and Sphinx for our searches and it has been great. Really fast and reliable. We could get it done quickly following David Cramer's post but I want to point some things:

1st: On sphinx.conf, use a base class for your database connection and extends your indexes from it.

2nd: Split big queries that can change and those that probably won't change so soon. We have a News site so we have one index for today, for the last 30 days and one archive. So we just have to index every 5 minute a small amount of data that must be keep up to date, and on bigger intervals for the rest of them.

3rd: To use timestamp fields on your index, make sure you are using DATE_PART('epoch',published_date) so it will be converted to integer as Sphinx expects. There's also a problem with boolean fields as mentioned here.

Problema com Subversion e Apache

,

Tive um problema com o svn algum tempo atrás que estava relacionado à uma configuração de VirtualHost.
Toda vez que tentava fazer um commit em um determinado arquivo eu tinha um erro de propfind "PROPFIND request failed" e me dava o retorno "200 OK".
Ou seja, ele estava considerando alguma URL e não retornando os comandos do SVN (ou algo do tipo).
Tudo porque o Location estava no global e havia um VirtualHost definido. Depois que coloquei o Location /svn dentro de um VH, tudo funcionou tranquilo.
Este post que me deu a luz.

Ok, será que este é um segundo sinal para pensar em fugir do SVN?

Criando e mantendo um branch SVN

,

Hoje fiz o primeiro uso real de um branch do SVN, até agora só havia usado as tags.
Como a migração para o Django 1.0 é algo que vai mexer com muitos arquivos, criei um branch django_migration usando o Tortoise SVN (que é uma mão na roda).

Para criar um branch siga os passos:
1 - Comite todas as alterações pendentes
2 - Com o botão direito na pasta do repositório,selecione Branch / Tag (copie o código da revisão, você vai precisar dele para fazer o merge)
3 - Informe o novo diretório, normalmente //my/repo/branches/branch_name, se não houver um diretório branches, crie usando o Repo Browser
4 - Dê um switch no diretório atual para apontar para o novo branch


Faça todas as alterações necessárias e comite, quando quiser fazer um merge das alterações no trunk você pode:

Utilizar o Merge / Reintegrate a branch que pode causar problemas, por exemplo, para mim sempre aparecia a mensagem "Cannot reintegrate into a working copy a switched subtree"
Mesmo sendo os passos deste post não funcionou.

Então você pode fazer um Merge / Merge two different trees seguindo os passos:
- Selecionar no primeiro grupo de campos o trunk e a versão onde aconteceu a cópia
- Selecionar no segundo grupo o branch e a versão atual ou HEAD
- Resolva os conflitos e pronto, suas alterações estão no trunk novamente

Caso queira fazer por linha de comando, veja este post.

Django debug toolbar

,

Instalei o Django Debug Toolbar e realmente é muito bom, bem completinho, dá uma visão geral de todas as pesquisas ao banco, tempo, mostra o conteúdo dos selects, permite ver os templates usados e muitas outras funçõezinhas bacanas, mas convenhamos, demora MUITO. Meu site tem 227 queries na página principal e demora cerca de 2 a 3 minutos para exibir, além disso, toda vez que vou fazer uma ação um pouco mais "complicada" como um Explain ou Profile o site trava. Ou seja, tenho que usar o Google Chrome senão toda hora tenho que reiniciar o Browser. Outro problema com ele, Porque não é SVN? Tenho que ficar baixando um zip toda vez ou instalar mais um programa?
Falando sério, se você só quer uma estatística das SQLs, o DebugFooter é mais do que suficiente, pelo menos até o toolbar se tornar mais viável para aplicações com muito acesso ao banco, para páginas gerais ele funciona razoavelmente bem.

nota: acabei de ver que o Debug Toolbar intercepta também os posts para mostrar as informações, muito bom =)



Abstract: I installed Django Debug Toolbar which is great but SO slow (up to 3 minutes to load a page with 227 queries!) that I cannot afford it as general debug, so I will keep with the old and stable DebugFooter and the Debug Toolbar only for deeper debug and I have to use Google Chrome, other browsers just freeze.

Linha vegetariana Superbom

, , ,

Ontem comprei os novos produtos enlatados da Superbom. Realmente deliciosos, vale a pena experimentar.
Mas qualquer semelhança com os produtos da Sanitarium são mera coincidência. E o nome da linha "Soy good", realmente nada parecido com o nome de outra linha da mesma empresa. Mas é "So good".
Agora, está na hora de alguma empresa trazer os produtos da linha So Good para o Brasil. Aquilo sim é comida vegan para os paladares mais exigentes.
January 2010
M T W T F S S
December 2009February 2010
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31