Blog do Petry

outra tentativa de manter um blog vivo na net...

Essa semana tive que implementar em um dos meus projetos um sistema de busca full-text. como estou utilizando o Mysql, ele possui um mecanismo de pesquisa integrado. Há outras bibliotecas de pesquisa como o Lucene, Xapian e Sphinx e todas elas possuem modulos para integra-las ao Django(django-search-lucene, djapian e django-sphinx ) mas no meu caso, como estou utilizando uma hospedagem compartilhada, tenho certas restrições para instalar algumas bibliotecas, portanto tive que partir para esta alternativa.

Bom, vamos ao que é necessário para funcionar a busca:

digamos que você possui um model de noticias:

class Artigo(models.Model):
data_publicacao = models.DateTimeField("Data de Publicação", default=datetime.now)
titulo = models.CharField(max_length=200)
slug = models.SlugField()
texto = models.TextField("Texto da noticia")

class Meta:
ordering = ['-data_publicacao']
get_latest_by = 'data_publicacao'

def __unicode__(self):
return self.titulo


Como esperado, o código acima vai gerar um tabela no banco, mas, para a busca funcionar corretamente, teremos que criar "no braço" um índice fulltext para efetuar a busca. Como estamos utilizando o mecanismo de busca do próprio banco. O índice será atualizado automaticamente quando registros são inseridos, atualizados, ou excluídos, de modo que os resultados da pesquisa nunca estarão desatualizada. A declaração CREATE INDEX é utilizado para criar o índice:
CREATE FULLTEXT INDEX fti_noticias_artigo ON noticias_artigo(titulo,texto)


Bom agora teremos que estender esta funcionalidade ao ORM do Django e criar um manager para o model em que você quer fazer a busca. Para isso simplesmente copie este código no seu models, ou melhor, coloque em um arquivos separado, já que você poderá aproveitá-lo em outros models!

Agora, chame o manager do código, atribuindo ao atributo objects (ou qualquer outro que você criar) passando como parâmetro os campos que você indexou no mysql:
objects = SearchManager(('titulo', 'texto'))


e está pronto!

agora para realizar alguma busca utilize o seguinte comando:

Artigo.objects.search('minha busca')


o método search executará uma consulta, verificando se a string que você enviou se encontra em um dos campos que você estabeleceu no seu SearchManager.

algo mais ou menos assim:
SELECT titulo, data_publicacao, slug, texto, MATCH(titulo, texto) AGAINST ('minha busca')
AS `relevance`
FROM noticias_artigo
WHERE MATCH(titulo, texto) AGAINST ('minha busca')


O seu manager também inclui um campo extra na sua consulta chamado relevance, que é o indice de relevância da sua pesquisa. Desse modo é possivel efetuar uma ordenacão através deste campo.

Artigo.objects.search('minha busca').order_by('relevance')


bom era isso! qualquer duvida, reclamação, ou colaboração de código, é só comentar!

Chegou a hora de votar para escolher os convidados internacionais da Conferência Python Brasil 5.

Qualquer interessado pode votar, não é preciso ser membro da
Associação Python Brasil (APyB).

Visite a página dos candidatos para saber quem é quem, e conhecer os detalhes sobre o processo de escolha.

Para votar, utilize este formulário. Você pode votar em um ou dois candidatos.

O prazo final para votar é 26/4 (domingo) e o resultado da votação será publicado dia 27/4.

O candidato mais votado será convidado pela APyB para vir à nossa Conferência Python Brasil 5 em Caxias do Sul, com passagens e hospedagem paga.

Os conselheiros e diretores da APyB convidarão também um segundo palestrante, escolhido entre os candidatos, independente da classificação dele na votação.

Foi criado por Jose Soares da Washington Times o site DjangoTidbits que é mais ou menos o famigerado Django Snippets.

O DjangoTidbits, além de um layout, na minha opinião, mais bonito, possui outros recursos como um controle de revisões do código, a opção de fazer uploads dos arquivos através de um arquivos compactado - ou não, e, o mais importante tem uma busca!!!!!!

Por enquanto o site possui poucos snippets, ou melhor tidbits, mas acredito que seja questão de tempo, pois achei este novo recurso *muito* melhor que o seu antecessor!

Com o Django Code Search é possivel realizar uma pesquisa no código do próprio framework.




Atratves dele, é possível encontrar atributos de classe ou até mesmo a definições de funções. É leve e rápido, é ma ferramenta a ser usada pelos djangers!

Eu sempre procurei um serviço decente para guardar meus arquivos mais usados, até pq como sou muito esquecido, normalmente deixo meu pendrive em casa ou perco ele ¬¬. Cheguei a colocar algumas coisas no meu gmail, através do gmailfs, mas sei lá, tinha um cheiro de gambiarra no ar que não me agradava mto!



