GlassFish – ConnectionPool sem senha – Aliasing Passwords

Janeiro 23, 2009

Conforme disse neste post, uma das coisas bacanas que o Glassifh resolveu (na verdade herdou do Sun Application Server quando ainda era proprietário) pe um problema de segurança, relacionado à utilização de senhas nos arquivos de configuração de connection pools JDBC. O que ele basicamente faz é permitir a criação de ALIAS (apelidos) para suas senhas para que posteriormente, ao invés de utilizar as senhas nos arquivos que configuram pools, você utilize o ALIAS criado.

Para criar um ALIAS é bastante simples. Seguindo os passos:

  1. Entre no diretorio glassfish/bin.
  2. Execute o comando: asadmin create-password-alias MEU-ALIAS , onde MEU-ALIAS será o apelido para a senha, que podera ser usado posteriormente no arquivo de configuração de seu connection pool. O glassfish pedirá para que você repita duas vezes a senha assciada ao ALIAS, portanto, faça com exatidão. Por medida de segurança, ao digitar você não verá nada, mas acredite, a digitação acontece. O resultado será exatamente como abaixo: Please enter the alias password>
    Please enter the alias password again>
    Command create-password-alias executed successfully.
  3. Pronto, seu ALIAS foi criado e agora pode ser utilizado no arquivo sun-resources.xml, utilizando o ALIAS ao invés da senha, deste jeito:
    ...
    <property name="password" value="${ALIAS=MEU-ALIAS}" />
    ...

    Um exemplo completo do arquivo sun-resources.xml, pode ser visto aqui. Para testar sua conexão, dê um restart no glassfish e ao entrar no console admin ( localhost:4848 ) vá até Resources/Connection Pools e selecione seu connection pool. Ao visualizá-lo, clique no botão “Ping”. Se a senha estiver correta, “Ping succeed” aparecerá.

Caso você tenha errado a senha por engano, ou ela tenha sido alterada, basta utilizar o comando asadmin update-password-alias MEU-ALIAS. Lembre-se, todas as criações de alias requerem um restart no Glassfish (pelo menos no meu caso notei isto).

Importante lembrar que todas as senha são guardads de maneira criptografada pelo Glassfish em local seguro.

É isso.Utlize este recurso para proteger suas senhas, não só de banco mas também de filas JMS ou qualquer outro dado sensível.


Plugin do Glassfish para Eclipse – Clear Button e Teclas de atalho

Janeiro 23, 2009

Há algum tempo venho usando o plugin do Glassfish V2 para o Eclipse Ganymede. Ele é bom e funciona basicamente como os outros plugins de application servers baseados em WTP, tipo JBOSS ou Tomcat.

Por padrão o WTP não suporta adicionar o Glassfish. Para que ele seja listado, precisamos ou adicionar um novo adapter, utilizando os recursos de atualizações automáticas do eclipse, como visto aqui, ou baixar a ultima versão dos arquivos e colocá-los nas pastas plugins e features.

O funcionamento é bem bacana, mas senti a falta de basicamente três coisas:

  • Um botão para limpar o log viewer (GlassFish LogViewer) porque ele obviamente torna-se imenso. (Mas acho que para fazere isto terão que mudar bastant eo plugin porque aparentemente o que vemos aí é uma leitura exata do arquivo domains/domain1/logs/server.log. Aparentemente o console do eclipse não é um novo appender, mas sim um visualizador do arquivo)
  • O correto funcionamento das teclas de atalho do eclipse dentro deste mesmo Log Viewer ao selecionar algum texto. Por exemplo, o atalho CTR+SHIFT+R que carrega a lista de classes, poderia já levar o texto selecionado para agilizar as buscas.
  • Um link para irmos diretamente ao fonte que lançou alguma exceção.

Como este último item já havia sido reportado, criei um novo issue no site do projeto para os dois primeiros, agora é esperar para ver se será aprovado.

Quanto mais pessoas votarem, maior a chance de as correções serem feitas! Entrem lá e ajudem a melhorá-lo!


Artesanato? Lembranças?

Janeiro 21, 2009

