Project Natal

4 06 2009

Eae pessoal? Passei para dar uma postada rápida sobre o project Natal do Xbox. Achei o video de demo fantástico! Se for 50% disso, o negócio vai ser revolucionário.

Segue o vídeo abaixo:





Recursos de teste de performance pra Sharepoint

15 05 2009

Pessoal, segue abaixo link para várias ferramentas, artigos, white papers e outros recursos para medir e testar a performance da implementação do Sharepoinit. Por Sanjay Narang: http://blogs.msdn.com/sanjaynarang/archive/2009/04/18/sharepoint-performance-stress-load-testing.aspx





Access Denied on Search

8 04 2009

Sessão troubleshooting. Fiz uma instalação e configuração de MOSS com Search. Tudo funcionando bonitinho. Ou quase. Fui checar o crawl da busca e vi que ele não indexou nenhum item. além disso no log estava constando vários erros de access denied (Access is denied. Check that the Default Content Access Account has access to this content, or add a crawl rule to crawl this content, para ser mais exato).

Pois bem. Comecei a procurar e fui olhar nos lugares óbvios. Conta de acesso do serviço de indexação. Conta padrão de acesso ao conteúdo. Como estava na VM de desenvolvimento, coloquei o administrador, para que não houvesse dúvidas. O problema persistiu.

Foi quando eu descobri um KB relatando esse problema. Isso acontece em ambientes Windows 2003 com SP1, e quando se usa diversos host headers para webapplications diferentes.

O fix para esse problema é a inclusão de uma chave no registro. A chave é HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa. Dentro adicionar uma DWORD com o nome DisableLoopbackCheck. Depois setar o valor para 1.

Reinicie a maquina e voilá! Agora o indexador funciona perfeitamente!

Para mais detalhes do fix: http://support.microsoft.com/default.aspx/kb/896861

;) Danilo





Sharepoint Designer Free!

6 04 2009

O Dênis me mandou essa mensagem há algum tempo, mas eu não acreditei, porque lá dizia que a data em que iria começar era 1o. de abril. Bom, mas eu vi agora e é verdade. Vou divulgado no blog do time de produto do Sharepoint que o Sharepoint Designer passar a ser grátis.

Isso vem para somar e ajudar com os deploys, especialmente de pacotes menores.

Quem quizer saber mais sobre o assunto, veja o post do time de produto.

;) Danilo





Customizando Retorno de Busca com FullTextSqlQuery

3 04 2009

Hoje eu vou falar sobre objeto FullTextSqlQuery e como customizar o resultado de busca com ele. Ele está localizado no namespace Microsoft.Office.Server.Search.Query e herda da classe Query.

Esta classe permite que você use uma sintaxe de SQL (com limitações) para customizar as buscas do Sharepoint. Segue abaixo um exemplo:

using (SPSite siteCollection = SPContext.Current.Site){
	FullTextSqlQuery query = new FullTextSqlQuery(siteCollection);
	query.QueryText = string.Format("SELECT Title FROM SCOPE() WHERE FREETEXT(defaultproperties, '{0}*') AND \"Scope\"='People' ", prefixText);
	query.ResultTypes = ResultType.RelevantResults;
	query.RowLimit = 10;

	ResultTableCollection queryResults = query.Execute();
	ResultTable queryResultsTable = queryResults[ResultType.RelevantResults];

	while(queryResultsTable.Read())
		context.Response.Write(queryResultsTable.GetString(0) +  Environment.NewLine);
}

No exemplo acima eu estou criando um objeto FullTextSqlQuery e monto uma query. Defino o tipo de resultados e quantidade limite de retorno. Depois de executar ele me retorna um objeto ResultTableCollection. Dessa coleção pegamos um ResultaTable e o lemos como um DataReader.

