2007-02-28

A concorrência

W Wordpress.com é o Windows dos gerenciadores de blogs...

Enquanto no Blogspot.com (Blogger.com) posso editar o modelo XHTML, alterar o CSS, fazer o diabo a quatro, o Wordpress.com não me deixa fazer nada.

Deve ser ótimo para quem está acostumado a uma babá, mas para alguém que gosta de ter controle sobre sua vida, suas coisas, personalizar suas coisas, como eu... é um inferno.

Até o código do artigo que escrevi o Wordpress.com tentou «corrigir»...

Por exemplo, não consegui de forma alguma configurar o alinhamento como justificado (coisa que seria facílima no CSS), ele simplesmente não oferece o recurso sob alegação de segurança. Pedi pro Torcato, que já conhece as manhas, procurar como fazer isso. Tive de acrescentar um <div style="text-align: justify;"> no começo do texto e </div> no final.

E qual não foi minha surpresa ao descobrir que o Wordpress.com trocou por conta própria meu <div ...> por <p ...>, colocou um </p> no final do primeiro parágrafo e removeu o </div> do final!

Depois de muito brigar com a ferramenta do Wordpress.com, descobri que, para colocar o alinhamento como justificado, tinha de colocar no começo de cada parágrafo <p style="text-align: justify;"> e </p> no final de cada parágrafo.

Que saco.

Bem, fica a dica: se você é fã do Windows, não quer se preocupar com como seu blog vai fica e não se incomoda de o sistema controlar você, use Wordpress.com! Agora, se você gosta de ter o controle das coisas, prefere que suas coisas tenham sua cara, recomendo Blogspot.com.

[]'s

2007-02-25

Nota 10

Clodovil Hernandes Antes de mais nada gostaria de deixar claro que nunca simpatizei com o Clodovil. Ponto.

Mas não é que o cara está a me surpreender?

Primeiro quando ele questionou o que seria mais importante na Câmara: honestidade ou gravata...

Agora, enquanto os deputados reeleitos metem a mão no máximo que podem da verba de R$15.000,00 de ressarcimento das despesas do mês, Clodovil dá um show de moralidade e honestidade pedindo apenas R$50,00 para ressarcir gastos com combustível.

Nota 10 pro cara. Acho melhor a gente ficar de olho nele, porque ele promete.

[]'s

PS: Referência: Verdade Absoluta.

2007-02-23

Herança múltipla em Lua

Lua Ficou faltando um exemplo de herança múltipla em Lua no artigo de orientação a objetos, né?

Vamos ver algo bem simples...

Você mesmo pode criar um mecanismo para lidar com redundância. No entanto, para manter este artigo o mais simples – e inteligível – possível, vou ignorar deliberadamente problemas desse tipo.


A idéia é que a função na chave __index da metatabela procure a chave em cada uma das classes pai, retornando a primeira ocorrência que encontrar.

Podemos colocar a lista de classes pai em outra chave da metatabela.

Digamos que queremos criar uma classe Button, herdeira de Shape e de EventResponser (só usei os nomes em inglês porque em português ficariam muito grandes). =P
Button = {
super = { Shape, EventResponser }
}

Button.__index = function (t, k)
local class
for _, class in ipairs(Button.super) do
if class[k] then return class[k] end
end
end


Assim que a chave for encontrada em uma das classes (ele deve procurar primeiro em Shape), o valor será encontrado.

Para podermos usar polimorfismo e acrescentar novos métodos a esta classe, teremos de mudar um pouco mais a função para procurar a chave primeiro na própria classe:
Button.__index = function (t, k)
if Button[k] then return Button[k] end
local class
for _, class in ipairs(Button.super) do
if class[k] then return class[k] end
end
end


Valeu a brincadeira?

[]'s

2007-02-21

Campo profundo

Hubble Uma das coisas mais interessantes do Hubble é o chamado «campo profundo», ou The Hubble Deep Field.

Imagine o seguinte:

Os cientistas escolhem uma região negra do espaço, focam nela, eliminam a luz do redor (que ofusca a região) e ampliam. Então aparecem novas estrelas e novas entidades celestes.

