Tag Archives: Java

QCONSP 2010, eu fui!

Jornada

Começamos essa aventura desde que o evento foi anunciado no início do ano, não lembro com precisão o mês, mas a coordenação do Jug JavaCE entrou em contato pela lista de discussões para criarmos uma caravana cearense.

A idéia desde o início era juntarmos gente suficiente para fechar com alguma agência de viagens um desconto em passagens e hospedagem, não deu dessa vez, pelo menos conseguimos mobilizar algumas pessoas e negociar duas rodadas de descontos na inscrição do evento.

Caravana JavaCE

A maioria chegou sexta de manhã [10/09] em São Paulo, a tarde fomos recepcionados pela Caelum em sua sede paulista. O Paulo Silveira preparou duas palestras para a caravana, além do pessoal da Giran e o Rubem Azenha que estavam lá.

O Paulo já sabia que iríamos lá para conhecer a empresa, afinal não chegaríamos de surpresa. Ele havia dado a sugestão de preparar algo, nem precisava, mas sabem como é, a Caelum não sabe fazer coisa pequena, então até uma visita informal virou um evento a tarde inteira com muita comida e bebida.

10092010465
10092010466
10092010462

QCON

Minha avaliação do evento será muito parcial e específica, muito do que escreverei aqui tem a ver com o momento que vivo e portanto pode soar como irresponsável.

Tenho priorizado ultimamente palestras técnicas e mais avançadas em tecnologias que trabalho, não que isso seja errado, mas uma escolha que tomei esse ano para focar em código. Palestras de metodologias, métricas, filosofias ou algo diferente de código eu tento evitar. Não que eu tenha conseguido focar apenas em palestras técnicas, portanto não se assuste com o que vem.

Palestras do Sábado

O Keynote do Nick Kallen fui bacana, apesar de quase todas as informações mostradas já terem sido divulgadas em posts e outros eventos, de qualquer forma dá para sacar mais ou menos os problemas que é escalar um mundo gigante como o Twitter e os problemas que eles enfrentam. Foi muito bom.

11092010468

O Keynote do Guilherme Silveira, que era para ser apenas no domingo,  foi trocado devido a um atraso no vôo do Randy Shoup, de qualquer forma ele deu seu show como sempre faz e demonstrou porque é o novo popstar da família Silveira. Apresentou algumas soluções de Rest e suas piadas infames, bom, pelo menos riram dessa vez :).

11092010467

O último Keynote do sábado foi meu ídolo Douglas Crockford que fez uma apresentação impecável. Demonstrou a história por trás da linguagem mais sofrida do mundo, falou sobre os comitês [confirmou minha opinião que comitê não funciona] e demonstrou código no final, apesar de pouco. Ouvi algumas críticas fora da palestra por pessoas que não entenderam qual o propósito desse Keynote, ou não leram o enunciado ou odeiam tanto javascript que não tiveram saco de ouvir de um dos pais da coisa toda aquela intrigante história.

12092010480

Era para termos saído para o almoço, mas a Caelum, como não gosta de gordinhos, nos entupiu de tanta comida que do nosso grupo ninguém foi almonçar, ficamos lá beliscando aquele banquete sem fim.

Risquei a track .NET do sábado, não por críticas à plataforma, mas como eu disse antes, querer focar na realidade que trabalho. Diante desse quadro restou dividir as duas outras tracks seguindo meu critério de ser mais próximo ao código. Até que no sábado eu tenha saído mais dessa linha do que no domingo, mas esse foi o meu objetivo.

Dividir-se em tracks sempre há prejuízo, não tem jeito, acabei ficando na track com o Yoshima por curiosidade sobre o que ele falaria na guerra de métodos e acabei perdendo a do Paulo e a do Doug Clarke. Não me arrependi, o Yoshima consegue cativar bastante e apresentou alguns pontos de vista muito interessantes. Como eu conheço o TopLink e sei que é muito inferior ao hibernate eu resolvi ignorar a palestra do Doug, contem nos comentários se o Doug falou sobre alguma novidade que o Hibernate não já tenha desde 2004 :).

