Marlon Silva Carvalho

Arquivo Pessoal: Informática, Música, Geek, Hacking, Etc…

Lucene ou Oracle Text?

Vou relatar aqui um curioso problema que surgiu em um projeto no qual trabalho. Nosso sistema necessita de um mecanismo de busca textual, que irá realizar uma pesquisa em vários campos de várias tabelas. Digamos que uma pesquisa em cerca de 15 tabelas e de cada tabela precisamos indexar umas 10 colunas. Para apimentar o molho, temos campos que são BLOB, e possuem um binário (!) do OpenOffice Writer. Sim, um arquivo com extensão ODT que precisa ter seu conteúdo indexado também.

Partimos em busca de soluções. Temos um banco de dados Oracle 10g, o que nós traz a solução Oracle Text. Como nosso aplicativo é totalmente em Java, temos também o Lucene, da Apache. Devemos, agora, partir para escolher qual a melhor opção. Antes, precisamos entender nossos requisitos não-funcionais para esta funcionalidade específica do sistema. Basicamente, o cliente quer a pesquisa. Só isso. E rápida. Muito rápida. Obviamente, precisaremos filtrar resultados, pois temos informações que determinados perfis de usuário não podem ver.

Iniciei a pesquisa com o Lucene. Primeiro problema encontrado. As informações deste sistema são extremamente, absurdamente e grotescamente sigilosas. O Lucene guarda os índices em sistemas de arquivo. Embora tenha uma opção de guardar em um banco de dados (nosso BD é totalmente criptografado), a solução, conforme podemos ver nos fóruns do Lucene, é lenta. Podemos colocar os índices em um sistema de arquivos criptografado, em uma máquina separada e blá blá blá. Mas isto envolve mais custos operacionais: uma nova máquina, um sistema de arquivos criptografado, rotinas de segurança para esta máquina, etc. Como já temos um BD criptografado e com toda segurança que precisamos disponível, nada mais sensato do que aproveitá-la.

Segundo problema. Uma vez feita a pesquisa, precisaremos fazer uma consulta gigantesca no banco para verificar se o usuário em questão tem permissão de acesso aos resultados obtidos pela pesquisa. Ou seja, embora a pesquisa do Lucene seja rápida, temos um gargalo que é uma consulta às credenciais do usuário no banco de dados.

Vamos ao Oracle Text. Bem, podemos intercalar consultas textuais com consultas de permissão. O Oracle Text já faz consulta no conteúdo de diversos tipos de arquivo, incluindo o OpenOffice Writer. Os dados já estão criptografados, é só consultar. Certo, tudo bem. Vamos usar o Oracle Text. Eu até queria usar o Lucene, para aprender. Mas dessa vez não deu. Fica pra próxima!

Tags: ,

Futuro do Alfred


Conforme informei no post anterior, tive uma boa recepção dos desenvolvedores que viram a notícia no BR-Linux e enviaram suas críticas e sugestões sobre o Alfred. Alguns criticaram a forma como a biblioteca foi programada, usando apenas métodos estáticos.

Cabe a mim explicar o motivo desta escolha. Não foi por desconhecer Orientação a Objetos, aliás, eu adoto este paradigma de programação a mais de 5 anos, seja programando em Java, C++ ou C#.

A adoção de métodos estáticos é devido à própria natureza da biblioteca. Eu diria que está relacionado à filosofia que eu pensei inicialmente para este projeto. A ideia inicial era ter uma biblioteca super simplificada. Não imaginei que sua utilização fosse com Composição de objetos ou herança.

Por exemplo, a ideia era que você não usasse a classe Telefone como um atributo de alguma classe, mas que se você precisasse, pontualmente, de uma formatação de telefone, usasse um método bastante simples de ser adotado.

Claro, em um mundo O.O. isto pode parecer estranho, mas admito que fui influenciado pelo projeto do Aurélio, o Funções ZZ. A filosofia por trás é a KISS: Keep It Simple and Stupid. E a forma mais simples que achei para a biblioteca foi esta.

E você? Concorda? Acha que a biblioteca deveria seguir outro rumo e adotar um modelo mais orientado a objetos? Dê sua sugestão, a biblioteca seguirá o rumo que a maioria achar melhor.


