2007-04-30

Seriedade

Vírus Hoje pela manhã, ainda bem cedo, recebi uma proposta da Ed. Abril para assinar uma revista séria em troca de um vale-compra de R$80,00.

Não acho que eles precisariam oferecer um vale-compra no valor de quase o dobro da mensalidade da assinatura se a revista valesse a pena.

No entanto o que quero discutir aqui não é se vale ou não a pena, mas o conceito de seriedade.

Seriedade é um conceito «forte e estaticamente tipado» (desculpem o trocadilho), que significa cumprir com os compromissos.

Mas que compromissos são esses?

Aqui o conceito de seriedade se torna extremamente flexível.

Compromisso com a Verdade? Não… Verdade não cobre a folha de pagamento de ninguém.

Os compromissos de um «revista séria» são:

  • com os lucros;
  • com os patrocinadores (e o que eles quiserem que seja verdade);
  • com (o dinheiro d)os clientes (ou seja, o que é preciso para que o clientes continuem clientes, não importando o quão imoral seja).


Essa é a triste verdade por trás da seriedade das revistas.

[]'s
Rodrigo Cacilhas

PS: Eu assino a SuperInteressante e recomendo, e pretendo assinar assim que possível a National Geographic Brasil.

2007-04-24

Comparação de desempenho

Kodumaro
Estou estudando Haskell ao mesmo tempo em que me aperfeiçoo em Lua e Kepler.

Meu interesse em Haskell é usá-la como linguagem compilada, enquanto continuo usando Lua (e eventualmente Python) como linguagem geral.

Estava impressionado com a velocidade de Haskell em recursões, principalmente no cálculo de Fibonacci (que costumo usar para comparações de desempenho), resolvendo índices altíssimos em frações de segundo, enquanto a própria linguagem C demora para retornar algum resultado.

Foi então que me dei conta de que a implementação em Haskell de Fibonacci que eu estava usando aplicava memoização!

Resolvi refazer os códigos comparatórios usando memoização também nas outras linguagens.

Observação:


  1. Não refiz em Java porque não conheço a linguagem o suficiente para trabalhar com memoização (imagino que haja algum módulo pronto) e números grandes.
  2. Não refiz em C e C++ porque fiquei com preguiça de reescrever usando GNU MP.


Fiz os testes da seguinte forma: executei cinco vezes cada «programa» anotando seus tempos de execução; removi o maior e e o menor tempos; calculei a média geométrica.

Foi aí que tive uma surpresa agradável: Lua foi a segunda mais rápida!

Seguem as médias:
  • Haskell: 4,0ms
  • Lua: 21,7ms
  • [update 2007-05-02]Ruby: 42,0ms[/update]
  • Python: 58,0ms
  • Perl: 97,3ms


[update 2007-05-02]
Escrevi errado da primeira vez!

Havia colocado microssegundo (μs) em vez de milissegundo (ms). Minha máquina não é tão rápida assim. =P

Desculpem!
[/update]


Agora os códigos (retirei os comandos de saída para stdout para medir as velocidades):

Haskell


module Main where

import IO

fib = 1 : 1 : zipWith (+) fib (tail fib)

main = do
hSetBuffering stdin LineBuffering
let num = fib !! 1000
putStrLn (show num)


Lua


local fib
do
local memo = setmetatable(
{ ["0"] = 1, ["1"] = 1 },
{ __mode = "k" }
)

function fib(n)
if not memo["" .. n] then
memo["" .. n] = fib(n - 2) + fib(n - 1)
end
return memo["" .. n]
end
end

local num = fib(1000)
print(num)


[update 2007-05-02]
Ruby

def fib(n, memo={ 0 => 1, 1 => 1 })
if not memo.member? n
memo[n] = fib(n - 2, memo) + fib(n - 1, memo)
end
return memo[n]
end

num = fib(1000)
print(num)


Obrigado Fenrrir!
[/update]


Python


def fib(n, memo={ 0: 1, 1: 1 }):
if not n in memo:
memo[n] = fib(n - 2) + fib(n - 1)
return memo[n]

num = fib(1000)
print(num)


Perl


use Memoize;

sub fib {
my $n = shift;

if ($n < 2) {
return 1;
} else {
return fib($n - 2) + fib($n - 1);
}
}

memoize 'fib';

my $num = fib 1_000;
print "$num\n";

exit 0;



[]'s
Rodrigo Cacilhas

2007-04-21

Linux × Windows

Tux Neste primeiro post sobre o assunto não quero entrar no mérito de cada sistema, mesmo porque cada um tem seus prós e contras. Quero falar sobre o problema social (que é o que realmente importa).