Então, nesta região, eles repetem o processo: escolhem uma região negra deste campo, focam nela, eliminam a luz do redor e ampliam.

Eles fazem isso repetidas vezes, até que a ampliação venha realmente negra ou disfocada. A última imagem clara é chamada campo profundo, e mostra coisas assim:

The Hubble Deep Field


Vale a pena visitar o sítio!

[]'s

[update]
Faltou colocar a referência: Discovery na Escola
[/update]

2007-02-19

Moscadas científicas

Vírus Interessante ver como o método científico falha justamente quando é afetado pelo fator humano.

A parte explícita do método científico é a seguinte:

  1. São observados comportamentos que levam a um teoria;
  2. Cria-se uma hipótese, que afirma categoricamente a teoria que os cientistas querem provar;
  3. Cria-se uma antítese, que nega sistematicamente a hipótese;
  4. São definidos procedimentos controlados – chamados experimentos – para verificar a autencidade da hipótese (nesta etapa deve haver ao menos um grupo de teste e outro de controle);
  5. Caso a hipótese seja confirmada, cria-se uma tese, caso contrário a antítese se converte em hipótese e voltamos ao 3º passo.


Agora, há uma parte implícita do método, cheia de hipocrisia:
  1. Para ser aceita como hipótese, a teoria deve ser materialista;
  2. Todo dado experimental que confirme vagamente a hipótese é aceito sem muita investigação;
  3. Toda informação de qualquer natureza que contradiga a hipótese é rejeitada sempre que possível;
  4. Para ser aceita como tese, a hipótese precisa corroborar teorias, axiomas e teses pré-estabelecidos.


Um grande exemplo de uma moscada científica causada por essa hipocrisia é o resfriado comum (em inglês common cold).

Na primeira metade do século XX, quando estava na moda o vírus, fizeram um experimento científico que, em tese, «provou» que o resfriado é causado por contágio viral, nada tendo a haver com friagem.

A partir de então os médicos mais pragmáticos passaram a combater a relação que as sábias mães criam entre friagem e resfriado, enquanto os médicos mais céticos (no sentido correto da palavra, ou seja, que duvidam) continuaram recomendando evitar a friagem.

Só que há fatos pouco divulgados sobre aquele experimento tido como científico...

Em primeiro lugar, o grupo de teste (que teve uma percentagem maior de contágios) tinha apenas seis voluntários, assim como o grupo de controle, quantidade insuficiente para qualquer teste que se preze.

Em segundo lugar, nenhum dos voluntários foi exposto a friagem: apenas os voluntários do grupo de teste foi exposto a contaminação viral (e mesmo assim nem todos ficaram resfriados).

Recentemente novo teste feito por cientistas mais céticos verificou o contrário:

Primeiro: o grupo de teste tinha cento e oitenta (180) voluntários, assim como o grupo de controle.

Segundo: os voluntários do grupo de teste foram expostos a friagem, enquanto os do grupo de controle não.

Terceiro: ninguém foi exposto controladamente a contaminação viral.

O resultado: a percentagem de resfriados no grupo de teste foi estupidamente maior que no grupo de controle.

A teoria para isso é a seguinte: todos estamos o tempo todo expostos aos vírus que causam resfriado, mas a friagem baixa as defesas do sistema imunológico o suficiente para os vírus se desenvolverem.

Tirem suas próprias conclusões.

[]'s

2007-02-17

Orientação a objetos em Lua

Lua Dando continuidade a orientação a objetos em Perl, vamos agora falar sobre orientação a objetos em Lua.

Lua é uma linguagem de programação intrigante... sua orientação a tabelas (e metatabelas, metamétodos...) é prática e versátil.

Assim como quase tudo em Lua, a implementação de orientação a objetos também é baseada em tabelas e metatabelas.

Metatabelas


Metatabelas são tabelas que controla o comportamento de outras estruturas de dados.

Por exemplo, executar o seguinte no prompt do interpretador:
lua> nome = "La Batalema Pitonisto"
lua> print(nome:upper())
LA BATALEMA PITONISTO


