Realidades Paralelas

Thursday, November 24, 2005

Ubuntu, controle de versão e afins

Uma nota mais administrativa, mas enfim.

Finalmente, após muito planejamento, substituí o servidor que cuidava aqui da sala da pós-graduação. É um Pentium II meio antigo, que estava rodando Windows XP muito mal, cheio de problemas e que caía constantemente. Instalei o Ubuntu 5.10, só o sistema básico para funcionar como servidor. Aproveitei e coloquei Apache, Zope, cvs e darcs, só por enquanto. Pensei em instalar Ruby on Rails também, para brincar um pouco, mas deixei para depois.

Instalar sistemas de controle de versão era importante. Estou trabalhando atualmente em 4 máquinas diferentes, e às vezes é complicado saber onde está a versão mais nova de algum programa ou texto (será que a versão mais nova está no pendrive? ou esqueci de copiar?). Primeiro instalei o darcs que é um novo concorrente na praça, feito em Haskell e muito elogiado por aí pela sua teoria dos patches. Instalei o cvs depois porque achei mais prático para outros alunos aqui que queiram usar controle de versão, já que é um sistema mais antigo, tem integração com Eclipse, ferramentas GUI interessantes como o TortoiseCVS e por aí vai.

Também coloquei o ubuntu rodando em mais duas máquinas aqui (sendo uma para meu uso). Até agora tudo muito bem, e sem dúvida ele é infinitamente mais prático de instalar que o Gentoo. A única experiência traumática parece ser fazer um dist-upgrade, coisa que ainda não tentei. No geral, é uma das distros linux que eu mais recomendo hoje em dia, uma que tem o poder da Debian mas muito mais facil de usar.

Sobre o darcs, comecei a usar já e estou mantendo alguns projetos com ele. Depois eu comento sobre minhas experiências.

Thursday, November 17, 2005

Será?




If I were a Springer-Verlag Graduate Text in Mathematics, I would be J.L. Doob's Measure Theory.



I am different from other books on measure theory in that I accept probability theory as an essential part of measure theory. This means that many examples are taken from probability; that probabilistic concepts such as independence, Markov processes, and conditional expectations are integrated into me rather than being relegated to an appendix; that more attention is paid to the role of algebras than is customary; and that the metric defining the distance between sets as the measure of their symmetric difference is exploited more than is customary.



Which Springer GTM would you be?
The Springer GTM Test


Sunday, November 06, 2005

Brincando com Haskell, parte 1

Estou experimentando agora com sistemas de inferência de tipos, começando com um Hindley-Milner clássico, escrevendo o código em Haskell. Claro que para experimentar eu precisava de uma linguagem funcional simples, mas desta vez resolvi não ficar apenas na sintaxe abstrata: criar um parser e coisa e tal para poder escrever programas num formato razoável. Isso me levou a usar o Parsec, biblioteca de combinadores de parsers. Já tinha ficado impressionado antes vendo alguns exemplos, mas nunca tinha usado de verdade. E, realmente, é muito bom de usar, pelo menos para uma linguagem simples. O trabalho é feito definindo parsers algebricamente, de uma forma que espelha quase perfeitamente a forma da gramática em BNF. A documentação no site também ajuda bastante, tendo exemplos e casos de uso interessantes. Nada de usar um processador separado para gerar um parser quase incompreensível.

Como um pequeno exemplo, aqui está a definição que analisa a expressão condicional:


conditional :: Parser Exp
conditional = do reserved "if"
e1 <- expr
reserved "then"
e2 <- expr
reserved "else"
e3 <- expr
return (If e1 e2 e3)


Isso significa que o parser vai procurar pela palavra reservada if, depois chamar o parser para expressões para analisar a expressão booleana do condicional, depois procura a palavra reservada then, e por aí vai. Outro exemplo interessante é um analisador parcial para expressões básicas (que podem aparecer como fatores de expressões com operadores):


baseExp :: Parser Exp
baseExp = letexpr <|> conditional <|> variable <|> numberLiteral <|>
booleanLiteral <|> parens expr
"basic expression"


Isso mostra de maneira bem clara que uma expressão de base é uma expressão let, um condicional, uma variável, um literal (numérico ou booleano) ou uma expressão entre parênteses. Cada um desses como letexpr que são operados com <|> são parsers de algum tipo de expressão. O operador <?> permite que o parser seja descrito, para ajudar na composição de mensagens de erro significativas.