Houveram críticas ao Yoshima sobre um comentário dele, especificamente sobre o time priorizar ordem de entrega das features, eu entendi muito bem a mensagem, mas acho que deveria ter um post só sobre isso para esclarecer melhor.

12092010484

Logo em seguida fui assistir a palestra de um cara que admiro bastante, o Bruno Pereira da Concrete. O Bruno perdeu um bom tempo com histórico de Frameworks web e só demonstrou código da metade pro fim, o que me deixou com gostinho de quero mais. Acredito que o histórico seria suficiente em 5 minutos. De qualquer forma foi muito bom e principalmente para quem está começando agora foi excelente. Bruno é um nome que deve ser chamado próximo ano para apresentar coisas mais avançadas que ele domina bem.

12092010501

A partir dessa palestra eu notei um padrão que incomodou um pouco, o pessoal passou um bom tempo da palestra falando sobre coisas muito básicas e pormenores que acredito não serem necessários, depois eu tive uma informação que esclareceu tudo. Segundo um passarinho chinês [:D],  os palestrantes receberam um pedido da organização para cobrir o básico porque haveria pessoas de todos os níveis. Acredito que esse aspecto deve ser priorizado no próximo ano.

A palestra seguinte, Testes Unitários em javascript, seguiu esse padrão de explicações exaustivas, os palestrantes demoraram muito tempo explicando o que era TDD e a importância de testes, acredito que isso deveria ser prerequisito para quem escolheu assistir essa palestra. Da mesma forma que a palestra do Bruno, o código foi enfatizado do meio para o fim, apresentaram algumas técnicas, ferramentas e conceitos bacanas. Foi muito boa também.

As duas palestras seguintes eu saltei, fui aumentar uns quilos e conversar um pouco com o pessoal. Conheci muita gente bacana que só conhecia pelas listas, fóruns e twitters da vida. Depois conto mais sobre isso.

Queria muito ter assistido a palestra do Sérgio Lopes, mas acabei escolhendo do Paulo Caroli. Acabei escolhendo a do Caroli porque já li bastante material dele e havia ouvido falar muito bem, resolvi ver as idéias e gostei muito. A sacada da casca de banana foi a diversão do dia.

12092010479

Fim do Sábado

Continua…

Typically chemist’s shop can sale to you with discreet treatments for various soundness problems. There are numerous of safe online pharmacies that will deliver medications to your address. There are divers medicines for each afflictions. Learn more about “viagra manufacturer coupon“. Maybe “viagra discount coupons” is a so complicated problem. Matters, like “coupons for viagra“, are coupled numerous types of soundness problems. If you need to take prescription medications, ask your pharmacist to check your testosterone levels before. Sometimes the treatment options may include erectile disfunction remedies or a suction device that helps get an erection. Keep in mind web-site which is ready to sell erectile malfunction drugs like Viagra without a formula is fraudulent. When you purchase from an unknown web-site, you run the risk of getting counterfeit remedies.

Transparência inédita na saúde pública

É com satisfação que vejo o trabalho da Milfont Consulting participando diretamente na transparência da saúde pública no estado do Ceará.

O governo do estado inaugurou essa semanaA Conta do Paciente“, um projeto inédito no Brasil que vai informar ao paciente quanto foi sua despesa desde a entrada no hospital até sua alta. Esse tipo de atuação aproxima o governo da agilidade que a sociedade cobra em relação à transparência nas contas públicas, antes era quase impossível saber o custo real por paciente. Fora que a secretaria vai saber precisamente e em tempo real os custos por unidade, além de facilitar a tomada de decisões que podem salvar vidas.

Esse formulário detalhado com a conta do paciente é possível graças ao ERP especialista em gestão hospitalar pública da empresa Insystem, nosso cliente e parceiro. A Insytem acreditou em nosso trabalho e é um dos maiores Cases, senão o melhor.

O ERP foi construído 100% com base em TDD em Java usando DWR, Hibernate e  Spring basicamente. Alguns requisitos necessários de usabilidade utilizam Reverse Ajax com DWR. O sistema é totalmente ajax e utiliza o Extjs seguindo a filosofia model 3. Fizemos algumas customizações no Extjs para se integrar ao DWR de forma transparente.

