sexta-feira, 12 de junho de 2009

Novamente liberado para postagens

Olá galera! Por acaso verifiquei que consegui logar no blogger e quem sabe eu possa postar mais algumas coisas se isto se mantiver.
Já faz umas três semanas que estou morando em meu novo AP, este sim adquirido e não alugado aqui em POA. Finalmente minha esposa e eu poderemos construir nossa lar para vivermos tranquilamente pelos próximos 6 ou 7 anos, após isto acredito que poderemos pensar em mudarmos para um AP com área maior que os atuais 30m².
Estive incursionando nos meandros de meu cérebro e disto surgiram algumas idéias de cunho filosófico, mas que ainda não pude aprofundar nas definições. A primeira: me parece que a pergunta não deveria ser "qual o sentido da vida?", mas sim "porque somos inteligentes?", afinal vida é uma convenção. Sem inteligência jamais perguntaríamos "qual o sentido da vida?", "Deus existe?". Ainda, jamais afirmaríamos "Deus existe." ou "Deus não existe". Ah! É verdade, alguns poderiam dizer que para fazer estas perguntas, além da inteligência é necessária uma linguagem, pois sem esta não poderíamos formar frases.

quinta-feira, 14 de maio de 2009

Ferramento para União e Pdginação de PDFs, PdfMergeAndPaging

Estou com problemas de acesso ao blogger aqui da empresa onde trabalho e tive que recorrer a um site redirecionador para tanto, inclusive enviando minha senha em modo inseguro.
Vamos ao projeto, surgiu uma necessidade aqui na empresa de alguns departamentos que geram arquivos PDF a partir de várias aplicativos e necessitavam juntá-los e após paginá-lo para publicação na intranet e internet. Para resolver isto, um dos departamento fez a aquisição de uma licença do Adobe Acrobat Professional. Perfeito, sanou toda o seu problema, mas os demais departamentos ainda continuam sem solução.
Pensando nisto resolvi escrever um aplicativo para tentar auxiliar nesta tarefa, para tanto baseei este projeto no iText e acredito que tenha chegado a um uso razoável já.
Como hospedei este projeto no code.google, resolvi divulgá-lo a quem possa interessar http://pdfmergeandpaging.googlecode.com/files/launch.jnlp para instalação do aplicativo via Java Web Start e http://code.google.com/p/pdfmergeandpaging/ para acesso ao home do projeto.
Basicamente estou utilizando Netbeans 6.5 e as bibliotecas iText e ini4j.
Era isto por hora galera.

quinta-feira, 30 de abril de 2009

Jogo de Tabuleiro "War" e JBoss Seam


Boa tarde a todos, especialmente ao melhores da américa neste momento!

O que tem a ver War e JBoss Seam? Nada isoladamente, até o momento em que resolvo desenvolver uma versão deste jogo de tabuleiro em versão Web.
Na verdade eu ainda estou decidindo, enquanto desenho o mapa do jogo em SVG com o maravilhoso Inkscape, se faço a implementação em Web ou Desktop.
Se eu acabar decidindo por Web pretendo praticar JBoss Seam com Eclipse, se acaso decidir por Desktop vai ser mesmo com Netbeans.
A idéia não é implementar toda uma infraestrutura para jogos on-line e sim permitir usar o computador como tabuleiro para o jogo. Acredito que usando somente SVG com Javascript chegaria próximo do resultado que desejo, mas como é um projeto pessoal e eu quero estudar novas tecnologias, é uma boa motivação.
Ah! Esqueci de citar que pretendo usar Apache Batik para o trato com SVG. Tá difícil de encontrar boa documentação e como normalmente apelo pra fazer de qualquer jeito desde que funcione, vai acontecer de eu postar códigos aqui bem feinhos e, quem sabe, bem pouco otimizados.
Abraçõs...

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!

segunda-feira, 16 de fevereiro de 2009

Usando htb para controle de tráfego por ip priorizando certos serviços

Sempre fui fiel usuário do htb-tools para controle de tráfego do meu roteador de internet na prefeitura de Terra de Areia. É claro que o uso do htb-tools dá-se principalmente pela minha completa falta de competência em saber lidar com o comando tc "na unha".
Minha estrutura é simples, por isto mantenho o squid nesta mesma máquina fazendo nat, o que sempre me trouxe o problema do controle preciso de upload, pois com nat e squid, definitivamente não dá pra fazer controle de upload da mesma forma "simples" que download.
Estes dias passei a estudar traffic control para linux e htb no intuito de preparar um novo roteador que me permitisse controle preciso de download e upload e para isto é lógico que precisava separar o nat e o squid para outra máquina a fim de manter de forma simples estes controles.
Até estava pensando em continuar usando htb-tools, afinal sempre fez muito bem seu trabalho, mas um htb generate eth0 (por exemplo) gerou uma infinidade de regras totalmente incompreensíveis para mim e decidi que queria saber como funcionam as suas entranhas.
A princípio sempre soube que o controle de tráfego é sempre feito no fluxo (interface) de saída e como faço controle de upload com htb-tools ele muda esta política e passa a controlar pelo fluxo de entrada (ingress, pelo menos eu acho).
Ainda estou totalmente cru com todos os conceitos envolvidos em controle de tráfego e com a forma de aplicá-los com o comando tc, por isto resolvi escrever minhas memórias como forma de documentação do meu aprendizado e para que as bondosas almas possam indicar-me minhas falhas.
Sem dúvida o fórum underlinux é minha principal fonte de aprendizado e busca por respostas, mas não posso deixar de citar o manual traduzido do htb e QosLinux.ppt.
Como resultado final deste trabalho pretendo desenvolver uma aplicação em ruby, java, php ou qualquer outra linguagem para que a partir de um arquivo com os ips e taxas de download e upload sejam geradas um conjunto de regras para estes controles.
Ainda não tenho a mínima idéia de como fazer, mas "em cima" do controle de tráfego de cada computador da rede quero fazer também priorização, ou seja, dar prioridade maior para pacotes de voip do que ftp, independente de quem está fazendo download, assim não precisaria prioriza individualmente.
Para começar quero registrar como faria para controlar o tráfego de dowload de um link de 512k entre 4 computadores. A interface da lan (ou saída do tráfego do roteador de internet para a lan) será a eth0, assim as regras para definir taxa garantida de 128k e limite de 512k ficariam assim:
tc qdisc add dev eth0 root handle 1:0 htb default 9
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 512kbit
tc class add dev eth0 parent 1:1 classid 1:9 htb rate 8k
tc class add dev eth0 parent 1:1 classid 1:101 htb rate 128k ceil 512k
tc class add dev eth0 parent 1:1 classid 1:102 htb rate 128k ceil 512k
tc class add dev eth0 parent 1:1 classid 1:103 htb rate 128k ceil 512k
tc class add dev eth0 parent 1:1 classid 1:104 htb rate 128k ceil 512k
tc qdisc add dev eth0 parent 1:9 handle 90:
sfq perturb 10
tc qdisc add dev eth0 parent 1:101 handle 1010: sfq perturb 10
tc qdisc add dev eth0 parent 1:102 handle 1020: sfq perturb 10
tc qdisc add dev eth0 parent 1:103 handle 1030: sfq perturb 10
tc qdisc add dev eth0 parent 1:104 handle 1040: sfq perturb 10
tc filter add dev eth0 protocol ip parent 1:1 u32 match ip dst 192.168.10.101/32 flowid 1:101
tc filter add dev eth0 protocol ip parent 1:1 u32 match ip dst 192.168.10.102/32 flowid 1:102
tc filter add dev eth0 protocol ip parent 1:1 u32 match ip dst 192.168.10.103/32 flowid 1:103
tc filter add dev eth0 protocol ip parent 1:1 u32 match ip dst 192.168.10.104/32 flowid 1:104

Temos assim, a definição do htb como qdisc, a classe que estabelece a capacidade do link em 512k, as classes que definem as taxas para cada ip, as qdisc para cada uma destas classes e os filtros para direcionamento dos tráfegos de saída.
Acredito que seja simplesmente isto para fazer o controle básico de download embora ainda não tenha posto isto em prática. Num futuro gostaria de poder contar com as possíveis vantagens da utilização dos parâmetros quantum, burst e cburst (entre outros).
Por enquanto era isto, assim que conseguir testá-los vou usar basicamente estas mesmas regras com a interface de saída do roteador para o roteador de internet (eth1) para controle de upload, lembrando que não vou fazer nat e nem ter squid neste roteador.

terça-feira, 3 de fevereiro de 2009

A saga do Oracle com Windows 2003 64bits e o Mono para experimentações

A situação ainda era triste (bom, ainda é), o desenvolvimento do sistema precisava e estava sendo realizado com o Visual Web Developer 2008 Express Edition (VWD), a única coisa com licença para desenvolver asp.net aqui na empresa.
Tudo ocorria tranquilo em minha máquina de desenvolvimento, uma estação windows xp 32bits. Para acesso ao servidor Oracle resolvi utilizar ODP.NET em meus DAOs e o sistema corria bem no servidor embutido do VWD.
Quando resolvi por o sistema em produção em um servidor Windows 2003 64bits com IIS 6, qual não foi a ingrata surpresa de saber que o deploy não ocorerria assim tão fácil, pois de cara, este servidor não tinha suporte a asp.net 2.0. Pois bem, instalamos o abençoado .net 3.5 neste servidor, acreditando que meus problemas estaria acabados, mas não mudou em nada o ambiente. Pesquisando descobri que deveria rodar o aspreg_iis.exe -i para "registrar" o asp.net 2.0 no IIS6.
Legal! Estava registrado e a aplicação agora rodava mas de pronto já berrava exceções referente a impossibilidade de conseguir carregar dll referente ao Oracle. Aí sim que a batalha foi terrível. Como o servidor é 64 bits achamos que o .net deveria ser de 64bits também, mas em lugar algum diz que o .net 3.5 é 32 e 64 bits, então removemos e instalamos o .net 2.0 64bits, afinal o asp.net do .net 3.5 ainda é 2.0.
De nada adiantou as exceções agora só eram diferentes e não permitiam saber exatamente o que estava ocorrendo a não ser pela indicação BadFormatException.
Certamente, então, deveria ser o ODP.NET instalado que não era de 64bits, corremos e instalamos a versão 64bits destes componentes, como podem imaginar, nada de diferente exceções e exceções. Alguns comentários pela web a fora sugeriam que o sistema deveria ser compilado forçadamente como 32 bits e para isto o VWD não servia, pois não dá a opções de escolher o target 32 bits.
A esta altura já estava quase desistindo de utilizar o IIS6 do Windows 2003 64bits para rodar a aplicação. Como tenho meu amado e idolatrado Debian rodando virtualizado com VirtualBox baixei e compilei o mono 2.0 e depois instalei o cliente Oracle. Foi mais fácil executar a aplicação no mono com apache do que no .net com IIS, mas era certo que as exceções referentes ao Oracle continuariam a ocorrer, ou então outras distintas pois até o momento em que pesquisava não encontrara o ODP.NET para mono.
Resolvi mudar meus DAOs e não mais utilizar ODP, passei a utilizar o provider embutido no .net. Já que assim estava, atirei a aplicação no servidor Windows para experimentar, mas não teve jeito, aí passaram a ocorrer outras exceções distintas referente à falta de suporte ao cliente Oracle que fosse inferior a versão 8 ponto alguma coisa.
Atirei a aplicação no mono e bala, rodou tranquilo, pelo menos a princípio, algumas vezes ocorriam algumas exceções estranhas referente à acesso aos dados.
Mas eu ainda estava com gana de colocar o sistema a rodar no Windows 2003, pois afinal é nosso ambiente oficial de execução e eu certamente não teria autorização para alocar a aplicação em um servidor de aplicação linux com mono que nem existe na empresa.
Bom, neste momento a coisa foi uma doidura só experimentamos diversas configurações e versões de ODP.NET de 32 e 64 bits, .net em 32 e 64bits. Nesta altura já tinha voltado meus dados para utilizar ODP.NET.
Em alguma momento conseguimos descobrir que o famigerado IIS 6 roda em 32 bits. Esta "descoberta" foi para alimentar a escalada final da decepção com este servidor. Não dava pra acreditar que o servidor web oficial e nativo do servidor Windows 64bits rodava em 32bits!
Finalmente deixamos tudo em 32 bits, .net e odp.net e conseguimos correr a aplicação tranquilamente.

quarta-feira, 28 de janeiro de 2009

Possível causa para a mensagem "The document has no pages" do iText

Buenas moçada, tempão louco que não mantenho atualizado este blog, mas como todos, é sempre a velha desculpa esfarrapada de "falta de tempo".
Bem, pretendo utilizar este espaço mais vezes pra relatar a solução de alguns pequenos problemas que enfrento no cotidiano referente à desenvolvimento de software, mais precisamente na codificação ou programação.
É uma grande pena que no momento tenha que estar utilizando um ambiente não-livre e ferramentas da mesma forma para desenvolvimento: windows xp e visual web developer 2008 express edition.
Estou procurando, em paralelo, utilizar também php e java, para tanto até já tenho um ambiente virtualizado com VirtualBox e meu querido Debian Lenny.
Acontece, que atualmente, minhas maiores dores de cabeça foram com o ambiente "oficial" e já passo a esclarecer um deles.
Estou utilizando iTextSharp para gerar pdf em um sistema asp.net. Só para registrar tenho utilizado c# pela semalhança com java. Tudo tranquilo em meu ambiente de desenvolvimento (windows xp 32bits e servidor asp.net embutido do visual web developer) até que fiz o deploy em um servidor windows 2003 64 bits e iis 6 (em um post futuro falo mais sobre outra saga neste ambiente), aí começaram a ocorrer os famigerados "The document has no pages" sempre quando da execução do método .Close() do documento pdf. Sempre era gerado um arquivo pdf, no meu caso Notificacao.pdf, com 0 bytes. Bom, depois de tanto fuçar descobri que era um problema com a chamada FontFactory.GetFont(Font.HELVETICA), ou seja, alguns procuras no google indicavam que poderia ser problema com fontes e realmente eram. Passei a utiliar as chamadas como descrita abaixo:

Chunck chunk = new Chunk("Notificação de Débito de Celular", FontFactory.GetFont("Verdana", 18, iTextSharp.text.Font.BOLD));

Problema resolvido!

Até um novo post.