sábado, 31 de março de 2007

[Vista] Que contas de novo?

Esse não tem exatamente a ver com programação mas eu tinha que mostrar. Quando você instala alguma aplicação no Vista, ele pode exibir uma mensagem dizendo que o software não é compatível com essa versão do Windows. No caso do Norton Antivírus, pelo visto deve haver algum problema nos balancetes da Symantec:







[Vista] Rodando aplicações ASP tradicionais

Estou tentando fazer uma aplicação ASP tradicional rodar no windows vista sob o IIS7. O primeiro problema que encontrei foi que ao rodar estava aparecendo a seguinte mensagem "An error occurred on the server when processing the URL. Please contact the system administrator". Depois de fuçar um pouco, descobri que há uma configuração no IIS7 para esconder os erros de asp:
  • Abra a ferramenta de administração do IIS.
  • Selecione seu site ou seu diretório virtual e clique no botão ASP.
  • No item Compilação / Propriedades de Depuração , Mude a opção "Enviar erros ao navegador" para True. Aliás, aproveite e mude todos esses subitens para True.
  • Clique no botão Aplicar.
  • Pronto, agora rode novamente a aplicação e você verá a mensagem real de erro.

sexta-feira, 30 de março de 2007

Visão do Desenvolvedor vs Visão do usuário


Alguma vez você já disse, ou ouviu alguém dizer "Foi o usuário que fez merda"? Creio que sim. Bom, talvez não usando essas plavaras (rs), mas muitas vezes o usuário é culpado pelo uso errado do sistema.

Na minha opinião, na maioria das vezes que o usuário utiliza o sistema de forma errada, a culpa é do sistema, ou pelo menos uma parcela da culpa.

O problema é que costumamos desenvolver sistemas do ponto de vista da tecnologia, e não do usuário. O que pra nós é claro e fácil, para o usuário pode ser bastante confuso, e induzir a erro. Nós desenvolvedores e analistas possuimos uma série de conhecimentos técnicos sobre o funcionamento de um software que a grande maioria dos usuários não têm. E nem precisam ter. Você precisa conhecer o funcionamento da sua TV ou aparelho de som para utilizá-los?

Um exemplo simples, mas que ilustra bem esse problema é a questão de campos para informar data. Não é incomum um site ou programa que exijam que a data seja digitada no formato dd/mm/aaaa.

Algumas vezes essa exigência é informada ao usuário apenas exibindo a máscara, e espera-se que ele vá entender o que isso significa, outras vezes, nem é informada e o usuário que tente descobrir porque sua data não é válida.

Na visão de desenvolvedor, é fácil entender que a data deve ser 01/04/2007, mas para uma "pessoa comum", uma data pode ser apresentada de várias formas. Se você ver em algum lugar a data "1/4", vai reconhecer como uma data válida, já entendendo como o ano atual. Se um amigo seu te fala "Dia Primeiro agora haverá um churrasco lá em casa", você vai entender isso como uma data válida, e vai saber que ele se refere ao dia 1 do próximo mês. Todas essas são datas válidas. Ou por acaso quando fala uma data para alguém você fala "Olha, dia Zero Um do Zero Quatro de Dois mil e Sete vai ter um churrasco lá casa"?

Não estou dizendo que nesse caso você deveria fazer o programa reconhecer o texto "Próximo dia 1°" como uma data válida (Embora, se fizesse isso, ia ficar bem legal :) ). Mas se o usuário digitar 1/4/07, por que não tratar a data e transformá-la numa data aceitável para o computador? Ou mesmo "1/4", podemos subentender como "01/04/2007".

Esse caso da data foi só um exemplo, para mostrar como o software pode dificultar o uso se ater-se demais ao modelo tecnológico ao invés do modelo do usuário. Em muitos casos que o usuário executou um operação inválida no sistema, ou entrou com dados incorretos, o sistema poderia validar essas operações e informações e avisar ao usuário antes, afinal de contas, se é inválido, porque o sistema deixou fazer?