Minha esposa agora possui um site para a venda de seus produtos artesanais. Caso alguém se interesse por artesanatos de alta qualidade e bom gosto, para ocasiões do tipo lembranças de nascimento, casamento ou até mesmod ecoração, vale a pena dar uma ohada nas coisas que ela faz.

O site é www.alinemilanez.com.br . Tenho certeza de que você irá gostar.


EJB + Glassfish + TemporaryQueue + QueueRequestor = Vai com calma

Janeiro 20, 2009

Uma das coisas interessantes de se fazer com JMS, é a invocação síncrona. Por mais que pareça estranho, em muitas ocasiões é bastante interessante e razoável, que um cliente de uma fila possa obter a resposta de sua requisição, de alguma maneira.

Uma das maneiras mais comuns de se fazer isto, é utilizando uma classe da própria especificação chamada QueueRequestor, que facilita bastante a criação de um Request/Response utilizando as filas como meio. O que a classe faz, é basicamente criar uma fila temporária e adicionar seu nome no header replyTo do próprio JMS, na mensagem a ser enviada. Desta maneira, quem consome esta mensagem, sabe que após porcessá-la deve enviar uma resposta na fila especificada.

Um código bem simples para realizar esta tarefa, poderia ser por exemplo:


QueueConnection c = (QueueConnectionFactory) (new
InitialContext().lookup("qcf"));
QueueSession s = c.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Queue q = (Queue) (new InitialContext().lookup("requestqueue"));
QueueRequestor r = new QueueRequestor(s, q);
Message reply = r.request(s.createTextMessage("1233442342"));
c.close();

Neste trecho de código, uma mensagem é enviada em uma fila chamada “requestqueue" e, como estamos utilizando o QueueRequestor, ele automaticamente cria uma fila temporária para o recebimento da resposta de sua requisição, que é armazenada na variável “reply”. Lógico, quem implementou o MessageListener que consome a fila “requestqueue" precisa obviamente implementar a lógica necessária para obter o header replyTo e publicar alguma possível resposta nesta fila. Isto pode ser feito deste jeito:


Destination destinationJMS = message.getJMSReplyTo();
TemporaryQueue replyQueue = (TemporaryQueue) destinationJMS;

Desta maneira, obtemos uma referência à fila temporária criada pelo QueueRequestor e poderemos escrever nossas repostas por lá.

O que é mais comum no entanto, é que a lógica de todo o processamento não resida no MessageListener, e sim em outro lugar qualquer. A partir daí, temos dois pontos a considerar, um relacionado ao EJB e outro ao Glassfish (não consgui testar em outro APP Sever).

Problema do Glassfish: Nome da fila não é o mesmo nome JNDI

Como disse, normalmente a lógica toda de uma requisição a uma fila não fica no MessageListener, mas sim em algum outro lugar qualquer que o próprio MessageListener irá delegar. Neste caso, precisamos de alguma maneira guardar o nome da fila temporária, para que em tempo apropriado, possamos novamente obter uma referência a este memso objeto e publicarmos nossa resposta. No Glassfish, o nome obtido através do método getQueueName() aparentemente não é o mesmo nome JNDI desta fila. Estranho, mas um NameNotFoundException explode na cara ao tentar realizar o lookup do retorno deste método. A solução aqui é simples, apesar de soar obviamente desnecessária. Basta que realizemos um bind no nome da fila apontando para o próprio objeto, mais ou menos assim:


...
Destination destinationJMS = message.getJMSReplyTo();
TemporaryQueue replyQueue = (TemporaryQueue) destinationJMS;

context = new InitialContext();
temporaryQueueName = replyQueue.getQueueName().replaceAll(”[/]“, “A”);
temporaryQueueName = temporaryQueueName.replaceAll(”[:]“, “A”);

context.bind(temporaryQueueName, replyQueue);

Fazendo isto, garantimos que o nome JNDI seja igual ao nome retornado pelo método getQueueName(). Basta que este nome seja entregue ao objeto na qual o delegate foi realizado, de maneira que ele o preserve para futuro lookup. Repare que adicionei alguns replaceAll.. Isto se deve ao fato de o Glassfish não publicar nomes JNDI contendo “/” ou “:”.. Neste caso, uma exceção do tipo “Cannot create empty subcontext” é atirada.

