The Diamond Age, breve!

The Diamond Age é um livro de Neal Stephenson sobre nano-tecnologia, educação infantil e choque de culturas, e pode apostar que é uma das melhores coisas de se ler. A maior parte da história se passa em Xangai, mas não na China, já que ela, assim como todos os outros estados nacionais, não existe na época em que se passa a história, em seu lugar temos a corrupta “República Costeira” e o ancestral e confunciano “Reino Celestial”.

Na Era do Diamante, ou você faz parte de uma tribo, ou dificilmente morrerá de velhice. E uma tribo não é aquele bando de Emos andando em shopping centers e vestindo as mesmas roupas, a tribo do Reino Celestial corresponde a população da China Continental, por exemplo. Os laços tribais podem consistir em partilhar da mesma filosofia e visão de mundo, como os neo-Vitorianos, líderes em nanotech, ou ser afinidades genéticas e históricas, como os Nipponeses, número dois em nanotech.

A história começa com um lorde neo-Vitoriano, Alexander Chung-Sik Finkle-McGraw, encomendando a John Percival Hackworth, Artifex de sua Majestade Rainha Victoria II, um livro para educar sua neta, melhor do que seus filhos foram educados, algo com um toque subversivo. Não um livro comum, é claro, todos acessam informação via papéis eletrônicos (que se dobram sozinhos, graças às nano-máquinas), este livro, “A Cartilha Ilustrada da Jovem Dama”*, deveria contar uma história fictícia, porém baseada em todos os acontecimentos da vida da menina, ao mesmo tempo que ensina sobre os mais diversos campos de conhecimento: alfabetização, artes marciais, etiqueta, astronomia, cozinha, máquinas de turing e, claro, nanotecnologia. A cartilha é capaz de conhecer o ambiente e mesmo os processos biológicos de quem estiver ao redor usando nano-sondas e integrar esses dados nas histórias com sua pseudo-inteligência. (Aparentemente na Era do Diamante eles desistiram do termo inteligência artificial.)

Outra idéia empolgante (para programadores, pelo menos) é o Compilador de Matéria (M.C.), capaz de materializar qualquer coisa criada pelos engenheiros nanotecnológicos, de cavalos robôs a computadores, até mesmo cartilhas… O caso é que o senhor Hackworth faz uma cópia ilegal da invenção que foi contratado para desenvolver para sua própria filha. Contudo, todos os compiladores tiram a matéria de uma fonte central, que denunciaria sua cópia imediatamente, e ele provavelmente seria expulso da tribo. Ele então recorre ao Dr. X, um mandarin do Reino Celestial que possui um rústico compilador com fonte própria. Na volta pra casa é atacado por uma gangue, a mando do Dr. X, que tinha interesse próprios na cartilha e no próprio Sr. Hackworth. Não reconhecendo o livro como um objeto de valor a gangue não percebe quando um dos membro guarda a cartilha.

Harv, dá a Cartilha a Nell, sua irmã de quatro anos, que passa a maior parte do tempo conversando com o livro, ouvindo suas histórias e aprendendo. No tempo restante ela e Harv são ignorados pela mãe e espancados pela sucessão de namorados truculentos.

No de correr da trama são levantadas questões sobre a superioridade de uma cultura sobre as outras, o que realmente funciona na educação de crianças, e como conhecimento e instrução podem mudar a vida de uma pessoa, embora em um dado momento a protagonista se veja numa situação onde a filiação a um grupo social teria sido sua melhor chance de segurança.

Para minha profunda felicidade e indescritível (e sua também, pode acreditar) fiquei sabendo que o SciFi Channel vai filmar The Diamond Age como série de 6 horas, com produção de George Clooney e roteiro do próprio Neal Stephenson, o que me deixa curioso, pois embora seus dialógos sejam muito bons, partes extensas do livro sejam descritivas, mas provavelmente várias páginas se tornarão cenas de 10 segundos.

Por que Era do Diamante, você pergunta? Ora, porque as Eras históricas costumam ser definidas pelos materiais que a raça humana é capaz de manipular. No começo do livro alguns personagens estão voando sobre o mar num luxuoso avião com chão de diamante, o mesmo diamante que qualquer pessoa poderia produzir nos compiladores de matéria caseiros que todos possuem.

