World PloneDay 2008

World Plone Day, o dia para falar sobre Plone.
A Simples Consultoria se une à comunidade Plone para em 7 de novembro de 2008 divulgar o Plone para o mundo.

É um sistema gerenciador de conteúdo robusto que tem como objetivo proporcionar uma experiência agradável as pessoas que publicam conteúdo.

Escrito em Python, roda sobre o servidor de aplicações Zope, o que lhe proporciona alto nível de segurança da informação e de produtividade de desenvolvimento.

O Plone é focado no usuário final e sua interface administrativa é fortemente integrada ao website final, permitindo uma administração mais intuitiva do conteúdo e, desta forma, melhor edição final do website ou portal.


A música fala do Emacs, mas a letra foi escrita em Vi...



I Tried Emacs (Pit Party '08)

With apologies to Katy Perry. The University of Washington Computer Science and Engineering (CSE) Band at the annual CSE pit party, 9/27/08.
This version of the UW CSE Band consists of Alex Colburn, Laura Effinger-Dean, Andrew Guillory, Natalie Linnell, Kristi Morton, and Pradeep Shenoy. Lyrics:vi... Certo, mas que isso tem com Python?? O.o
Emacs e Vi são os melhores editores para script's de Python!!! Há ainda quem discorde disso, mas tudo bem vai... Ninguém é perfeito!!! =D

Python-UNO bridge on OOo3.0.0

IMPORTANT: Workarounds for pyuno problems in OOo3.0.0

There are some problems with pyuno in OOo3.0.0 (in particular with the python executable). Here the known problems and the workarounds for the moment .
  1. (windows only) The python scripting framework (scripts within openoffice via Extras/Macro/) does not work, when you have a python 2.3 installed on your windows system (more precisly, when there exists a python23.dll in your windows/system32 directory). You can work around it for now by copying Basis\program\python23.dll to program\. beside the soffice.bin executable. This forces the soffice process to load the correct library beside the office process. (94993)
  2. (windows only) When you try to connect to a running office process, you get
     __main__.com.sun.star.connection.NoConnectException: Connector  couldn't connect to socket (WSANOTINITIALISED, WSAStartup() has not been called) 
  3. You can workaround this, by placing a
    import socket
    in the top of your script (95028)
  4. (windows only) The python program crashes or you get an attribute error
    AttributeError: getCurrentComponent  (or some other attribute)
    This is because the types could not be loaded due to changes in the uno bootstrapping mechanism. You can work around it for now by setting the URE_BOOTSTRAP variable (adapt to your installation path, replace every space with a %20, change \ to /).
    set URE_BOOTSTRAP=file:///C:/Program%20Files/OpenOffice.org%203/program/fundamental.ini
    and run python. Alternatively, you can set URE_BOOTSTRAP=fundamental.ini when your current working directory is beside the python executable. (95024)
  5. (windows only) Interactive mode in python does not work correctly When you start the python executable without parameters, the interactive session runs somewhat fuzzy (at least on my machine). When you get the prompt >>>> , everything you type will be interpreted as a shell command. When you then just press return, you are prompted with your current working directory, here you can place a python command, so in short, you have to press return 2 times after every python command (95037).
  6. ( unix only), you need to set LD_LIBRARY_PATH correctly before starting the python executable, eg.
      export set LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../../openoffice.org/ure/lib:../../openoffice.org/basis3.0/program
    ./python

Mais um Blog falando de Python! PqSerá??? =D

Bem, este é o meu primeiro post no ~ Code Vibe ~, já que o primeiro foi apenas um código que achei no blog do Mike Tremoulet, nas indas e vindas no oráculo... Ele é bem simples, tem poucas linhas mas é prático/funcional, ótimo na filosofia Python =].

Bem, de início gostaria de apresentar-me, coisa que é impraticável em blog's, eu sei, mas não vou deixar aquela história de "Quem sou eu" ao lado, pois o que importa é o Python. Mesmo assim, e só essa vez, eu
sou um escravo masoquista da codificação binária e de elementos algoritmos psicosomatizado pela matemática... que navega em mares revoltos em JAVA e PHP para web, mas descanso nas ilhas paradisíacas do Python, deleitando-me ao desktop em gtk2 e com um bom livro de GNU/Linux à cabeceira da minha acolhedora vida. Antes, até iniciei uns dois ou três blog's, sem nenhum estimulo pra falar a verdade, e no final, e executei-os com um killall -Iq.

