O que há de novo no SP 1 - Service Pack 1 - do SharePoint 2010 ?


O SP1 do SharePoint 2010 chegou com algumas novidades interessantes

  • Lixeira para Sites Collections e Sites.
  • Página StorMan.aspx, que oferece uma visão sobre as cotas associadas aos sites. Shallow Copy para o Remote Blob Storage, ao invés de Deep Copy
  • Cascading PerformancePoint Services Filters, que oferece a possibilidade de passar um filtro para outro.
  • Suporte ao Google Chrome

Ainda não conheço a fundo. Assim que tiver mais novidades, eu posto no blog.

Onde faço download do Service Pack 1 do SharePoint?
http://sharepoint.microsoft.com/blog/Pages/BlogPost.aspx?pID=984 



Onde encontro a documentação oficial do Service Pack 1 do SharePoint? 
http://www.microsoft.com/download/en/details.aspx?id=26573



Urgente
Após a instalação do ServicePack 1, instale o HotFix a seguir:
http://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=2536599

Que tipo não herda de Object, em dotnet?

Como trabalhar com ponteiros em .NET ?

Poucos sabem que é possível trabalhar diretamente com ponteiros em .NET. Outros até sabem, mas evitam mexer. Em geral não é recomendado que se trabalhe em modo inseguro em .NET, que é requisito para trabalhar com ponteiros.
Os ponteiros são especiais e não herdam de Object, sendo assim uma exceção no ambiente comum da CLR. Para trabalhar com ponteiros é necessário utilizar a palavra reservada unsafe para esta ação.

Habilitando o modo inseguro no projeto

Para utilizar de forma insegura é necessário que seja habilitada a opção de uso de código inseguro na aplicação. Clique com o botão direito no projeto que tornar inseguro (Solution Explorer). Vá até a opção Build nas abas laterais a esquerda. Em General, habilite o checkbox com a frase ‘Allow unsafe code’. Consulte a figura a seguir para auxiliar.
Veja uma exemplo de código que utiliza o contexto inseguro:

public static void Main()
{
unsafe
{
            int* i;
            int j = 10;
            i = &j;

            Console.Write(i->ToString());
}
}

Para trabalhar com ponteiros  é necessário o uso de operadores específicos. Repare o código acima que utiliza :  int*,  i=&j, i->ToString(). Estas notações são comuns na linguagem C++, mas são pouco utilizadas em .Net. Estas notações são válidas apenas em contextos inseguros. Veja a seguir uma lista com os operadores utilizados em ponteiros em .NET:

Operador
Função
*
Faz acesso a um ponteiro
-> Utiliza o conteúdo de um ponteiro
[] Acessa o ponteiro como um vetor.
Cuidado! Pode-se fazer acesso a posições de memória que não estão relacionados ao contexto desejado.
& Obtem dados do destino do apontamento de um vetor
++, -- Incrementa ou decrementa um ponteiro
+,  - Realiza uma operação aritmética
==, !=, <, >, <=, >= Compara ponteiros
Stackalloc Aloca memória na stack
fixed statement Define endereço de ponteiro que aponta para destino que não corresponde ao desejado

Os ponteiros dão flexibilidade para o desenvolvedor. Porém esta flexibilidade pode ser muito prejudicial por não ser tratada diretamente pela CLR. Os ponteiros em .Net podem apontar apenas para seus tipos primitivos: sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, ou bool; enumerações; qualquer outro tipo de ponteiro; structs que não tenham campos não gerenciados (campos por referência).
Existe um tipo especial para ponteiros que é o void*. A microsoft não recomenda o uso deste tipo. O tipo void* é utilizado para guardar apontamentos sem identificação do tipo de valor destino ou capacidade de tratamento.
Também é possível trabalhar com um ponteiro como se fosse um vetor. Diferentemente dos vetores de alto nível, é possível acessar posições de memória que não correspondam ao vetor em questão, por não ser tratado. No exemplo a seguir, as posições 0 e 1 são impressas na tela, porém, só a posição 0 é conhecida  pela aplicação.