Seek The Alchemist!

* Minha livre tradução para “The Young Lady Illustrated Primer”.

Anúncios

Cygwin, C, Python, SWIG, Wrappers & Sofrimento em Win32

Existem muitos tipos de sofrimento, e a disciplina do “Projetão” desse período está me trazendo uma grande variedade deles. Contudo, vou falar apenas do sofrimento de ser obrigado a ficar próximo do que é desagradável. Esse está representado pelo uso do Windows como S.O., já que o tablet PC que conseguimos pro projeto, assim como o cérebro de muitos professores desse centro, roda Windows.

Mas onde existe sofrimento, existe algum paleativo! O projeto usa as linguagens Python e C, e minha parte foi fazer a integração das duas, no sentido de Python chamando funções em C. Primeiro precisei exorcisar o ambiente: instalei o Cygwin, que me dá o direito de usar GCC, Make e um terminal bash perfeitamente funcional. Quando apertava CTRL+R pensava estar no gnome-terminal.

Pra tarefa de criar os wrappers Python sobre a lib em C usei o SWIG. É bem simples: você cria um arquivo.i, roda o SWIG que por sua vez gera um arquivo_wrap.c mais um arquivo.py (e várias outras linguagens), depois disso um Makefile pra criar as DLLs, aí você pode importar e aproveitar a alta performance de uma função em C. Meu problema é que compilava as DLLs e wrappers no Cygwin e quando o povo usava com o Python instalado no windows, ele pedia a libpython2.4.dll, e depois de copiada do /bin do Cygwin para o diretório onde seria usada, eu descobri que ela estava linkada com o cygwin1.dll, quando coloquei mais esse a aplicação travava para sempre e sempre.

Me informando melhor descobri que compilar coisas no Cygwin faz seu código precisar do runtime do bicho, que a princípio não é nada mal, já que ele emula umas posix-coisas legais. Mas estava sem saco pra ver descobrir qual o problema, possivelmente não relacionado com o Cygwin, além disso não tinha mais castanhas-do-pará então resolvi matar o cyg, ou melhor, suas DLLs. Descobri a diretiva do gcc -mno-cygwin, que evita o uso das dlls do cygwin, mas também nada mais estava compilando. Resolvido algumas horas depois, quando troquei o endereço dos includes e libs de Python, tirando os do cygwin (que estavam linkados com o cygwin1.dll) e colocando os da instalação de Python no Windows, em c:\Temp\Python24.

PYTHON_LIB_PATH = /cygdrive/c/Temp/Python24/libs
PYTHON_INC_PATH = /cygdrive/c/Temp/Python24/include

E a compilação de um dos DLLs ficou mais ou menos assim

gcc -c blah.c -mno-cygwin
gcc -c -I$(PYTHON_INC_PATH) blah_wrap.c -mno-cygwin
gcc -L$(PYTHON_LIB_PATH) -shared -mno-cygwin $(OBJS) -lpython24 -o _blah.dll

Referência:

Lógica de Predicados com Python

Ultimamente tenho me divertido revendo algumas coisas de lógica e no momento estou em predicados e quantificadores. Resolvi testar esses conceitos (de forma bem simples) usando Python, assim vou compartilhar minha idéia de diversão com o mundo.

Considere a frase “Marcelo dorme 4 horas por noite”, “Marcelo” é o sujeito e “dorme 4 horas por noite” é o predicado, a lógica de predicados expressa o predicado da afirmação como uma função proposicional onde uma variável representa o sujeito. Estabelecemos que P(x) significa “x dorme 4 horas por noite”, e podemos substituir x por qualquer sujeito, bem não qualquer sujeito e sim algum que esteja no universo de discurso, que nesse caso poderia ser “todos os alunos de computação”. A função P(x) pode ser verdadeira ou falsa, dependendo da qualidade de vida do aluno de computação que substituir x na função.

