terça-feira, 28 de abril de 2009

Ubuntu + M$ ISA Server

Boa tarde gurizada medonha!
Estava eu fuçando com o novíssimo Ubuntu 9.04 logo após instalá-lo e reparei que, embora minha conexão de rede estivesse funcionando e eu conseguisse navegar, reparei que um apt-get update que ocorria problema de autenticação no ISA Server (proxy da M$ aqui na CORSAN).
Antigamente e em meu Debian, bastava apontar para o endereço do proxy na variável de ambiente http_proxy e tudo resolvido, acesso liberado. Após 15 minutos de tentativas frustradas, resolvi apelar pro google e de lá veio a solução "ntlmaps".
Mais que depressa pus-me a baixar e instalar este serviço e então pude usar apt-get e synaptic tranquilamente.
Acontece que logo em seguida o computador virou uma carroça, corri para verificar o que tomava todo o seu processamento e lá estava o ntlmaps.
Depois de várias vezes "restartar" o serviço, catei uma alternativa e logo o google retornou-me o cntlm.
Barbadamente instalei-o e configurei no arquivo /etc/cntlm.conf usuario, senha e endereço do proxy e pronto.
Já estou a alguns minutos navegando tranquilamente sem esgasgos. Recomendo!

quarta-feira, 1 de abril de 2009

Eclipse Ganymede + JBoss Seam

Eis que acredito ter atingido o meu ápice em termos de utilização do maravilhoso framework Mentawai, muito embora esteja longe de ter utilizado todos os seus recursos. Digo isto porque minha capacidade em Java, J2EE, na verdade em desenvolvimento e projeto de softwares em geral, é bem limitada e isto que sou Analista de Sistemas graduado em Bacharelado em Sistemas de Informação.
Bem, mas não vem ao caso ficar denegrindo assim, veementemente minhas capacidades.
UM comportamento, sim, um único comportamento que na verdade é um suporte ao Mentawai está fazendo com que eu procure um framework alternativo e eis que explico o comportamento e o porquê desta procura.
Precisava de um campo em um formulário web simples que permitisse somente a entrada de números com casas decimais, prontamente recorri ao fórum e às excelentes páginas de apresentação do Mentawai e encontrei o que precisava, o inputMoney. Perfeito, rapidamente estava podendo digitar somente números com vírgulas naquele campo. O problema foi o comportamento deste componente. É comum e isto já está gravado no DNA de todo cidadão que usa interfaces gráficas esperar que uma vez um texto selecionado receba a entrada de algum caracter, seja via teclado, área de transferência, etc, este seja substituído por esta nova entrada, mas o inputMoney (que na verdade é um regido por javascript) simplesmente ignora a seleção e tudo que digito é acrescentado ao conteúdo original e isto é no mínimo irritante, pois o cidadão tem que primeiro atentar ao fato de apagar todo o conteúdo para depois digitar o novo, sem contar que as casas decimais deve ser entradas obrigatoriamente, ou seja, se preciso do valor 15 para um campo com duas casas decimais tenho que entrar 1500. Simplesmente não gostei nem um pouco disto e como disse acima, sou limitado (de agora em diante esqueçam isto por favor), restou-me pedir ajuda encarecidamente no fórum, mas como o pessoal eu sei que realmente é ocupado e fez um belo trabalho em nos disponibilizar este magnífico framework, eu já esperava que ficaria sem resposta.
Não pessoal, não estou reclamando de má vontade ou algo parecido por parte dos desenvolvedores do Mentawai e muito menos estou sendo irônico, pois sei que o inputMoney na verdade é um "plus" do projeto.
Pois bem, muito embora o Saoj tenha escrito que o Mentawai faz tudo que o JBoss Seam faz e de forma mais compacta e direta, foi justamente esta comparação que aguçou meus sentidos a estudar o JBoss Seam, pois nem ao menos sabia qual era seu propósito até aquele momento. Pelo que pude entender, superficialmente, tem a intenção de fazer a ligação do JSF com os demais framework normalmente utilizados em J2EE (EJB 3.0, JPA, Hibernate, Ajax) facilitando ou automatizando esta integração e diminuindo consideravelmente a quantidade de arquivos e/de configurações necessários.
É isto que sei até o momento e o que mais vou relatar agora é como instalar e configurar o JBoss Seam 2.1.1-GA com Eclipse Ganymede, tomando por base o ótimo post do nosso amigo Sílvio Netto.

