terça-feira, junho 20, 2006

Router 3g com HSDPA + OPENVPN - Parte 2

Consegui pingar hoje o router atraves da ligação VPN. O que não se consegue com Linux!!
Com esta configuração usei o OpenWrt , um firmware opensource em fase experimental especifico para o router wrt54g3g, router 3G/UMTS.
Segui recomendações de Documento disponivel em OpenWRT para compilar o Openwrt para wrt54g3g com especificações HSDPA (Nova tecnologia sem fios para telecomunicações que permite larguras de banda até 3,5 Mbps). A partir daqui foi só instalar pacotes adicionais de suporte para openVPN e fazer a ligação ao servidor de VPN , também OpenVPN em Windows.
Works like a charm...

segunda-feira, junho 19, 2006

Router 3g com HSDPA + OPENVPN

Nova tarefa, novo desafio. Desta vez prende-se com o facto de o cliente desejar efectuar uma ligação VPN a um automato atraves de um router 3g. De facto o router permite a ligação 3g, mas colocam-se alguns problemas.
  1. A ligação tem de ser efectuada por uma operadora especifica, não a que o aparelho traz configurados por defeito;
  2. O router faz somente VPN pass-through, o que quer dizer que não faz ligações vpn-ssl, apenas deixa passar;
  3. O código GPL para compilar o firmware deste aparelho não está completo e apenas permite compilar o que vem por defeito;
  4. O router permite apenas UMTS e GPRS e não HSDPA;

Soluções: Alterar os scripts do programa firmware concorrente, adicionar drivers nozomi (HSDPA Option), adicionar package de openvpn para compilação e testar.

Darei resultados no fim desta semana. A ver como corre...

sexta-feira, junho 16, 2006

ASP.NET Index and length must refer to a location within the string. Parameter: Length

Estamos na fase de testes da extranet elaborada para um cliente e um erro aconteceu logo no primeiro teste do cliente. Já me tinham dito que para testar, nunca pode ser o programador a faze-lo, pois temos tendência inconsciente de não testar o que provavelmente poderia gerar erro.

Pois o erro aconteceu e desde logo foi corrigido. No meu caso, uso muitas chamadas a subtrings que permite retirar caracteres de uma dada expressão. Um deles não estava a testar o tamanho da string antes de retirar a porção definida. Logo, quando apanhava uma expressão mais pequena do que o numero de carecteres que mandava retirar este gerava um erro.

If imovelbi.ToString.Length > 58 Then
imovelbi2 = imovelbi.ToString().Substring(0, 58)
Else
imovelbi2 = imovelbi
End If


Impus a condição anterior de apenas fazer substring até 58 caracteres se realmente tiver mais de 58 caracteres.

quinta-feira, junho 15, 2006

Cluster Step by step

Eis o local escolhido que irá acolher o bastidor que por sua vez irá acondicionar o Cluster Dl380s + ml350 + cablagem. Como se pode ver, a unica coisa que existe ainda são uns cabos pendurados ligados a um router.

Aqui já temos o bastidor colocado, assim como um primeiro esforço de colocar a cablagem.

Esteve-se também a certificar a cablagem. A cerificação é efectuado por um fluk que corre varios testes e conforme a nossa tabela de valores minimos aceitaveis por cabo, todos eles passaram com exito.


Em baixo fotos do meu local de trabalho para esta solução. Podemos ver o bastidor arranjado com as ups + ml350 + Cluster em pleno funcionamento.
Todo este trabalho foi efectuado em 2 dias sempre a correr. É uma solução que tinha algumas condicionantes e uma delas era por tudo em pleno funcionamento com o minimo tempo de paragem.




Replicação Transacional - SqlServer 2000

Hoje tenho de preparar uma replicação entre dois servidores de uma base de dados. Este cliente gere muita informação diáriamente e a aplicação de gestão que usam deve ser separada entre departamentos. No fundo pretende-se um género de Load Balance. Temos as caixas do supermercado e a área administrativa.
Neste momento, sempre que pretendem fazer uma análise de facturação ou outra do género, as caixas sofrem com a perda de perfomance. Sugeri uma replicação de base de dados, visto terem até dois servidores.
A replicação consiste na criação de réplicas de tabelas, seguindo o modelo publish-subscribe. Um publisher é um servidor de dados replicados. Um subscriber replica dados publicados pelos publishers. Entre eles há um distribuidor, que é responsável por obter os dados nos publishers e entregá-los aos subscribers. Aquela que vou usar é a transacional replication. Transacional: Um instantâneo inicial dos dados é enviado aos subscribers, e quando modificações de dados são feitas no publisher, as transações são propagadas para os subscribers. Este tipo de replicação garante as propriedades ACID (Atomicidade, consistência, isolamento, durabilidade). O tamanho da base de dados deste clientes excede já os 45 Gb (em ano e meio de actividade).
Bom, mais logo escrevo aqui as conclusões.

