Programação e Linux.

Mostrando postagens com marcador python. Mostrar todas as postagens
Mostrando postagens com marcador python. Mostrar todas as postagens

sexta-feira, 17 de dezembro de 2010

Remover acentos

Quando se está fazendo uma pesquisa de palavras em um banco de dados é melhor converter todos os caracteres acentuados em seus correspondentes sem acentos. Pesquisei e descobri que não é difícil fazer isto.

Por isso fiz alguns exemplos, um em php usando iconv, em python usando o suporte nativo da linguagem. Acredito que o exemplo usando iconv possa ser usado em C/C++ (man 3 iconv) visto que funciona em linha de comando (man 1 iconv) como mostrado no último exemplo.

(17/12/2010) Há também um exemplo em perl como pedido por Aurélio

Em todos os exemplos eu uso UTF-8.

Exemplo em php:

setlocale(LC_ALL, 'en_US.UTF8');

$string = "Iúri Diniz come açúcar";
echo iconv('UTF-8', 'ASCII//TRANSLIT', $string) . "\n";

Exemplo em python:

import unicodedata

string = "Iúri Diniz come açúcar"

print unicodedata.normalize(
"NFKD", string.decode('utf-8')).encode('ascii', 'ignore')

Exemplo usando linha de comando(bash):

echo "Iúri Diniz come açúcar" | iconv -f "UTF-8" -t "ASCII//TRANSLIT"


Exemplo usando perl:

use Text::Iconv;
$converter = Text::Iconv->new('UTF-8', 'ASCII//TRANSLIT');
print $converter->convert("Iúri Diniz come açúcar")

quinta-feira, 15 de janeiro de 2009

Instalar Plone 3.1.x no CentOS 5.2

O Plone é um CMS que roda em cima do Zope, que por sua vez é um servidor de aplicativos feito em python.

Para instalá-lo, eu preferi usar o instalador unificado, ele instala o python (mas pode-se usar o python do CentOS), o Zope e o Plone.

Primeiro é necessário baixar o Plone e descompactá-lo, para versão 3.1.7 faça assim:

wget http://launchpad.net/plone/3.1/3.1.7/+download/Plone-3.1.7-UnifiedInstaller.tgz
tar xvzf Plone-3.1.7-UnifiedInstaller.tgz

Para compilar, faz-se necessário que alguns pacotes sejam instalados, faça:
yum -y install zlib-devel
yum -y install libjpeg-devel
yum -y install gcc

yum -y install gcc-c++

yum -y install libxml2-devel
yum -y install openssl-devel

yum -y install readline-devel

Existe duas formas de instalação, Cluster e Standalone. Cluster é ideal para fazer balanceamento de carga e fazer proveito do uso de vários processadores se o sistema possuir mais de um.

Para instalar a versão Cluster faça:
./install.sh zeo

Para instalar a versão Standalone faça:
./install.sh standalone

O instalador permite instalar várias instâncias do Plone, basta passar um nome diferente para cada usando a opção --instance=nome.

O instalador vai usar o diretório /opt/Plone-3.1 como base para instalação, todas as instancias vão ser instaladas neste diretório, é possível mudar isto usando --target=diretório-para-instalação.

Eu preferi compilar um python só para o Zope, mas é possível fazer com que o instalador use o python do sistema usando a opçao --with-python=diretório-do-python.

Para ver mais opções do instalador faça:
./install.sh --help

Aqui eu instalarei uma instância Standalone de nome myplone-single, então:
./install.sh --instance=myplone-single standalone

O python é compilado e instalado em /opt/Plone-3.1/Python-2.4
e a instância do plone em /opt/Plone-3.1/myplone-single e a senha do Zope fica em /opt/Plone-3.1/myplone-single/adminPassword.txt

Para iniciar a instância faça:
/opt/Plone-3.1/myplone-single/bin/instance start

Agora acesse o Plone via:
http://meudominio:8080/Plone

