Empreenda’07 no Porto: fomento à inovação

IAPMEI - Feira de Ideias e Financiamento

“Dê força ao arranque do seu negócio!” Com esse slogan a feira de idéias e financiamentos Empreenda’07, realizada esta semana no Porto, acolheu nesta edição cerca de 44 projetos para exposição e apresentação a empresas portuguesas.

A participação nesta empreitada para mim começou com um folder no qual li as regras do concurso e mandei minha idéia em forma de relatório para avaliação ao IAPMEI – Instituto de Apoio a Pequenas e Médias Empresas, pertencente ao Ministério da Economia e da Inovação de Portugal. Concorri com o Umbrella Project, um Gerenciador Eletrônico de Documentos (GED) e fui selecionado para participar da feira e ter o trabalho publicado em brochura.

A oportunidade de participar desta feira trouxe para mim uma nova visão de mercado, da abertura de negócios, do pensar em soluções inovadoras e assim ir aos poucos vendo as alternativas de ser um empreendedor. Acho que é um bom caminho.

No evento, um dos projetos que mais chamaram atenção foi um que pretende desenvolver remédios contra o câncer a partir de testes com a mosca da fruta. E outro que faz o carregamento automático do marcapasso.

Web application using db4o

It is perfectly possible to use db4o in web environment because its database always works in thread-safe mode. Servlets can be accessed by multiple threads, and the transactions against to the db4o core are made in a thread-safe manner.

Step by step

It is necessary to copy the db4o library to the directory WEB-INF/lib. This way your application will access the class responsible for the creation of the server and of the database client.

The same way that it works in desktop version, we don’t need to worry about how to map the process, neither with containers and other applications.

On the other hand, it is necessary to do some configuration. First of all, we have to configure the access to the database file and after this we must think in a way of creating only the ObjectServer for each application.

The great way for this to work is to create the ObjectServer in the startup of the application context and close the connection when the context is ended. To get it we need to elaborate a Listener class, which is not given by the db4o API.

Here you have an example code of a Listener that comes together with db4o tutorial:


package myproject.dao;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.db4o.Db4o;
import com.db4o.ObjectServer;

public class Db4oServletContextListener implements ServletContextListener {
public static final String KEY_DB4O_FILE_NAME = "db4oFileName";

public static final String KEY_DB4O_SERVER = "db4oServer";

private ObjectServer server = null;

public void contextInitialized(ServletContextEvent event) {
close();
ServletContext context = event.getServletContext();
String filePath = context.getRealPath("WEB-INF/db/"
+ context.getInitParameter(KEY_DB4O_FILE_NAME));
server = Db4o.openServer(filePath, 0);
context.setAttribute(KEY_DB4O_SERVER, server);
context.log("db4o startup on " + filePath);
}

public void contextDestroyed(ServletContextEvent event) {
ServletContext context = event.getServletContext();
context.removeAttribute(KEY_DB4O_SERVER);
close();
context.log("db4o shutdown");
}

private void close() {
if (server != null) {
server.close();
}
server = null;
}

}

It is very simple to visualize what this code does. When the context is started the db4oServer is instantiated. And when the context is stopped the connection with the database is ended. After that you have to configure the Listener to the application context of its application, inside the web.xml file that can be found in WEB-INF directory:


<listener>
<listener-class>meuprojeto.dao.Db4oServletContextListener</listener-class>
</listener>

Observe that it is necessary to describe the complete name of the class (to list the packet where the Listener is). Now we need to configure the db4o file path that will be used by Listener:


<context-param>
<param-name>db4oFileName</param-name>
<param-value>web.yap</param-value>
</context-param>

Observe that the constant KEY_DB4O_FILE_NAME of the Listener has the same value of the context parameter.I really appreciate this system.

db4o e Android? Sim, funciona.

O Android é o novo sistema operacional desenvolvido pelo google para ser usado em dispositivos móveis. Possui uma Virtual Machine própria chamada Dalvik VM, que serviu somente para não pagar os direitos autorais da Sun :-)

A linguagem é “Java”, ou pelo menos se parece. Marketing utilizado para conquistar a massa javeira para a plataforma. Pelo pouco que vi, não se parece nem um pouco com JME e acredito que seja mais amigável inclusive (o que não é mais amigável que JME?).

