sexta-feira, dezembro 22, 2006

Novo disco externo

Farto de fazer tanta ginástica mental e computacional, e de sacrificar ficheiros que mantinha caprichosamente, para gerir os poucos gigabytes de disco rígido livre, decidi comprar um novo disco.

Para favorecer a mobilidade, e poder usá-lo para trazer colecções a indexar da faculdade para casa, decidi-me por um disco externo de 320gb. A sua capacidade é maior do que a do meu computador pessoal(80gb) e do meu PowerBook(80gb) reunidos como tal, nos próximos tempos, não devo ter problemas de falta de espaço.

Como modelo, decidi-me por um Lacie que, para além de estar ao mesmo preço do que a maioria, tem um formato compacto e apelativo com o seu aspecto de alumínio esfregado. Interessante também é o facto do design deste disco ter sido feito pelo equipa de design da Porsche. Pensado bem, este deverá ser o objecto mais Porsche que irei ter em toda a minha vida...

quarta-feira, dezembro 20, 2006

Observadores em Java

É recorrente, para os programadores, terem que conceber programas em que algumas partes estão dependentes do estado ou dos dados que algum componente detem. Por exemplo, ter um programa de chat no qual, cada mensagem recebida pela rede tem que se apresentada na interface ao mesmo tempo que é guardada num histórico da aplicação.

Uma forma elegante de resolver este problema é de recorrer a uma "software pattern" denominado Observer. Neste pattern, muitas vezes também chamado publish/subscribe, os objectos observadores registam-se junto dos que pretendem observar à espera de um evento.

Em Java, a API suporta explicitamente este pattern disponibilizando as classes Observer e Observable e vou aqui dar um exemplo muito ingénuo de como utilizá-las.
Aproveitando a ideia do client de chat, vou aqui apresentar o código esqueleto para a aplicação deste pattern.
Para começar, temos que ter o objecto que vai ser alvo de observação, em Java este objecto tem que estender a classe java.util.Observable:

import java.util.Observable;

public class
MsgObservable extends Observable implements Runnable
{
private String msg;

public void
run()
{
while(true)
{
msg = waitForMsg();

// marca o objecto como alterado
setChanged();

// avisa os observadores da mudança
notifyObservers( msg );
}
}

private String
waitForMsg() throws Exception
{
// recebe as mensagens
}
}
Neste excerto de código, os pontos importantes são as funções setChanged() e notifyObservers(...) que avisam os observadores de um evento.

Visto que se faz sentido ter algo para observar se estiver alguém a observar, temos que criar um observador, por exemplo, a classe para fazer o logging:

import java.util.Observable;
import java.util.Observer;

public class
LogWriter implements Observer
{
public void
update(Observable obj, Object arg)
{
logMessage(arg);
}

private void
LogMessage(Object arg) {
// TODO
}
}
A parte importante de este excerto de código é a função update( Observable obj, Object arg ) que é a função que é executada quando o observador é notificado de um evento.

Agora só falta colar isto tudo de forma a que os observadores possam ser notificados dos eventos do objecto observado. Mais uma vez simplificando, em muito, o código para o essencial:

import java.util.Observer;

ChatClient implements Observer
{

ChatClient
{
// criar um MsgObservable
// para receber as mensagens da rede
MsgObservable msgObj = new MsgObservable();

// criar os observadores
LogWriter log = new LogWriter();
ChatUI ui = new ChatUI();

// associar os observadores ao objecto observado
msgObj.addObserver(log);
msgObj.addObserver(ui);

// iniciar o MsgObservable
msgObj.run();
}
}
Aqui temos uma forma bastante elegante de separar bastantes componentes de código e de limitar a sua zona de interacção no código facilitando a sua reutilização.

É também importante referir que o Observable está muito dependente do desempenho das funções update( Observable obj, Object arg ), visto que só retorna o seu fluxo normal de execução depois de todos os observadores tenham sido notificados.

quinta-feira, dezembro 14, 2006

Eragon & Eldest

Estreia hoje nos cinemas a adaptação do livro best-seller de Christopher Paulini, Eragon.
Como praticamente todos os filmes provenientes das suaves folhas de um livro, acho que é d esperar um filme medíocre. Principalmente para quem leu os livros.

Este livro, o primeiro da Trilogia da Herança, relata a história de um cavaleiro, Eragon, e do seu dragão, Saphira, mais precisamente a consciencialização e crescimento desses.
Mas como em todos os livros no qual grande parte da história consiste numa enorme caminhada num continente longinquo e desconhecido, todo o poder descritivo da narração da caminhada é trocado, no grande ecrã, por um turbilhão de acção, lutas, magias e efeitos especiais. Foi o que aconteceu com o primeiro filme do Senhor dos Anéis.


Já que falo no Eragon, não poderia deixar de falar igualmente no segundo livro da trilogia, Eldest, que li no princípio deste mês. Só foram necessários 6 dias para ler as mais de 750 páginas do livro. Movidas por vontade própria ou afectadas por alguma influência mágica, as páginas foram-se virando velozmente.

