terça-feira, outubro 31, 2006

Google devora +1: JotSpot

A saga de aquisições da Google parece não querer parar. Depois da aquisição faraônica do YouTube pela Google por uns "míseros" 1,65 mil milhões de dollars (mais milhão, menos milhão), ontem foi divulgada a compra da JotSpot pela Google.

A JotSpot é uma empresa, do chamado web 2.0, com bastante sucesso e que se dedica à criação de Wikis, tanto para empresas como para pequenos grupos, com elevada vertente colaborativa.

O objectivo desta aquisição por parte da Google só pode ser o de reforçar o, informalmente chamado, "Google Office" com soluções que o tornem cada vez mais interessante para empresas. Mais, parece-me que o JotSpot poderá vir a interligar-se com facilidade nos actuais produtos da Google.
Como curiosidade, fiquem a saber que JotSpot usa o Yahoo Maps para apresentar locais. É de esperar que esse "defeito" seja corrigido rapidamente pela Google.

Esta notícia poderia ser interpretada como mais uma das muitas aquisições da Google, fim. Mas para mim teve particular interesse devido ao facto de, ainda 2ª feira, ter-me registado no JotSpot porque andava a investigar várias soluções de wikis grátis para pequenos grupos.
Inconscientemente, devo ter sido das últimas subscrições a serem feitas na era pré-Google. Ainda dizem que coincidências não existem...

segunda-feira, outubro 30, 2006

Eragon


Farto de livros de índole informático, hoje convenci-me que precisava de voltar a ler um livro dito "normal".


Visto que um amigo meu não se tem poupado a esforços quando se trata de elogiar o livro Eragon, decidi que seria esse mesmo livro que seria o escolhido. Veremos se vive à altura de tais elogios.
Também me apercebi que esta seria a altura ideal para ler este livro visto que estreia, no mês dezembro, um filme baseado na sua história. Antes que se erga toda uma histeria à volta do livro, e que corrompa a minha visão do livro, terei que o devorar velozmente, página a página.

Apesar de não ter ainda lido o livro, e de este ser um estilo de escrita já bastante explorado, não deixa de ser surpreendente que este livro, escrito por Christopher Paolini quando tinha uns meros 20 anos, tenha sido um fenómeno de sucesso mundial, e esteja prestes a atingir o mainstream mediático.

sexta-feira, outubro 27, 2006

"Cuidado com a língua"

Acabei de ver, mesmo agora, um sublime programa na RTP1. O Cuidado com a língua é um programa dedicado ao "...nosso património linguístico, regras, curiosidades e disparates".

Este programa, apresentado pelo Diogo Infante, é uma verdadeira joia da televisão portuguesa, um dos poucos programas televisivos que podem motivar alguém a ligar a televisão (não! Floribela e Morangos com Açúcar não merecem o estatuto de programa televisivo!).

Em cada programa, a origem de algumas palavra é explicada, são apresentados e corrigidos alguns erros atrozes cometidos à língua portuguesa, entre outras coisas.

Hoje, por exemplo, foi abordada a diferença entre o português de Portugal e o português do Brasil.
Sabia que no Brasil, casa de banho se diz: privado? E que canalisador se diz bombeiro? É no mínimo divertido.

Depois, seguiu-se uma secção dedicada às expressões do "futebolês", às coisas absurdas ditas em nome do desporto "rei".
"Fazer um canto de mangas arregaçadas". Esta expressão é simplesmente cómica.
"Correr atrás do prejuízo". Mas alguém no seu perfeito juízo corre atrás do prejuízo? Do lucro, ok, entende-se. Agora do prejuízo...

Esta é sem dúvida uma forma refrescante e divertida de aprender português. Se ao menos todas as aulas tivesses sido assim...

Google Calendar no Gnome Evolution

Ontem lá consegui actualizar a minha instalação do Ubuntu da versão 6.06 para a versão 6.10. Agora, umas 2-3 horas para actualizar o sistema, digamos que foi um pouco... monótono, até porque não há nenhuma opção nem para interromper nem suspender a instalação.

Mas este post não é sobre a minha, demorada, actualização do Ubuntu.

Com a actualização consumada, decidi explorar as novas aplicações e funcionalidades do Ubuntu 6.10. Enquanto dava uma vista de olhos no Gnome Evolution, lembrei-me que nunca tinha tentado configurar o Evolution para que fosse possível ver os meus calendários no Calendário da Google.

