quarta-feira, 30 de setembro de 2009

404 Resource Not Found For Segment acessando o Table Storage do Azure

Essa tem algo a ver com o acesso ao Azure ser baseado em REST (Representational State Transfer). Devo confessar minha ignorância, pois li um pouco sobre REST mas não entendi quase nada. Mas pelo que entendi, é uma forma de arquitetura para softwares distribuídos. Engraçado que foi criado baseado em uma análise da Internet como software, e parece criar uma teoria bastante complicada em cima de algo que já usamos e, de certa forma, já dominamos.

Bem, o négocio é o seguinte: fui procurar um item em uma tabela no Table Storage do Azure. Inicialmente, a impressão que dava é que o erro retornado - 404 Resource Not Found for Segment 'Nome da Tabela' - aparecia aleatoriamente. Depois vimos que ele aparecia quando a tabela na qual fazíamos a procura estava vazia. E na verdade, um comentário de Andrew Conrad, que participa do projeto de Linq To REST da Microsoft, indica que este erro aparece quando o item é procurado por sua chave e não é encontrado na lista. Isto porque, segundo REST, as aplicações distribuídas são compostas de clientes e servidores, e os servidores fornecem recursos aos clientes - como os arquivos de um servidor Web. Então, quando uma consulta REST procura um recurso específico - como p.e., uma consulta Linq em uma tabela no Table Storage do Azure, e este recurso não é encontrado, é retornado o erro "Resource Not Found" - como o erro 404 em HTTP.

Este erro parece obedecer à teoria do REST, mas realmente, quando você trabalha com algo chamado *Table* Storage, a primeira coisa que vem na cabeça é algo semelhante ao acesso a um BD, e não um acesso a um recurso REST. Então quando algo não é encontrado, a gente espera um resultset vazio, e não um erro. Pelo comentário do Andrew Conrad citado acima, eles já estão cientes desta, digamos, "peculiaridade" do Azure, e planejam fazer algo mais intuitivo na próxima versão.

Por enquanto a solução é envolver seu código em um Try/Catch nada elegante:
try
{
var elemento =
(for item in contextoAzure.MinhaTabela
where item.PartitionKey = '...' and item.RowKey = '...'
select item).FirstOrDefault();
}
catch (DataServiceQueryException erro)
{
if(erro.Response.StatusCode == 404)
// elemento não foi encontrado
}

segunda-feira, 28 de setembro de 2009

Check-outs Múltiplos no TFS

Equipe de geeks (2: eu e o Luti). Instalamos o Visual Studio 2010 (beta, of course, que geek que se preza não trabalha em software estável), com o Team Foundation Server, e criamos nosso primeiro projeto. Depois de algum estudo do Azure, começamos a codificar. Criamos nossas primeiras classes.

"Editei o ContextoDados.cs. Tenta editar ele aí", diz o Luti. Nem sei de onde ele tirou a idéia de testar o TFS SCC (Source Code Control - o Controle de Código Fonte - do TFS, sucessor do Visual SourceSafe). Bem, fiz aquela cara de ai-meu-saco-tenho-mais-o-que-fazer-e-claro-que-vai-funcionar-tudo, e fui fazer o check-out. "Uai", sai sem querer a exclamação mineira, depois de 20+ anos aqui no DF. "Não é que checkautô?". O Luti faz aquela cara de toma-seu-mané. "Fiz check-in. Altera alguma coisa aê e faz check-in também", ele diz. Eu faço uma alteração e, na hora que tento fazer check-in, aparece uma tela de resolução de conflitos de edição. Auto-Merge, Merge Manually, Changed, Deleted, Next, Previous... Tudo pronto pra causar uma boa confusão. Uai de novo. Isso já não funcionava redondo no Visual SourceSafe?