Problema do EJB: Transações

O código que crua o objeto QueueRequestor, como demonstrado acima, funciona perfeitamente em qualquer lugar, menos em objetos EJB (não em todos os casos, existe uma solução).

Isto ocorre porque por padrão, o método request deste objeto utiliza os recursos transacionais do EJB realizar algumas garantias, mas o que acaba acontecendo é um bug difícil de encontrar: A fila temporária é criada e a mensagem chega ao destino com transação, mas seu consumidor (MDB, MessgaeListener) não consegue retirá-la de lá. O travamento é certo, mesmo parando o servidor a coisa continua feia. A única solução para este caso, é anotar o método que realiza a lógica do QueueRequestor com instruções não transacionais, deste jeito:

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)

Se o método em questão precisa obrigatóriamente de transações, então não será possível utilizar o QueueRequestor (repito, pelo menos no GlassFish V2), alguma outra API deve ser usada para continuar com o efeito Request/Response.

Para uma explicação mais detalhada, vale a pena dar uma olhada neste blog tmabém: http://blogs.sun.com/fkieviet/entry/request_reply_from_an_ejb

Isso aí, apesar de tudo o peixe de vidro continua sendo bacana… Vamos ver até quando!


Criando Connection Pools por configuração no Glassfish

Janeiro 19, 2009

Muito tempo sem publicar nada, mas tentarei adiquirir o hábito novamente!

De um tempo pra cá, estamos utilizando apenas o Glassfish v2 como servidor de aplicações.  Ao mesmo tempo que é bem interessante, em determinados momentos alguns bugs nos deixam atordoados.

O que eu acho bastante legal e intuitivo é o console admin. De longe é mais fácil do que o de outros Applications Servers (inevitável comparar com o JBOSS, me desculpem aqueles que acham isso ruim). O que acho que falta, e isso é uma desgraça, é um console para fazer queries em Queues e Topics JMS. Não sei como deixaram isso de lado, inacreditável…

Em relação aos bugs que atordoam, acho que o mais estranho deles é a anotação para nomear um Session Bean em JNDI. Ao utilizar:

@Stateless(
mappedName = “ejb/session/MeuSessionBean”)

public Bean MeuSessionBean implements MinhaInterface {

}

Nada acontece, nem erro de deployment. O problema só ocorrerá durante um lookup, recebendo um glorioso NameNotFoundException. Para corrigir o problema, basta colocar um nome qualquer, junto da anotação, como por exemplo:

@Stateless(
name = “ejb/session/MeuSessionBean”)
mappedName = “ejb/session/MeuSessionBean”)

public Bean MeuSessionBean implements MinhaInterface {

}

Tudo funciona neste caso.. Bugs a parte, continuo a acreditar (até agora pelo menos) que o Glassfish tem um futuro bastante promissor pela frente.

Uma das coisas bem interessantes, e que levei um tempinho para resolver, é a criação em deployment de um pool de conexões com o banco de dados. O glassfish possui um arquivo proprietário chamado “sun-resources.xml” que deve estar presente no diretório META-INF de sua aplicação (aqui utilizamos EAR, em um projeto eclipse mesmo). Neste arquivo podemos adicionar instruções para a criação de pools de conexão com bancos de dados, JMS Factories e Destinations, dentre outras coisas mais.

Criar um pool de conexões com um banco, exigiria o seguinte conteúdo:

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE resources PUBLIC “-//Sun Microsystems, Inc.//DTD Application Server 9.0 Resource Definitions //EN” “http://www.sun.com/software/appserver/dtds/sun-resources_1_3.dtd”>
<resources>

