O que mudou com o Sharepoint 2010

 

Interface Web
  • Integração da Office Ribon no interface web
  • Edição directa nas paginas e de itens nas listas (não é necessário mudar para o bulk actions)
  • Integração com Silverlight é out-of-the-box.
  • Integração com Ajax, JQuery e outras bibliotecas de JavaScript é out-of-the-box.
Novidades
  • BDC agora chama-se Business Connectivity Services (BCS) e suporta leitura e escrita, yeah !!! 
  • Visio Services (parecido com Excel Services), web-services que permite colocar documentos Visio e diagramas no Sharepoint, para alem de permitir configurar workflows no Visio e importa-los para Sharepoint e vice-versa.
  • Sharepoint Desingner tem um novo editor de Workflows e agora permite reutilizar Workflows.
  • LINQ é totalmente suportado no Sharepoint 2010 permitindo efectuar um Join a um SPListItemCollection sem ter que iterar item a item para os mapear manualmente.
Requisitos
  • 64bits only, ouch!! ... as instâncias de SQL tambem :(
  • O requisito anterior quebra com algumas aplicações em MOSS 2007, no SP2 do MOSS 2007 veio um verificador se a nossa aplicação pode sofrer um upgrade (call me psycho) da versão do Sharepoint. Existe um artigo do Joel Oleson que explica o processo desta validação.
Sharepoint Designer (SPD)
  • Levou um tratamento tipo "Querido mudei o Sharpoint Designer", tem um nova apresentação, em que os menus desapareceram e foram substitutos pela Ribbon.
  • O Editor de Workflows está diferente, a caixa de dialogo foi substituida por um editor de workflow, um bocado semelhante ao editor da Nintex.
  • O SPD permite agora adicionar Workflows a Content Types e não apenas a listas.
  • Importação de Templates de Workflow (awesome !!)
  • Criação de Visio Services (semelhante ao Excel Services mas para o Visio).
SDK
  • Features contêm dois atributos novos UpgradeReceiverAssembly e UpgradeReceiverClass, que suportam o novo método da classe SPFeature chamado Upgrade, o que permite efectuar Upgrades às nossas Features, sem estar a instalar e a desinstalar o WSP e activar e desactivar as Features sempre que mudamos algo. Para isso basta instalar a nova Feature e usar o método Upgrade:
SPFeature myFeature = SPContext.Current.Site.Features[FEATURE_ID];
myFeature.Upgrade(false); 
//booleano para forçar o upgrade

Quando evocado o método Upgrade evoca a assembly descrita no atributo UpgradeReceiverAssembly e podemos controlar por código o upgrade da nossa Featrue. Como requisito do Upgrade é necessário existir pelo menos uma versão da Feature já instalada, podemos utilizar o método SPSite.QueryFeatures para saber quais as Features que se pode efectuar um Upgrade. 
  • Partilha de Features, Settings e Serviços entre sites da mesma Site Collection. Isto agora é possível através da classe SPSiteSubscription, que indica quais os items que os sites dentro de um site collection podem subscrever uns dos outros.
  • Solution Sandbox é uma nova funcionalidade, que permite criar uma Solution e fazer deploy para um site collection e correr essa solução num processo isolado sem interferir com os restantes sites da collection, ou seja, é um forma de podermos experimentar uma funcionalidade nova sem estragar o que foi desenvolvido. Esta funcionalidade esta exposta pela classe SPUserSolution. Esta solução tem bastantes limitações de recursos (memória, CPU, etc) e quando esses limites são ultrapassados o processo é automaticamente "morto" por um Job que verifica a utilização destas soluções.
  • Para colocar um item nos menus do MOSS 2007 dá algum trabalho, agora com a classe SPUserCustomAction podemos adicionar itens aos varios menus de sistema do Sharepoint.
  • Utilização de Resource Types para aplicações multi-lingua, podemos indicar os GlobalResources no contexto do Sharepoint, como exemplo:
            string titulo = SPContext.Current.Web.Titleresource.Value
  • SPList.AppendDataTable é uma nova classe que permite adicionar resultados de uma SPQuery a uma DataTable, o que se torna bastante eficaz no que diz respeito a de não termos que efectuar Merge de DataTable quando queremos agregar resultados de pesquisas.

 

Posted por João Filipe Rocha | with no comments

Google Javascript Tools

Cada vez o desenvolvimento Web apresenta novos desafios na forma e no volume de dados que são transmitidos entre servidor e cliente. A Google lançou um pacote denominado Clouse Tools, que tem como objectivo auxiliar o trabalho dos programadores Web na tarefa de optimizar e gerir os pedidos entre servidor e cliente. Este Pacote é composto por três novos produtos que facilitam o desenvolvimento em Javascript, são eles:

  • Clousure Compiler - Um editor de JavaScript que optimiza o JavaScript colocando-o de forma a pesar o menos possível em cada pedido. Podemos experimentar este produto aqui.
  • Clousere Library - Um biblioteca que contem varias funcionalidades usadas nos produtos da Google. Esta biblioteca permite o acesso modular a widgets, controlos, manipulação de DOM, animação, structuras de dados, testes unitários, edição rica de texto, etc.
  • Closure Templates - Gerador de HTML para criar interfaces que foi implementado para trabalhar em JavaScript e Java.

Cross Posted from http://jf_rocha.xtreemhost.com/2009/11/google-javascript-tools/

Posted por João Filipe Rocha | 1 comment(s)
Filed under: ,

Visual Studio 2010 Beta 2 ja saiu

Finalmente o Visual Studio 2010 fornece a tão desejada alternativa para a criação de aplicações em SharePoint em vez do SharePoint Designer.
Visual Studio promove o desenvolvimento rápido do SharePoint, fornecendo recursos como ferramentas de debug avançadas, IntelliSense, e modelos de projeto.
Visual Studio também tira proveito das novas funcionalidades da .NET Framework tais como LINQ e REST para melhorar o desenvolvimento em Sharepoint.
Aqui ficam alguns guide-lines para desenvolver aplicações em Sharepoint com o Visual Studio 2010

Passo a Passo

Como fazer...

Cross-posted from http://jf_rocha.xtreemhost.com/2009/10/visual-studio-2010-beta-2-ja-saiu/
Posted por João Filipe Rocha | with no comments

Controlar o Windows com a face

Parece ficção cientifica, mas trata-se de um software que efectua o reconhecimento facial e move o cursor do rato quando movemos a nossa cabeça. Este software funciona num PC normal com um webcam, e foi desenvolvido para auxiliar pessoas com deficiência motora, ou paralisia. O software ainda permite configurar alguns movimentos faciais que possam se configurados com eventos do rato, como o double-click ou a seleccção de texto. Aqui esta um video de exemplo:

Cross-posted from http://jf_rocha.xtreemhost.com/2009/10/controlar-o-windows-com-a-face/

Posted por João Filipe Rocha | with no comments

Esconder campos nos Formulários do MOSS 2007

As Listas do MOSS 2007 contem uma estrutura hierárquica dos conjuntos de campos (Content Types) que estas contêm, como exemplo ao criamos um Calendar Lits  esta lista vai herdar os campos do Content Tyepe Event.

No entanto podemos criar os nossos Content Types que vão ter sempre um Content Type "pai" ao qual vão herdar os campos. Esta situação pode levar a exibição de campos a mais nos formulários de criação (NewForm.aspx), Visualização (DispForm.aspx) e Edição (EditForm.aspx).

Para esconder campos de um formulário de edição de conteúdo de listas, temos de alterar os respectivos formulários da definição da lista.

Se estiverem a usar as extensões para o Visual Studio  do Windows SharePoint Services 3.0 e estão usar uma Solução .WSP  para deploy das features no vossa Web Applcation, deverão editar em cada definição de lista os  formulários  NewForm.aspx, DispForm.aspx e EditForm.aspx e na linha após a esta tag:

<asp:Content ContentPlaceHolderId=”PlaceHolderMain” runat=”server”>

Colocamos este codigo Javascript

<script language="javascript" type="text/javascript">

_spBodyOnLoadFunctionNames.push("hideFields");

function findacontrol(FieldName) {

   var arr = document.getElementsByTagName("!");
   // get all comments
   for (var i=0;i < arr.length; i++ )
   {
      // now match the field name
      if (arr[i].innerHTML.indexOf(FieldName) > 0)
      {         return arr[i];      }
   }
}

function hideFields() {

   var control = findacontrol("Title");
   control.parentNode.parentNode.style.display="none";
   control = findacontrol("Document Link");
   control.parentNode.parentNode.style.display="none";
   control = findacontrol("PublishDate");
   control.parentNode.parentNode.style.display="none";

}
</script>

Na função hideFields() definimos os campos a esconder. Se quisrem testar logo no site sem instalar a feature, abram o Sharepoint Designer e na estrutura do site escolham a vossa lista e abaixo na pasta Forms editem da mesma forma os respectivos formularios.

Cross-Posted from [http://jf_rocha.xtreemhost.com/2009/10/esconder-campos-nos-formulrios-do-moss-2007/] 
Posted por João Filipe Rocha | with no comments
Filed under:

Foi criada a Fundação CodePlex

A fundação CodePlex foi criada hoje com o objectivo de criar a interligação de código e software entre entidades comerciais e comunidades open-source.

A fundação é dirigida pelos seguintes membros 

Cross-Posted [http://jf_rocha.xtreemhost.com/2009/09/foi-criada-a-fundacao-codeplex/]

De volta ao Básico

 

Small Basic é um projecto que quer levar a "diversão" de volta à programação.


Ao fornecer uma linguagem de programação e fácil de aprender em num ambiente de desenvolvimento amistoso e convidativo, o Small Basic torna a programação um divertimento.

Ideal para crianças e adultos, Small Basic ajuda a dar o primeiro passo para o maravilhoso mundo da programação.

Cross-posted from [http://jf_rocha.xtreemhost.com/2009/09/de-volta-ao-basico/]

Posted por João Filipe Rocha | with no comments
Filed under: ,

Alterar a Connection String para Membership/Profile/Role em run-time

O sistema de autenticação fornecido pela framework através das classes de Membership é muito útil e poupa bastante trabalho com a utilização dos Login Controls.

Com a criação de tabelas numa base de dados, e uma simples configuração do web.config, o Membership fica disponivel a ser utilizado, no entanto na configuração do web.config temos que indicar o nome da connection string para a base de dados onde o Membership fica instalado.

Esta situação significa que teríamos que colocar a connection string em texto limpo no web.config, o que poderia ser perigoso.

Para alterar a connection string para o Membership em run-time basta criar um provider com o override ao metodo Initialize:

   1: namespace DAL
   2: {
   3:     public class MeuMembershipProvider : SqlMembershipProvider
   4:     {
   5:         public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
   6:         {
   7:             base.Initialize(name, config);
   8:  
   9:             // obter a connection string cifrada por exemplo.
  10:             string connectionString = MeuDecifrador(ConfigurationManager.ConnectionStrings["conn"].ConnectionString);
  11:  
  12:             // alterar a propriedade do Membership provider.
  13:             FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);
  14:             connectionStringField.SetValue(this, connectionString);
  15:         }
  16:     }
  17:     
  18: }

 

e no web.config basta colocar a configuração a apontar para a classe que serve de provider ao membership.

   1: <membership defaultProvider="MeuMembershipProvider">
   2:    <providers>
   3:    <clear />
   4:    <add name="MeuMembershipProvider"
   5:               type="MeuNamespace.MeuMembershipProvider, Minha Assembly"
   6:               connectionStringName="Nome ficticio para a connection string que nunca vai ser utilizado" />
   7:    </providers>
   8: </membership>

 

Para o Role e Profile o procedimento é exactamente o mesmo mas herdando as classes SqlRoleProvider e SqlProfileProvider respectivamente.

Filmes YouTube Multilingua


Imagine que quer partilhar o filme que gravou no YouTube de uma apresentação que efectuou na sua empresa, com os seus clientes espalhados pelo mundo, a maior barreira é a língua. Pois agora ao colocar Texto nos filmes do YouTube e com a ajuda da API de Tradução do Google é possível traduzir para enumeras línguas o conteúdo desses textos.

Como exemplo vejam este video.


E no canto inferior direito surge a sigla CC que significa Crowd-Caption e é possível traduzir esses textos para enumeras línguas.

A documentação do funcionamento desta API está aqui.

 

Posted por João Filipe Rocha | with no comments
Filed under:

Exportar uma DataTable para Excel

Um pedido frequente que me fazem nas aplicações que faço em ASP.NET é a possibilidade de exportar dados para excel.

Apresento aqui a forma mais facil que conheço:

  1. Criem um metodo publico que irá receber a DataTable e o Ficheiro a exportar, e que gerar uma resposta que é um ficheiro Excel.
   1: public static void ExportToExcel(DataTable data, string fileName)
   2: {
   3:     HttpContext.Current.Response.Clear();
   4:     HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", fileName));
   5:     HttpContext.Current.Response.ContentType = "application/ms-excel";
   6:  
   7:     HttpContext.Current.Response.Write(GenerateTable(data));
   8:     HttpContext.Current.Response.End();
   9:  
  10: }

Criem o metodo GenerateTable  para criar a tabela formatada para o Excel

   1: private static string GenerateTable(DataTable source)
   2: {
   3:     HtmlTable table = new HtmlTable();
   4:  
   5:     HtmlTableRow headerRow = new HtmlTableRow();
   6:  
   7:     for (int x = 0; x < source.Columns.Count; x++)
   8:     {
   9:         HtmlTableCell th = new HtmlTableCell("th");
  10:         th.Style.Add(HtmlTextWriterStyle.BackgroundColor, "#337490");
  11:         th.Style.Add(HtmlTextWriterStyle.Color, "#FFFFFF");
  12:         th.InnerText = source.Columns[x].ColumnName;
  13:         headerRow.Cells.Add(th);
  14:     }
  15:  
  16:     table.Rows.Add(headerRow);
  17:  
  18:     foreach (DataRow x in source.Rows)
  19:     {
  20:         HtmlTableRow tableRow = new HtmlTableRow();
  21:         for (int y = 0; y < source.Columns.Count; y++)
  22:         {
  23:             System.Type rowType;
  24:             rowType = x[y].GetType();
  25:             HtmlTableCell td = new HtmlTableCell();
  26:             switch (rowType.ToString())
  27:             {
  28:                 case "System.String":
  29:                     string XMLstring = x[y].ToString();
  30:                     XMLstring = XMLstring.Trim();
  31:                     XMLstring = XMLstring.Replace("&", "&");
  32:                     XMLstring = XMLstring.Replace(">", ">");
  33:                     XMLstring = XMLstring.Replace("<", "<");
  34:                     td.InnerText = XMLstring;
  35:                     break;
  36:                 case "System.DateTime":                       
  37:                     DateTime XMLDate = (DateTime)x[y];
  38:                     string XMLDatetoString = ""; //Excel Converted Date
  39:                     XMLDatetoString = XMLDate.Year.ToString() +
  40:                          "-" +
  41:                          (XMLDate.Month < 10 ? "0" +
  42:                          XMLDate.Month.ToString() : XMLDate.Month.ToString()) +
  43:                          "-" +
  44:                          (XMLDate.Day < 10 ? "0" +
  45:                          XMLDate.Day.ToString() : XMLDate.Day.ToString()) +
  46:                          "T" +
  47:                          (XMLDate.Hour < 10 ? "0" +
  48:                          XMLDate.Hour.ToString() : XMLDate.Hour.ToString()) +
  49:                          ":" +
  50:                          (XMLDate.Minute < 10 ? "0" +
  51:                          XMLDate.Minute.ToString() : XMLDate.Minute.ToString()) +
  52:                          ":" +
  53:                          (XMLDate.Second < 10 ? "0" +
  54:                          XMLDate.Second.ToString() : XMLDate.Second.ToString()) +
  55:                          ".000";
  56:  
  57:                     td.InnerText = XMLDatetoString;
  58:  
  59:                     break;
  60:                 case "System.Boolean":
  61:                     td.InnerText = x[y].ToString();
  62:                     break;
  63:                 case "System.Int16":
  64:                 case "System.Int32":
  65:                 case "System.Int64":
  66:                 case "System.Byte":
  67:                     td.InnerText = x[y].ToString();
  68:                     break;
  69:                 case "System.Decimal":
  70:                 case "System.Double":
  71:                     td.InnerText = string.Format("{0:n}", x[y]);
  72:                     break;
  73:                 case "System.DBNull":
  74:                     td.InnerText = string.Empty;
  75:                     break;
  76:             }
  77:  
  78:             tableRow.Cells.Add(td);
  79:  
  80:         }
  81:  
  82:  
  83:         table.Rows.Add(tableRow);
  84:     }
  85:  
  86:  
  87:     StringWriter sw = new StringWriter();
  88:     HtmlTextWriter htw = new HtmlTextWriter(sw);
  89:  
  90:     table.RenderControl(htw);
  91:  
  92:  
  93:     return sw.ToString();
  94:  
  95: }

O metodo exprimentado funciona com o Excel 2007.

Posted por João Filipe Rocha | 4 comment(s)
Filed under:

Google anuncia Sistema Operativo

A empresa Google anunciou a semana passada que iria lançar um sistema operativo no segundo semestre de 2010.

Tanto ao que se sabe este sistema operativo contem as seguintes caracteristicas:

  • O Kernel base será Linux.
  • O ambiente de desktop (DE) será o browser Chrome.
  • Inicialmente estará disponivel só em netbooks
  • Irá correr sobre processadores x86 e ARM
  • O armazenamento dos dados será feito na cloud
  • E que o Google Chrome OS não terá licenciamento pago

 

Posted por João Filipe Rocha | with no comments
Filed under:

Utilizar o IHttpHandler com Ajax

 

Ao chamar um Generic HTTP Handler (.ASHX) pelo URL, o ASP.NET avalia a forma de tratar o ficheiro conforme o que estiver defenido no web.config na tag <httpHandlers>.

Acontece que se estivermos a trabalhar com Ajax, todos os pedidos HTTP passam pelo handler do Ajax e o deste modo, quando efectuamos um pedido a um .ASHX o handler do ajax não sabe como dar resposta a esse pedido o que deixa a nossa aplicação “pendurada” á espera de resposta.

Uma das soluções que encotrei para este problema é efectuar um postback na chamada ao handler, e fazendo desta forma:

No markup da pagina defenimos o link que chama o .ashx

<asp:Linkbutton id="btnFile" 
    runat="server" 
    onLoad="btnFile_Load" 
    onClick="btnFile_Click" 
    Text="Abrir Ficheiro" />

no Codebehind no evento Load do Linkbutton indicamos que este botão irá efectuar um postback:

void btnFile_Load(object sender, EventArgs e)
{
  SriptManager.GetCurrent(this.Page).RegisterPostBackControl((Control)sender);
}

E por fim definimos a chamada ao nosso link

void btnFile_Click(Object sender, EventArgs e)
{
    Response.Redirect("../file.ashx");
}

Desta forma os eventos do Linkbutton btnFile não passam pelo Handler do Ajax.

Mas se mesmo assim necessitem de utilizar o Http Handler em conjunto com o Ajax então a unica solução é no .ASHX fazer o handling assíncrono dos pedidos

Posted por João Filipe Rocha | 2 comment(s)
Filed under: ,

Apontamentos de um Programador

Para quem tem a profissão de Programador, por vezes torna-se dificil decorar tanta informação. Aqui ficam algums apontamentos que podem nos facilitar a vida.

 

Espero que ajude…

Posted por João Filipe Rocha | with no comments

Alô Alô Google

O Google vai lançar uma aplicação denominada Google Voice, onde será possível efectuar a gestão de todos os nossos números telefone.

Ao registar o serviço é nos atribuído um numero Google, e podemos associar todos os nossos telefones a esse numero e gerir todos os nossos telefonemas e efectuar enumeras operações, tais como:

Quando alguem nos liga para o nosso numero Google, dependendo das configurações, a chamada pode ser reencaminhada para um dos nossos telefones, para todos os telefones, ou simplesmente para o voicemail. 


Vejam os videos (em Inglês) 

 

Posted por João Filipe Rocha | with no comments
Filed under:

Quanto custa o Windows 7

 

Ja foram anunciados os preços (para os EUA) do novo sistema operativo da Microsoft, o Windows 7.

Para as versões de upgrade (XP ou Vista) são:

  • Windows 7 Home Premium (Upgrade): $199.99
  • Windows 7 Professional (Upgrade): $199.99
  • Windows 7 Ultimate (Upgrade): $219.99

Para as versões completas são:

  • Windows 7 Home Premium (Versão completa): $199.99
  • Windows 7 Professional (Versão completa): $299.99
  • Windows 7 Ultimate (Versão completa): $319.99
Posted por João Filipe Rocha | 3 comment(s)
Filed under:
Mais Entradas Página seguinte »