De onde veio esse upper()? Daqui:
lua> print(getmetatable(nome))
table: 0x806b2a8


Ah! Há uma metatabela associada às strings!!!

Repare nisso:
lua> print(getmetatable(nome).__index == string)
true


Olha só! A chave __index da metatabela das strings é o módulo string!

Isto significa que:
nome:upper() == nome.upper(nome) == string.upper(nome)


Chave __index


A chave __index da metatabela pode ser uma tabela ou uma função e indica o que deve acontecer quando houver uma tentativa de leitura de uma chave que a estrutura de dados original não possua.

Por exemplo, o objeto referenciado pela variável nome (uma string) não possui a chave upper, então quando tentamos acessar esta chave, o sistema procurar pela chave na tabela referenciada pela chave __index da metatabela, que é string.

Se o valor da chave __index da metatabela for uma função, esta função deve ter dois argumentos: 1º o objeto original, 2º a chave; a função retorna o esperado para a chave.

Por exemplo, se queremos que uma tabela retorne o código ASCII do primeiro caráter do nome da chave informada, podemos usar uma função:
mt = {
    __index = function (t, k)
        return k:byte()
    end
}
var = setmetatable({}, mt)


Então, por exemplo, var.b retornará 98 (o código ASCII para b).

Esta chave é importantíssima para a orientação a objetos.

Chaves __newindex e __mode


Não vamos ver estas chaves neste artigo, mas é interessante conhecê-las.

A chave __newindex recebe uma função (argumentos: o objeto original, a chave, o valor atribuído) e é chamada quando se tenta atribuir um valor a uma chave que não existe. Sem esta chave da metatabela, a chave simplesmente seria criada no objeto e o valor atribuído a ela, com esta chave da metatabela, a função é executada e decide o que fazer.

A chave __mode decide se chaves e valores do objeto original serão referências fracas ou não. O padrão é não.

Classes e construtores


Em orientação a objetos, classe é um molde para a criação de novos objetos.

Em Lua, classe em geral é uma metatabela onde a chave __index aponta para ela própria. Algo assim:
mt = {}
mt.__index = mt


Isso faz com que as chaves da metatabela sejam padrões para as tabelas que a receberem como metatabela, ou seja, a metatabela se torna um molde para outras tabelas. As tabelas que fazem uso deste molde são chamadas instâncias.

As funções de uma classe/instância são chamadas métodos e sempre recebem implícita ou explicitamente como primeiro argumento a classe ou instância que faz a chamada.

Algumas linguagem são extremamente implícitas, escondendo a referência à classe ou instância.

Lua pode chamar um método passando a instância (ou classe) implícita ou explicitamente.

Exemplo de uma chamada explícita:
login = login.lower(login)


Agora a mesma chamada, mas passando a instância implicitamente:
login = login:lower()



Há um método especial chamado construtor, que é executado sempre que uma nova instância é criada.

Em algumas linguagens, o construtor é executado pela instância após esta ter sido criada. Nestas linguagens o construtor costuma ter o mesmo nome da classe (exceto Python, onde é chamado __init__()).

Em outras linguagens, o construtor é executado pela classe, como um método de classe, e retorna a instância. Nestas linguagens o construtor geralmente é chamado new() (como em Perl).

Lua usa a segunda abordagem.

Então um construtor simples pode ser:
function mt:new(o)
    o = o or {}
    return setmetatable(o, self)
end


O construtor aqui recebe como argumento uma tabela que servirá de referência para a criação da instância.

O primeiro comando garante que o argumento o é uma tabela, e o segundo associa a metatabela ao objeto, retornando-o.

Como new() é um método de classe, self representa a classe. Se fosse um método de instância (que deve ser chamado pela instância), self representaria a instância.

Outros métodos


Podemos criar outros métodos. Por exemplo, poderíamos querer que um somatório dos elementos numéricos da tabela seja retornado para o método soma():
function mt:soma()
    local s = 0
    table.foreachi(self, function (i, e)
        if type(e) == "number" then
            s = s + e
        end
    end)
    return s
end


Então podemos criar um objeto com alguns valores numéricos e retornar seu somatório:
var = mt:new { 2, 4, 6 }
ret = var:soma()