O TFS SCC vem com duas modificações radicais nas suas configurações default, em relação ao SourceSafe:

  • A primeira: check-outs múltiplos são permitidos por default. No VSS, o check-out múltiplo podia ser habilitado, mas o default era check-out simples: somente um desenvolvedor pode travar um dado arquivo para edição. Se outro desenvolvedor tentasse travar o mesmo arquivo (o check-out), ele receberia uma mensagem e não conseguiria editar o arquivo.

Esta até que não chega a ser tão problemática assim. Da primeira vez que houvesse um check-out múltiplo, apareceria a tela de resolução de conflitos de edição, e alguém falaria "Opa! O check-out múltiplo está habilitado". Aí é só desabilitá-lo e tudo ok.

  • O problema sério é a segunda modificação. Quando um desenvolvedor faz um check-out, ele *não* recebe a última versão do arquivo armazenada no servidor!!! Isto significa que, se você tem uma versão antiga de um arquivo na sua máquina,e faz check-out deste arquivo, você vai editá-lo sem receber as modificações já feitas por outros desenvolvedores.

Ok, quando você fizer check-in, vão aparecer conflitos para todas estas modificações; mas somente pela quantidade de conflitos caso sua versão seja muito antiga, e pela proximidade do botão "Next", há um grande potencial para que modificações sejam perdidas. De fato, ao pesquisar sobre o assunto, encontrei relatos de equipes que, em apenas algumas semanas de trabalho, já estavam experimentando este tipo de problema.

As configurações default do Visual SourceSafe evitavam estes dois problemas. No VSS, o check-out múltiplo era desabilitado por default, ou seja, só um desenvolvedor pode trabalhar em um arquivo em um determinado momento. E quando você fazia o check-out, você rebebia a última versão do arquivo. Isto podia quebrar a sua compilação local, por o seu código não estar de acordo com as modificações mais recentes feitas no arquivo recebido durante o check-out. Mas isto obrigava você a manter o seu código atualizado. E evitava que seu check-in sobrescrevesse coisas que outros já tinham feito.

Se você, como eu, a torcida do Vascão e a maioria dos desenvolvedores prefere o esquema do VSS, basta abrir o projeto no Team Explorer, fazer duplo-clique no item Source Control, e no menu Team, selecionar a opção Team Projet Settings > Source Control. Em seguida, inverta a seleção de opções:

Desta forma o SCC do TFS irá trabalhar como o VSS, quanto às suas configurações de check-out.

sábado, 26 de setembro de 2009

Visualizar Arquivos - Conversor para PDF online

Precisei visualizar um arquivo .PUB (Microsoft Publisher) e esbarrei com este cara. BCL Premium PDF Online Service permite que você envie um arquivo ao site e, se ele for de uma das 300 extensões cadastradas, o site converte o arquivo para PDF e disponibiliza o PDF para download por até 24h. Consegui desta maneira visualizar o conteúdo de um arquivo do Publisher sem o dito cujo na máquina - já que o viewer do Publisher é o próprio software - você instala o trial e após o período de trial ele só permite visualização (o que despertou a fúria da galera na Internet, no blog On Microsoft Publisher And More da MSDN).

segunda-feira, 14 de setembro de 2009

Access Denied: stsadm no Windows 2008 (como Administrador!!!)

Well, well... Sei lá. A Microsoft introduziu o UAC (User Access Control) no Windows Vista e no Windows 2008. O objetivo é evitar que você se descuide e faça alguma besteira em algum lugar importante (p.e., num servidor). As aplicações tem agora dados de access control. A idéia é que aplicações sensíveis só possam ser executadas em "modo administrador". De acordo com o UAC Guide na TechNet, mesmo um usuário administrador, ao logar, recebe dois conjuntos de credenciais de segurança: um como usuário "normal" e outro de administrador. Quando uma aplicação marcada com access control que pede por um usuário administrador é executada, o Windows pede confirmação para executar a aplicação como administrador e, caso sua conta não tenha este direito, ainda abre uma janela de logon para vocês especificar uma conta administrativa.