BR-Linux e Alfred

Agradeço ao Augusto Campos, do BR-Linux, pela publicação da notícia que enviei sobre a biblioteca Alfred. Diversos desenvolvedores já entraram em contato sugerindo mudanças e com críticas muito construtivas.

Para quem quiser ver a notícia original, acesse o link http://br-linux.org/2009/alfred-biblioteca-de-utilitarios-para-java/. Para quem ainda não conhece a biblioteca, acesse http://code.google.com/p/alfredlibrary/.

Tags: ,

Nova Versão do VeículoZ

Estou desenvolvendo uma nova versão do VeículoZ, agora para Windows Mobile 6. É uma versão totalmente nova em design. Desenvolvida totalmente em .NET Compact Framework versão 3.5 e com SQL Server CE. Quer acompanhar o desenvolvimento? Acesse o Blog do projeto em http://veiculoz.wordpress.com/.

veiculoz-wm1

Disponibilizei algumas imagens desta nova versão no blog! Gostou? Tem sugestões? Deixe um comentário! Para quem não entendeu, o VeículoZ é um software para gerenciamento de veículos. Tem controle de abastecimentos, despesas, multas, seguros e muitos relatórios legais. A primeira versão foi lançada em 2007 (2006?). Atualmente estou desenvolvendo uma versão para Windows Mobile 6.

Tags: ,

Alfred - Biblioteca de Utilitários para Java

Cansado de procurar na internet por código de validação de e-mail? E conversão entre unidades de medida? Como converto celcius em fahrenheit? E como converto de libras para real brasileiro? Calma! Seus problemas se acabaram! Usando o maravilhoso Alfred, você terá tudo isto muito facilmente! Alfred é uma biblioteca de utilitários em Java. Todo aquele código chato, que você invariavelmente precisa mas nunca tem à disposição.

São muitas classes e diversos métodos utilitários:

  • Tem conversão entre unidades monetárias;
  • Conversão entre unidades de temperatura;
  • Conversão entre Bases Numéricas (Hexadecimal, Binário, etc);
  • Conversão entre unidades de Comprimento;
  • Conversão entre unidades de armazenamento;
  • Validação e formatação de CNPJ;
  • Validação e formatação de CPF;
  • Utilitários para Coleções;
  • Cálculo de Frete por Sedex, Sedex10, etc;
  • Formatação de CEP e obtenção de endereços por CEP;
  • Cálculos com Datas;
  • Validação de E-mail;
  • Leitura de arquivos CSV;
  • Formatação de Telefones;

E muitas outras coisas. E o Alfred está sempre crescendo e se tornando um mordomo melhor! Deixando a propaganda de lado, deixe-me explicar mais formalmente do que se trata esta ideia. Como já deu para perceber, é apenas uma biblioteca em Java, sem qualquer dependência externa (nenhum jar externo precisa ser usado). São dezenas de utilitários para você usar. Quer ajudar? Ótimo, mande-me um e-mail que conversaremos. Quer usar em seu projeto comercial? Tranquilo! Alfred é LGPL.

Quer saber onde baixar? Ah sim, estava quase esquecendo!  Acesse http://code.google.com/p/alfredlibrary/.

Tags: , , ,

OpenOffice com Java

Já pensou em manipular o OpenOffice através de um código Java? Sim, é possível. É fácil? Sim e não. Com pouca configuração e um OpenOffice instalado na máquina, você consegue iniciar a brincadeira. Entretanto, prepare-se para digitar muitas linhas de código se você deseja apenas criar um documento ODT e apenas inserir uma imagem, por exemplo.

A API do OpenOffice não é simples. Documentação é pouca. Quando dá erro, é difícil de depurar. Mas, é possível e até interessante. Tive um desafio nestes dias. Criar um arquivo ODT a partir de um código HTML e depois inserir as imagens das tags <img> diretamente no arquivo. Muito simples, não? Seria caso a API não fosse extremamente complicada de se utilizar.