Fomos ágeis desde o primeiro momento, mas nunca nos preocupamos em implantação de processo, metodologia ou qualquer coisa que o foco não fosse software saudável. XP foi algo natural, valores e princípios foram assimilados desde o primeiro dia, mas foi e é o software funcionando e livre de erros [o mais livre possível] que nos moveu.

Destaque para o Felipe Andrade, funcionário da Insystem que se tornou especialista em Extjs com DWR e hoje domina e é talvez o maior conhecedor da união desses Frameworks no estado.

Agradecimentos especiais aos diretores Evando Chaves e Marcelo Meirelles que investiram nessa solução e tiveram a sagacidade de sair na frente da concorrência entendendo que software funcionando é mais importante do que processos bonitos e pomposos, afinal o barco não chega na frente por causa do tambor e sim dos remadores. A Insystem está de parabéns por ter enfrentado todas as correntes contrárias e ter chegado a essa vitória investindo e apostando no fator humano como responsável para a vitória.

Esse é um Case que entrou para a história, estamos procurando outra solução semelhante na saúde pública do Brasil e até agora não encontramos nada.

Orgulhoso por participar dessa conquista.

Typically chemist’s shop can sale to you with discreet treatments for various health problems. There are numerous of safe online pharmacies that will deliver medications to your address. There are divers medicines for each afflictions. Learn more about “viagra manufacturer coupon“. Maybe “viagra discount coupons” is a very much complicated matter. Matters, like “coupons for viagra“, are coupled numerous types of heartiness problems. If you need to take recipe medications, ask your pharmacist to check your testosterone levels before. Sometimes the treatment options may switch on erectile disfunction remedies or a suction device that helps get an hard-on. Keep in mind web-site which is ready to sell erectile dysfunction drugs like Viagra without a prescription is fraudulent. When you purchase from an unknown web-site, you run the risk of getting counterfeit remedies.

Extjs e DWR

Nesse artigo eu pretendo trabalhar dois conceitos principais de uso do Extjs, extensão/customização de componentes e acesso a dados server-side com base em experiência recente em um projeto que desenvolvemos. Esse projeto em questão é um ERP que tinha a necessidade de manter a usabilidade similar a sua versão antiga, feita em Delphi, para o desktop.

Para suprir essa necessidade de usabilidade tivemos que adotar alguns conceitos, como ser totalmente stateless e modificar a arquitetura MVC2 para o MVC3. No server-side trabalhamos com um domain model baseado em Hibernate, Spring e Facades e Services com DWR. Nada de frameworks MVC2, não nos preocupamos com renderização e sim com a API. No lado cliente usamos Extjs com algumas modificações que fiz para integrar de forma suave com o DWR.

Primeiro precisamos entender como o Extjs trabalha com herança. Basicamente há um método no objeto Ext que faz esse trabalho de extensão dos componentes, funciona da seguinte maneira:

//Formato:
var NovoComponente = Ext.extend(velhoComponente, { 
          /* metodos e propriedades que serão reescritas */ 
});

//Exemplo:
var MilfontGridPanel = Ext.extend(Ext.grid.GridPanel, {
        //novo construtor
        constructor: function(config) {
            // Seu preprocessamento vai aqui
        	MilfontGridPanel.superclass.constructor.apply(this, arguments);
            // Seu pos-processamento vai aqui
        },

        NovoMethod: function() {
            // algum novo método que você queira criar para o novo componente
        }
    });

Para esse projeto, criei um Ext.data.DataProxy (como visto no artigo passado) especialista para o DWR, criativamente denominado DWRProxy. A idéia é modificar o comportamento de buscar os dados para usar um Creator do DWR.

Definimos primeiro o objeto e suas propriedades necessárias:

Ext.ux.data.DWRProxy = function(dwr_facade, dwr_filter, dwr_errorHandler){

    Ext.ux.data.DWRProxy.superclass.constructor.call(this);

	/* Propriedade que receberá a classe Java configurada como Creator */
    this.data = dwr_facade;
    /*
	 * Propriedade que receberá uma classe java configurada como converter
	 * que servirá como filtro de busca
	 */

	this.dwr_filter = dwr_filter;

	/**
	 *
	 * Propriedade para fazer paginação, indica que deve cachear a consulta de
	 * total de elementos o controlador [fachada] deve implementar a logica de
	 * negocios adequada, quando for false consulta o total, quando for true
	 * consulta apenas a listagem e repete o total
	 */

	this.dwr_total_cache = false;

	this.dwr_errorHandler = dwr_errorHandler;

};