É uma idéia legal, pois desde criancinha a gente aprende a não dar direitos administrativos para contas de usuários "normais"; nossos pais sempre dizem "crie uma conta administrativa, trabalhe com sua conta de usuário normal, e quando for fazer alguma tarefa mais privilegiada, logue com a conta administrativa". O UAC permite isto, pois exige uma interação explicita do usuário para confirmar que você quer rodar uma aplicação como administrador.



O problema é quando a aplicação exige direitos de administrador e não aparece a janelinha acima. Por exemplo, rodando a ferramenta de linha de comando de administração do SharePoint, o stsadm. Você loga no servidor como administrador, abre um prompt de comando, muda pro diretório do stsadm, roda um comando qualquer de administração do SharePoint e... Access denied. Roda só o help do stsadm: stsadm -?. Access denied. Pô, acesso negado no help? Eita programa seguro. Na verdade, o stsadm precisa de que você o rode com direitos administrativos em relação ao UAC, então mesmo logado como administrador, você precisa abrir o prompt de comando no qual o stsadm será executado como administrador:



Como a aplicação que irá disparar o stsadm (o prompt de comando) já foi aberto com as credenciais de administrador perante o UAC, então, e só então, o stsadm roda.

Ou você pode desabilitar o UAC no servidor. Mas não conta pra ninguém que eu sugeri isto. Sorriso

Não Adiantou Mas Foi Legal

Coloquei uma sugestão pra poder inserir uma opção de menu no Team Explorer 2010 que excluísse um projeto do TFS. Foi educadamente recusada pela Microsoft, mas pelo menos foi bom ver que não foi um auto-reply que gerou a resposta; foi alguém que conhecia do produto. O link pra sugestão está em http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=488149. Legal esse Connect.

quinta-feira, 10 de setembro de 2009

Could not load file or assembly CrystalDecisions.CrystalReports.Engine

Se você desenvolveu uma aplicação ASP.NET no Visual Studio 2008, e usou o Crystal Reports 2008 Basic (a versão do Crystal que vem com o Visual Studio 2008), ao tentar rodar a aplicação em um IIS "pelado", será gerada a mensagem de erro "Could not load file or assembly 'CrystalDecisions.CrystalReports.Engine, Version=10.5.3700.0" etc etc etc. Isto porque o site precisa do runtime do Crystal Reports para poder rodar. Um pacote de instalação MSI com este runtime está no diretório C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\CrystalReports10_5 da máquina aonde o Visual Studio está instalado. Basta instalar este MSI no servidor web aonde sua aplicação rodará, e o erro será solucionado.

ASP.NET 3.5 não aparece no IIS

Ao configurar um site ASP.NET no IIS Manager, quando vamos na página de propriedades do site (ou do diretório virtual), existe uma aba para selecionar a versão do ASP.NET. Mas na lista "ASP.NET version", não aparece a versão 3.5 (nem a 3.51, nem a 3.51 SP1):



Bem, de acordo com um post de Vijayshinva Karnure (!!!), no seu blog no site da MSDN, este é o comportamento esperado, pois as versões 3.x não são frameworks "completos", como as versões 1.0, 1.1 e 2.0 - são enriquecimento de funcionalidades em cima da versão 2. Novos controles, novas bibliotecas, mas a "infraestrutura" usada é a da versão 2. Então se você está instalando uma aplicação ASP.NET feita no Visual Studio 2008, ao criar o site no IIS Manager, selecione a versão 2.0 na lista de versões do ASP.NET. Se a máquina tiver instalado o Framework 3.5, a configuração do site estará correta.

terça-feira, 8 de setembro de 2009

Chatices do Windows 2008 Para Desenvolvedores

