terça-feira, 8 de maio de 2012

Meu site SharePoint está com segurança integrada mas ainda aparece a janela de logon

Coloca ele como “Local Intranet” no IE que pára de aparecer.

(Forte concorrente a menor post do mundo se não fosse essa última frase)

quinta-feira, 3 de maio de 2012

SharePoint: Erro de deploy | Momento revolta :-P

Estava fazendo o deploy de uma solução no SharePoint e apareceu o erro "Error occurred in deployment step 'Activate Features': Operation is not valid due to the current state of the object.". Aí eu pensei "Hein?" e fui pro Google. E a primeira solução que encontrei foi:
1. Feche o VS2010
2. de um IISRESET no server
3. Abra o Task Manager e de um KILL em todos os processos w3wp.exe 
"Tu tá de sacanagem" eu pensei. Mas fiz isso e, sem mudar nada no código, o deploy passou a funcionar. Desenvolvimento no SharePoint é isso: faz sua estimativa, multiplica por 3 por causa dessas "peculiaridades", e reza pra ter alguém que já passou pela mesma coisa e postou na Internet. Se não chegasse tanta demanda nesse troço...

segunda-feira, 27 de fevereiro de 2012

Ambiente de Testes Virtualizado com Controlador de Domínio

Não sei direito porque, mas ouvi o pessoal de infra falando sobre problemas se serviços do seu domínio (tais como SQL e Exchange) sobem antes do controlador de domínio. Montei um domínio de testes para desenvolvimento no TFS e esbarrei nesse problema: serviços não subiam ou a conectividade entre eles não funcionava. Como as VM’s estão no Hyper-V, dá pra colocar um “atraso” no boot das máquinas, então configurei o DC sem o delay, e as outras máquinas com um delay de 30 segundos. Na tela de configuração de cada VM que deve subir com o delay:


Desta forma, o controlador de domínio sobe antes das outras VM’s, evitando esse tipo de problema.

terça-feira, 14 de fevereiro de 2012

Como publicar seu banco para o SQL Azure com o Management Studio

Essa é velhinha mas vale a pena, porque tá escondida lá nas profundezas do Wizard de geração de scripts do Management Studio.

O SQL Azure só suporta um subconjunto das instruções e opções de objeto do SQL Server “normal”. Se você gerar um script de criação do banco no Management Studio, esse script só vai rodar se você retirar manualmente um monte de coisa dele (a lista está nesse artigo do Technet: Develop and Deploy With SQL Azure). Mas se você usar o Management Studio do SQL Server 2008 *R2*, tem umas opções no Wizard de geração de scripts que já retira esse monte de tranqueira que não roda no SQL Azure.

Entre no Wizard de geração de scripts do Management Studio (no Object Explorer: selecionar o banco | botão direito | Tasks | Generate scripts…). Quando chegar na tela “Set Scripting Options”, selecione o destino (file | clipboard | new query window) e pressione o botão “Advanced”. As opções interessantes são:

  • Script for the database engine type: stand-alone para SQL Server “normal” ou SQL Azure Database para o SQL Azure.
  • Types of data to script: Schema only gera os comandos de criação de objetos, Schema and data gera também os INSERT’s para as linhas de cada tabela incluída no script (obviamente só use isto se você tiver poucos dados nas tabelas).

E pronto. Conecte o Management Studio no seu banco SQL Azure e rode o script gerado.

PS: Se você não tem o SQL Server 2008 R2, pode baixar o SQL Server 2008 R2 Express with Advanced Tools. No setup desmarque a instalação de uma instância do SQL Server (Database Engine, ou Database Services, algo assim), e ele instalará apenas as ferramentas de gerenciamento, dentre elas o Management Studio versão 2008 R2. O melhor é que é de “grástis”: http://www.microsoft.com/download/en/details.aspx?id=23650.

segunda-feira, 23 de janeiro de 2012

Haja Produtividade

Quando for fazer um projeto pra nuvem, lembre-se de acrescentar no cronograma uma gordurinha extra por conta dos deploys da aplicação. Olha um log de deploy de um projeto Cloud no VS2010:


16:22:27 - Warning: There are package validation warnings.
16:22:28 - Preparing...
16:22:28 - Connecting...
16:22:31 - Uploading...
16:30:31 - Creating...
16:31:41 - Starting...
16:32:16 - Initializing...
16:32:16 - Instance 0 of role _____________ is initializing
16:32:16 - Instance 0 of role _____________ is initializing
16:36:12 - Instance 0 of role _____________ is busy
16:36:12 - Instance 0 of role _____________ is busy
16:37:19 - Instance 0 of role _____________ is ready
16:37:52 - Instance 0 of role _____________ is ready
16:37:54 - Complete.

16:22 pra 16:37... só 15 minutos esperando o deploy :-P Tá me lembrando a época da bolsa de computação gráfica da UnB, que a gente mandava compilar o aplicativo e demorava 5 minutos. Aí testava, corrigia alguma coisa e mais 5 minutos pra compilar. Haja produtividade ;-)

sexta-feira, 20 de janeiro de 2012

"Unable to load the specified metadata resource", ou "Como perder 2 dias por causa de um asterisco"