O DropBox serviu como um luva pra mim. Ta certo que 2Gb não é aqueela maravilha de espaço! mas pra quem não quer deixar um cópia do seu HD online, ele dá pro gasto. Ele possui clientes para windows, linux e Mac, testei os dois primeiros e funcionam perfeitamente!

Assim que o programa/pacote é instalado, abre na barra de tarefas, uma caixinha, clicando nela abre uma pasta com os seus arquivos, assim que um arquivo é adicionado, ele é sincronizado. Simples e fácil, exatamente o que eu queria!




Se você possuir interesse, clique nesse link e ganhe além dos 2Gb, mais 250Mb para a sua conta, e pra minha! hehe!

Apenas para tirar as traças do blog, hehehe espero que este ano eu dê mais atenção a ele!

A decisão foi tomada a tempo, mas como não foi publicada oficialmente, fiquei segurando a noticia! Mas é mais do que certo! o próximo encontro da comunidade Python brasileira será na minha cidade, mas precisamente no meu local de trabalho! Na Universidade de Caxias do Sul!



O evento agora chamdo PythonBrasil 5 acontecerá dias 10, 11, e 12 de Setembro de 2009.

Posso dizer em nome de todos os colegas de trabalho, que estamos muito felizes e orgulhosos de sermos os anfitriões deste evento e daremos todo o apoio necessário para que ele se torne um sucesso!

Mais informações estão no site da associação:

Até um tempo atrás estava usando o TIMWEB mas como a conexão aqui em Caxias do Sul é uma porcaria bem lenta, praticamnte sem acesso, migrei para a Claro 3G, a velocidade é maravilhosa! Não sei se a banda vai esguelar daqui a um tempo, mas tá ótima até o momento (o ultimo teste de velocidade ultrapassou o 1Mbps).




O único problema é que com meu modem, ele não conectava no meuatravés do Ubuntu, reconhecia somente como pendrive, depois de muita pesquisa vi que o dispositivo não está na lista de dispositivos compatíveis. Tentei de tudo! até mesmo a heresia de usar uma maquina virtual Windows com suporte a USB para tentar conectar o modem por lá, tudo sem sucesso...

Bom, não sou um expert em Linux, mas me defendo ehhehe, portanto não sei direito o que houve, se foi depois de uma atualização do SO que ele passou a funcionar, ou se foi a regra do udev, mas depois de vários passo-a-passos, um deles funcionou! Agradeço ao Laudeci Oliveira por postar no blog dele os passo corretos (cara te devo uma biritas se algum dia te ver/conhecer! hehehe).

Os passos que utilizei para conectar foram os seguintes:

criei o arquivo 50-md300modem.rules dentro de /etc/udev/rules.d/ para criar uma regra que faça o udev montar corretamente o dispositivo:

mdpetry@dv9700:~$ sudo vim /etc/udev/rules.d/50-md300modem.rules

e coloquei o seguinte código:

ACTION!=”add”, GOTO=”3G_End”
BUS==”usb”, SYSFS{idProduct}==”d0cf”, SYSFS{idVendor}==”0fce”, PROGRAM=”/bin/sh -c ‘echo 3 > /sys/%p/device/bConfigurationValue’”
LABEL=”3G_End”


reiniciei o udev:

mdpetry@dv9700:~$ sudo /etc/init.d/udev restart

instalei o wvdial e o gnome-ppp

mdpetry@dv9700:~$ sudo aptitude install gnome-ppp wvdial


e adicionei este conteudo no wndial do meu home:

mdpetry@dv9700:~$ vim .wvdial.conf

[Dialer Defaults]
Modem = /dev/ttyACM0
ISDN = off
Modem Type = USB Modem
Baud = 460800
Init = ATZ
Init2 = AT+CFUN=1
Init3 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Init4 = AT+CGDCONT=1,"IP","bandalarga.claro.com.br"
Init5 =
Init6 =
Init7 =
Init8 =
Init9 =
Phone = *99***1#
Phone1 =
Phone2 =
Phone3 =
Phone4 =
Dial Prefix =
Dial Attempts = 1
Dial Command = ATM1L3DT
Ask Password = off
Password = claro
Username = claro
Auto Reconnect = off
Abort on Busy = off
Carrier Check = on
Check Def Route = on
Abort on No Dialtone = on
Stupid Mode = off
Idle Seconds = 0
Auto DNS = on
;Minimize = off
;Dock = off
;Do NOT edit this file by hand!



pronto! iniciei o gnome-ppp e a conexão da claro estava lá! conectei e funcionou sem problemas!

alguns blogs falam q da pra melhorar a conexão alterando o dns e utilizar o do openDNS, eu não precisei a velocidade está boa assim...