Bem, um resumo do que descobri sobre o Windows 2008. Podemos chamar de "Chatices do Windows 2008 Para Desenvolvedores", ou "Como Perder Um Dia Tentanto Usar o Windows 2008 Em Ambiente Virtualizado".

  1. Você começa a pesquisar o Windows 2008 e descobre que tem uma versão nova dele: o Windows 2008 R2. "Legal", pensa você. "Vou baixar ela e instalar numa VM do Virtual PC". Tome-lhe 3,2Gb de donwload.
A consequência do item 1 é que Windows 2008 R2 em VM só se seu sistema operacional já for o Windows 2008, para rodar a VM no Hyper-V, ou se você usar um dos produtos VMWare - o mais barato é o VMWare Server, que é gratuito, mas tome-lhe 0,5Gb de download.
  1. Para rodar um sistema operacional de 64 bits dentro de uma VM, o seu processador precisar suportar tecnologia de virtualização.
    • Processadores Intel: deve haver suporte à Intel VT - Intel Virtualization Technology, ou Intel Vanderpool Technology. Tem uma lista de suporte a VT em http://ark.intel.com/VTList.aspx. E tem uma ferramenta de identificar o processador em http://www.intel.com/support/processors/tools/piu/sb/cs-014921.htm.
    • Cuidado com o PC Wizard: a versão 2008 reconheceu erroneamente meu processador como o Intel mobile T7100, que suporta VT. A versão 2009 reconheceu o processador corretamente como o T5670, que não suporta VT.
Resumo da opera, verifique se seu processador tem suporte a tecnologia de virtualização. Geralmente isto pode ser visto como uma opção no setup da BIOS. Tem um programinha chamado SecurAble, em http://www.grc.com/securable.htm, que verifica isto.
  1. Ok. Tem que ser o Windows 2008 de 32 bits. Só que aí você descobre o tal de "Windows 2008 Server Core", que requer aproximadamente 1/3 dos recursos de hadware do Windows 2008 "normal". Ótima pedida pra uma VM!!!
    • O Windows 2008 Server Core requer menos recursos que as edições "normais" porque, dentre outros componentes, não tem a GUI (inteface gráfica) - é tudo linha de comando, até o sistema operacional estar todo configurado, quando ele poderá ser acessado via TS ou MMC.
    • Uma instalação Server Core pode exercer um dentre vários "papéis" (roles), dentre os quais está o IIS.
    • Infelizmente, dentre os componentes que estão faltando, está o .NET Framework. Ou seja, ASP.NET: esquece. SQL Server 2005 ou superior: esquece também.
    • Felizmente, no Windows 2008 *R2* o papel IIS de uma instalação Server Core vem com o .NET Framework. Ou seja, ASP.NET: roda. SQL Server 2005: roda, mas "não suportado": http://www.nullsession.com/2009/06/02/sql-server-2008-on-server-core-2008-r2/.
    • Infelizmente, meu processador não suporta o diacho da Intel VM. Então, nada de Windows 2008 R2. E nada de Server Core com menos consumo de máquina.
Bem, como é pra ambiente de desenvolvimento, a escolha é baixar o Windows 2008 Web Edition 32 bits (tome-lhe mais 3,2Gb de download). Infelizmente, os links de trial pras versões de 32 bits parecem estar sendo desativados pela M$. Então ou você tem uma assinatura da MSDN ou TechNet, pra baixar as versões de 32 bits, ou você vai ter que comprar um processador que tenha a tecnologia de virtualização, pra poder usar as de 64 bits.

Você tem aí, em poucos minutos, o que levei um dia inteiro para descobrir. Basicamente, se você vai montar uma VM com Windows 2008 para ambiente de desenvolvimento ASP.NET, é o seguinte:

  1. Se seu processador suporta tecnologia de virtualização, você pode baixar a versão nova do Windows 2008, que é a R2.
    • A vantagem é tentar instalar um Windows 2008 Server Core com ASP.NET e SQL Server, que em teoria consome menos máquina que uma instalação normal do Windows 2008. Não tentei ainda, só encontrei links falando que dá pra fazer.
    • Pra rodar essa VM, só no VMWare. O Virtual PC e o Virtual Server não suportam VM´s com sistemas operacionais de 64 bits. Ou vc instala o W2008 na sua máquina e roda a VM no Hyper-V.
  2. Se o seu processador não suporta virtualização, baixe uma versão 32-bits do Windows 2008.
    • Roda no VMWare ou no Virtual PC/Virtual Server.
    • O Server Core não roda ASP.NET nem SQL Server, então tem que ser uma das edições "normais". Vou tentar a Web Edition.