Vi no blog do Carl Rosenberguer um post muito interessante, falando da integração do Android com o db4o e parece que deu tudo certo. Ele substituiu a camada de persistência default(sqlite) pelo db4o e criou um projeto chamado Android Password Manager, pode ser baixado em: http://developer.db4o.com/ProjectSpaces/view.aspx//Android_Password_Manager.

Maiores detalhes em:

Aplicação web com db4o

É perfeitamente possível utilizar o db4o em ambientes web porque o seu banco de dados trabalha sempre em modo thread-safe. Servlets podem ser acessados por múltiplos threads, e as transações chamadas ao core do db4o são feitas em thread-safe.

Copie as bibliotecas do db4o para o diretório WEB-INF/lib para que a sua aplicação tenha acesso às classes responsáveis para a criação do servidor e do cliente da base de dados. E da mesma forma que funciona na versão desktop, nós não precisamos ter preocupações com mapeamentos, containers e outras complicações. Mesmo assim é preciso configurar algumas coisas. Primeiro devemos configurar o acesso ao arquivo do banco de dados e depois pensar em uma forma de criar somente um ObjectServer para toda a aplicação.

O funcionamento ideal seria a criação do ObjectServer no startup do contexto da aplicação e o fechamento da conexão quando o contexto também fosse fechado. Para isto é preciso criar uma Listener class, que não é fornecida pela API do db4o. Abaixo segue um código de exemplo de um Listener que vem juntamente com o tutorial do db4o:


package meuprojeto.dao;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.db4o.Db4o;
import com.db4o.ObjectServer;

public class Db4oServletContextListener implements ServletContextListener {
public static final String KEY_DB4O_FILE_NAME = "db4oFileName";

public static final String KEY_DB4O_SERVER = "db4oServer";

private ObjectServer server = null;

public void contextInitialized(ServletContextEvent event) {
close();
ServletContext context = event.getServletContext();
String filePath = context.getRealPath("WEB-INF/db/"
+ context.getInitParameter(KEY_DB4O_FILE_NAME));
server = Db4o.openServer(filePath, 0);
context.setAttribute(KEY_DB4O_SERVER, server);
context.log("db4o startup on " + filePath);
}

public void contextDestroyed(ServletContextEvent event) {
ServletContext context = event.getServletContext();
context.removeAttribute(KEY_DB4O_SERVER);
close();
context.log("db4o shutdown");
}

private void close() {
if (server != null) {
server.close();
}
server = null;
}

}

É bem simples visualizar o que este código faz. Quando o contexto é inicializado o db4oServer é instanciado e quando o contexto é parado, a conexão com o banco é finalizada.Depois configure o Listener para o application context de sua aplicação dentro do arquivo web.xml que pode ser encontrado no diretório WEB-INF:


<listener>
<listener-class>meuprojeto.dao.Db4oServletContextListener</listener-class>
</listener>

Observe que deve ser descrito o nome completo da classe (listando o pacote onde o listener está). Agora precisamos configurar o path do arquivo do db4o que será utilizado pelo Listener:


<context-param>
<param-name>db4oFileName</param-name>
<param-value>web.yap</param-value>
</context-param>

Observe que a constante KEY_DB4O_FILE_NAME do Listener possui o mesmo valor do context parameter.Acho esse tema interessante e, por isso, quero dar continuidade no próximo post trabalhando com um servlet efetuando operações de persistência e consulta de objetos no banco de dados.

TDD - Test Driven Development

É realmente bem estranho testar algo sem que ele exista. Mas é exatamente isso que esta metodologia ágil descreve. A filosofia do método é:

  • Escreva um pequeno teste (em alguns casos ele não vai compliar).
  • Rode este teste e veja quais foram os erros encontrados.
  • Faça uma pequena alteração para que o teste passe com sucesso
  • Efetue todos os testes e veja se o teste foi bem sucedido
  • Refatore e remova as duplicatas que foram feitas para que o teste passe

Além de escrever o teste antes da criação do código, o design incremental do seu código é outro item fundamental no TDD.Mas qual é o ganho em utilizar esta metodologia?

Código limpo, aumento da qualidade e da produtividade são os objetos da aplicação do TDD.