Site Error
Se você receber 404 Not found, Sorry, the requested resource does not exist é porque durante a instalação por algum motivo o Plone não foi instalado dentro do Zope. Você deve fazer isso na mão, acesse a interface administrativa do Zope via http://meudominio:8080/manage, vai ser pedido o nome do usuário e a senha (veja o arquivo /opt/Plone-3.1/myplone-single/adminPassword.txt), escolha Plone Site no menu e clique em Add.
Preencha as informações na tela seguinte, Id será usado como path da URL, neste caso use 'Plone' para obter a url http://meudominio:8080/Plone.
Clique em Add Plone Site e pronto.

Referência:
http://plone.org/documentation/tutorial/installing-plone-3-with-the-unified-installer

terça-feira, 16 de dezembro de 2008

Programador velho, linguagem nova: Leia um bom livro [Era: utilidades do java]

Me considero programador em apenas 4 linguagens: Perl, C, Java e Python, nesta ordem de aprendizado. Em todas estas, além de gostar e ter escrito muito código nelas, eu as acompanho vendo suas novidades, suas tendências, seus padrões, sua filosofia e participando de alguma lista.

Para muitos amigos meus programadores, Java é horrível, concordo em vários pontos, mas só pude ter uma opinião concreta quando aprendi mais sobre ela e após isto considero java uma linguagem com muitas idéias legais. Contudo Java definitivamente não é, e nunca vai ser, minha linguagem preferida, não a odeio como outros programadores, também não a defendo como ela sendo o estado da arte como muitos dos seus programadores fazem, deixei de ser xiita.

Mas figuras como estas, são no mínimo muito engraçadas: "Por que java é útil?"

De http://www.danilocesar.com/blog/2008/11/26/porque-java-ainda-e-util/

Não gosto deste livro, já o li, para mim o melhor livro de java, apesar de antigo (Java 5.0), é o Learning Java da O'Reilly. É essencial que um programador saiba programar em uma linguagem seguindo sua filosofia, o da O'Reilly faz isto, o da Deitel não.

É horrível ver um programador C fazer programas em Python como se fosse C.

Aqui vai meu apelo: Se você realmente quer aprender uma linguagem de programação nova, leia um bom livro sobre ela e participe da comunidade, só porque já sabe programar, não garante que você vai fazer um programa bom em outra linguagem.

Aproveitando, linguagens que já programei/estou programando e gostei/estou gostando: haskell, scheme, mxml+actionscript (junto, não separado). Linguagens que já programei/estou programando e não gostei/continuo não gostando: php, tcl/tk, C++.


quinta-feira, 21 de agosto de 2008

Slides palestra de 'Python no Celular' CeSOL

Ontem dia (20/08/2008) fiz minha palestra no CESOL, sobre python e Series 60, Mostrei como usar os recursos disponíveis no celulares Series 60 da Nokia usando Python como linguagem
No primeiro momento eu falei sobre python, nokia, symbian, a implemetação do python para o Series 60.

Após isto iniciei a parte dinâmica (slides 22 e 23) da palestra onde eu abria um console remoto (meu computador conectado no console python do celular) e fazia pequenos scripts para usar as funcionalidades do celular usando apenas python. O meu roteiro desta parte segue abaixo:
############################
# Abrir tres terminais
# Ligar o rfcomm
sdptool add --channel=2 SP
sudo rfcomm listen rfcomm2 2

####
# ir no celular e ativar o console bluetooth
#####
# Abrir o minicom em outro terminal

minicom
#######################
# no terceiro terminal
# procurar dispositivos

sudo hcitool scan

######################################
# DENTRO DO MINICOM
######################################
# PYTHON
# Coisas basicas
import os

# nome do os
os.name

# diretorio atual
os.getcwd()

os.listdir(u"e:\\")

# mostrar a hora atual
import time
time.ctime()


################################3
# SMS

# enviar um sms
import messaging
messaging.sms_send('08584166618', u'Somente um teste')

# receber um sms
import inbox
i = inbox.Inbox()

# receber sms
def my(msgid):
print msgid

i.bind(my)

########
# Aqui vai aparecer uma mensagem com o numero (copiar para abaixo)