VIEWSTATE - ASP.NET Bug meu, Bug meu, diz-me tu quem é pior programador que eu?

Após o lançamento da minha última página, aliás com grandes alterações a nível de estruturação da programação, lancei-a para o servidor público na expectativa de não ocorrer nenhum erro. Deixem que vos diga algo importante. A pior pessoa que nós podemos pedir para testar a página, somo nós próprios, porque de maneira inconsciente não testamos da melhor maneira as partes que achamos que provavelmente tenham maior risco de erro. Peçam sempre a alguém de fora da vossa comunidade de programadores para testarem a página.

Após o envio, já estava a ocorrer um erro. A página nunca mais arrancou, ficando esta infinitamente num estado de procura, como quando esperamos que carregue uma página. Que teria acontecido? Liguei-me por FTP ao servidor remoto e reparei que a base de dados em ACCESS tinha um registo bloqueado (podemos sabe-lo se estiver no mesmo local um ficheiro do tipo .LDB). Estranho. O pior é que não havia maneira de apagar esse ficheiro pois dava sempre o erro de estar a ser usado por um outro processo. A única forma era drástica. Telefonar para o departamento técnico do alojamento e pedir-lhes para REINICIAR O IIS para libertar o serviço !!!!ehe...Simpáticos os tipos aliás. Isto é perigoso para eles porque iriam não só desactivar a minha página como também desactivar todas as outras que estavam ligados com aquele IIS. Após desactivarem os serviços lá consegui colocar a página no ar. O que teria acontecido??

De facto as alterações na página relativamente a todas as outras que fiz, tem a ver com o método LoadControl do controlo Placeholder. Agora em vez de ter varias páginas com usercontrol tenho uma página que faz o load dinamicamente do controlo. Isto provoca algumas alterações nos ViewStates das páginas. Se estes não forem guardados na variavel local , não poderei ter certas interacções com o usercontrol usado, pois o viewstate não é guardado. Resolução??

If Not Me.ViewState("ctrlPath") Is Nothing And Request.QueryString("data") = "" Then
PlaceHolder1.Controls.Add(LoadControl(Me.ViewState("ctrlPath")))
endif


Imaginemos a seguinte situação. Temos uma página que dinamicamente carrega um controlo responsável pela pesquisa no site. Esse controlo tem um botão que despoleta eventos. Carregamos a página juntamente com o controlo e carregamos no botão para pesquisar por exemplo, em produtos. Fantástico. Se nós não guardasse-mos o viewstate desse controlo a página provavelmente nem carregaria se fosse chamada de outro usercontrol. Se não guardasse o viewstate da página e a carregasse novamente com o veiwstate guardado anteriormente, então nada acontecia e seria como se ela carregasse de novo.

Erro ao Iniciar IIS - 0x8ffe2740

Estava a trabalhar sossegado no meu pc, no Visual Studio, pois estava a finalizar uma página, quando um amigo me telefona a perguntar como está o trabalho. Queria mostrar-lhe, e para isso precisava redefinir o endereço IP atribuido ao meu router no IIS servidor web. Tudo correcto, mas o meu amigo não conseguia ver nada. Reparei que o IIS tinha um ícon de erro e encontrava-se desactivado. Ao tentar reinicia-lo, enviava-me para o ecran este erro: 0x8ffe2740 . O mais estranho, é que aquilo aconteceu a meio do trabalho, pois para poder-mos trabalhar em paginação web no VS, temos de ter o IIS a laborar. Verifiquei logs, eventos e nada me apontava o caminho. pesquisei na internet e de facto dizia-se que poderia ser um conflito na porta 80. Conflito na porta 80????
De facto, após fazer um levantamento dos programas que poderiam estar a causar o erro, reparei que uma das opçoes do Skype (Telefone grátis pela Internet), tinha como configuração, a porta 80 como porta alternativa em caso de bloqueio das portas normais do Skype. Retirei a checkbox da porta 80, desliguei o Skype, reiniciei o IIS e tudo voltou ao normal. Só não entendi porque terá acontecido.