public static void Main()
{
unsafe
{
            int* i;
            int j = 10;
            i = &j;

            Console.Write(i[0] + “\n” + i[1]);
}
}

Como funcionam internamente os Arrays em .NET?
Os arrays são estruturas de dados fundamentais para a maioria da linguagens de programação. Um agrupamento de dados de um mesmo tipo é dimensionado na memória. Os arrays internamente são ponteiros que acessam posições de memória pré-definidos para leitura e escrita de um tipo específico de dado. Veja a seguir as 2 formas de criação de arrays em C#:
public static void Main()
{
int[] meu_array = new int[50];
      meu_array[10] = 30;

      System.Array meu_array2 = new int[50];
      meu_array2.SetValue(30, 10);

      Console.WriteLine(meu_array[10].ToString());
      Console.WriteLine(meu_array2.GetValue(10).ToString());
}
A notação type[] vale para qualquer tipo de dado, seja por valor ou por referência. Esta notação converte internamente o tipo para um tipo System.Array, e desta forma este encapsulamento é guardado na heap.
Repare que a segunda notação não oferece algo como:

this[int index] { get; set; }.

Sendo assim, é mais fácil trabalhar com a notação type[].



Como adicionar webservices como referencia comum ao invés de web reference ou service reference?

Em soluções que envolvam vários projetos no Visual Studio as referencias a serviços podem ficar perdidas. A associação a um service é feita com “Add Web Reference” ou com “Add Service Reference”. Com isto o Visual Studio obtém o WSDL do serviço e gera o código em C#, VB, etc. É fácil atualizar a referência, útil quando está desenvolvendo a aplicação cliente e o WebService.

Existe um alternativa interessante. Com as aplicações WSDL e CSC pode-se utilizar os webservices como referencias comuns no projeto. Isto pode ser útil:
  • É mais fácil estender funcionalidades do WebService no cliente
  • É mais flexível de utilizar a referência entre os projetos

Gerando o DLL a partir do webservice?

Considero um cenário em que o WebService está sendo criado manualmente.
Para criar uma DLL a partir de um webservice, siga os passos:

1. Crie um projeto do tipo WebService

2. Adicione os webmethods que desejar

3. Compile o webservice

4. Abra o prompt de comando do Visual Studio

5. Execute a linha de comando com WSDL
wsdl /language:cs /out:c:\projetos\financeiroservice.cs /namespace:FinanceiroService http://localhost:1974/Service1.asmx?WSDL
6. Execute a linha de comando com CSC
csc /target:library /out:c:\projetos\financeiroservice.dll c:\projetos\financeiroservice.cs

7. Crie outra aplicação cliente

8. Adione uma referencia

9. Selecione a DLL gerada no passo 6

10. Utilize o serviço no cliente

11. Adicione a referencia de System.Web.Services

12. Voilà! Pronto.

Como configurar a Collation da base de dados para o SharePoint 2010?

É recomendável utilizar um database específico para o SharePoint, quando possível. Isto permite um melhor isolamento lógico e gerencial dos vários bancos de dados criados pelo SharePoint.

Que collation utilizar na instalação da base de dados do SharePoint?
Quando se configura a collation de uma database qualquer, se deve utilizar como base nos usuários. Se todos compartilham de um mesmo padrão, como GREEK, então escolha este. Se os usuários estão geograficamente distribuidos, com culturas e conjuntos de caracteres próprios, deve-se utilizar uma collation mais abrangente. Por padrão, a collation do SQL Server 2008 é  SQL_Latin1_General_CP1_CI_AS.

Segundo o KB http://support.microsoft.com/kb/2008668 a base de dados do SharePoint deve seguir as especificações:
  • case-insensitive
  • accent-sensitive
  • Kana-sensitive
  • width-sensitive