# entao mostrar a mensagem
i.content(1049305)
i.address(1049305)
i.time(1049305)

# formatar para o tempo correto
from e32db import format_time
format_time(i.time(1049305))

#########
# Ligar para alguem

import telephone

telephone.dial('88752334')

telephone.hang_up()


#########################
# Agenda

import contacts

# mostrar contatos:
db = contacts.open()
for i in db:
print db[i].title

# adicionar um contato
c = db.add_contact()
c.add_field(u"first_name", value=u"CESOL")
c.add_field(u"last_name", value=u"UFC")
c.add_field(type=u"mobile_number", value=u"2008")
c.commit()

# Mostrar os contatos
for i in db:
print db[i].title

# Mostrar meu contato
c
c.id
db[c.id]

for e in c:
print e.type, e.value

# exportar um vcard
vcards = db.export_vcards([c.id])

# gravar o arquivo

filename = u"e:\\test.vcf"
f = open(filename, "w")
f.write(vcards)
f.close()


# PEDIR PARA LIGAR O BLUETOOTH
# enviar para alguem da plateia
# sudo hcitool scan

from e32socket import *
cel1 = "00:17:E3:F9:D6:D3"
#cel1 = '00:09:DD:50:0C:C5'
phone = bt_obex_discover(cel1)
bt_obex_send_file(phone[0], phone[1].values()[0], filename)


# apagar o contato
del db[c.id]
# Mostrar os contatos
for i in db:
print db[i].title

# reimportar o contato
db.import_vcards(vcards)

###########################
# Parte grafica (fazer um aplicativo)

# mexer no celular

# fazer um hello world

from appuifw import *

# desenhar o hello world
t = Text()
t.set(u"Hello python")
app.body = t

# como ninguem ta vendo, vamos tirar um screenshot da tela e enviar para alguem

import graphics

pc = '00:09:DD:50:0C:C5'
phone = bt_obex_discover(pc)
image = graphics.screenshot()
filename =(u'e:\\pic001.jpg')
image.save(filename)
bt_obex_send_file(phone[0], phone[1].values()[0], filename)

# enviar para eu mesmo
# ligar o bluetooth obex server

# fazer funcao para realizar screenshot e enviar para alguem
def ss(to='00:09:DD:50:0C:C5'):
phone = bt_obex_discover(to)
image = graphics.screenshot()
file =(u'e:\\pic001.jpg')
image.save(file)
bt_obex_send_file(phone[0], phone[1].values()[0], file)

#ss()

###
# Desenhar um retangulo

# mexer no celular

from random import randrange
app.body = canvas = Canvas()
color = randrange(0xffffff)
canvas.rectangle((0, 0, 100, 100), fill=color)

# enviar para eu mesmo
ss()

# desenhar uma seta de mouse
x,y = 20,20
arrow = [(0,0), (0,10), (2,8), (4,12), (6,11), (4,7), (7,7)]
canvas.polygon([(x+dx,y+dy) for dx,dy in arrow], 0, 0xffffff)

# enviar para mim mesmo
ss()

###################
# Camera
import camera
image = camera.take_photo()

# enviar para alguem
filename =(u'e:\\pic001.jpg')
image.save(filename)

cel1 = '00:17:E3:F9:D6:D3'
# cel1 = '00:09:DD:50:0C:C5'
phone = bt_obex_discover(cel1)
bt_obex_send_file(phone[0], phone[1].values()[0], filename)

# fazer um sistema de monitoramento?
# usar gprs/internet

#################
# Arquivo de audio?

import audio

filename = u"e:\\audio.wav"
s = audio.Sound.open(filename)

# gravar
s.record()

# parar
s.stop()

# tocar
s.play()

# fechar
s.close()

enviar para alguem
cel1 = '00:17:E3:F9:D6:D3'
# cel1 = '00:09:DD:50:0C:C5'
phone = bt_obex_discover(cel1)
bt_obex_send_file(phone[0], phone[1].values()[0], filename)

# apagar o arquivo
os.unlink(filename)

# Fazer um Servico jornalistico?