segunda-feira, 29 de setembro de 2008

Hamlet em Metropolis

Acho que já comentei isto tempos atrás (possivelmente no blog antigo), mas assistir o filme Metropolis com o cd do Hamlet tocando em paralelo é bem interessante. O Filme é inerentemente mudo, então se sua versão tiver uma trilha sonora, deixe-a de lado e escute a REVELAÇÃO :)

(tudo bem, não chega a ser um Dark Side + Wizard of Oz, mas veja se puder)

terça-feira, 23 de setembro de 2008

Meta!

Lei de Jung será lançado em 08/11/2008.

E pensar que sua edição iniciou-se em 21/06/2006... é hora de acabar com isso!

segunda-feira, 22 de setembro de 2008

Post de Ferro

O lançamento do Homem de Ferro na locadora me fez lembrar de outro "homem" de ferro, ou melhor, o Gigante de Ferro. É um livro infantil da época da Guerra Fria, que virou desenho mas não ficou tão evidente na época. Foi um dos primeiros usos de cartoon rendering (ou cel-shading) que tenha visto.

Interessante também é que a música Iron Man não se refere ao super-herói, mas mais provavelmente ao gigante (que também chama-se Iron Man no conto original).

quarta-feira, 17 de setembro de 2008

Programação jogada no ventilador

Imagine fazer com que um programa Java converse com uma rotina em Fortran. Parece a cena final do Star Trek I, com o computador da nave querendo "jogar uma idéia" na V'Ger...

Mas isso é possível, a princípio se voce chamar um intermediário, que nesse caso será o meu amigo C++... ou talvez o "primo-pobre" C, talvez cause menos problema com ambos os lados...

Então o programa Fortran será embalado pelo C/C++, fazendo o encapsulamento, podendo virar uma DLL. Daqui ele conversa com o Java, graças ao JNI, que é a possibilidade do Java ler código nativo.

Lembrando que o Java é uma linguagem interpretada e portável entre máquinas distintas, enquanto que o lado C /C++/ Fortran são compilados, não necessariamente funcionais em qualquer lugar.

Então você pergunta: "porque não faça o que você quer em um local só ?!?" porque quero aproveitar o melhor de cada um:
  • O Fortran é o cara para calcular (você pode dizer o mesmo do C++, mas quando você tem uma biblioteca pronta a sua disposição, ou simplesmente um código que levou anos para uma galera implementar, não é você que vai desenroscar)
  • O Java é o cara da apresentação: interface gráfica, web, XML... há bastante coisa pronta, e principalmente: a torcida é a das maiores.
Surgem outras dúvidas, para ambos os lados: tem gente com bibliotecas numéricas boas, e tem gente que é melhor em web... mas juntando todos os requisitos, qual é a melhor combinação? Se buscar pela melhor solução, não saio daqui hoje, então escolhi isto.

Agora o problema é implementar. o java chamará funções do fortran, vai passar estruturas de dados variadas, e hoje em dia tem que haver um tratamento de exceção, coisa que até hoje não tem no fortran (horror, horror), ou seja, quando trava, é rosca, sem aviso prévio.

Felizmente existem tutoriais, que abordam um pedaço de cada coisa. Um exemplo é o http://www.csharp.com/javacfort.html

quinta-feira, 4 de setembro de 2008

Faça o "J"

Em tempos de programação orientada a objetos, documentação no próprio código e outras boas práticas que nos evita o código-macarrão, eis que vejo um livro chamado "J para quem conhece C".

Até aí, para quem vê o C pela primeira vez o acha bizarro, quando se vê então um código propositalmente obscuro, nem se fala. Agora, este tal de J é sacanagem!

Vejamos o mesmo programa em duas versões. Em C:

// Program to calculate Chebyshev coefficients
// Code taken from Numerical Recipes in C 1/e
#include <math.h>
#define PI 3.141592653589793
void chebft(a,b,c,n,func)
float a,b,c[];
float (*func)();
int n;
{
int k,j;
float fac,bpa,bma,f[300];
bma = 0.5 * (b-a)
bpa = 0.5 * (b+a)
for(k = 0;k<n;k++) {
float y = cos(PI*(k+0.5)/n);
f[k] = (*func)(y*bma+bpa);
}
fac = 2.0/n;
for (j = 0;j<n;j++) {
double sum = 0.0;
for(k = 0;k<n;k++)
sum += f[k] * cos(PI*j*(k+0.5)/n);
c[j] = fac*sum;
}
}

Em J:

chebft =: adverb define
:
f =. u. 0.5 * (+/y.) - (-/y.) * 2 o. o. (0.5 + i. x.) % x.
(2 % x.) * +/ f * 2 o. o. (0.5 + i. x.) *"0 1 (i. x.) % x.
)