Neste livro, apesar da influência suavemente evidente do "Senhor dos Anéis", não pude deixar de constatar uma semelhança com o Star Wars: O Império Contra-Ataca. A narração centra-se no treino de Eragon e de Saphira, culmina numa batalha épica e numa revelação (quase) surpreendente.
Este livro é notoriamente mais rico, para além de existirem vários fios narrativos, em torno dos diversos intervenientes principais, nota-se um crescimento do autor comparativamente à escrita do primeiro livro.

Lidos os 2 primeiros livros da trilogia, existe agora uma certa ânsia em ler o terceiro e último livro. Ora ai está o problema. O terceiro livro ainda está a ser escrito e, se considerarmos as fases de revisão, pós-produção, bla bla bla, com alguma sorte, a última parte da trilogia sai ainda antes do final de 2007. Com sorte...
Contudo já sei que a capa será verde =)

segunda-feira, dezembro 11, 2006

Aprender novas línguas com podcasts

A internet é, hoje em dia, um método ubíquo de aprendizagem. Contudo nem todo o tipo de conhecimento pode ser adquirido de uma forma puramente textual e, aprender uma nova língua, é um desses casos.

Cada vez mais, a internet evolui no sentido de um enriquecimento com conteúdos multimédia e com isso é possível métodos mais completos de aprendizagem.
Julgo que ninguém acha possível aprender uma nova língua lendo simplesmente. Aprender uma língua é também ser capaz de a falar. Como tal, conteúdos online como os podcast permitem reforçar a aprendizagem com conteúdo em audio ou em vídeo.

Se estiver interessado em aprender alemão, grego, japonês, ... dê uma oportunidade ao iTunes, ou qualquer outro programa de podcast, para aprender uma das muitas línguas presentes neste directório de podcasts de línguas.

sexta-feira, dezembro 08, 2006

Como era o "Alt+Tab" em 1588

Obviamente que em 1588 ainda não existiam computadores e que, como tal, o atalho para trocar de janelas não tinha motivo para existir.
Mas em 1588, o engenheiro italiano Agostino Ramelli inventou uma mesa de leitura rotativa que, tal como podem constatar na imagem seguinte, consiste no modelo físico do conceito do "Alt+Tab" inventado "uns" séculos depois.


Possivelmente inspirado no trabalho deste italiano, a Microsoft desenvolveu, para o Windows Vista, um sistema (pouco útil e devorador de recursos) denominado Flip 3D. Esta aplicação permite alinhar e percorrer as janelas de uma forma rotativa com efeitos 3D interessantes.

quinta-feira, dezembro 07, 2006

Melhorar o Eclipse no Ubuntu

Para muitos programadores de Java, o Eclipse é uma ferramenta essencial para se conseguir produzir melhor código, mais rapidamente.

No Ubuntu, o Eclipse vem configurado para usar o GCJ, um compilador open-source de Java, devido a uma política de uso exclusivo de software livre. Contudo, no meu pobre computador com uns míseros 256mb de RAM, só o Eclipse ocupava mais de 100mb de RAM, por vezes ultrapassando os 110mb. Mas o consumo de RAM não seria dramático se não tornasse o Eclipse irritantemente lento, afectando igualmente o resto do sistema.

Depois de instalar a JDK da Sun, julguei que o Eclipse passaria a usar a JVM(Java Virtual Machine) da Sun para correr, visto que este passou a ser a JVM por omissão no sistema. Na realidade, o Eclipse continuou a usar o GCJ.
Assim, para mudar de JVM no qual o Eclipse corre é necessário alterar o ficheiro /etc/eclipse/java_home e acrescentar o destino da JVM da Sun, tipicamente, /usr/lib/jvm/java-1.5.0-sun, no princípio do ficheiro.

Depois de esta alteração, o consumo do Eclipse passou a situar-se abaixo dos 100mb de RAM, mas mais importante, passou a ser, de facto, possível usá-lo sem recorrer permanentemente a uma das virtudes com maior carência entre os seres humanos: a paciência.

domingo, dezembro 03, 2006

Alarme de incêndios anti-partidas

Toda a gente conhece a mítico truque, hollywoodesco, de activar o alarme de incêndio para interromper as aulas, criar uma diversão ou fugir de assassinos sanguinários.

O que não sabem é que em 1938 foi criado um alarme de incêndios que dissuadia os falsos alarmes. Neste dispositivo, para se conseguir activar o alarme, a pessoa tem que passar a mão por um compartimento especial no qual, após activar o alarme, esta passa a ficar algemada.


Sem dúvida que este sistema previne que os "terroristas" com acne consigam activar o alarme e fugir, safando-se da merecida "recompensa" pela partida. Contudo, não me parece muito entusiasmante uma pessoa activar o alarme e ficar alegemada enquanto tudo à volta... arde. O altruísmo, o sacrificar-se por outrém não me parece estar muito na moda.

Eis o intelecto humano no seu melhor.