Outro dia mesmo li num blog (que parei de acompanhar porque se tornou terra de nazistas) um técnico em Informática que justifica achar o GNU/Linux uma porcaria com uma analogia interessante com TV.

A lógica do técnico é que ele não quer saber como a TV funciona, só quer que funciona, da mesma forma o computador (ele reclamava de ter de saber como um computador funciona para poder usar o GNU/Linux).

Apesar de não concordar com a analogia (prefiro analogia com direção), ela própria já é comprometedora para quem a citou.

Concordo que o chamado usuário final (um conceito criado pelas companhias para enganar as pessoas e vender mais) não precisa saber como uma TV ou um computador funciona, mas quem confiaria num técnico de TV que não soubesse como a TV funciona?

Que técnico é esse que não quer saber como funciona seu objeto de trabalho? Eu me sentiria enganado.

Pensem no assunto… ainda voltarei a ele abordando outros pontos.

[]'s
Rodrigo Cacilhas

2007-04-14

Os Dez Mandamentos dos Soldadinhos de Deus

Paiva Neto O autor destes «mandamentos» foi o saudoso Alziro Zarur, fundador da LBV:

  1. Amar a Deus sobre todas as coisas.
  2. Viver o Evangelho de Jesus em Espírito e Verdade à luz do Seu Novo Mandamento.
  3. Cultuar a Boa Vontade em todos os momentos da vida.
  4. Fazer do Brasil a Pátria das Pátrias – o Coração do Mundo.
  5. Respeitar as religiões das crianças de toda a Humanidade.
  6. Abraçar fraternalmente os filhos dos pobres e dos ricos, dos brancos e dos negros, dos amarelos, dos vermelhos e dos mestiços.
  7. Honrar a seu pai e sua mãe, obedecendo sempre.
  8. Estudar incessantemente, dignificando seus professores.
  9. Cumprir, de todo o coração, os Mandamentos da Lei de Deus.
  10. Aplicar a todos os seus atos o Novo Mandamento de Jesus: «Amai-vos como Eu vos amei. Somente assim podereis ser reconhecidos como meus discípulos. (…) Não há maior Amor do que doar a sua própria Vida pelos seus amigos.» (Evangelho do Cristo, segundo João, 13:34 e 35 e 15:12 e 13).


Acho que estes «mandamentos» valem não apenas para os pequenos, não é?

[]'s
Rodrigo Cacilhas

2007-04-13

Religiosidade

Outro dia estava conversando sobre Criação com o Walter, quando ele me perguntou:

— Mas em que você acredita?

Então me toquei: «realmente… nunca deixo claro em que acredito». Acho que porque já estou de saco cheio das pessoas ficarem tentando salvar minha alma. É tanto evangélico querendo que eu conheça Jesus, católico querendo que eu reconheça o Papa, espírita querendo que eu seja espírita, muçulmano querendo que eu abrace o Islam, margi querendo que eu pare de comer carne, materialista cético querendo que eu apenas acredite no que é academicamente cientificamente comprovado… simplesmente não tenho paciência.

Devido essa falta de paciência, evito falar no que acredito e sempre discuto sobre religião de uma posição um tanto impessoal.

Também como não gosto das pessoas me empurrando suas crenças, evito falar das minhas para assim não me impor.

Mas acho que já é hora de parar de me esconder. Vou tentar expor neste post da forma mais clara possível minha religiosidade.

Ceticismo


Muita gente por aí se diz cética, mas ainda não conheci um cético assumido que fosse cético de verdade. São materialistas, mas como ser materialista é feio, usam uma palavra mais bonita – que eles consideram erroneamente um sinônimo de materialista: cético.

Ceticismo consiste em duvidar de todas as possibilidades, portanto exclui por definição qualquer ponto de vista dedicado, inclusive o materialismo.

Assim ceticismo consiste em manter a mente e o coração abertos.

Infinito


Acredito no Infinito, mas não no infinito dos espíritas. Vou explicar, pois é óbvio apenas para mim. =P

Acredito numa Fonte única, como uma fonte luminosa, origem prima de tudo o que há, houve ou haverá. Da Fonte emana uma irradiação, como uma irradiação luminosa, em todas as direções.

Esta irradiação é a Criação em si, tudo o que há é luz que emana da Fonte. Assim como quando olhamos para um objeto o que vemos é a luz que nele reflete, quando olhamos para uma fonte luminosa o que vemos é a luz que dela emana.