Nesta pequena introdução de desenvolvimento orientado a testes, pretendo descrever passo a passo como desenvolver uma aplicação para o calculo de IMC (Índice de Massa Corporal) que é feito da seguinte forma:

IMC = PESO / (ALTURA²)

Antes de começar verifique os pré-requisitos descritos abaixo:

  1. Uma IDE com suporte a refatoração (Vou utilizar o Eclipse)
  2. JUnit (preferência a versão 4.0 com suporte a annotations)

Vamos ao primeiro teste:


import org.junit.Test;

public class testIMC {
@Test
public void testCalculoIMC(){
IMC imc = new IMC (74.0f,1.80f);
assertEquals(22,8f,imc.getImcResult());
}

}

Estamos com alguns problemas aqui. O teste não compila porque a classe IMC não existe, muito menos o seu construtor e o atributo imcResult. Além disso estamos acessando o atributo de classe diretamente, o que não é conveniente.

Vamos então aos baby steps, corrigindo os erros com pequenas alterações até que o código do teste seja compilado e executado. Lembre-se de utilizar a IDE para facilitar a sua vida na geração das classes, métodos etc.

O primeiro passo é criar a classe IMC:


public class IMC{

}

Acrescente o construtor:


public class IMC{

public IMC(float peso, float altura){

}

}

Finalmente acrescente o atributo imcResult


public class IMC{

private float imcResult;

public IMC(float peso, float altura){

}

}

Neste momento o teste é compilado e roda com erros. O próximo passo é fazer com que a barra vermelha fique verde. Acrescente um método que retorne um valor que resulte o sucesso do teste e encapsule o atributo imcResult.


public IMC(float peso, float altura){

public float getImcResult(){

return 22,8f;

}

}

Neste momento o teste passa para verde, mas precisamos melhorar o nosso código refatorando e removendo a duplicação.Veja o código completo:


public class IMC {

private float imcResult;

public IMC(float peso, float altura) {
imcResult = peso / (altura * altura);
}

public float getImcResult() {
return imcResult;
}

}

Este post foi uma pequena introdução do que é o TDD e para que serve. Os “devotos” do desenvolvimento de software baseado em XP já estão bem acostumados com o TDD. Para um maior aprofundamento desta técnica acesse os sites:

http://dojofloripa.wordpress.com/category/tdd/

http://www.improveit.com.br/xp/praticas/tdd

Comentários sobre o post serão muito bem vindos!

Manutenção no Mac OS - MainMenu

Na minha última atualização do Mac OS o Onyx parou de funcionar. Eu julgava o Onyx o melhor programa de manutenção para o Mac OS. Mas a necessidade de procurar outro software semelhante me fez achar o MainMenu, que efetua praticamente todas as funcionalidades do Onyx e mais um pouco, além, é claro, de funcionar na atual versão do Mac OS que utilizo.

O programa pode ser baixado em http://www.santasw.com/cgi-bin/download.cgi?file=MainMenu. Roda nas versões 10.4 (Intel e PPC), 10.3.9 E 10.3. Agendar tarefas, corrigir problemas de permissão, limpeza de cache, logs, exclusão de arquivos DStore, ativar / desativar arquivos ocultos etc. Tudo isso com a licença free.

Tá aí a dica!

WiMAX - Sai ou não sai?

Desde de 2005 que vejo uma certa movimentação, tanto das empresas quanto do governo, para a implementação do WiMAX no Brasil. Em termos bem simples, a WiMAX é uma tecnologia muito parecida com a do wi-fi (ambas sem fio). A grande diferença é o alcance e a velocidade entre essas redes. Em uma rede wi-fi o alcance do sinal é de 100m em média, com uma velocidade de 54 Mbps, enquanto na WiMAX o alcance é de até 50 km de raio, com uma velocidade de 75Mbps.

A primeira vez que ouvi falar dessa tecnologia e de uma futura implementação no Brasil foi na TV Câmara (acreditem, eu assistia!). No programa, o presidente da comissão de ciência e tecnologia, Julio Semeghini, do PSDB, falava sobre as vantagens de implementar a WiMAX no sentido da inclusão digital em áreas mais carentes, facilitando o acesso à Internet e a serviços que algumas cidades do interior que não possuem acesso ADSL poderiam adquirir com este projeto. Mas até agora eu não ouvi falar em uma previsão de lançamento da rede, muito menos quanto isto vai custar para o consumidor. Há poucos dias atrás li na Folha Online que a cidade de Nova Iorque estará com suporte a WiMax em 2008, onde a Sprint vai investir cerca de US$ 5 bilhões até 2010 para implementar a rede nos Estados Unidos.