Você precisará usar constantemente o objeto UnoRuntime. E o pior de tudo. A ajuda das IDEs se fará pouco útil aqui. É uma tremenda dor de cabeça e muitas horas tentando entender como o troço funciona. Por este motivo, resolvi criar uma classe que me ajuda em boa parte do código. Obviamente, eu disponibilizo para que todos possam baixar. Basta clicar neste link. O arquivo .zip do link contém todo o projeto em NetBeans.

Um exemplo de utilização? Aqui vai:

        // Iniciar.
        OOStarter ooStarter = new OOStarter();
 
        // Criar um ODT em branco.
        OOTextDocument ooTextDocument = ooStarter.createTextDocument();
 
        // Inserir um código HTML no documento.
        ooTextDocument.insertFromHTMLFile("file:///c:/arquivo.html");
 
        // Salvar o arquivo.
        ooTextDocument.saveToFile("file:///c:/arquivo.odt");
 
        // Fechar o arquivo.
        ooTextDocument.close();

Pô, só isso cara? Foi mal, mas, sim, é só isso. Por enquanto tenho apenas esta funcionalidade. Mas juro que irei complementando assim que possível. E, ei! Ajude também, faça novas funcionalidades e passe para os demais. Não funcionou com você? Bom, então você esqueceu alguma coisa na configuração.

Você já está com o BrOffice ou OpenOffice instalado na máquina? Eu uso a versão 3.0 e está funcionando bem. Agora, coloque os arquivos da imagem abaixo no classpath. É, eu sei. Talvez você não precise de todos. Mas, até agora eu não parei para ver quais são realmente necessários. Na dúvida, coloque todos!

netbeans-openoffice

Mais um detalhe. Está dando um erro informando que não encontra um openoffice para executar? Então, você deve usar o OpenOffice 3. Neste caso, um paleativo é você copiar o arquivo juh.jar para a pasta program. Não entendeu? Olha a imagem acima. Observe o último arquivo. Ele está na pasta URE/java. Copie ele para esta nova localização. O motivo? Veja este post: http://user.services.openoffice.org/en/forum/viewtopic.php?f=44&t=10825.


Java Magazine Edição 56

A edição de número 56 da revista Java Magazine conta com um novo artigo meu. É a continuição, embora tardia, do primeiro artigo publicado na edição 44, que falava sobre a criação de workflows em Java com o OSWorkflow.

Capa da Java Magazine Edição 56

Neste novo artigo eu me aprofundo mais o assunto, dado detalhes de como integrar o OSWorkflow ao Quartz e a mecanismos de persistência. Interessado no assunto? Então, acesse este link para ver o resumo das matérias desta edição e compra a revista!


Compiz + Kubuntu e Bordas no KDE

Uso continuamente o Compiz Fusion. Gosto de frescuras no Desktop. Seja para trabalho ou lazer, o Compiz Fusion está sempre ativado. No Kubuntu, contudo, reparei umas bordas esquisitas ao redor dos menus, inclusive do K Menu. A screenshot abaixo exemplifica.

compiz-kubuntu2.png

A forma mais simples que encontrei para resolver este problema foi desativando as sombras para este tipo de menu. É simples, basta executar o Sistema de Configuração do Compiz (CCSM) e na opção Effects -> Decoração de Janela mudar a opção Shadow Windows para any !dock. Observe a imagem abaixo.

compiz-kubuntu12.png

Tags:

Singletons em Javascript

Você já pensou em escrever uma classe considerando o padrão de projeto Singleton? Provavelmente você leu em algum lugar de que é impossível. Bem, não é bem assim. Talvez não haja uma maneira igual à da linguagem Java. Mas, de certa forma, é possível. Em um post anterior, eu comentei sobre uma nova forma de escrever classes em Javascript, e é usando esta forma que dá para escrever um Singleton. Veja este código:

 
Singleton = function() {
 
  // variáveis e método privados.
 
  var variavelprivada = 0;  
 
  function funcaoprivada() {
  }
 
  // variáveis e métodos públicos.
  return {
 
    metodo: function() {
        alert("singleton");
    }
 
};
}();