Após algum esgravatar, lá descobri. No Evolution, é preciso ir a Ficheiro > Novo > Calendário. De seguida é preciso que entre no Google Calendar e que vá às definições do calendário que pretende adicionar. De seguida, tem que localizar o botão verde que diz "iCal" na secção referente ao "Endereço Privado".

Google Calendar private links

Depois que tenha clicado no ícone verde, irá aparecer um diálogo com um endereço http (ver imagem seguinte). Tem que copiar o endereço que aparece.

Google Calendar private iCal link

De seguida no Evolution, tem que escolher como tipo de calendário "Na web" e colar na caixinha "URL" o endereço que copiou, substituindo http:// por webcal://, tal como na imagem que se segue.

Gnome Evolution: new WebCal

Já está, agora já deve conseguir ver no Gnome Evolution os seus eventos do seu calendário no Google Calendar.

O único problema, é que estes endereços de calendário disponibilizados pela Google são "read-only", ou seja, não é possível acrescentar novos eventos a partir do Evolution. Terei que investigar uma forma de contornar esta limitação.
Este tutorial pode ser facilmente adaptado para o Outlook, Sunbird ou Apple iCal, só é preciso ultrapassar as particularidades de cada programa visto que a parte referente ao Google Calendar é comum a todos.

quinta-feira, outubro 26, 2006

Ubuntu 6.10 saiu

Mantendo o seu ciclo de lançamentos de 6 meses, saiu o novo Ubuntu, a versão 6.10 é essencialmente mais evolucionária do que revolucionária.

Esteaversão vem com os principais programas actualizados, Firefox 2.0, OpenOffice 2.0.4, Gaim 2.0b3 (se bem que recentemente saiu a versão 2.0b4), Gnome 2.16, entre outros.

As surpresas (e novidades) surgem na inclusão de programas feitos em Mono, uma framework open-source de C#, o Tomboy e o F-Spot. Outra surpresa foi saber que o novo Ubuntu vem com um novo sistema de Init, Upstart, feito por eles de raíz e que pretende resolver uma série de problemas dos sistemas actuais, principalmente ao nível dos dispositivos amovíveis.

Eu até dava o meu parecer sobre esta nova versão, mas ainda tenho o sistema a actualizar, 193 pacotes em 1166. Lá terei eu que esperar até brincar com as novas funcionalidades... Oh well.

segunda-feira, outubro 23, 2006

Usar o Apache Lucene: parte 1

O meu estágio na faculdade, no grupo XLDB, tem-me levado a investigar com particular atenção e interesse o mundo da Information Retrieval e tem-me levado a experimentar uma série de bibliotecas.
Uma das bibliotecas mais famosas é o Apache Lucene , que é amplamente reputada pelo seu desempenho tanto em indexação como em pesquisas, e pela sua escalabilidade. Só por curiosidade, o Lucene é a base do sistema de pesquisa da Amazon.
Contudo a qualidade dos seus resultados de pesquisa não é das mais brilhantes visto que não parece haver particular esforço na melhoria dos algoritmos de classificação.

Para programadores que queiram implementar funcionalidades de pesquisa nas suas aplicações, o Lucene é uma boa proposta. Fácil de usar e com documentação abundante.

Para que possam ter um bom ponto de partida, de seguida apresento um pedaço de código em Java que implementa um programa que indexa todos os ficheiros .txt de um dada directoria e sub-directorias. Este código foi feito usando o Lucene 2.0.0.

Mas antes de chegarmos ao código propriamente dito, julgo que é importante explicar o que são de facto esses índices. Os índices são ficheiro onde, a cada termo se mantêm uma lista de ficheiros onde estes termos aparecem. Graças a isto, é possível, sem grande esforço, que dado um termo se obtenha todos os ficheiros onde este aparece.

Agora, já vos autorizo ver o código;)
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Date;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;