<jdbc-connection-pool allow-non-component-callers=”false”
associate-with-thread=”false” connection-creation-retry-attempts=”0″
connection-creation-retry-interval-in-seconds=”10″
connection-leak-reclaim=”false” connection-leak-timeout-in-seconds=”0″
connection-validation-method=”auto-commit”
datasource-classname=”net.sourceforge.jtds.jdbcx.JtdsDataSource
fail-all-connections=”false” idle-timeout-in-seconds=”300″
is-connection-validation-required=”false”
is-isolation-level-guaranteed=”true” lazy-connection-association=”false”
lazy-connection-enlistment=”false” match-connections=”false”
max-connection-usage-count=”0″ max-pool-size=”32″
max-wait-time-in-millis=”60000″ name=”MeuPool
non-transactional-connections=”false” pool-resize-quantity=”2″
res-type=”javax.sql.DataSource” statement-timeout-in-seconds=”-1″
steady-pool-size=”8″ validate-atmost-once-period-in-seconds=”0″
wrap-jdbc-objects=”false”>
<property name=”databaseName” value=”MinhaBase” />
<property name=”instance” value=”MinhaInstancia” />
<property name=”serverName” value=”MeuServidor” />
<property name=”user” value=”meuUsuario” />
<property name=”password” value=”MinhaSenha” />
</jdbc-connection-pool>

<jdbc-resource enabled=”true” jndi-name=”jdbc/MeuNomeJNDI
object-type=”user” pool-name=”MeuPool” />

</resources>

Repare que os itens em vermelho, são obviamente o que você deve substituir para seus endereços específicos. O item em verde, representa a classe do seu driver que criará o pool de conexões. Repare na tag jndi-name. Ela é bastante importante pois represente como o lookup para este pool será realizado. Outro ponto importante é o pool-name (em laranja). Ele deve estar igual tanto na declaração da connection-pool como no jdbc-resource para que tudo funcione corretamente.

No meu caso, utilizo o SQL Server 2005, portanto meu driver é o JTDS, assim como identificado no arquivo. Lembrando que este valor depende da documentação de cada driver e lembrando também que o jar do driver, bem como suas dependências, devem estar em algum diretório de bibliotecas de sua aplicação. Ao contrário do que se vê por aí, não é necessário copiá-lo diretamente para a pasta lib do Glassfish. É suficiente que ele esteja presente em sua pasta de bibliotecas e também descrito no arquivo META-INF/application.xml (no caso de um projeto EAR, o que acredito ser o mais comum) deste jeito:

<?xml version=”1.0″ encoding=”ASCII”?>
<application xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns=”http://java.sun.com/xml/ns/javaee” xmlns:application=”http://java.sun.com/xml/ns/javaee/application_5.xsd” xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd” version=”5″>
<display-name>MinhaAplicacao</display-name>
<module>
<java>jtds-1.2.2.jar</java>
</module>

</application>

Ao fazer o deploy, alguma coisa do tipo aparecerá no console:


INFO: Added Resource Type: jdbc-connection-pool
INFO: Added Resource Type: jdbc-resource

Pronto, sua conexão está configurada e  pode ser utilizada por seus persistence-units, no arquivo META-INF/persistence.xml, atravé do nome jndi declarado desta forma:

<persistence xmlns=”http://java.sun.com/xml/ns/persistence” version=”1.0″>
<persistence-unit name=”MeuNomeDeUnit” transaction-type=”JTA”>
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/MeuNomeJNDI</jta-data-source>
<properties>
<property name=”hibernate.show_sql” value=”true” />
</properties>

…..
</persistence-unit>
</persistence>

Mais uma vez, o nome descrito em azul, deve bater com o jndi-name para que o lookup do Glassfish funcione adequadamente!


Sun Tech Days 2008: Agora Vai!

Agosto 14, 2008

Há algum tempo, escrevi que não sabia se haveria ou não Sun tech Days neste ano, pois costumeiramente o evento acontece em meados abril. Até que acessando www.suntechdays.com.br me deparei com uma grata surpresa

Está bem em cima da hora para não ter nem link de inscrição, mas o negócio é ficar atento. Tomara que o evento não seja tão absurdamente comercial quanto foi no ano passado!


SOA com Java EE, Parte I

Agosto 14, 2008

No mais recente projeto java que rola por aqui de que tanto falo, as integrações com sistemas externos serão muito mais do que meras interações esporádicas, são parte essencial da captação de quase todos os dados que existirão no produto.