Esta especificação é valida para o SharePoint 2007 ou 2010. Na configuração de um novo DataBase, deve-se escolher o SQL_Latin1_General_CP1_CI_AS em compatibilidade retroativa, ou, escolher Latin1_General com as especificações indicadas acima. Isto é necessário para que as tabelas TEMPDB e MASTERDB estejam configuradas de acordo com as necessidades do SharePoint.
Os bancos de dados criados pelo SharePoint devem ser criados automaticamente, já com todas as configurações necessárias.

Como funcionam os tipos por referência, em .NET ?

Os tipos por referência ocupam espaço duas vezes. Uma na stack e outra na heap. Na stack existe um apontamento para o dado correspondente na heap. Se estes tipos por referência forem destruídos, apenas seu ponteiro é destruído. O Garbage Collector percebe os dados na heap que não possuem contra-referências na stack e o excluem na sua limpeza.
Os tipos por referência são especialmente úteis. Eles são responsáveis por guardar tipos mais complexos como classes. Estes tipos normalmente ocupam grande espaço em memória. Quando um tipo por referência é utilizado como parâmetro para um método, este parâmetro aponta para o tipo por referência. E quando um tipo por referência é atribuído por outro, existe um apontamento interno, diferentemente do tipo por valor. Isto é de grande valia para objetos pesados.
    Os tipos por referência mais fundamentais são:
  • System.Object
  • System.String
  • System.Text.StringBuilder
  • System.Array
  • System.IO.Stream
  • System.Exception

Por que utilizar StringBuilder a string?

As strings são classes prontas do .NET para tratamento de arrays de caracteres. Enquanto um char[] utiliza a classe System.Array, um string utiliza a classe System.String. A classe System.String se especializa no tratamento de array de caracteres trazendo uma série de benefícios na sua manipulação.
As strings em .NET e em outras linguagens apresentam uma limitação: as strings são imutáveis. Isto significa que é impossível alterar uma string em .NET. Esta afirmativa é estranha por que é comum a alteração de string, porém internamente a CLR realiza uma manobra para que isto funcione corretamente. Quando uma string é definida, uma posição de memória é alocada na stack para apontar para um endereço da heap que conterá a string. Se esta string for alterada, uma nova entrada será feita na stack e outra cópia será feita na heap. E pelo menos o .NET apaga o endereço de memória da stack que contém a antiga string. Desta forma na próxima passagem do Garbage Collector, todas as strings antigas serão excluídas. Veja o código – comentado – a seguir que mostra este problema:
  public static void Main()
        {
// System.Int32 ocupa 4 Bytes somente na stack
            int valor1 = 300;
int valor2 = 600;
            int valor3 = 900;

            string valor;          
// System.String ocupa o equivalente a um System.IntPtr na stack.
//Este valor varia de acordo com a plataforma
            /* Como este valor não está instanciado, apenas ocupa a stack, e não aponta para a heap */

            valor = "Esta string é um teste";     
// Um novo espaço (System.IntPtr) é ocupado na stack
            /* O espaço antigo não é anulado (embora já estivesse)*/
            /* A heap guarda o tamanho da string mais outras partes da classe System.String*/

            valor += "\nO valor 1 é de " + valor1; 
// Um novo espaço (System.IntPtr) é ocupado na stack
            /* O espaço antigo não é anulado*/
            /* A heap guarda o tamanho da string mais outras partes da classe System.String*/

            valor += "\nO valor 2 é de " + valor2; 
// Um novo espaço (System.IntPtr) é ocupado na stack
            /* O espaço antigo não é anulado*/
            /* A heap guarda o tamanho da string mais outras partes da classe System.String*/

            valor += "\nO valor 3 é de " + valor3; 
// Um novo espaço (System.IntPtr) é ocupado na stack
            /* O espaço antigo não é anulado*/
            /* A heap guarda o tamanho da string mais outras partes da classe System.String*/


            // Imprime na tela o valor da string
            Console.Write(valor);


        }