Há uma pequena modificação com relação ao código do post anterior. Observe na última linha, logo após as chaves, os dois parênteses. O que aconteceu, então? Para entender melhor, é preciso compreender bem a linguagem Javascript. Já discuti em outros posts alguns destes detalhes. Inclusive, destaquei as diversas maneiras que você pode usar para escrever classes. Lembre-se que ao fazer algo do tipo f = function() {}, você já está, de certa forma, definindo uma classe. Você pode fazer, var objeto = new f(); e terá uma instância da classe f.

Com relação ao exemplo que escrevi, em um primeiro momento, você definiu uma classe com métodos privados e públicos. Quando você colocou os dois parênteses no final, você executou a função, fazendo que ela retornasse um Array de métodos (que define sua classe). Porque isto é um Singleton? Você não pode fazer new Singleton, porque, de fato, você não definiu uma classe que poderia ser instanciada. Para chamar os métodos, basta fazer Singleton.metodo(). Neste caso, você tem uma única instância da sua classe, satisfazendo ao que solicita o padrão de projeto.

Tags: , ,

Vaio VGN C260E e Kubuntu 7.10

A pouco mais de 1 ano comprei um novo notebook. Mais um Sony Vaio. Desta vez, o modelo VGN C260E. Porque mais um Sony Vaio? Porque é o melhor. Bonito, elegante, alta qualidade, sem comentários. Para acessar a página de suporte da Sony para este modelo, clique aqui. Comprei no MercadoLivre, com o vendedor EletronicaNet. Aliás, foi uma negociação tranqüila, trata-se de uma loja, que vendeu, inclusive, com nota fiscal. Na época, o comprei por 3.999,99 reais. Mas vejo que já é possível comprá-lo, na mão do mesmo vendedor, por até 3.000,00 reais.

Notebook VGN C260E

Trata-se de um ótimo notebook. Nunca tive problemas. É muito rápido, a tela tem um brilho muito bom, provavelmente devido à tecnologia XBRITE-ECO. As cores são muito vivas, fortes, chama a atenção! O desempenho é de dar inveja a muitos desktops. Os 2GB de memória fazem a diferença, e o processador Intel Core 2 Duo é extremamente silencioso e eficiente. Nunca tive problemas com gargalos, mesmo rodando diversas aplicações Java com o Compiz-Fusion ativado. As especificações fornecidas pela Sony, para esta notebook, são:

- Processador Intel Core 2 Duo T5600 - 1.83GHz.
- Memória Cache L2 2MB Advanced Smart Cache
- Memória Principal - DDR2 2GB PC2-4200
- Disco Rígido - Serial ATA 160GB 5400rpm
- Driver de CDRW/DVDRW
- Expansão para leitura de cardão MMC, SD e outros tantos.
- Áudio - Não especifica exatamente. Só diz "Windows Compatible".
- Display - 13.3" resolucão máxima 1280x800. Tecnologia XBRITE- ECO WXGALCD.
- Placa de vídeo - Intel Graphics Media Accelerator 950. 224MB. Chipset Intel 945GM.
- Rede Ethernet.
- Modem Integrated V92/V.90
- Rede Wireless - Intel PRO / Wireless 3945ABG Network Connection
- Acompanhado de um Windows Vista (blergh)

Deixei o Gentoo. Já usei Slackware, que, aliás, foi minha primeira distribuição. Resolvi mudar para avaliar outras distros, ver se acho uma que atenda mais ao meu gosto. Pensei no Fedora. Cheguei a acessar o site deles, mas a única opção para download era uma imagem de DVD. Eu estava com pressa, não podia aguardar mais de 6 horas para iniciar a instalação. Resolvi testar, mais uma vez, o Kubuntu.

Mais uma vez, porque eu já tinha instalado e usado por cerca de 4 meses, até que removi e voltei ao Gentoo. Motivo: o Kubuntu tinha sido o único Linux que desde que comecei a usar esse S.O., há cerca de 10 anos, conseguiu travar uma máquina de forma similar ao Windows. Porque tentar o Kubuntu de novo? Apesar disto, eu tinha gostado. Era fácil de usar, intuitivo, etc. Talvez tivesse sido só a versão de algum pacote que criou todo o problema!

Notebook com Kubuntu

