segunda-feira, 22 de junho de 2009

A Mesa Voadora

Do livro "A Mesa Voadora" de Luis Fernando Veríssimo, extraí um texto e uma frase:

Com champignon



Esta é uma história de amor, embora algum leitor possa protestar que instintos menos nobres a dominem. Envolve uma mulher, um homem e um sentimento entre os dois.
Se não quiserem chamá-lo de Amor, tanto faz. Uma rosa com outro nome teria o mesmo aroma etc, etc.
Encontraram-se em frente às sopas enlatadas. Ele examinava uma soupe a l'oignon, ela pegou distraidamente um creme de lagosta, bateu no braço dele e deixou cair a lata. Desculparam-se mutuamente; sorriram-se, e em pouco tempo estavam conversando. Sobre sopas, a princípio e — à medida que percorriam as prateleiras — sobre outros interesses comuns, sólidos e líquidos. Quando chegaram aos queijos, já tinham descoberto várias afinidades. A principal era um gosto pelo champignon que beirava a paixão. Os olhos dos dois brilharam quando descobriram isto. O ar se carregou de eletricidade quando seus olhos iluminados se encontraram e a conversa era sobre champignon. Se era Amor ou outra coisa, que importa?
Devo esclarecer que nem ele nem ela eram jovens. Estavam naquela idade crepuscular onde o espírito está disposto mas a carne já vacila, e o senso do ridículo intercepta o desejo para frustrar qualquer paixão além da mesa. Mas ainda havia, nos dois — como uma débil chama sob a caçarola, só o bastante para manter morno o molho, mas longe da ebulição — um saudável apetite pela vida. Ou, pelo menos, a morna memória de um apetite.
— Conheço uma receita de champignon... — disse ela, baixando os olhos como uma provocação.
Ele chegou perto para superar.
— Como são?
— Recheados.
— Mmmm.
— Só me faltam trufas para completar a receita comme ilfaut. Nunca encontro trufas...
Ele olhou para os lados antes de dizer no ouvido dela:
— Tenho trufas na minha casa. Da França.
— Não!
— Talvez um dia pudéssemos...
— Meus champignons recheados finalmente com trufas! É um sonho que tenho desde que...
— Desde que?
— Desde que meu marido morreu.
Ele engoliu em seco. Estavam agora na seção de bebidas.
— Seu marido tinha trufas?
— Não. Não é isso... — Ela parecia alvoroçada. Pegou uma garrafa de Grand Marnier para disfarçar seu embaraço. — É que comecei a cozinhar depois que meu marido faleceu. Para encher o tempo. O meu grande prato é o champignon recheado. Mas nunca fiz com trufas.
— Há quantos anos você...
— Sim?
— Está sem trufas?
Ela estava rubra como um rabanete por fora.
— Doze anos.
— Curioso. Nos cinco anos desde que minha esposa faleceu, recebo trufas regularmente, de um sobrinho que mora na França. Mas, fora um ou outro molho, que a minha cozinheira invariavelmente estraga, não sei o que fazer com as minhas trufas...
Alguma coisa pairou sobre o silêncio que se fez entre os dois naquele instante. Alguma coisa ainda disforme, a sugestão da sombra da possibilidade de uma ideia.
Não podiam ter certeza que daria certo. Às vezes está tudo conforme a receita — champignon dos grandes, o recheio de queijo, a manteiga e o creme para o molho, as trufas acrescentadas ao molho antes de gratinar — e não dá certo. Mas como saber, sem provar?
Esta história tem dois finais, à escolha do leitor. Doce ou amargo, como as sutis variações da cozinha oriental. Num final ele pergunta para ela "Você quer?" E ela faz que sim com a cabeça. Então ele pergunta: "Na minha casa ou na sua?" E ela responde: "Na minha, porque eu conheço a cozinha..." No outro final, os dois se despedem, nunca mais se vêem, e o espectro de uma possível sauce com trufas perfeitas para os champignons recheados fica vagando entre as prateleiras, por todos os tempos.


Tudo isso só pra dizer que tudo é uma escolha...

E a frase que ficou é do texto "Chineses", do mesmo livro:

É difícil saborear o mundo quando se está tentando transformá-lo.

sexta-feira, 19 de junho de 2009

Google Docs -> OpenOffice

Para solucionar o problema da Vane (ela não pediu ajuda, mas me contou e eu me meti), comecei a pensar numa forma de exportar uma planilha no Google Docs para um documento no OpenOffice mantendo tudo atualizado (não é bem uma sincronização, já que a informação vai de "mão única").