Alguns pontos. O FROM da clausula SQL é o SCOPE() sempre. O comando FREETEXTestá buscando em todas as propriedades padrão de busca (semelhante a uma busca por palavra-chave. Depois temos a segunda condição que diz “Scope” = ‘People’. Neste item definimos o escopo de busca. Se for criado um escopo customizado no SSP é nesse momento que você deve referenciá-lo. No exemplo acima, a query está fazendo uma busca em pessoas.

Com esta query podemos filtrar e retornar qualquer propriedade mapeada. No meu caso isso foi importante pois eu precisei fazer a implementação de uma tela de busca avançada customizada.

Bom este é o básico necessário para a implementação deste objeto. Em outros posts irei aprofundar mais o assunto.

;) Danilo





WSP Builder

2 04 2009

Olá. No último projeto que trabalhei, fiz a utilização de uma ferramenta chamada WSP Builder. Vou escrever aqui as minhas impressões.

De modo geral a ferramenta é muito boa. Eu não sou fã de desenvolvimento direto no servidor, nem de instalar o Windows 2003 e usar ele como client. Para o meu modo de desenvolvimento, a ferramenta me atendeu em quase tudo.

Basicamente o WSP Builder gera uma solution, seguindo a estrutura de pastas parecida com a estrutura do Sharepoint. Por elas ele se guia e monta automaticamente o manifest. Isso poupa muito tempo e possíveis erros. A única coisa que tive que fazer manualmente é a manipulação dos xmls de feature. Cada recurso ele dá opção de gerar uma nova feature. Contudo se quiser colocar todos os arquivos numa única feature, é necessário alterar manualmente o arquivo xml correspondente. Não é complicado mas exige conhecimento na estrutura.

O mais legal que eu achei nele é dar a opção da pessoa trabalhar como quiser. Eu, como falei antes, prefiro desenvolver os pacotes e mandar para um servidor. Tem pessoas que preferem desenvolver diretamente no servidor. Ele tem a opção tanto de deploy quanto de geração do pacote wsp.

Bom essas foram as primeiras impressões com o projeto piloto. Vou continuar postando aqui conforme for utilizando mais.

Para quem quiser conhecer acesse o link para baixar a ferramenta

:) Danilo





Criar Site Collection em um novo Database

23 03 2009

Nos últimos dias surgiu uma demanda para um site existente, onde o cliente queria um repositório de documentos com busca e tudo o mais. Eu fiquei preocupado sobre o impacto do volume de conteúdo extra poderia gerar ao portal principal. Neste momento decidi que deveria criar o Site Collection em um novo banco de dados de conteúdo. O problema é que essa não é uma tarefa tão trivial quanto parece.

Ao criar um novo Site Collection, o Sharepoint não dá opçao de selecionar o banco de dados a ser utilizado. Se houver mais de um, ele escolhe um e cria nele baseado em uma análise inteligente de uso. Contudo eu queria que fosse o banco isoladamente para este Site Collection e também queria que mais nenhum site fosse criado nele.

Existem duas formas de atingir este objetivo. O primeiro é deixar todos os banco que você NÃO quer utilizar em modo offline, só restando o banco em que você quer criar o site. Uma informação importante é que deixando o banco de dados offline, não quer dizer que ele esteja realmente desligado. Ele simplesmente não permite que se crie novos Site Collections nele. Essa informação foi útil para a segunda parte do meu problema, pois eu não queria nenhum outro Site Collection criado neste banco depois.

Outra forma é pelo stsadm. Nesta forma, o banco de dados não pode estar criado ainda. O comando é o seguinte:

stsadm –o createsiteinnewdb –url [Url do site] –owneremail [e-mail] –ownerlogin [login do usuário] –sitetemplate [modelo de criação do site] –title [título do site] –databaseserver [servidor do banco de dados] –databasename [nome do banco de dados]

Espero que ajude! :)





Sharepoint Log

6 03 2009

Me deparei com um código e achei bacana postar aqui. Ele serve para criar uma entrada no arquivo de log do Sharepoint.