Mas este agora tem um gosto especial, tem um foco, e este não me levará a outros mares que eu desconheça e em vez de um único motivo, agora tenho vários:
  1. A um bom tempo venho vivendo com o GNU/Linux(quem fala que o Cachorro é o melhor amigo do Homem, é porque ainda não conheceu um pingüim na vida), com isso até idealizei um bom projeto, que foi lançado em Agosto de 2005 o "Desvendando o GNU/Linux" no Diário do Nordeste (Um Periódico em Fortaleza-Ce). Mas meu espírito no início de 1997 no SRPV-SP, até saboreava o Bash à Awk, temperada com um bom Regex nas normas POSIX BRE e ERE (básico ao estendido)... Foi em Fortaleza, por motivo de carência local que vi uma boa oportunidade financeira com PHP4, sabendo que apache estava virando moda e ferramentas de construção pra WEB dominando em cursos e escolas técnicas... Então o ZOPE entrou na minha vida, com ela o Python... E pra minha felicidade, vi que a linguagem estava muito mais presente no GNU/Linux do que eu imagina... E com ela foi um barato, voltei para as tty's da vida e reencontrei os meus velhos amigos de terminais, e o melhor, que eu também estava com um pé na web com Plone e o outro em desktop com GTK, ô tempo bom... E minha alegria não para de crescer, por isso quero ajudar a quem eu puder;
  2. Uns dias atrás, lendo uma matéria no Wired, encontro um figura chamado Paul Boutin explicando que em inglês que "O Blog Morreu"(eu vou me preocupar com isso??? Dane-se o que ele pensa). E como eu, outros vão surgir, em maior ou menor número não importa, o que vale é contribuir!!!
  3. Vejo muito amigos, que vem sorrindo ou chorando com seus blog's, mas sempre mostrando ou escrevendo como nos livros de programação convencionais, dificultando o contato dinâmico da mídia ao passar o conteúdo técnico. Sendo assim, pra não encher os sacos de quem tem... Inicio o meu!
  4. Falam que crescimento, amadurecimento e envelhecimento são etapas, no qual vejo-me perdido nessa ordem, ao ficar criticando uns e outros, assim vão melhorando os seus conceitos, os seus níveis, as suas idéias ou os assuntos mantidos em seus post's, em fim, ajudo muito no crescimento dos meus amigos, que acho ótimo, mas no entanto, eu me recolhendo com minhas vergonhas e inibições de expor o que eu acho, falo e penso... taq m*rd* =}, então com este, estou aberto, e assim, receberei com felicidade as críticas, pois sei que elas me fortalecerão e indicarão um bom caminho a seguir;
  5. Bem, tenho outros motivos que, de fato pra esse blog não faz nenhum sentido em continuar. E nem mesmo eu iria ler se estivesse em outro blog. =P
Eu não vou escrever aqui que espero isso ou aquilo, mas sim divertir-me com o que tenho bom ou o que eu sei fazer(ou tento, o que importa é não ficar parado), e se caso eu estiver ajudando outros, só tenho agradecer a Deus por essa oportunidade de unir o útil ao agradável.


#!/usr/bin/env python
from __future__ import *

Exemplo de Python-IRC

"""
Python-IRC - an IRC client written in Python
(c) 2004 Mike Tremoulet
Version 0.5

This work is licensed under the Creative Commons Attribution-NonCommercial License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc/2.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
"""


import curses
import select
import socket
import sys
import textwrap
import time
import re

class CursesUI:
"""
May have a problem with inbound messages while typing - blocks the display of new data while typing.
(the select.select() call triggers on the first keypress but blocks until newline. too lazy to write
an internal buffer to pick up on characters as they are typed. :> )

More to the point, the UI doesn't seem to be doing a 100% good job of splitting up the input. Occasionally
messages inbound will not get parsed - this seems to be when multiple items arrive at once.

Also, server messages (large and all-at-once) are not parsing properly.

Parts are inspired from http://twistedmatrix.com/documents/current/examples/cursesclient.py
"""
def __init__(self, irceng):
"""
Input param:
socket - open socket to IRC server
irceng - IRC engine object
"""
self.lines = []
self.engine = irceng
self.sock = self.engine.connect()
self.linewrap = textwrap.TextWrapper()
self.stdscr = curses.wrapper(self.evtloop)

def addline(self, line, screen):
# First part sanitizes input for the screen - break input buffer into lines (\n), then into
# screen lines based on width
line = line.rstrip()
actuallines = line.split("\n")
for entry in actuallines:
try:
entry = self.engine.parseinput(entry)
except PingInputError, err:
self.sock.sendall("PONG :" + err.value + "\n")
entry = "PING/PONG to " + err.value
screenlines = self.linewrap.wrap(entry)
for item in screenlines:
self.lines.append(item)
# Now we clear the screen and loop over the formatted lines to display them.
screen.clear()
i = 0;
index = len(self.lines) - 1
while i < self.nrows - 2 and index >= 0:
screen.addstr(self.nrows-2-i, 0, self.lines[index])
i = i + 1
index = index - 1
screen.refresh()
screen.move(self.nrows-1, 0)

def evtloop(self, screen):
curses.echo()
self.nrows, self.ncols = screen.getmaxyx()
self.linewrap.width = self.ncols
while True:
(inlst, outlst, errlst) = select.select([self.sock, sys.stdin], [], [])
if self.sock in inlst :
# data coming in
data = self.sock.recv(8192)
if len(data) > 0:
# self.addline(self.engine.parseinput(data), screen)
# Moving the parseinput() call to addline()
self.addline(data, screen)
else :
# No data from socket - socket may be closed
# Test this and exit gracefully if needed
try :
self.sock.sendall("PING\n")
except socket.error :
print "Socket closed by host."
break
elif sys.stdin in inlst :
# keyboard data to be sent
data = self.engine.parsecmd(screen.getstr())
self.sock.sendall(data + "\n")
self.addline(data, screen)

def close(self):
self.engine.shutdown()



class PythonIRC:
def __init__(self, svr="irc.freenode.net", prt=6667, nck="PythIRC", rname="Python-IRC User"):
self.server = svr
self.port = prt
self.nick = nck
self.realname = rname
self.channel = ""
self.usercmd = re.compile('^/(\w+)( (.*))?$')
self.usermsg = re.compile('^(#?\w+)( (.*))?$')
self.svrmsg = re.compile('^:([a-zA-Z0-9\.]+) [0-9]+ ' + self.nick + '(.*)')
self.chanmsg = re.compile('^:(.+)![~]?(.+)@(.+) (\w+) #?(\w+) :(.*)$')
self.genmsg = re.compile('^:(.+)!~?(.+)@([a-zA-Z0-9\-\.]+) (\w+) :?(.*)$')
self.pingmsg = re.compile('^PING :(.*)$', re.IGNORECASE)

def connect(self):
# Connect to the IRC server.
# ... insert socket code here ...
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect((self.server, self.port))
# ... add error handling for the commands?
nickcmd = "NICK " + self.nick + "\n"
usercmd = "USER Python-IRC host server :" + self.realname + "\n" # Might want to not hardcode those
self.sock.sendall(nickcmd) # Need to check for collision here
self.sock.sendall(usercmd) # Watch for errors here
return self.sock # The established connection

def parseinput(self, input):
if self.svrmsg.match(input) is not None:
# Server message
parse = self.svrmsg.match(input)
result = parse.group(1) + ": " + parse.group(2)
elif self.chanmsg.match(input) is not None:
# Channel msg
parse = self.chanmsg.match(input)
if parse.group(4).upper() == "PRIVMSG":
result = "[#" + parse.group(5) + " || " + parse.group(1) + "]: " + parse.group(6)
else:
# Unhandled
result = input.rstrip()
elif self.genmsg.match(input) is not None:
# General messages
parse = self.genmsg.match(input)
if parse.group(4).upper() == "QUIT":
result = "-- " + parse.group(1) + " has quit: " + parse.group(5)
elif parse.group(4).upper() == "JOIN":
result = "++ " + parse.group(1) + " has joined " + parse.group(5)
elif parse.group(4).upper() == "NICK":
result = "-+ " + parse.group(1) + " has morphed into " + parse.group(5)
else:
# Unhandled input
result = input.rstrip()
elif self.pingmsg.match(input):
parse = self.pingmsg.match(input)
raise PingInputError, parse.group(1)
else:
# Unhandled input
result = input.rstrip()
return result

def parsecmd(self, input):
"""
This function parses user supplied input and reformats into IRC commands
"""
# If first char is a /, then this is a command.
output = input
if input[0] == "/" :
parsedcmd = self.usercmd.match(input)
output = parsedcmd.group(1).upper() # group(0) is the raw match, not the group
# Insert a bunch of if..elif..else statements
if (output == "MSG") :
# private message to a user. format: /msg user text
# break off the first word of group(3) to get userid
splitcmd = self.usermsg.match(parsedcmd.group(3))
output = "PRIVMSG " + splitcmd.group(1) + " :" + splitcmd.group(3) # Note - no error checking for existence of groups
elif (output == "JOIN") :
# Only supports one channel, no keys, at this time
if parsedcmd.group(3) is not None:
output = output + " " + parsedcmd.group(3) # Note - group(2) contains that space
# Store channel for later use
self.channel = parsedcmd.group(3)
else :
# Raise a USER=ID10T error
pass
elif (output == "QUIT") :
# map add'l params i.e. reason for quitting
if parsedcmd.group(3) is not None:
output = output + " :" + parsedcmd.group(3)
elif (output == "PART") :
# add'l param = channel to leave
if parsedcmd.group(3) is not None:
output = output + " " + parsedcmd.group(3)
elif (output == "NICK") :
output = "NICK " + parsedcmd.group(3)
elif input[0] == "#" :
splitcmd = self.usermsg.match(input)
output = "PRIVMSG " + splitcmd.group(1) + " :" + splitcmd.group(3)
self.channel = splitcmd.group(1) # Update the CHANNEL variable - allows for easier multiple messages
else :
# This is a msg for a channel.
# look for null input!
output = "PRIVMSG " + self.channel + " :" + output # Retrieves channel from above
return output.rstrip()

def shutdown(self):
self.sock.close()



class PingInputError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)



def usage():
print("Python-IRC (c) 2004 Mike Tremoulet. Some rights reserved (http://creativecommons.org)")
print("USAGE: " + sys.argv[0] + " server port nick realname")

if (__name__ == "__main__"):
# Expect server port nick realname
if len(sys.argv) != 5:
usage()
else:
client = PythonIRC(svr=sys.argv[1], prt=int(sys.argv[2]), nck=sys.argv[3], rname=sys.argv[4])
cursesui = CursesUI(client)
# Event loop happens ... need more graceful way
cursesui.close()