Baixei o Kubuntu 7.10, direto do site http://www.kubuntu.org, através do Mirror da Universidade Federal do Paraná (UFPR). A parte interessante do Kubuntu é sua instalação através de um LiveCD, o que lhe permite acessar a Internet enquanto o programa de instalação faz seu trabalho.

Ao chegar à opção de particionamento de disco, você deve perceber que existe uma partição "oculta", com formato NTFS. Trata-se da área na qual a Sony armazena o Recovery do Windows Vista. Minha sugestão? Não apague esta partição. Por mais que você abomine o Windows, lembre-se que um dia você pode vir a vender seu notebook e nem todos gostam de usar Linux, logo...

Alguns periféricos e programas funcionaram sem necessidade de intervenção, digamos, manual. São eles:

  • Placa Wireless: perfeitamente. Desde o início ela é detectada sem problemas. Mas observe que o Kubuntu usa um driver sem suporte nativo do projeto;
  • Placa de Som: perfeitamente. Som em boa altura, sem distorções;
  • Placa de vídeo: A instalação coloca o driver intel. Mudei para i840 e ficou melhor, aparentemente;
  • Placa Ethernet: aparentemente, sim. Ainda não testei, pois só uso wireless :);
  • Conexões USB: perfeitamente. Reconhece sem problemas os pendrives;
  • Modem: não testei, ainda.

Vale destacar também que as opções de Suspend e Hibernate funcionaram bem. Para falar a verdade, foi a primeira vez que vi estas funções trabalhando tão bem. Já havia tentado no Slackware e no Gentoo, mas sem sucesso.

Gostou da screenshot acima? Nela você pode ver o AWN Manager, funcionando como um docker similar ao do OS X. A decoração das janelas fica a cargo do Compiz-Fusion com o gerenciador Emerald, usando o tema Mac4Lin. O papel de parede você pode obter no Deviantart, mais especificamente neste link. O tema de ícones é o Buuf.

Quanto aos softwares? Até o momento, o Firefox funciona normalmente com os plugins para Java, MPlayer e Flash. Eclipse funcionando perfeitamente também. Tudo obtido através do Adept Manager de forma bastante simples.

Veja abaixo a saída do comando lspci para esta máquina:

- Host bridge: Intel Corporation Mobile 945GM/PM/GMS, 943/940GML and 945GT Express Memory Controller Hub (rev 03)
- VGA compatible controller: Intel Corporation Mobile 945GM/GMS, 943/940GML Express Integrated Graphics Controller (rev 03)
- Display controller: Intel Corporation Mobile 945GM/GMS/GME, 943/940GML Express Integrated Graphics Controller (rev 03)
- Audio device: Intel Corporation 82801G (ICH7 Family) High Definition Audio Controller (rev 02)
- PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 1 (rev 02)
- PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 2 (rev 02)
- PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 3 (rev 02)
- PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 4 (rev 02)
- USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #1 (rev 02)
- USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #2 (rev 02)
- USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #3 (rev 02)
- USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI Controller #4 (rev 02)
- USB Controller: Intel Corporation 82801G (ICH7 Family) USB2 EHCI Controller (rev 02)
- PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev e2)
- ISA bridge: Intel Corporation 82801GBM (ICH7-M) LPC Interface Bridge (rev 02)
- IDE interface: Intel Corporation 82801G (ICH7 Family) IDE Controller (rev 02)
- IDE interface: Intel Corporation 82801GBM/GHM (ICH7 Family) SATA IDE Controller (rev 02)
- SMBus: Intel Corporation 82801G (ICH7 Family) SMBus Controller (rev 02)
- Ethernet controller: Marvell Technology Group Ltd. 88E8036 PCI-E Fast Ethernet Controller (rev 16)
- Network controller: Intel Corporation PRO/Wireless 3945ABG Network Connection (rev 02)
- CardBus bridge: Texas Instruments PCIxx12 Cardbus Controller
- FireWire (IEEE 1394): Texas Instruments PCIxx12 OHCI Compliant IEEE 1394 Host Controller
- Mass storage controller: Texas Instruments 5-in-1 Multimedia Card Reader (SD/MMC/MS/MS PRO/xD)

Tags: