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

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.

quinta-feira, 26 de junho de 2008

Como Concorrer a um Asus EEE PC e Outros Prêmios e Ajudar a WikiPedia e Outro Projeto sem Gastar Dinheiro

Ajude a sustentar a Wikipédia e outros projetos, sem colocar a mão no bolso, e concorra a um Eee PC!
…e também a pen drives, card drives, camisetas geeks, livros e mais! O BR-Linux e o Efetividade lançaram uma campanha para ajudar a Wikimedia Foundation e outros mantenedores de projetos que usamos no dia-a-dia on-line. Se você puder doar diretamente, ou contribuir de outra forma, são sempre melhores opções. Mas se não puder, veja as regras da promoção e participe - quanto mais divulgação, maior será a doação do BR-Linux e do Efetividade, e você ainda concorre a diversos brindes!

quarta-feira, 26 de março de 2008

Configurando Virtualbox Guest para acesso a compartilhamento de Debian Lenny dentro de Debian Lenny

Estou iniciando no mundo da virtualização e para tanto, como usuário Debian que sou, iniciante que sou, parti para utilização do que me parece mais fácil, o Virtuabox. Meu impasse ocorreu quanto estava tentando acessar um compartilhamento da máquina hospodeira pela máquina hóspede, todas as duas Debian Lenny.

A princípio, tudo deveria funcionar com apenas um "#apt-get install virtualbox-ose-guest-utils" para que pudesse ser acessado um compartilhamento configurado pelo virtualbox com um simples "#mount -t vboxfs nome_compartilhamento ponto_montagem", mas não foi tão fácil assim. O problema todo foi que o tal "#apt-get install virtualbox-ose-guest-utils" apresentou um problema ao tentar carregar o módulo "vboxadd" e a tarefa toda está em disponibilizar este módulo para o lenny guest.


Encurtando a história, para que isto tudo funcione é preciso que sejam instalados pacotes (vai que algum esteja sobrando, mas foi a primeira vez que fiz isto e fui instalando aos poucos):
#apt-get install virtualbox-ose-guest-source
#m-a prepare virtualbox-ose-guest
#m-a a-i virtualbox-ose-guest

Após isto o módulo vboxadd já existe então pode-se instalar o virtualbox-ose-guest-utils

#apt-get install virtualbox-ose-guest-utils

Por fim, para que finalmente possa-se montar a partição, antes é necessário carregar o módulo vboxvfs. Realmente não sei porque o próprio comando mount não o carrega sob demanda, acredito que seja pela sutil diferença entre o tipo de sistema de arquivo vboxfs e o nome do módulo vboxvfs:

#modprobe vboxvfs
#mount -t vboxfs downloads /mnt/downloads

Estes passos permitiram que eu pudesse acessar o compartilhamento downloads.

Espero que esta dica seja de utilidade.

Um grande abraço a todos.

quarta-feira, 19 de março de 2008

Após tantas e poucas coisas acontecerem...

Olá amigos! Puxa vida que tanto tempo sem postar, já estava sentindo falta fazia tempo, mas algumas coisas aconteceram que me impossibilitaram de tal.
Neste dia 31 de janeiro, data da minha última postagem, foi o último dia que ainda estava como responsável por uma LanHouse de proprierade de minha empresa de provimento de acesso wireless. Infelizmente sofremos um acidente de moto, minha namorada e eu, mas graças a Deus foi muito mais um susto, pois os resultados foram leves escoriações. Passamos por um período de recuperação e além disto já estávamos abalados porque dois dias antes eu havia sido penalizado por duas multas, totalizando mais de 1000 UFIRs por ter dirigido uma Biz 100 sem possuir habilitação adequada.
Passamos então, após este episódio, a não mais deslocarmo-nos à referida LanHouse, pois eu não poderia arriscar tomar mais duas buchas de 500 UFIRs cada e minha namorada estava traumatizada e sem condições de condução da Biz. Aliás, até hoje ela ainda tem muito medo de conduzir a motinho.
Como a LanHouse estava a mais de 15Km de casa, fiquei sem poder utilizar o meu computador que estava lá, a disposição dos usuários e quando não era o que eu utilizava para minhas experiências e trabalho.
Além de ser um dos dois sócios-proprietários da "poderosa" F&F Network, contando em seu conglomerado com a enorme LanHouse com 8 computadores (eram, já vendemos alguns pra pagar as contas), ainda sou servidor público municipal e não contava com uma boa máquina de trabalho no ambiente público o que não me permitia realizar nada de bons experimentos nos momentos de folga.
Finalmente, com o término da temporada de verão (a LanHouse estava disposta em uma praia próxima) o que ocasiona a volta em massa de todos os turistas à suas cidades de origem, deixando a praia às moscas até o próximo verão, pude tomar um dos computadores da LanHouse para uso pessoal novamente.
Também estamos passando por alguns problemas técnicos com o nosso provedor wireless o que nos está tomando um tempo enorme.
Pude fazer pequenas alterações no RBM, inclusive com a adição de um trecho de código passado aqui pelo blog que faço questão de dar os devidos créditos a seguir, além disto pretendo testá-lo em algumas distribuições que puder a fim de tentar passar os procedimentos para executá-lo nestes outros ambientes.
Um grande abraço a todos