Creio que podemos reduzir bastante os erros do usuário apenas dando uma atenção melhor à nossas interfaces. Uma boa experiência é observar ocasionalmente o usuário enquanto ele estiver utilizando o programa. Dessa forma, é possível perceber melhor quais pontos do sistema podem ser melhorados para facilitar a tarefa do usuário.

quarta-feira, 28 de março de 2007

Windows Vista: A missão.

Recentemente comprei o Windows Vista Home Premium para o meu computador de casa. Como sou desenvolvedor, claro que vou querer programar nele também. Então, conforme for avançando vou postando aqui os problemas que forem ocorrendo e como solucionei ou porque ainda não encontrei uma solução, para ajudar quem queira usar o Vista e enfrente problemas semelhantes.

Visual Studio
Depois de instalar o Vista, instalei o Visual Studio 2005. O próprio Vista me informou que há um problema de compatibilidade com o Visual Studio 2005 e que seria necessário baixar um service pack. Ainda não baixei o service pack, e o VS parece estar funcionando. Porém, até agora só desenvolvi um console application de teste, ainda não criei uma aplicação Asp.Net pra ver como se comporta. De acordo como uma pesquisa rápida que fiz na internet, o VS 2003 não é suportado pelo Vista :( . Agora, não sei se o "não é suportado" significa "esquece, não funciona mesmo, meu filho" ou "Funcionar até funciona, mas não nos responsabilizamos nem garantimos nada". Posteriormente vou tentar instalar o 2003 , então postarei os resultados.

IIS
O ISS não vem instalado por padrão, mas pelo menos a partir da versão Home Premium o IIS 7 vem disponível no disco de instalação, é só adicionar. Não sei se está disponível na versão Home Basic, e provável que não. Durante a instalação, você escolhe o que vai querer rodar no IIS: Asp, Asp.Net, CGI etc. Escolhi Asp e Asp.Net e a instalação concluiu numa boa. Acredito que nem será necessário o famoso aspnet_regiis.exe para registrar o Asp.Net no iis.

segunda-feira, 19 de março de 2007

Porque StringBuilder é mais rápido que concatenação de strings

Desculpem a demora para postar, estava tentando colocar um trecho de código aqui no blogger, mas isso estava se mostrando uma tarefa complicada, acabei desistindo.

Você provavelmente já ouviu falar ou já leu em algum lugar sobre o uso de StringBuilder ao invés de concatenação de strings. Realmente o objeto Stringbuilder é bem mais rápido para concatenar grandes quantidades de strings. Duvida? Faça um teste. Faça um loop concatenando strings 10.000 vezes e calcule o tempo. Em seguida, faça a concatenação usando StringBuilder. Pra se ter uma idéia, fiz um teste na minha máquina e quando concatenava 10.000 vezes, demorou uns 2 segundos. Quando fiz a concatenação com o StringBuilder, e fazendo 100.000 vezes, demorou apenas alguns milésimos.

Porquê o StringBuilder é tão mais rápido? Por causa da forma como trata a alocação da memória.

Vejamos a seguinte operação:

StringC = StringA + StringB;

Nesse caso, será alocado um espaço na memória suficiente para caber a StringA e a StringB, e o conteúdo dessas duas strings será copiado para esse novo espaço alocado. Se fizermos outra alocação:

StringC = StringC + StringD;

Será alocado mais um espaço na memória, que caiba as duas strings e o conteúdo das duas será copiado. A cada nova concatenação feita, o processo se repetirá. Será feita uma alocação de memória para cada string adicionada.

No Caso do StringBuilder, a história é diferente. Quando um objeto StringBuilder é instanciado, já aloca por padrão 16 bytes para a string (Esse valor inicial pode ser alterado através de um parâmetro do construtor). Quando uma string é adicionada:

sb.Append(StringA);

O StringBuilder utilizará o espaço já alocado e copiará a string informada para lá. Novas strings concatenadas serão adicionadas ao mesmo espaço. Quando o espaço disponível chegar ao fim, o objeto irá alocar um novo espaço, com o dobro do tamanho do anterior e copiar o conteúdo para lá. Com essa abordagem, a quantidade de alocações de memória reduz significativamente. E como o StringBuilder sempre aloca um espaço com o dobro do tamanho do anterior, a frequência das alocações diminui conforme as strings são adicionadas.

Vale lembrar que o StringBuilder serve não somente para concatenar strings, mas para manipulá-las. Você pode inserir um texto em determinado ponto, excluir partes da string, substituir, tudo isso usando o espaço já alocado.

domingo, 18 de março de 2007

"Cannot start Debugging on the server"

Sua aplicação estava funcionando normalmente e "de repente", ao executar começou a aparecer a mensagem "Cannot start Debugging on the server"? Isso pode ser um erro que está ocorrendo na inicialização da aplicação, provavelmente no Web.Config.

Inicie sua aplicação pela opção "Start Without Debugging". Se for mesmo erro no web.config, será mostrado. Corrija o erro e depois pode voltar a usar o F5 normalmente.

sábado, 17 de março de 2007

TypeCast e Conversão

Surgiu uma dúvida num grupo de discussão sobre o assunto e resolvi falar sobre a diferença entre TypeCast e Conversão de tipos.

Conversão de tipos ocorre quando você tem um valor de um determinado tipo e deseja convertê-lo para outro tipo. Por exemplo, você tem uma string e deseja convertê-la para um número.

Já o TypeCast ocorre quando você tem um valor de um tipo, mas está sendo tratado como um tipo superior. Por exemplo, alguns controles de uma página web possuem o método FindControl, para o qual você passa o nome de um controle da página e retorna um referência para o controle. Por ser um método que irá funcionar para qualquer tipo de controle, ele irá retornar um objeto do tipo Control. Na verdade ele irá retornar algum objeto que herda de Control. Para usar o objeto retornado , você terá que especificar qual é o tipo desejado:

Button btn = (Button) FindControl("btnConfirmar");

O Nome da classe entre parênteses indica que você sabe que o retorno será um Button (Se não ocorrerá um exceção).

Para exemplificar a diferença entre eles, vamos supor que temos um DataRow "dr" com um campo "Codigo". Podemos obter o valor desse campo de duas formas:

int codigo = (int) dr["Codigo"];
int codigo = Convert.ToInt32(dr["Codigo"]);

Na primeira opção, não é feita nenhuma conversão de tipos, apenas o TypeCast. Se o campo "Codigo" não for do tipo int, será gerado um erro. Mesmo se for outro tipo inteiro como short, por exemplo. Já a segunda opção, efetua a conversão do valor do campo para Inteiro. Só ocorreria erro aqui se o conteúdo do campo fosse algo que não pudesse mesmo ser convertido, como a string "João", por exemplo.

Qual é melhor utilizar? Se o campo já for int, use TypeCast, caso contrário, use a conversão.

sexta-feira, 16 de março de 2007

Javascript, Terra de ningúem!

Javascript é uma das linguagens com menos restrições para executar o código, tudo vale. Por exemplo, se você declarou uma função com dois parâmetros. Ao chamá-la, se passar 1 parâmetro, vai funcionar, se passar 2 também vai, se passar 3, 4 ou mais parâmetros, também fuciona... Outra coisa que costuma gerar erros é errar nome de variável. Por exemplo, para alterar o texto de uma textbox, via javascript, o correto seria : Form1.tbxPesquisaDataPedido.value = "texto"; Se você escrever errado, e ao invés de value, escrever vale, ou até mesmo Value (Javascript diferencia maiúscula de minúscula), não vai dar erro. Mas também não vai funcionar. O que o irá acontecer é que será adicionada uma variável chamada vale e o valor "texto" será atribuído a ela. Você só irá perceber o erro depois, e até rastreá-lo a origem vai ser trabalhoso. Lembre-se disso quando procurar um erro em seu script.

Bem vindos!

Sejam bem vindos!

Nesse blog vou postar dicas, comentários e quaisquer outras informações que achar interessante a respeito de programação, principalmente na linguagem .Net. Pretendo colocar aqui algumas dúvidas de usuários em grupos de discussões que respondo, ou que outro usuário respondeu e achei interessante.

Estou aberto a sugestões, se você tiver algo a dizer sobre o blog, poste um comentário e diga o pensa. (Mas seja educado, por favor.. :) )