Mas ao contrário da luz que vemos no dia-a-dia, cujos raios se afastam da fonte, na Criação cada raio emana de e para a Fonte, num ciclo infinito.

Realidade


Toda realidade é subjetiva. Realidade é o resultado da percepção.

Alterando a percepção, a realidade também se altera.

A percepção ainda se relaciona com a consciência, portanto uma alteração de consciência interfere na percepção, alterando assim a realidade.

— Ah! Mas um bêbado continua sendo percebido pelo sóbrio da mesma forma!

Sim! Mas porque a(s) realidade(s) é(são) subjetiva(s): a realidade do bêbado e a do sóbrio são diferentes e incompatíveis, e cada um percebe a manifestação da realidade do outro segundo sua própria realidade.

Re-encarnação


As pessoas me perguntam se acredito em reencarnação. Digo que não acredito nem em encarnação!

Se a realidade é resultado da percepção, então estar encarnado ou desencarnado são só pontos de percepção diferentes. Por si só não existem, existindo apenas como consequência da percepção.

Nada impede que uma consciência passe de um estado perceptivo a outro e de volta ao primeiro se a «física» – metafísica ou transfísica – envolvida assim permitir.

Isso se reflete na natureza física: energia luminosa se converte em energia térmica, depois energia potencial, energia cinética, energia elétrica e finalmente energia luminosa e energia térmica novamente. Então a energia pode passar desse estado para aquele e de volta a esse.

Energia e consciência são similares.

— Mas isso é ressurreição!

Não! Porque o corpo físico é uma ilusão, real para quem o percebe assim, mas irreal para quem já está em outro estado. Dessa forma «renascer» de novo ventre não passa de um mecanismo válido para esta realidade.

Alma e mente


Alma = consciência e pronto.

Mente é uma ferramenta que a consciência lança mão para interagir com a realidade gerada pela percepção e ainda com as realidades de outras consciências.

Infelizmente muitas pessoas se tornam escravas de suas mentes, assim em vez da ferramenta trabalhar para o ferreiro, o ferreiro trabalha para a ferramenta.

«Iluminação» é tomar de volta o controle da própria mente.

Céu e Inferno


Céu e Inferno são realidades, ou seja, consequências da percepção alterada pelo estado de consciência.

Assim Céu e Inferno podem ser em qualquer lugar.

Inferno é quando a mente, que se tornou selvagem, domina a consciência. Céu é quando a consciência retoma o controle e a mente se torna apenas uma ferramenta.

Religião


Toda religião é uma ilusão resultante da capacidade que algumas mentes têm de impor sua realidade a mentes mais fracas. Um fenômeno social.

É claro, nem todo religioso é escravo de uma ilusão. Nesses casos, religião é uma boa coisa.

Ciência


Toda ciência é uma ilusão resultante da capacidade que algumas mentes têm de impor sua realidade a mentes mais fracas.

É claro, nem todo cientista é escravo de sua ciência. Nesses casos, a ciência se torna uma ferramenta.


Bem, acho que é isso aí.

[]'s
Rodrigo Cacilhas

2007-04-12

Kodumaro

Kodumaro
Em respeito aos assinantes de RSS e à identidade das Reflexões de Monte Gasppa e Giulia C., não vou mais «ecoar» os artigos publicados no Kodumaro aqui.

Quem quiser continuar acompanhando os artigos do Kodumaro por aqui, basta seguir a lista na barra lateral, que é atualizada via RSS.

[]'s

2007-04-06

Alterando o comportamento de strings em Lua on-the-fly

Lua Um recurso legal de Lua é permitir a alteração do comportamento de strings «on-the-fly».

Por exemplo, strings em Lua não possuem métodos para «capitalizar» e «normalizar», mas podemos criar.

Por exemplo:

> var = "la batalema pitonisto"
> print(var:normalize())
stdin:1: attempt to call method 'normalize' (a nil value)
stack traceback:
stdin:1: in main chunk
[C]: ?


Pois é… não existe. Mas podemos criar!

Nem precisa reiniciar o interpetador. Vamos continuar daí e criar nosso normalize():
> function string:normalize()
>> local t = {}
>> local naocapitular = { "da", "das", "de", "do", "dos", "e" }
>> self:gsub("(%S+)", function (e)
>> e = e:lower()
>> local alterar, lig = true
>> for _, lig in ipairs(naocapitular) do
>> if e == lig then alterar = false end
>> end
>> if alterar then
>> e = e:sub(1, 1):upper() .. e:sub(2)
>> end
>> table.insert(t, e)
>> end)
>> return table.concat(t, " ")
>> end