A aplicação citada gasta:
  • 3 System.Int32
    • 4 Bytes cada
    • 12 Bytes da stack
    • Gastos corretamente
  • 5 System.IntPrt
    • O valor varia de acordo com a plataforma
    • Gasta no mínimo 5 bytes da stack
    • Os 5 System.IntPrt representam indiretamente a mesma System.String
  • 5 System.String
Agora, tendo o problema bem claro, então qual é a solução? O .NET oferece um objeto que resolve esta questão: System.Text.StringBuilder. Diferentemente da string, ele tem a função de montar strings e, apenas, uma string é criada na memória após uma manipulação de string. Veja o código que segue, ele resolve o problema apresentado no código anterior:
public static void Main()
        {

// System.Int32 ocupa 4 Bytes somente na stack
            int valor1 = 300;      
            int valor2 = 600;
            int valor3 = 900;
                             
// System.Text.StringBuilder equivale a um System.IntPtr na stack. Este valor varia de acordo com a plataforma
System.Text.StringBuilder sb = new StringBuilder();

            sb.Append("Esta string é um teste");
            sb.Append("\nO valor 1 é de " + valor1);
            sb.Append("\nO valor 2 é de " + valor2);
            sb.Append("\nO valor 3 é de " + valor3);

// Um novo espaço (System.IntPtr) é ocupado na stack
            /* A heap guarda o tamanho da string mais outras partes da classe System.String*/
            string valor = sb.ToString();
          
            // Imprime na tela o valor da string
            Console.Write(valor);

        }
Desta forma, o resumo dos gastos são:
  • 3 System.Int32
    • 4 Bytes cada
    • 12 Bytes da stack
    • Gastos corretamente
  • 2 System.IntPtr
    • O valor varia de acordo com a plataforma
    • 1 para apontar para um System.String, criado corretamente
    • 1 para apontar para um System.Text.StringBuilder, criado corretamente
  • 1 System.String
  • 1 System.Text.StringBuilder

O que é Iniciativa Passiva?


Ouvi falar que Napoleão Bonaparte separava seu exército em quarto classes. Ignorantes com iniciativa, ignorantes sem iniciativa, inteligentes com iniciativa e inteligentes sem iniciativa.

Achei bacana e quis entender mais. Para Napoleão, os inteligentes com iniciativa eram os mais preparados para ficar afrente de setores estratégicos, como os generais; Os inteligentes sem iniciativa guiavam a frente de batalha, como sargentos de capitães; Os ignorantes sem iniciativa ficaram na frente de batalha, como soldados e cabos; e por fim, os ignorantes com iniciativa. Estes não prestavam! Criavam as piores atrocidades e atrapalhavam o desenrolar das estratégias. Estes não eram admitidos em seu exército.
Levei este pensamento para o ambiente de trabalho e percebi que é bastante razoável. Mas o que me deixa mais intrigado neste ambiente é o que chamo de Iniciativa Passiva.



O que é iniciativa passiva?
Já aconteceu contigo, ou já viu acontecer: alguém que reclama de tudo, por ter a solução de todos os problemas que existem ou que venham a existir. Sejam problemas da empresa ou do país. O mais interessante é que estas pessoas não são a solução. Sabe por quê? Porque são boas em julgar de longe. Talvez por medo ou por falta de capacidade nunca tomam iniciativa. Para apoiar este formato de pensamento entram as frases feitas. Elas são ótimas quando bem utilizadas. Normalmente quem usa não às questiona. Pode ser útil para convencer ignorantes, mas ajudam a consolidar a iniciativa passiva. Isto é iniciativa passiva.

Você sabe com quem está falando?

Alguém já te perguntou, ou você já ouviu alguém ser perguntado: "Você sabe com quem está falando"? Ou ainda pior, você já perguntou isso para alguém?
Eu vi um vídeo fantástico sobre este tema. Trata-se de uma palestra do Filósofo Sergio Cortella feita para o Banco do Brasil. Possívelmente o público desta palestra já vivenciou esta pergunta.