Eu sei que o log do Sharepoint não é muito fácil de ser lido (não sem alguma ferramente auxiliar), mas de qualquer é o lugar oficial onde as pessoas vão (ou pelo menos deveriam) procurar quando algum erro estranho acontece.

Bom, segue o código abaixo:


Microsoft.Office.Server.Diagnostics.PortalLog.LogString(”Exception Occurred:
{0} || {1}”, myException.Message, myException.StackTrace)

Espero que ajude

:) Danilo





Deploy de Arquivos usando Features

14 02 2009

Hoje eu vou abordar um item que facilita muito a vida nos momentos de deploy. Já vi muitas pessoas (e eu mesmo no início) na hora de fazer o deploy ficar se preocupando em mandar arquivos de layout ou até mesmo arquivos xml a serem gravados em listas no site. Mas para isso há uma forma melhor.

Imagine o seguinte cenário. Num branding de sharepoint, precisamos fazer deploy de itens como: masterpage, pagelayouts, css, imagens só pra citar os mais usados. Seria interessante nesse caso fazer o deploy desses itens num único pacote de design. Isso é possível usando features.

Uma feature pode ser composta de um ou mais ElementManifests e de zero ou mais ElementFiles. O ElementManifest é um arquivo xml que irá dar as diretrizes da feature. Por exemplo, uma feature pode fazer deploy de arquivos em listas (nosso caso), pode criar itens no ações do site, etc.

Vamos pegar como exemplo que você precise fazer o deploy de uma masterpage, e duas imagens. O nosso arquivo de feature ficaria assim:

<?xml version="1.0" encoding="utf-8" ?>
<Feature xmlns="http://schemas.microsoft.com/sharepoint/"
    Title="Design Feature"
    Description="Elementos de Design"
    Id="{A57FC881-5684-4f43-9826-3FBABF5DE64D}"
    Scope="Site"
    Hidden="FALSE">
  <ElementManifests>
    <ElementManifest Location="Elements.xml" />
    <ElementFile Location="masterpages\masterpage.master" />
    <ElementFile Location="images\image1.gif" />
    <ElementFile Location="images\image2.gif" />
  </ElementManifests>
</Feature>

As referencias de arquivos usadas em cima são feitas com base no diretório onde está a feature.

Até este ponto apenas montamos a estrutura da nossa feature. Nela declaramos o arquivos de manifest e os arquivos que a compõem.

O segredo está no nosso arquivo manifest. Vamos a ele:

<?xml version="1.0" encoding="utf-8"?>
<Elements Id="59ca9eeb-91e1-4796-bf0f-834dd75b2837" xmlns="http://schemas.microsoft.com/sharepoint/" >
  <Module Name="MasterPages" List="113" Url="_catalogs/masterpage">
    <File Path="masterpages\masterpage.master" Url="masterpage.master" Type="GhostableInLibrary">
      <Property Name="Group">MySite</Property>
    </File>
  </Module>
  <Module Name="Images" List="101" Url="SiteCollectionImages/images">
    <File Path="images\image1.gif" Url="image1.gif" Type="GhostableInLibrary" />
    <File Path="images\image2.gif" Url="image2.gif" Type="GhostableInLibrary" />
  </Module>
</Elements>

Para cada grupo de arquivos criamos uma tag Modulo. Por Modulo entendemos lista e pasta. No nosso exemplo temos dois módulos. O primeiro manda a masterpage para a lista de masterpages e o segundo manda as duas imagens para a pasta images dentro da biblioteca de documentos SiteCollectionImages.

A estrutura é simples, mas tem alguns pontos de atenção. O atributo “List”, define o tipo da lista (nosso exemplo sendo 113 um modelo de lista de masterpages e o 101 uma biblioteca de documentos).

Caso seja necessário informar algum metadado do arquivo a ser gravado, pode-se usar a tag Property para definir esse metadado. No caso usamos o Grupo como MySite.

Isso pode ser explorado para fazer deploy de qualquer tipo de arquivo para qualquer biblioteca de documento.

;) Danilo