É isso. Haja detalhe....





Um update: Se você chegou até aqui, é que está tentando montar uma máquina de testes usando o Virtual PC, ou o Hyper-V, ou outro trem desses. Se você usa Windows 7 ou Windows 2008, tem uma opção *espetacular* pra montar máquinas de teste: dar boot através de um VHD. Dá uma olhada nesse post: Máquina de Testes usando Boot de um VHD.

[]s,

GB

Vostro 1310 Não Roda VM com Guest de 64 bits

Poizé. Fui tentar instalar uma VM no Virtual PC pra testar o Windows 2008. Baixei o ISO do W2008 64 bits (2.8Gb de download num link ADSL de 1Mb - haja saco). Apanhei um pouco até descobrir que o Virtual PC não roda sistema operacional guest de 64 bits. "Usa o VMWare", a Internet recomendava. Baixei o VMWare Server: mais 0.5Gb de download no mesmo link lerdo, e ainda com a esposa desligando o disjuntor aonde o modem tava na metade dele - e não sei porque diabos o site da VMWare não dá suporte a gerenciador de downloads. SACO!!! Mas o mesmo erro de instalação aparecia: "attempting to load a 64-bit application however this cpu is not compatible with 64-bit mode". Uai. O PC Wizard (2008) relata meu processador como sendo o "Intel Core 2 Duo Mobile T7100", que, de acordo com o site da Intel, suporta a Virtualization Technology, necessária para a execução de sistemas operacionais de 64 bits virtualizados. Depois de rodar bastante na tal da Internet, encontrei o SecurAble, em http://www.grc.com/securable.htm, que de acordo com o site detecta as 3 principais tecnologias de segurança em termos de hardware (64 bits, DEP e VT - Tecnologia de Virtualização). E ele relatou minha CPU como sendo o T5670, que não tem suporte a virtualização. Mostrando a língua Depois de um dia inteiro tentando instalar o Windows 2008 64 bits, vou ter que caçar uma versão de 32 bits pra poder fazer meus testes.

Saco.



Um update: veja mais sobre o assunto no post seguinte a este: Chatices do Windows 2008 Para Desenvolvedores.

sexta-feira, 4 de setembro de 2009

Como Excluir um Projeto do TFS

Vai entender. Pra você criar um projeto no Team Foundation Server, a Microsoft disponibilizou um wizard com interface gráfica muito fácil de usar. Agora pra excluir um projeto (team project, no jagão do TFS), tem que entrar em ferramenta de linha de comando. No grupo de programas do Visual Studio (estou usando o 2010, mas deve servir para 2005 e 2008 também), tem uma pasta chamada "Visual Studio Tools". Entre na opção "Visual Studio 2010 Command Prompt", e digite o seguinte comando:

tfsDeleteProject /server:url_do_tfs nome_projeto

O primeiro parâmetro, url_do_tfs, deve ser a URL aonde seu Team Foundation Server está instalado. Cuidado neste parâmetro, ele deve ser a URL exata do TFS, incluindo número de porta e caminho completo. P.e., no meu servidor, a URL usada é http://srv07:8080/tfs. O segundo parâmetro é o nome do projeto (deve estar entre aspas duplas caso o nome do projeto contenha espaços).

No Team Explorer tem uma opção "Remover", que remove o projeto do Team Explorer, mas sem apagar ele do TFS. Por que não colocar uma opção "Excluir" também??? Vou sugerir lá no Connect...