Até isso sair no Brasil, vamos gastando o nosso dinheiro com conexões ADSL ridiculamente lentas a preços altíssimos e os provedores de acesso à Internet juntamente com as gigantes de telecomunicações se enriquecendo às custas do povo.

Safari, Camino, Firefox e IE. Um por todos ou todos por um?

Pode parecer muita exigência de minha parte, mas até hoje não encontrei um browser que tenha todas as funcionalidades que preciso juntas. Um bom Rendering Engine, um plugin para o delicious, algo semelhante ao firebug, funcional em todos os editores WYSIWYG, um comando de localizar com realce e finalmente um browser que rode todos os tipos de comandos javascript para acabar com minhas dores de cabeça para acessar alguns sites que só funcionam no Internet Explorer. Ufa! Até hoje não vi nada parecido :-)

No final das contas tive que separar um navegador de lazer e outro de trabalho, acreditem. O Firefox seria com certeza o browser perfeito para mim, porque possui uma grande quantidade de plugins (delicious, firebug, ftp etc), suporta muitas funções javascript e um leitor de feed muito bom. Com isso poderia utilizar tanto no trabalho quanto para uso pessoal. Mas o rendering Engine dele não me agrada muito. Eu utilizava o Safari nas horas vagas porque acho que ele processa as páginas mais rapidamente que o Firefox. Mas isso foi até eu conhecer o Camino ;-). Entre todos os citados, escolheria o Camino em termos de velocidade. Depois disso deixei o Safari de lado, perdendo o seu espaço no Dock do meu Mac :-) Sem dizer que o Safari tem sérios problemas com editores WYSIWYG e como atualmente estou trabalhando em um projeto que utiliza esse tipo de editor fica difícil utilizá-lo no trabalho.

Suporte a abas, leitor de feed e barra de favoritos acredito que todos eles tenham e, logo, isso não é mais um diferencial.

Como havia dito, acabei fazendo uma seleção natural dos navegadores escolhendo o Firefox para trabalho e o Camino para o lazer. Isso me ocasiona alguns problemas para “favoritar” sites porque tenho que exportar alguns links para o delicious manualmente de vez em quando. Abaixo vou descrever as vantagens de cada um:

Safari

  • Nativo no Mac OS;
  • Redefinição rápida (limpeza de histórico, cache, formulários etc.);
  • Verificação ortográfica;
  • Busca de palavras com realce;

Firefox

  • Plugin para o delicious;
  • Plugin de ftp;
  • Firebug, ótimo plugin para quem trabalha com css, javascript;
  • Leitor de feed simpático;
  • Suporte aos editores WYSIWYG;
  • Suporte a muitas funções javascript;

Camino

  • Processamento de páginas bem mais rápidos que o Firefox e o Safari;
  • Nativo;
  • Redefinição rápida;
  • Verificação ortográfica;
  • Suporte aos editores WYSIWYG;
  • Suporte a muitas funções javascript;

IE

  • Como o IE foi até a versão 5 no Mac OS não posso comentar muito porque nunca o utilizei :-);

Para efetuar o download do Camino: http://www.caminobrowser.org/download/releases/1.5.1-MultiLang/

Banco de dados Orientado a Objetos - dbo4

No mercado existem diversos tipos de banco de dados orientados a objetos como o NeoDatis, ObjectDB, MyOODB e o db4o que foram escritos em Java. Dentre eles, escolhi o db4o para trabalhar em um projeto de um sistema com mais ou menos 50 usuários, sendo no máximo 5 com uso simultâneo. Era um projeto relativamente pequeno, curto prazo de entrega e sem muita complexidade de modelagem. O que dificultava um pouco era o prazo que era muito curto mesmo :-)

O db4o foi perfeito neste caso, evitei toda aquela configuração de mapeamento objeto-relacional com o Hibernate, não precisei falar com o DBA para criar um schema no Oracle me livrando de toda a burocracia que é inevitável na maioria das vezes. Posso dizer que minha experiência foi muito boa com este BD OO com os seguintes parâmetros:

  • Pouca concorrência
  • Baixa complexidade no MER
  • Sincronização com PDA
  • Não precisava de um sistema 24X7