A outra parte são os quantificadores, que são o universal e o existencial. Usando a função P(x) e o universo de discurso declarados acima, com o quantificador universal posso afirmar que todos os alunos de computação dormem 4 horas por noite”, ou usar o existencial e afirmar que existe pelo menos um aluno de computação que dorme 4 horas por noite”. Para ser verdadeira a proposição quantificada universalmente precisa ser verdade para todos os casos do universo de discurso, já para a proposição quantificada existencialmente, basta que exista um caso verdadeiro para tornar verdadeira a proposição. Pelo menos essa semana posso afirmar que a segunda proposição é verdadeira, infelizmente. :-\

Agora vamos à programação. Em termos algorítmicos a verificação das proposições quantificadas é feita com um loop sobre os elementos do universo de discurso, se a proposição testada for quantificada universalmente o loop pára quando encontrar um resultado falso, que invalida a proposição, se for quantificada existencialmente, ele pára ao encontrar um resultado verdadeiro, que valida a proposição.

Vou usar um exemplo matemático pra facilitar. Considere a função P(x) significando

px

Em Python fica assim:

def P(x):
... return x**2 - 4*x <= 0

Vamos considerar o universo de discurso

xez4×5.png

Agora afirmo que

ax

que é lida como “para qualquer valor de x (dentro do universo de discurso) P(x) é verdadeira”. Ora, P(x) é falsa para x=-1, o que torna falsa a proposição de que P(x) é verdadeira para qualquer valor de x. Expresso logicamente para o universo de discurso declarado acima fica:

ands.png

A avaliação de “para todo” em Python:

def avaliaParaTodo(univ):
... res = True
... for x in univ:
...... res = res and P(x)
...... if not res:
......... return False
... return res

Daí testamos para o universo de discurso (usando range)

>>> avaliaParaTodo(range(-4,5))
False

Vejamos agora o existencial

ex

que é lida como “existe ao menos um valor de x para o qual P(x) é verdadeira”. Com apenas um caso verdadeiro, como x=2, provamos a veracidade da expressão. Também pode ser expresso como:

ors.png

Em Python:

def avaliaExiste(univ):
... res = False
... for x in univ:
...... res = res or P(x)
...... if res:
......... return True
... return res

Avaliando:

>>> avaliaExiste(range(-4,5))
True

Vamos mudar o universo de discurso um pouco, passando a usar o números naturais em lugar dos inteiros:

xen1.png

Agora o teste de ambos os casos, universal e existencial, resulta em verdade:

>>> avaliaParaTodo(range(0,5))
True

>>> avaliaExiste(range(0,5))
True

A coisa pode ficar mais elaborada com funções proposicionais com mais de um argumento, permitindo quantificações como “para todo x existe um y”, que algorítmicamente seria expressa com dois loops aninhados.

Depois disso tudo você pode querer mandar para sua namorada uma representação em lógica de predicados de “x ama y” ou algo assim. As mulheres adoram.

Referências:

Ah, e as fórmulas foram produzidas no OpenOffice.org Math

Vegetarianos Perturbadores

Tem uma coisa que eu não entendo de jeito nenhum. Na verdade existem várias, mas só vou falar de uma.

Eu sou vegetariano, na verdade, ovolactovegetariano, ou seja, não deixo minha alimentação provocar a morte de algum animal, embora quanto aos ovos esteja num terreno nebuloso. Mas a vida é feita de melhorias graduais.

Bem, eu como minha sojinha sem incomodar ninguém e sem dizer que ninguém tá errado por comer cadáveres, minha filha come e eu não faço drama, afinal não nasci vegetariano. Claro, acredito seria excelente se a humanidade deixasse os outros bichos em paz.

O estranho é ver como as pessoas se perturbam com algo que não devia afetá-las de jeito nenhum. Já ouvi os maiores absurdos: “você está matando as plantas”, “vamos te embebedar e depois te dar carne de churrasco”, “as plantações de soja tão acabando com as florestas”, “isso é frescura”, etecetera. E nenhum dos meus amigos é açougueiro!

Qual é a desse povo? Algum instinto primal de grupo que repele manifestações individuais contrárias ao costume? O que incomoda tanto? Não tenho resposta, mas começo a achar que, pelo menos pra cabeça, carne faz muito mal mesmo.