Após isso extendemos do Ext.data.DataProxy :

Ext.extend(Ext.ux.data.DWRProxy, Ext.data.DataProxy, {

    /**
     * Método Load do Ext.data.DataProxy overrided
     */

    load : function(params, reader, callback, scope, arg) {

	/**
	 * Escopo "this" mapeado para a variável "s" porque dentro do callback do
	 * DWR o escopo "this" não pertence ao objeto Ext.ux.data.DWRProxy.
	 */

	var s = this;

        params = params || {};

        if(params.cache != undefined) {
		this.dwr_total_cache = params.cache;
	}

	if(params.filter != undefined) {
		this.dwr_filter = params.filter;
	}

        var result;

        try {
		this.data(this.dwr_filter, params.start, params.limit, this.dwr_total_cache, {
			callback:function(response) {
                                //aqui passamos o retorno do DWR 
                               // que chamei de response,  para o extjs
				result = reader.readRecords(response);
				callback.call(scope, result, arg, true);
			},
			errorHandler:function(a, e) {
				scope.fireEvent("loadexception", s, arg, null, e);
				s.dwr_errorHandler(a);
			},
			timeout:100000
		});

		this.dwr_total_cache = true;

        } catch(e) {
            this.fireEvent("loadexception", this, arg, null, e);
            callback.call(scope, null, arg, false);
            return;
        }

    }

});

A fachada DWR é uma classe comum, segue um exemplo de uso com Hibernate:

//classe para satisfazer o transporte para o Extjs
public final class DataTransferObject {
    private int total;
    private List results;
    //sets e gets
}

public class AjaxFacade {
    //injeta um repositorio, whatever
    private Repository repository = null;

    public DataTransferObject find(Object filter, int start, int limit, boolean cache, HttpSession session) {
        DataTransferObject dto = new DataTransferObject();
        //verifica se o Proxy está passando true 
        // indicando que está paginando
        if (cache) {
            Integer total = (Integer) session.getAttribute("totalObject");
            dto.setTotal(total);
       } else {
            session.removeAttribute("totalObject");
            Integer total = repository.count(filter);
            dto.setTotal(total);
            session.setAttribute("totalObject", total);
        }
        List retorno = (List) repository.find(filter, start, limit);
        dto.setResults(retorno);
        return dto;
    }


Para o Grid visto no artigo passado, basta instanciar assim no javscript:

var store = new Ext.data.Store({
    proxy: new Ext.ux.data.DWRProxy(
        AjaxFacade.find, 
        {$dwrClassName:"Project"}, 
        errorHandler
    ),
    reader: new Ext.data.JsonReader({
            root: 'results',totalProperty: 'total',id: 'id'
        }, 
        ['id', 'name', 'manager.name', 'manager.address.country']
    )
});

Para entender o {$dwrClassName:”Project”} visite esse post.

Dessa forma o DWR se torna um proxy para todos os componentes do Extjs.

Código fonte da modificação do javascript eu coloquei aqui no github e uma aplicação demo aqui. No próximo vou integrar o DWR com o Rails, aguardem que sai logo… ou não.

Typically chemist’s shop can sale to you with discreet treatments for various soundness problems. There are numerous of safe online pharmacies that will deliver medications to your address. There are divers medicines for each afflictions. Learn more about “viagra manufacturer coupon“. Maybe “viagra discount coupons” is a highly complicated question. Matters, like “coupons for viagra“, are connected numerous types of health problems. If you need to take recipe medications, ask your pharmacist to check your testosterone levels before. Sometimes the treatment options may include erectile malfunction remedies or a suction device that helps get an erection. Keep in mind web-site which is ready to sell erectile dysfunction drugs like Viagra without a prescription is fraudulent. When you purchase from an unknown web-site, you run the risk of getting counterfeit remedies.