Vamos analisar…

A tabela naocapitular contém uma lista dos elementos que não queremos capitular. Se quiser, você pode acrescentar outros termos de ligação, como "el", "von", "van", "and", "du", etc..

A chamada do método gsub() de self seleciona cada palavra ("(%S+)") e executa a função passada como segundo parâmetro para cada ocorrência.

A função transforma todas letras de cada palavra para minúsculas (e:lower()), depois corre um for para verificar se a palavra atual devem ou não ser capituladas.

Se a palavra deve ser capitulada, transforma a primeira letra em maiúscula (e:sub(1, 1):upper()), mantendo as demais (e:sub(2)).

Finalmente a palavra é inserida na tabela temporária.

Já no final de normalize(), o return retorna uma string, concatenando os elementos de t usando um espaço (" ") como separador.

Bem, feito isso, é só pegar o mesmo comando anterior:
> print(var:normalize())
La Batalema Pitonisto


Olha só! A string que já existia passou a ter o método normalize()!

Isso aconteceu devido à forma como Lua trata os objetos: metatabelas!

Toda string possui como metatabela uma tabela cuja chave __index aponta para o módulo string:
> print(getmetatable("").__index == string)
true


Então quando a função normalize() foi acrescentada ao módulo string, esta passou a ser método de todas as strings, mesmo as já criadas!

Com isso em mãos, as possibilidades são enormes. =)

[]'s

PS: Veja este artigo também no Kodumaro.

2007-04-02

Instalando Haskell no Slackware

haskell Se você é usuário de Slackware e, como eu, sofreu para tentar instalar o ghc sem sucesso, aqui segue o passo-a-passo para sair da miséria!

Estes procedimentos foram testados no Slackware 11.0.

Primeiro vamos baixar o maldito RPM. Se quiser procurar por outros pacotes, veja aqui.

Baixado o monstro, vamos convertê-lo em algo mais decente com rpm2tgz:

bash$ rpm2tgz ghc66-6.6-1.i386.rpm


Agora é possível manipular este pacote. Vamos descompactá-lo:
bash$ mkdir raiz
bash$ tar xzvf ghc66-6.6-1.i386.tgz -C raiz/


Pronto! Já podemos criar uma descrição do pacote:
bash$ cd raiz/
bash$ mkdir install/
bash$ vim install/slack-desc


Eu uso o Vim, mas use o editor que lhe convier. Escreva o seguinte conteúdo:
ghc: The Glasgow Haskell Compiler v. 6.6
ghc:
ghc: GHC is a state-of-the-art, open source, compiler and interactive
ghc: environment for the functional language Haskell.
ghc:
ghc: This package was generated by rpm2tgz
ghc:
ghc: http://haskell.org/ghc/
ghc:


Salve e já temos nossa apresentação! Agora vamos criar um instalador que publique as bibliotecas no sistema e crie alguns links simbólicos amigos do peito:
bash$ vim install/doinst.sh


O conteúdo do arquivo:
#!/bin/sh

sed -i '/\/ghc/ d' /etc/ld.so.conf
echo '/usr/lib/ghc-6.6' >> /etc/ld.so.conf

( cd /usr/bin/ ; rm -rf ghc )
( cd /usr/bin/ ; ln -sf ghc-6.6 ghc )
( cd /usr/bin/ ; rm -rf ghci )
( cd /usr/bin/ ; ln -sf ghci-6.6 ghci )

ldconfig


Não é necessário, mas gosto de ter este arquivo executável:
bash$ chmod +x install/doinst.sh


O pacote RPM tem umas maluquices, como chamar o diretório de documentação de ghc66-6.6/ (versão 6.6 da versão 6.6? Redundâncias de Fedora Core…). Vamos acertar isso:
bash$ mv usr/share/doc/ghc{66,}-6.6


Para terminar vamos criar e instalar o pacote!

Para evitar possíveis dores de cabeça, vamos fazer isso como superusuário:
bash$ su -l
bash# chown -R root:root .
bash# makepkg -c y -l y ../ghc-6.6-i386-1.tgz
bash# cd ../
bash# installpkg ghc-6.6-i386-1.tgz


E pronto! Já é possível executar ghci e testar os exemplos do Torcato.

Ah! Não esqueça de guardar bem o pacote (ghc-6.6-i386-1.tgz) e limpar a sujeira (ghc66-6.6-1.i386.rpm, ghc66-6.6-1.i386.tgz e raiz/) que deixamos para trás!

[]'s

PS: Veja este artigo também no Kodumaro.