A entrada de dados será pelos Forms do Google Docs. A saída dos resultados, pelo OpenOffice.

Primeiro, crie o form no Google Docs (https://docs.google.com), clicando em "New" e depois em "Form" (eu uso em inglês).



Pode usar temas e tudo mais, nada disso influencia a exportação, só o preenchimento do formulário. Para o preenchimento, vá em "More actions", "Embed" para pegar o link do formulário na web.

Coloque os campos que quiser (a interface é auto-explicativa). Salve. Mande exibir os resultados, em "See responses" e "spreadsheets".




Na planilha que abrir, vá em "Share", "Publish as web page".



Escolha a planilha atual, marque a caixa para atualizar automático ("Automatically republish when changes are made") e clique em "Start publishing". Depois disso, selecione "CVS" e copie a URL abaixo.




Agora, vamos ao openoffice. Abra o OOCalc.

No menu superior, vá em "Insert", "Sheet from file". Vai abrir uma janela para procurar arquivos, mas aqui vem o "pulo do gato": cole a URL ali e clique em "Insert".



A partir daí é uma importação normal, escolhendo os separadores (deixe apenas a vírula - "comma") e vc pode eliminar colunas que não quiser.



Pressione OK e vamos voltar à tela para inserir a planilha. Marque a opção "Link" para que ele mantenha a referência.



Vai criar uma planilha em branco (ou só com os títulos dos campos). Isso é esperado, pois ninguém respondeu ainda... :D
Salve o arquivo e feche.

Voltando ao Google Docs, abra a url do form (que vc pegou em "More actions", "Embed") e informe alguma coisa.

Agora, cada vez que vc abrir esse arquivo, ele vai pedir para buscar os dados novamente. Clicando em "sim", os dados serão atualizados.



Meio complicado de fazer, mas interessante de mostrar... espero que ajude! :)


Fontes: http://openoffice.blogs.com/openoffice/2007/12/issues-with-ins.html
tentativa e erro

terça-feira, 9 de junho de 2009

FISL saindo de Porto Alegre?!

Meus colegas já comentaram e um amigo me mandou o link que segue:

http://softwarelivre.org/furusho/blog/asl-quer-melhores-condicoes-para-o-fisl-em-porto-alegre-divulga-que-o-parana-esta-interessado-em-levar-o-evento

Eu já tinha lido sobre isso. Se eu fosse mais assíduo na comunidade de software livre, até diria alguma coisa, mas sou só um cagão, então...

Quer minha opinião? O FISL se tornou um negócio comercial a muito tempo. Me contaram que tem gente que vive só de organizar as coisas dele. Por isso acho que perdeu um pouco da alma do evento.

Mudar para o Paraná, se a organização continuar a cargo da mesma entidade e/ou das mesmas pessoas, continuaremos na mesma: um evento que serve mais para agradar egos pessoais do que para divulgar o software livre e trocar informações e técnicas entre a comunidade.


É ou não é?!




UPDATE:
Fisl fica em Porto Alegre
09/Jun/2009 - 15:40
Enviado por Redação PSL-Brasil

Fonte: http://portalantigo.softwarelivre.org/news/13745
Saiu de cena a possibilidade do Fórum de Software Livre deixar de ser realizado em Porto Alegre.

quarta-feira, 3 de junho de 2009

XBox - promessas

Acho que isso demonstra uma tendência não só para games, mas para boa parte das novas interfaces que virão. Que Surface que nada! :P



Se realmente funcionar, teremos que tirar o chapéu para a Microsoft...

terça-feira, 2 de junho de 2009

Consumo de memória de um processo

Para saber quanta memória ocupa um processo, no Linux, podemos pegar com um:


cat /proc/PID/status


Onde:

VmSize: The size of the virtual memory allocated to the process
VmLck: The amount of locked memory
VmRSS: The amount of memory mapped in RAM ( instead of swapped out )
VmData: The size of the Data segment
VmStk: The stack size
VmExe: The size of the executable segment
VmLib: The size of the library code
VmPTE: Size of the Page Table entry

Copiado descaradamente de http://www.linuxforums.org/forum/linux-kernel/49438-proc-pid-status.html

segunda-feira, 1 de junho de 2009

Os Seminovos - Escolha já seu nerd

Não gosto muito da globo.com, mas esse vídeo ficou mto tri... Não tem como não rir.

domingo, 3 de maio de 2009

Bot do MSN em Python

Existem muitos serviços de DNS dinâmico, mas eles são atualizados de "tempos em tempos". O ideal seria ter alguém do outro lado pra nos dizer qual é o IP atual. Então, vamos criar um BOT para isso. Já que quase todo mundo usa MSN, vamos usar ele! :D