Como gerar documentação automaticamente em .NET?

Gerar documentação para os projetos de desenvolvimento nem sempre são tratadas como importantes. Nem todos pensam (ou sabem pensar) que o legado do projeto é da empresa e não do programador. A solução de documentação que quero falar é muito boa e eficiente, independente do projeto em questao ter a documentação como um artefato formal.




Sandcastle - Help File Builder
Esta solução gera documentação apartir dos comentários de 3 barras feito no código. A documentação gerada é semelhante a documentação do MSDN ou dos SDKs em documentos HTML ou CHM (Help do Windows).

/// <summary>
/// Responsável por realizar cálculos
///
</summary>
public class Calculadora
{
    ///
<summary>
    /// Útil para realizar somatório de números inteiros
    ///
</summary>
    /// <param name="i">Primeiro número a participar do somatório</param>
    /// <param name="j">Segundo número a participar do somatório</param>
    /// <returns>Retorna a soma entre dois valores</returns>
    int soma(int i, int j)
    {
        return i + j;
    }
}

Faça download do SandCastle
http://shfb.codeplex.com/


Como instalar o SandCastle?
1: Faça download do instalador, descompacte e execute-o
Instalação do SandCastle

2: Avance a instalação
Avance e leia atentamente todos os pontos da instalação.
Quando chegar em "SandCastle Pacth" clique em "Apply Patch"

Configurando a instalação do SandCastle

3: Avance a instalação, novamente
Prossiga até chegar em "SandCastle Help File Builder" clique em "Install SHFB"
Instalando o SandCastle Help File Builder
SandCastle Help File Builder


4: Feito.
SandCastle instalado com sucesso.
Reinicie seu computador.
Instalação do SandCastle finalizada



Como preparar meu projeto do visual studio para gerar documentação?
1: Crie seu projeto com comentários de 3 barras
Como demonstrado no inicio do artigo.


2: Configure o projeto
Vá no "Solution Explorer" do seu projeto e clique em Propriedades
Selecionar: Propriedades do Projeto


Vá na aba "Build" e selecione o checkbox "XML documentation file"
Na aba Build, selecionar XML Documentation

3: Compile seu projeto
Vá até o local onde está o executavel ou DLL do projeto. 
Você deve encontrar um documento XML com os comentários


4: Pronto

Como utilizar o SandCastle?
1: Abra a aplicação do SandCastle
Encontra-se no menu iniciar > SandCastle Help File Builder > SandCastle Help File Builder GUI

SandCastle Help File Builder GUI


2: Crie um novo projeto
Vá no menu "File" > "New Project" e escolha um local para salvamento de seu novo projeto

Criando Projeto no SandCastle


3: Adicione arquivos para geração da documentação
Vá na aba "Project Explorer" encontrada, inicialmente, à direita.
Clique com o botão direito em "Documentation Sources" e escolha as DLLs de seus projetos e XMLs de seus comentários
Adicionando DLLs e XMLs no SandCastle

4: Gere a documentação
Vá no menu "Documentation" > "Build" e espere.
O sistema gerará logs visíveis na tela e mostrará um barra de progresso no canto inferior direito.
Gerando arquivo CHM de ajuda


5: Leia a documentação gerada
Vá na pasta onde o projeto do SandCastle, criado no passo 1, foi salvo. Encontre uma pasta chamada Help e abra o arquivo "Documentation.chm"
Abrindo arquivo .CHM gerado automáticamente


6: Pronto
Sua documentação foi gerada com sucesso
Abrindo o arquivo .CHM gerado automáticamente com base nos comentários


Obs.: Esta tarefa pode demorar. Por exemplo, tenho um documento de uns 100 métodos comentados, e umas 20 classes. Para gerar a documentação demora de 5 a 10 minutos, numa maquina de 2GB de ram.

É possível fazer diversas configurações no SandCastle. Está é a configuração mais básica. Num próximo post falo mais.