Aqui a variável ret receberá 12 (a soma dos elementos).

Metamétodos


Há alguns metamétodos interessantes, que agem junto a operadores.

Não vou entrar em detalhes, apenas vou citar alguns:
  • __add – gerencia operador de adição;
  • __sub – gerencia operador de subtração;
  • __mul – gerencia operador de multiplicação;
  • __div – gerencia operador de divisão;
  • __unm – gerencia operador unário de negação;
  • __eq – gerencia operador de igualdade;
  • __lt – gerencia operadores menor que e igual ou maior;
  • __le – gerencia operadores menor ou igual e maior que;
  • __pow – gerencia operador de potência;
  • __tostring – gerencia conversão para string;
  • __tonumber – gerencia conversão para número.


Herança


Imagine agora que queiramos aproveitar o que já programamos...

Queremos outra classe que além de devolver a soma, também devolva o produto, mas sem modificar a classe original.

Para isto herdamos uma nova classe. Mas como?

Muito simples: basta instanciar a classe pai normalmente, modificar a instância e usar esta instância como uma nova classe:
nmt = mt:new()

function nmt:produto()
    local p = 1
    table.foreachi(self, function (i, e)
        if type(e) == "number" then
            p = p * e
        end
    end)
    return p
end

var = nmt:new { 2, 4, 6 }
print(var:soma(), var:produto())


Serão exibidos 12 e 48.


Há uma forma mais avançada de herança, chamada herança múltipla, que acontece quando uma classe é herdeira de mais de uma classes pai.

Algumas linguagens, como Java, não permitem herança múltipla, devido a problemas de gerenciamento de polimorfismo, outras, como Perl e C++, confiam que o programador seja competente o suficiente para lidar com polimorfismos. Outras ainda, como Python, oferecem ferramentas para lidar com isso.

Em Lua, você escolhe!

A implementação de herança múltipla em Lua é complicada e mereceria um post por si só, portanto, quem quiser dar uma olhada, veja multiple inheritance no PiL.

Conclusão


Este foi apenas um artigo superficial sobre como implementar orientação a objetos em Lua. Espero que tenha sido elucidativo.

As melhores referências sobre Lua são o PiL e, preferencialmente, o PiL2.

[]'s

2007-02-15

Revolta?

Baal Passei duas semanas sem Internet em casa, por isso o período sem postar nada.

Agora que estou de volta, queria comentar alguns assuntos que ganharam mídia nesse período:

O primeiro é sobre o professor russo que está sofrendo processo por ter pirateado software.

O que vejo em todo lugar são pessoas comentando que a Microsoft está certa em processá-lo, porque a pirataria prejudica não só o mercado de Informática, mas também o movimento FOSS.

Só que todas essas pessoas estão alheias à parte da notícia que não está sendo traduzida: o professor Alexander Ponosov na verdade comprou dezesseis (16) máquinas para a escola em uma loja especializada, que vendeu para ele licenças clonadas.

A Microsoft, empresa muito boazinha, decidiu que processar a loja não seria boa idéia, porque esta pode pagar bons advogados e assim o processo se arrastaria, preferindo assim processar um professor inocente e indefeso.

Bonito.

Referência: Pirataria ou... que crime é esse?


Outro assunto foi o menino João Hélio...

Quero juntar minha voz à de Paulo Coelho e afirmar sem medo que os culpados por essa barbárie são o povo brasileiro, mais especificamente fluminense.

As pessoas não gostam de ouvir isso mas: você é responsável pelas consequências de seu conformismo.

O grau de desumanidade demonstrada por aqueles monstros reflete a tolerância e o conformismo do carioca, que são compartilhados pelo resto dos brasileiros. Não se vê tanta crueldade em outras cidades simplesmente porque nenhuma mistura de forma tão próxima luxo e pobreza quanto o Rio de Janeiro, mas a essência para tamanha monstruosidade está em todo o país.

Nada adianta se revoltar e depois voltar para a vidinha de sempre, precisamos ser menos tolerantes, menos acomodados.

Não tenho muito mais o que falar sobre o assunto.