Sei que a maior parte do tão falado SOA não passam de um hype, sendo que tudo que existe hoje neste sentido parece muito mais com uma coleção de design patterns catalogados especificamente para organizar as aplicações de modo a minimizar os impactos de integrações com sistemas Back-End, mas de qualquer maneira, as possibilidades de utilizar-se deste paradigma em Java são bastante interessantes, e é a respeito desta experiência que tivémos na última semana é que irei tentar reportar.

Como já falei, o projeto em questão receberá quase que 100% de suas informações a partir de dados provenientes de sistemas Back-End do cliente, utilizando-se maneiras e protocolos diversos. Dado o cenário, observamos a necessidade de separar os processos de integração do sistema de sua semântica, de seu objetivo. Neste sentido, as perspectivas ofertados pelo paradigma SOA parecem surgir com certa precisão para alcançar esta meta. Como em Java sempre existe a liberdade de escolha, que nos permite alcançar o mesmo objetivo utilizando-se diversos frameworks e produtos, existem diversas alternativas para implementar aplicações que utilizam o paradigma SOA. O importante nesta situação é optar por alternativas que seguem alguma API ou especificação JSR. isto lhe trará seguranças em diversos aspectos, principalmente ao vender (ou tentar vender) seu produto.

As APIs em Java que trarão o paradigma SOA à sua aplicação, fazem parte da JSR 208 – JBI (Java Business Integration). As características completas da especificação podem ser encontradas aqui, mas em essência diria que API foi construída no modelo de Web Services, integrando os consumidores e provedores de informações através de componentes plugáveis, chamados de Service Units (SU). Estes componentes plugáveis são divididos em duas categorias (se é que posso dizer assim):

  • Binding Components (BC): São os componentes que representam os meios de acesso ou consumo da informação necessária, ou do seu próprio processo. Dentre os BCs existentes, teríamos por exemplo: SOAP, HTTP, FILE, Message Queue, CICS e etc, implementando portanto, como consumir ou disponibilizar determinada informação.
  • Service Engines (SE):  São componentes que fazem parte do seu processo de integração e realizam tarefas específicas. Poderíamos ter por exemplo, service engines que executam tranformações de strings XML, acessam bases de dados, objetos EJB ou outros web services.

Os processos de integração que utilizam BCs e SEs em ambiente JBI são realizados de diversas formas, dentre elas processos BPEL, onde podemos harmonizar todas as condições nas quais as interações entre nossos componentes devem acontecer, em qual tempo e em qual ordem. A composição dos diversos SUs, dá origem a uma aplicação composta, chamada de Service Assembly (SA).

O interessante nisto tudo é ressaltar que o JBI define as formas (dentre muitas outras coisas) nas quais os componentes BC e SE devem ser construídos, quais interfaces devem implementar e quais arquivos xml devem ser providos.Isto facilita e muito a adição de novos Service Units, tornando a adição de novas tecnologias como CEP por exemplo, muito facilitada. Um viva aos padrões!!!

Durante a avaliação dos JBI Servers gratuitos que implementem JBI e que possuísem fonte aberto, os produtos que comparei por um tempo foram esses (não tive muito tempo, mas acho que o que pude ver foi bastante satisfatório):

Apache ServiceMix – Esta é a implementação JBI da Apache Software Foundation. Apesar de parecer bastante simples ao fazer download, minha impressão a respeito do ServiceMix é que ele não serve muito bem para iniciantes. Faz-se necessário um conhecimento bastante grande a respeito de suas especificações, das estruturas de diretórios necessárias, dos arquivos xml de configuração e por aí vai… Não consegui encontrar nenhum plugin para o eclipse que realmente tenham valido a pena, ou que me poupassem ao menos metado do trabalho necessário para publicar uma aplicação “Hello World”. Um problema grande (e bota grande nisso) é o fato de os tutorias publicados no site da Apache conterem diversos (e absurdos) erros, o que dificulta e muito seu aprendizado. Uma das coisas bacanas é a disponibilização de diversos builds Maven para empacotamento dos deploys.