Existem alguns depoimentos de empresas de grande porte no site do db4o descrevendo experiências com sistemas enormes com muita demanda I/O onde o db4o atendeu muito bem as expectativas. Neste link você pode conferir:

http://www.db4o.com/about/customers/success/

Como eu não tive essa experiência eu não posso falar por eles :-)

Velocidade

Fiquei surpreso com o desempenho principalmente nas consultas que buscavam mais de 4000 objetos de forma instantânea praticamente. O site Polipos http://www.polepos.org/ é um projeto opensource para Benchmark de banco de dados. Veja a tabela retirada do site db4o com os testes de comparação entre os bancos:

No site da Polipos existe o MER detalhado que foi utilizado para os testes.

Para quem não conhece o funcionamento de um banco O.O, abaixo confira uma animação representando a transparência na persistência dos dados no banco:

 


Escrevi no portal Devmedia alguns artigos sobre o db4o, que estão nos links abaixo:

db4o na terra de gigantes do B.D relacional

db4o - Mãos a obra - Parte II

Parte III

Parte IV

Este ano fui contemplado com o título de dVP (Db4o Valuable Professional) por ter contribuído em debates, fóruns e elaboração de artigos direcionados à comunidade. Para conferir a lista de dVP’s de 2007 acesse o link:

http://www.db4o.com/community/professionals/dVP/directory2008.aspx

De 89 pessoas da lista, 7 são brasileiros em todo o mundo :-)

Links úteis:

 http://pt.wikipedia.org/wiki/Object_database

http://www.db4o.com/

http://www.odbms.org/ 

http://www.odbms.org/downloads.html#odbms 

Por que eu troquei a janela pela maçã?

Há mais ou menos dois anos fui apresentado ao iMac G3 de um amigo semelhante a esse:

iMacEra um processador de 350 Mhz que estava funcionando há mais de três anos. Era um pouco lento para algumas tarefas mas estava funcionando tudo muito bem. Ele me disse que só teve um problema de crash em todos esses anos, onde tudo parou de funcionar. Realmente fiquei muito impressionado comparando com meu windows xp que eu achava que tinha melhorado muito em comparação com o win 2000. Relamente melhorou muito, mas as telas azuis e os erros fatais continuavam. Formatar, baixar drivers na Internet mais atualizados etc. Enfim uma história que todo mundo já conhece. Fiquei muito intrigado e comecei a pesquisar e ler mais sobre os Macs, o sistema operacional, compatibilidade de softwares (todo mundo tem essa dúvida antes de adquir um Mac: Será que o OS tem softwares que já estamos acostumados a usar no Windows?). Também fiz essa pergunta para o meu amigo e ele respondeu que tinha praticamente tudo.

Depois de muita pesquisa resolvi comprar um iBook usado. Monitor de 12″, leve com uma bateria de 6 horas (já estava usado então não tinha toda essa carga quando comprei). Foi bem arriscado o investimento mas valeu muito a pena.

Ibook

Após quase um ano de uso eu fui morar em outro país e aproveitei para vende-lo e comprar um modelo mais avançado. No final das contas quem comprou o meu iBook foi o mesmo amigo que me apresentou o iMac.

Atualmente estou com o MacBook Core Duo 2.0 Ghz, já com bluetooth e webcam imbutidos e um pacote de sofwares:

iMovie HD, iDVD, iPhoto, GarageBand, Photo Booth, iWeb entre outros. Não tive mais problemas de travamentos como no Windows, posso utilizar um shell com Unix feliz da vida e ainda tenho praticamente todas as ferramentas que utilizava no XP. A interface do Mac OS é espetacular, com diversas ferramentas como o Dashboard, Exposé, um suporte a rede sem fio fantástico (até hoje nunca tive problemas para contectar a uma rede Wireless) sem dizer no sistema de arquivos. Também fiquei muito espantado com o spotlight, um localizador de documentos que sempre sonhei :-)

 

Ainda não tive a oportunidade de utilizar o Windows Vista, mas pelo video abaixo já dá pra perceber que até a microsoft gostou muito do Mac OS, assim como eu :-)