public class lucene_indexing {

public static void main(String[] args) throws IOException {
File indexDir = new File("/directoria/onde/ficará/o/index");
File dataDir = new File("/directoria/a/indexar");

long start = new Date().getTime();
int numIndexed = index(indexDir, dataDir);
long end = new Date().getTime();

System.out.println("> "+ numIndexed +" indexados em: "+ (end - start) +"ms");
}

public static int index(File indexDir, File dataDir) throws IOException {
if (!dataDir.exists() || !dataDir.isDirectory()) {
throw new IOException (dataDir + "não existe ou não é directoria");
}

IndexWriter writer = new IndexWriter(indexDir, new StandardAnalyzer(), true);
writer.setUseCompoundFile(false);

indexDirectory(writer, dataDir);

int numIndexed = writer.docCount();
writer.optimize();
writer.close();

return numIndexed;
}

public static void indexDirectory(IndexWriter writer, File dir) throws IOException {
File[] files = dir.listFiles();

for (File file : files) {
if (file.isDirectory()) {
indexDirectory(writer, file);
}
else if (file.getName().endsWith(".txt")) {
indexFile(writer, file);
}
}
}

public static void indexFile(IndexWriter writer, File file) throws IOException {
if (file.isHidden() || !file.exists() || !file.canRead()) {
return;
}

System.out.println("A indexar: \t"+ file.getCanonicalPath());

Document doc = new Document();
doc.add(new Field("content", new FileReader(file)));
doc.add(new Field("filename", file.getPath(), Field.Store.YES, Field.Index.UN_TOKENIZED));
writer.addDocument(doc);
}
}

A função index(File indexDir, File dataDir) inicia o processo de indexação e é-lhe indicada a directoria onde residirá o index e a directoria a indexar.
Nesta parte do código é criado o escritor do índice, componente essencial para este programa.
Se repararmos nesta linha de código: IndexWriter writer = new IndexWriter(indexDir, new StandardAnalyzer(), true);, vemos que é passado ao escritor do índice um analisador. Este analisador é essencial no processo de indexação já que é ele que tem a responsabilidade de processar o texto e de definir quais são os separadores que delimitam os termos, tais como espaços, vírgulas. Em particular, o StandarAnalyzer possui regras complexas que o permite, por exemplo, manter e-mails como um todo invés de os dividir em parcelas.
Outra linha crucial é: writer.optimize();, esta chamada permite unificar vários ficheiros de índice que foram criados durante a indexação, com o intuito de ser possível obter um melhor desempenho. Esta chamada é feita uma única vez, no final do processo de indexação.

A função indexDirectory(IndexWriter writer, File dir) chama a função que indexa, caso encontre um ficheiro .txt, caso encontre uma directoria, chama-se recursivamente.

A função indexFile(IndexWriter writer, File file) é a função que indexa os ficheiros .txt, indexando o seu conteúdo transformando-o em parcelas mas sem o guardar e indexando o nome do ficheiro qualquer tipo de processamento ou interpretação.
Porquê esta diferença na indexação entre o conteúdo e o nome do ficheiro? No caso do conteúdo, nós queremos ser capazes de efectuar pesquisas aos termos que o compõe, como tal é preciso processar as parcelas de texto do ficheiro, tipicamente palavra a palavra, mas não guardamos o conteúdo por motivos de espaço em disco, só guardamos o processamento das parcelas de esse conteúdo. Isto permite diminuir em muito o tamanho dos índices face aos ficheiros que lhes deram origem.
No caso do nome do ficheiro, como vamos querer saber que ficheiros é que contêm determinados termos, vamos guardar os seus nomes para poderem ser apresentados e como não vamos fazer pesquisas sobre os nomes dos ficheiros, não é necessário processar os seus nomes, só guardá-los.

Agora, só é preciso alterar no código a directoria a indexar e a directoria onde vai ficar o índice, e compilar este código sem esquecer de colocar o .jar do Lucene no classpath.
Depois de compilar, é só correr, sem esquecer, novamente, de colocar a referência ao Lucene no classpath.

Num futuro próximo, irei explicar como é que é possível efectuar pesquisas sobre os índices criados.

sexta-feira, outubro 20, 2006

Tradição e IE7

O Internet Explorer 7, que foi oficialmente lançado a cerca de 24h, parece já ser alvo de falhas de segurança.
Aparentemente, a firma Secunia já descobriu que o tão "seguro" produto da Microsoft, não é tão seguro. Esta falha de segurança, considerada como baixa, pode ser explorada para revelar informações sensíveis.

Parece que o Internet Explorer não se consegue afastar da fama dos seus antepassados.
O slogan deles diz "We heard you. You wanted it easier and more secure", mas até agora só vi um interface mais complicado que não é conforme ao resto das aplicações e mais isto, esta notícia da vulnerabilidade.
Eu até queria acreditar neles, mas não consigo...