Mule – Apesar de bastante utilizado e comentado, não implementa especificação nenhuma, portanto não pude olhar este cara muito a fundo. Segundo os artigos e tutorias que li, é bastante rápido, fáicl de gerenciar e de se usar. Como não segue nenhuma especificação, cuidado se escolhê-lo, você pode morrer abraçado a ele.

Open ESB – É de longe o mais fácil de se utilizar e um dos mais completos em termos de Binding Components disponíveis após download. Antigo See Beyond, hoje é a base da distribuição Java CAPS da SUN.  Seu uso através do editor CASA NetBeans é muito intuitivo e apresenta resultados muito de maneira muito rápida. Além do que, os tutorias disponíveis no site da comunidade NetBeans estão muito bem escritos e realmente funcionam. Possui integração facilitada com servidores GlassFish e JBOSS, o que o torna uma excelente opção tanto para aprendizado como para ambiente produtivo.

É isot, neste post procurei descrever de maneira um pouco abstrata talvez, como a plataforma Java soluciona os paradigmas SOA através de suas especificações e APIs, além de apresentar algumas opções de ESBs disponpiveis. Nos próximos POSTS, colocarei alguns exemplos interessantes de aplicações que não consegui encontrar na internet e tivemos que descobrir na marra. Também vou escrever a respeito de CEP, que parece ser algo bastante promissor daqui pra frente!


A importância (ou não) das notações

Julho 2, 2008

Há algum tempo (três anos, acredito eu) assisti uma palestra de algumas horas sobre metodologias de desenvolvimento e documentação de softwares. O palestrante era pesquisador do SEI, e seu foco de pesquisa no momento era a utilização de WIKIs como forma de documentação ágil de sistemas.

Independentemente de seu foco de pesquisa, o palestrante procurou enfatizar a importância da utilização de uma notação adequada ao documentar uma arquitetura. Mas o que poderia eventualmente significar “notação adequada” ? Pois bem, aí é que começa a bagunça.

Quem nunca se deparou com um “diagrama” recheado de círculos e/ou quadrados, com setas ou traços ligando os elementos?  Isso é o que mais vemos todos os dias, como por exemplo nesta imagem do site da SUN, contida dentro de um artigo sobre a VM java e como ela se relaciona com linguagens de script:

(http://java.sun.com/developer/technicalArticles/scripting/languages/images/scriptingengine.gif)

O exemplo acima traduz claramente o que o palestrante quis dizer. Na grande maioria das vezes as pessoas optam por expressar suas arquiteturas ou idéias, através de notações próprias e que muitas vezes não querem dizer nada para nenhuma pessoa além dela mesma. Isto é um problema? É e não é.

Não é um problema porque o objetivo é e sempre será expressar idéias, planos ou implementações da melhor forma possível. Além de que, não são todas as pessoas (eliminando os desenvolvedores (será?)) que conhecem notações como a UML por exemplo. Muitos de nossos superiores não conhecem ou não julgam ser adequado em determinados momentos, utilizar a notação UML. Isto é um fato que não podemos simplesmente desprezar, nem nos tornarmos xiitas a ponto de dizer que se não for assim não será feito.  Essas pessoas geralmente julgam círculos, quadrados, setas e desenhos contendo servidores como algo muito mais intuitivo, mesmo que não possuam uma notação extremanente formal a ser seguida nem sequer uma metodologia (por exemplo: círculos indicarem processos e retângulos armazenamentos). Mas aí é que a coisa se torna um problema…

Esse tipo de diagramação torna-se um problema a partir do momento em que não definimos o que cada símbolo representa no contexto expresso. No exemplo acima retirado do site da própria SUN, esta definição  não foi feita. A não ser que tentemos adivinhar o que cada um dos símbolos representa, não conseguimos afirmar com propriedade que os quadrados representam os módulos da VM e as setas uma possível comunicação entre eles (pelo menos é o que me parece). Mas e se não for isso? E se o autor quis dizer uma outra coisa completamente diferente como por exemplo, indicar que as setas fechadas são chamadas de bibliotecas nativas e e as abertas são chamadas entre classes java? Não iremos saber, de forma alguma…

O que é importante ressaltar é que não é incorreto utilizar sua própria forma de expressar uma arquitetura ou idéia. O importante é descrever em qual notação ela foi feita, ou até mesmo dizer que não é uma notação definida, sendo que neste caso, a legenda contendo a indicação de cada um dos símbolos bem como o que significam deve estar presente. No caso de uma notação mundialmente conhecida ao menos seu nome precisamos referenciar, obrigatóriamente. Caso apresentemos um diagrama de classes UML por exemplo, devemos sempre colocar próximo a ele ou em um rodapé, mesmo soando redundante para nós , o dizer: NOTAÇÃO UML.

O exemplo da SUN de forma mais correta portanto, seria algo do tipo (não sei se está certo, se eles tivessem colocado uma legenda, não me induziriam ao erro! )

Diagrama sem notação definida, porém com legenda

É isto! Parece ser uma bobeira tremenda e até mesmo causar certo espanto, mas quanto mais formos claros em relação à documentar ou apresentar uma idéia ou arquitetura, teremos menos desentendimentos e dores de cabeça em nossos projetos!!


As ofertas de emprego java continuam

Julho 2, 2008

Há algum um tempo, postei que a empresa em que trabalho oferecia vagas para desenvolvedores java. Disse também que estaríamos recebendo os currículos no máximo até o final de junho.. Pois bem, as coisas sofreram um certo atraso e portanto, ainda estamos recebendo currículos.

Além do já mencionado, seria bastante interessante se os candidatos possuíssem:

  • Conhecimentos em algum framework ESB, de preferência Apache Service MIX, MULE ou Java CAPS
  • Conhecimentos em métodos de forecasting, como Redes Neurais ou métodos de regressão linear.

Novamente, os conhecimentos provavelmente não são obrigatórios, mas provavelmente farão uma diferença grande durante a seleção!


Visual Basic 6: Expression too complex

Junho 27, 2008

Java para mim representa duas coisas: meu ganha pão e minha inspiração. Porém, como todo desenvolvedor de hoje em dia não pode ficar limitado a determinada plataforma, também não fico restrito apenas a codificar em Java. Uma das coisas que trabalho, e que já trabalhei bastante, é com plataforma Windows DNA, utilizando ASP3, VB6 e COM+.

Se eu gosto? Não não gosto, mas muitas vezes a profissão obriga. Temos muitos sistemas legados por aqui que a cada dois meses precisam de manutenções pontuais e portanto não podem ser desprezados. Em duas oprtunidades, em manutenções deste tipo, obtive erros em tempo de execução simplesmente bizarros… Bizarros ao extremo eu diria. Citerei os dois campeões na minha opinião:

  • 8000FFFF – Catastrophic Failure: Se você recebe uma mensagem desta tarde da noite, com cliente buzinando no ouvido para que o sistema volte a funcionar o que você faz ? Se você tiver uma pistola à mão, a resposta é bem simples… Não sei explicar até hoje como este problema foi solucionado. Ele simplesmente sofreu um processo de cura automático. Falei por dois dias com o suporte da Microsoft, que caia na Argentina, sem obter sucesso. Acho que algum patch automático enviado pels administradores de rede por questão de releases da Microsoft acabou solucionando o problema.
  • Expression too Complex: Não é novidade que os seres humanos criaram os computadores para resolver seus problemas mais difícies. O que é novidade, é que a própria máquina passe a se recusar a solucioná-los porque também os considera difíceis demais!!!! Este problema ocorreu, porque segundo o Visual Basic, utilizei uma instrução muito, mas muito complexa, na qual reproduzo a seguir:

    IF (((CDbl((MesAtual) + getDiferencaMeses(tempMes))) – CDbl(tempMes)) <= (finalSufixo)) then

Sim.. Este IF é tão complexo, mas tão complexo, que o Visual Basic se recusa a fazê-lo por você. Tá certo, o código poderia ser melhorado, mas até aí não conseguir resolvê-lo já é demais… Bota demais nisso!