Primeiro, vamos usar o site http://www.cmyip.com/. Ele foi escolhido porque é o que tem menos "firulas" ao mostrar o IP. O código (arquivo commandos.py):

import httplib
import re

def getIP(msg):
h = httplib.HTTP('www.cmyip.com')
h.putrequest('GET', '/')
h.endheaders()
returncode, returnmsg, headers = h.getreply()
if returncode == 200:
f = h.getfile().readlines()[27].strip()
ip = re.compile('\d+\.\d+\.\d+\.\d+').match(f).group()
return ip
else:
return 'ops! erro interno (%s)! =/' % (returncode)

COMMAND = {
'IP': getIP,
}


Pode testar. É feio pegar a resposta na linha 27, mas funciona! :D

Agora criamos o cliente para o MSN. Usando o pymsn.

O código:

# -*- coding: utf-8 -*-

import pymsn
import pymsn.event

import gobject

import logging
#logging.basicConfig(level=logging.DEBUG) #para DEBUG =]

logging.basicConfig(level=logging.CRITICAL)

ALLOWED_CONTACTS = ('*****@hotmail.com',)

from comandos import COMMAND

# respostas a mudanças de status (do BOT)
class ClientEvents(pymsn.event.ClientEventInterface):
def on_client_state_changed(self, state):
if state == pymsn.event.ClientState.OPEN:
# mudar status para online

self._client.profile.presence_msn_object = pymsn.Presence.ONLINE, None
# definir subnick
self._client.profile.personal_message_current_media = "BOT!!", None

def on_client_error(self, error_type, error):
print "ERROR :", error_type, " ->", error

# respostas a eventos de conversação

class ClientConversation(pymsn.event.ConversationEventInterface):

# ao receber uma mensagem
def on_conversation_message_received(self, sender, message):
self._do(sender.account, message.content)

def _do(self, contact, cmd):
if contact not in ALLOWED_CONTACTS:
msg = "Hello %s! I'm a bot! :D" % contact
fmt = pymsn.TextFormat("Comic Sans MS",
pymsn.TextFormat.UNDERLINE | pymsn.TextFormat.BOLD,
'FF0000')
else:
c = cmd.split(' ')[0]
fmt = pymsn.TextFormat("Comic Sans MS",
pymsn.TextFormat.NO_EFFECT,
'000000')
try:
msg = COMMAND[c](cmd)
except KeyError:
msg = 'Bad command or filename... ;)'

fmt = pymsn.TextFormat("Comic Sans MS",
pymsn.TextFormat.BOLD,
'FF0000')
except:
msg = 'Erro interno... alguma coisa na função'
fmt = pymsn.TextFormat("Comic Sans MS",
pymsn.TextFormat.UNDERLINE | pymsn.TextFormat.BOLD,
'FF0000')

self._client.send_text_message(pymsn.ConversationMessage(msg, fmt))
return True

def on_conversation_error(self, error_type, error):
print "ERROR :", error_type, " ->", error


# "convite" para iniciar uma conversa
class Invite(pymsn.event.InviteEventInterface):
def on_invite_conversation(self, conversation):
self._conversation = ClientConversation(conversation)


class Client(pymsn.Client):
def __init__(self, account):
server = ('messenger.hotmail.com', 1863)
self.account = account

pymsn.Client.__init__(self, server)
self._event_handler = ClientEvents(self)
self._invite_handler = Invite(self)
gobject.idle_add(self._connect)

def _connect(self):
print 'connecting...'

self.login(*self.account)

def main():
import gobject
mainloop = gobject.MainLoop(is_running=True)

# aqui vão os dados da conexão: melhorar!
cl = Client(('bill@hotmail.com', 'Linux@PC'))
cl._connect()
while mainloop.is_running():
mainloop.run()

if __name__ == '__main__':
main()



Pode-se ver algumas validações. No exemplo, só vai responder para a minha conta no MSN. Para os outros, nada. E ainda é possível expandir através do arquivo commandos.py.

Acho que ficou bom. Alguém tem sujestões de aplicações? Lembrem-se que é um protocolo em texto plano, sem nenhum tipo de segurança das informações transmitidas...


Fontes:
http://ubuntuforums.org/showthread.php?t=1052281
arquivo test.py do pacote python-msn :)
http://madpython.com/pymsn/module-tree.html
Minha cabeça e ociosidade

Para deixar o código python legível no blog:
http://aima.cs.berkeley.edu/python/py2html.html (ainda tem que melhorar, precisei alterar o HTML pra poder colocar aqui... mas ajuda)