Então vamos lá (e considerando que já tenhas o JDK 6 instalado)!
Criemos um diretório que será nossa base, por exemplo, c:\DevelopEnv e lá descompactemos (estou usando como ambiente no momento um Windows XP 32bits):

Eclipse Ganymede;
JBoss 5.0.1.GA-jdk6;
JBoss Seam 2.1.1.GA;
JBoss Tools All 3.0.0.GA;

Atente para que o JBoss Tools seja descompactado dentro da pasta onde foi descompactado o Eclipse, pois ele é um conjunto de plugins para este.

A partir de agora vou fazer um copy-paste do post do Sílvio, alterando somente o que mudou daquele ambiente para este:

1 - Configurar o Eclipse
Alterar a perspectiva para Seam.
Window → Open Perspective → Other → Seam.

2 – Configurar o JBoss AS
Window → Preferences → Server → Runtime Environments → Add
JBoss Community → JBoss 5.0 Runtime
Altere o home directory para: C:\DevelopEnv\jboss-5.0.1.GA
Configuration: default.

3 – Configurar a visualização do servidor
JBoss Server View → Clicar com o direito → New Server
JBoss AS 5.0 → Next → Next → Finish

4 – Configurar Conectividade
Window → Preferences → Data Management → Connectivity → Driver Definitions → Add
HSQLDB JDBC Driver 1.8
Jar List → Driver File(s) → Add Jar/Zip:
hsqldb.jar → Remove Jar/Zip
Add Jar/Zip C:\DevelopEnv\jboss-5.0.1.GA\common\lib\hsqldb.jar
OK

5 – Criar um projeto
File → New → Seam Web Project
Name: agenda
Configurations: Dynamic Web Project with Seam 2.0
Next → Next → Next
Seam runtime: Add
Home Folder: C:\DevelopEnv\jboss-seam-2.1.1.GA
Deploy as: WAR
Database Type: HSQL
Connection profile: → New...→ HSQLDB → Finish
Finish

(O passo de anexar a aplicação agenda ao servidor pra mim não foi necessário)

6 – Iniciar o JBoss
Clique com o direito em JBoss 5.0 Server → Start

4 – Acessar o sistema
Abra um browser e digite: http://localhost:8080/agenda

Era isto gurizada.

quarta-feira, 18 de março de 2009

HTML: select (drop down) em cascata com MentaAjax

Finalmente acredito ter chegado a uma boa solução para controle de 3 campos select (drop down ou mesmo combobox) em cascatas. Para melhor ilustração aí vai o cenário da estrutura de dados. Tenho um catálogo de materiais, cada item deste catálogo faz parte de um subgrupo, cada subgrupo faz parte de um grupo e cada grupo faz parte de uma classe. Preciso selecionar o subgrupo a que pertence um item do catálogo e para tanto faz-se necessário: primeiro a seleção da classe, feita esta seleção o select com as grupos é preenchido; segundo faz-se a seleção do grupo e com isto o select dos subgrupos é preenchido para seleção final.
Estou desenvolvendo este catálogo em Java com mentawai para MVC. Tentei utilizar um cenário igual em que o cascateamento é feito com País, Estado e Cidade, desenvolvimento e relatado no fórum do mentawai, mas não obtive o resultado que desejava. Na verdade eu queria que ao ser feita uma nova seleção de classe, automaticamente os select com grupos e subgrupos fosse preenchidos automaticamente, sendo que o select dos grupos conteria os grupos da classe selecionada e o select dos subgrupos conteria os subgrupos do primeiro grupo da classe selecionada.
Chega de enrolação e vamos ao código!
Primeiro as configurações das actions no ApplicationManager:


action("/manager/FormMateriais", FormMateriais.class).on(SUCCESS, fwd("/manager/formMaterial.page"));
action("/manager/FormMateriais", FormMateriais.class, "add").on(SUCCESS, fwd("/manager/FormMateriais.mtw"));
action("/manager/FormMateriais", FormMateriais.class, "preencheComboGrupo").ajaxOk(new JSONGenericRenderer());
action("/manager/FormMateriais", FormMateriais.class, "preencheComboSubGrupo").ajaxOk(new JSONGenericRenderer());




Ao ser chamada URL /manager/FormMateriais.mtw, esta preenche a output com as classe, os grupos da primeira classe e os subgrupos do primeiro grupo da primeira classe. Como estou utilizando a tag html do mentawai (mtw:select) esta preenche automaticamente os select classe, grupo e subgrupo com os Maps da output.



@Override
public String execute() throws Exception {
Connection conn = (Connection) input.getValue("conn");

ClasseDAO classeDAO = new ClasseDAO(conn);
GrupoDAO grupoDAO = new GrupoDAO(conn);
SubGrupoDAO subGrupoDAO = new SubGrupoDAO(conn);

output.setValue("classe", classeDAO.getMap(classeDAO.list()));
output.setValue("grupo", grupoDAO.getMap(grupoDAO.list(classeDAO.list().get(0).getId())));
output.setValue("subgrupo", subGrupoDAO.getMap(subGrupoDAO.list(grupoDAO.list(classeDAO.list().get(0).getId()).get(0).getSeq())));
return SUCCESS;
}



Por fim, meu JSP com alguns recursos de Ajax disponibilizados pelo mentawai, permitem o preenchimento dinâmico dos selects grupo e subgrupo a cada evento onclick das selects classe e grupo.








< script type="text/javascript">
function getList(transport) {
var response = new mtw.response(transport);
response.replaceOptions("grupo");
}

function getList1(transport) {
var response = new mtw.response(transport);
response.replaceOptions("subgrupo");
}

function doRequest() {
var req = new mtw.request();
req.setUrl("FormMateriais.preencheComboGrupo.mtw");
req.addParameter("idClasse", $('classe').value);
mtw.removeOptions("grupo");
req.onSuccess(getList);
req.send();

doRequest1();
}

function doRequest1() {
var req1 = new mtw.request();
req1.setUrl("FormMateriais.preencheComboSubGrupo.mtw");
req1.addParameter("idClasse", $('classe').value);
req1.addParameter("idGrupo", $('grupo').value);
mtw.removeOptions("subgrupo");
req1.onSuccess(getList1);
req1.send();
}
< /script>




Bom, ainda não consegui resolver o problema de fazer os preenchimentos automáticos dos selects grupo e subgrupo para outros eventos que não o onclick, na verdade isto é um problema comigo ou com o mentawai, pois não consigo definir dois eventos diferentes nas tags mtw:select, assim resolvi usar onclick em detrimento a onchange ou mesmo onblur.

Era isto por enquanto. Abraços amigos.

sexta-feira, 13 de março de 2009

FISL 10


Buenas gurizada, já foi dada a largada para realização do FISL 10, este maravilhodo evento que ocorre todo ano aqui em Porto Alegre, desde 2000, e que nos permite compartilhar o sentimento único que cada usuário e promotor de software livre sente. Venham todos, tenho certeza que vai ser um evento memorável!

quarta-feira, 4 de março de 2009

Como definir limite de upload quando se dispõe de 2 link no servidor?

Ainda nem pude fazer experimentações com o tc+htb aplicando as regras propostas anteriormente aqui e já estou com a cabeça fervendo com as dificuldades que enfrentarei para fazer QoS de upload quando eu tiver 2 links a disposição.Não enfrentarei este mesmo problema para download, pois o tráfego para o cliente vai ser entregue pelo meu roteador QoS.
O "problema" que destaco é porque o upload do cliente ser daria por duas interfaces distintas, uma de cada link, por exemplo, uma com 2mb/s e outra com 1mb/s, enquanto que, voltando ao download, este se dá através de uma única interface de saída.
Digamos que eu queira oferecer ao cliente 256kb/s de download e 128bk/s de upload, estes 256kb/s pode ser uma somatória do que estiver vindo por um ou outro link, mas será sempre entregue por uma única interface de rede do QoS ligada aos clientes. Eu poderia fazer controle de upload em cada uma das interfaces de saída, ou seja, definir 44kb/s de upload pelo link de 1mb/s e 84kb/s de upload pelo link de 2mb, acho que seria um bom cenário, mas recaio no problema de não poder controlar upload desta forma fazendo NAT, pois não poderia identificar o cliente no momento do upload, devido ao tc que trabalharia sobre o IP do roteador NAT que já haveria feito o mascaramento, por exemplo:


+-----+ +-----+
|Link1| |Link2|
+--+--+ +--+--+
| |
+--+--------+--+
| NAT |
+------+-------+
|
| clientes


Então pensei em um cenário, que ainda não saberia dizer se operaria a contento, ainda vai demandar testes que seria:


+-----+ +-----+
|Link1| |Link2|
+--+--+ +--+--+
| |
+--+--------+--+
| NAT |
| Squid |
+------+-------+
|
+------+-------+
| QoS |
+------+-------+
|
| clientes


No roteador NAT/Squid faria o balanceamento de carga ou mesmo somente o direcionamento de tráfegos, ou seja, http e voip para o link 1 e o resto para o link 2, ou qualquer outra definição mais apropriada.
Tenho um sentimento que esta solução para upload não ofereceria a mesma qualidade no oferecimento de link aos clientes do que o upload, ambos feitos pelo QoS, mas é apenas uma impressão e ainda teria que raciocinar mais.

Um grande abraço a todos.

terça-feira, 3 de março de 2009

Autocomplete com mentawai

Como podem ver pelos posts, estou tocando dois pequeninos projetos, um em asp.net e outro em j2ee e sem dúvida que prefiro muito mais j2ee, parece que o desenvolvimento flui melhor e acredito que seja pela vasta documentação sobre tudo que se possa pensar, além de parecer gerar uma aplicação bem mais responsiva que asp.net, exatamente no sentido tempo de acesso ao banco de dados oracle como geração da saída para o browser do cliente.

Pois bem, voltemos ao assunto, eu já havia tentado implementar autocomplete com ajaxtoolkit no asp.net através da implementação de um webservice (necessário, mas de implementação simples no visual studio), só que não gerou um bom resultado, sendo apresentados alguns bugs, principalmente quando precisava dar foco no textbox e selecionar o conteúdo através de código.

Já estava preparado para amargurar alguns percalços com mentawai e parti pro abraço, mas fui decepcionado pela simplicidade do processo, sendo o mais complicado incluir os jar do json-lib, ezmorph, json, commons-logging e ajaxtags, pois tentei com os mais atualizados e não consegui rodar a aplicação, então baixei o mentawai completo e copiei dele os jar destas bibliotecas e transcorreu tudo perfeitamente.

Em meu jsp, por exemplo, BuscaMaterial.jsp tenho:

<mtw:inputtext name="descricao" id="descricao" size="50"/>
<div id="completeHere" class="auto_complete"/>
<mtw:ajaxcompleter onsuccess="completeText" source="descricao" target="completeHere" url="Filtro.autoCompleter.mtw">


e no head do meu Template.jsp:

<script type="text/javascript">
function completeText(key, value) {
}
</script>
<mtw:ajaxconfig loadprototype="true"/>


Já o método autoCompleter da action Filtro retorna um Map com a lista que eu desejar:

Map map = new LinkedHashMap();

while (rset.next()) {
BigDecimal numero = rset.getBigDecimal("id");
map.put(numero.longValue(), rset.getString("nome"));
}

output.setValue(AjaxConsequence.KEY, map);


Era isto galera!

Preencher TextBox como resultado de uma seleção no DropDownList em asp.net

Isto sem dúvida é algo bem simples e só fui descobrir isto porque após uma rápida procura frustrada no google parei e pensei em uma solução. Realmente, antes de simplesmente pensar em algo parti pro google para ele "pensar" por mim. Ok, mas vamos à situação: tenho um DropDownList com uma lista de materiais e queria preencher o conteúdo de um TextBox com o valor unitário daquele material após a seleção de algum item. As primeiras tentativas foram sobre CascadingDropDown ou algo similar, mas foram infrutíferas, então pus-me a pensar
- Mas se estas joça de asp.net é orientada a eventos, porque simplesmente não codifico a busca do valor unitário e o preenchimento deste TextBox no evento disparado pela seleção de um item do DropDownList? E foi o que fiz, cuidando para alterar a propriedade AutoPostBack do DropDownList para true, depois codifiquei o evento SelectedIndexChanged com:

String id = cMaterial.SelectedValue;

if (!string.IsNullOrEmpty(id)) {
Material material = MaterialDAO.Get(int.Parse(id));
cValorUnitario.Text = material.valorUnitario.ToString();
}

Pronto!