Mais uma pra pilha "Azure - Mais Um Detalhe De Desenvolvimento". Resolvemos migrar as tabelas de uma aplicação Azure do ATS para o SQL Azure.
OBS1: Se você vai começar seu projeto agora, *não* use o ATS como um banco relacional. A lista de problemas é tão grande que não vou nem colocar aqui.
Bem, fizemos os testes locais e tudo rodou tranquilo.
OBS2: Conselho para desenvolvimento no Azure: "Não escreve muito código sem um deploy e teste na nuvem". Os Compute/Storage Emulators e a nuvem tem vários comportamentos e particularidades diferentes entre si. Desenvolva um trecho, estabilize o suficiente para um teste, e faça um deploy na nuvem para teste lá. Obrigado ao Vitor por emprestar a frase.
Na hora que passamos para a nuvem, no primeiro acesso ao BD no SQL Azure, aparecia uma exceção "Unable to load the specified metada". Resumindo (muito), a estória é a seguinte:

  1. Nossa camada de dados é uma DLL separada (AcessoDados.dll), que contém um modelo Entity Framework apontando para o BD no SQL Azure, e mais um tanto de código customizado.
  2. A aplicação tem um web role e um worker role. Esta DLL é referenciada por ambos, já que ambos manipulam as mesmas tabelas.
  3. A string de conexão ao modelo EF começa assim:
    connectionString="metadata=res://*/Entidades.BDAplicacao.csdl|res://*/Entidades. BDAplicacao .ssdl|res://*/Entidades.BDAplicacao.msl; ...". Estes arquivos são necessários para o Entity Framework realizar o acesso ao banco de dados representado pelo modelo.
  4. O modelo EF tem uma propriedade chamada "Metadata Artifact Processing", que por default vale "Embed in Output Assembly". Isto significa que os 3 arquivos na string de conexão (BDAplicacao.csdl, BDAplicacao.ssdl e BDAplicacao.msl) são incorporados à DLL como recursos durante a compilação.
A mensagem de erro indicava que, na hora que o worker role ia acessa o banco, não encontrava os 3 arquivos necessários para a geração dos comandos de acesso ao banco. Então a exceção "Unable to load the specified metadata resource" ocorria.

A string de conexão no item 3 acima é a string padrão gerado pelo Designer de Modelos Entity Framework do Visual Studio 2010. Basicamente, os asteriscos na string de conexão significam "procure estes arquivos nos recursos de todos os assemblies carregados no momento". Não sei exatamente porque, mas o fato é que o worker role, quando rodando na nuvem, não encontrava os arquivos dentro da DLL (quando rodando no Compute Emulator, tudo funcionava ok). Tivemos então que especificar o nome da DLL em vez dos asteriscos, e a aplicação passou a funcionar também na nuvem. A string de conexão ficou assim:

connectionString="metadata=res://AcessoDados/Entidades.BDAplicacao.csdl|res:// AcessoDados /Entidades. BDAplicacao .ssdl|res://AcessoDados/Entidades.BDAplicacao.msl; ...".

Mais alguns detalhes pra fechar:
  • Repare que colocamos o nome da DLL, mas não sua extensão. Caso você coloque a extensão, será gerada uma exceção "Não foi possível localizar o arquivo ...".
  • O modelo EF se chama "BDAplicacao", e está dentro de um sub-namespace "Entidades". Então veja que o nome dos arquivos não é simplemente o nome do modelo com as extensões .csdl, .ssdl e .msl; o nome dos arquivos é "Entidades.BDAplicacao"; tem que ser acrescentado o namespace ao nome dos arquivos, exceto pela parte "raiz" do namespace - que é o nome da DLL.
E aí? Pouco detalhe, né não?

segunda-feira, 26 de dezembro de 2011

Treinamento Azure: Primeira turma de Azure da Sr Nimbus!

Abrimos nossa primeira turma de treinamento Azure, voltada para o pessoal que deseja ingressar de cabeça no desenvolvimento de soluções Web para o Windows Azure. Modelamos o curso de forma que o aluno veja todos os passos necessários para sair do “File > New > Project” até realizar o deploy da aplicação. E sempre apresentando os conceitos relacionados a cada aspecto do desenvolvimento realizado.

Além desta visão “início-ao-fim”, os laboratórios criam uma aplicação que tem o SQL Azure como base de dados, e usa filas e worker roles para mostrar a escalabilidade de uma aplicação construída para tirar proveito do conceito de computação na nuvem. De quebra, a aplicação exemplo possui uma arquitetura que pode ser usada como referência para as suas primeiras aplicações Azure, de forma que você já possa ser produtivo assim que acabar o curso.

No modelo tradicional de cursos de ferramentas de desenvolvimento você vê as partes mas não o todo. É comum, neste modelo, o “momento E agora???” que o aluno passa após o curso, exatamente pela falta desta visão de um processo contínuo no uso da ferramenta. Nosso objetivo é mudar isto, ao construir uma aplicação do início ao fim e fornecer uma arquitetura simples mas que pode ser usada em aplicações “de verdade”, e não apenas em demonstrações.

A ementa do curso está aqui, e as inscrições já estão abertas!

[]s,

GB