martes, 27 de enero de 2009

Evitar que Visual Studio 2010 CTP expire

 

Después del maratón Guadalupe-Reyes, algunos hemos querido retomar nuestros primeros pasos en el CTP de Visual Studio 2010, encontrándonos con que esta versión ya expiró.



image_thumb_5


 

 

 

 


Sin embargo, es muy fácil darle la vuelta a este pequeño obstáculo. Solo tenemos que hacer lo siguiente:

 

Abrir el archivo de configuración de la maquina virtual (Virtual Machine Settings File) en Notepad



image



 

 

Y agregar la siguiente sección (que esta en rojo), exactamente debajo de la sección de configuración del mouse.

<integration>
        <microsoft>
            <mouse>
                <allow type="boolean">true</allow>
            </mouse>
           <components>
                <host_time_sync>
                    <enabled type="boolean">false</enabled>
                </host_time_sync>
            </components>

 

 

 

 

 

 

 



Bueno, espero que esto ayude a que sigan jugando con la VM de Visual Studio 2010 CTP, que por cierto pueden descargar de aquí.

miércoles, 7 de enero de 2009

Habilitar Silverlight 2.0 para sitios SharePoint

Hoy en día las herramientas  de la colaboración son cada vez más comunes sobre todo en las intranets corporativas, por lo que cada vez más, los desarrolladores nos vemos involucrados en proyectos orientados a soluciones SharePoint, y una de las características que podemos adicionar a estos desarrollos es la integración con Silverlight.

Básicamente los pasos a seguir para habilitar el uso de Silverlight en SharePoint son los siguientes:



1.       Editar los tipos MIME registrados en el IIS.


2.       Agregar el ensamblado System.Web.Silverlight.dll


3.       Editar el web.config de nuestra aplicación


4.       Agregar una carpeta ClientBin en nuestra aplicación


5.       Establecer los permisos necesarios para la carpeta ClientBin



  A priori, necesitamos haber instalado el SDK de Silverlight (2.0 por supuesto), y para esto es necesario haber instalado antes el SP1 de Visual Studio, si aún no lo has descargado, puedes revisar mi post http://gerardo-reyes.blogspot.com/2008/10/silverlight-tools-rtw.html.

El detalle de los pasos antes mencionados, con imágenes muy descriptivas, lo pueden encontrar en este post de Paul Keijzers.

Con la pequeña diferencia de que en el registro del tipo MIME, debe establecerse a application/x-silverlight-2, que es el tipo mime de la última versión de Silverlight

Espero que esta información les sea útil e incremente el valor de sus productos desarrollados.



Happy Coding!

viernes, 2 de enero de 2009

Generación de Código

CodeDom

Hoy comentaré acerca de uno de los tópicos menos conocidos dentro del mundo de .NET, y que a mí personalmente me apasiona por el potencial de explotación que nos brinda. Y aunque existen varios posts en la red que hablan acerca de esto, aun es poca la difusión que tiene, ya que en mi opinión todo programador debería tener una mínima referencia a este tema.

CodeDom (Code Document Object Model) es un conjunto de clases agrupados en el namespace System.CodeDom, que nos proporciona la funcionalidad necesaria para representar tipos .NET a partir del mapping correspondiente con las clases de CodeDom. Este subsistema se basa en arboles binarios para crear una representación de grafo de nuestro código. Una vez que tenemos el grafo de código, podemos indicarle cualquiera de los proveedores de código para obtener la representación específica. Un proveedor de código, es aquel que se encarga de transformar ese grafo de tipos a código especifico, por ejemplo C#, VB, y cualquier otro lenguaje para el que exista un proveedor 

La generación de código es un concepto muy viejo, tanto como las diferentes soluciones que se han implementado, desde la concatenación de cadenas hasta llegar a CodeDom, pero también la orientación que se le ha dado, algunas de los usos que se le ha dado va desde la generación y compilación dinámica de código en Runtime, hasta la creación de ORM (Object Relational Mapping). Estos últimos son, para mí, la orientación más interesante y es en la que basare mi ejemplo de hoy.

El problema que intenta resolver los ORM es básicamente tratar de crear objetos que interactúen entre distintos ambientes, es decir, intermediarios. 

Diferentes tipos de datos


Aunque cada tecnología cuenta con diferentes tipos de datos y a veces con diferentes implementaciones para cada uno de ellos, un tipo de dato siempre corresponde a una unidad lógica fundamental en la estructura de representación de información en un entorno dado. Por ejemplo SQL Server, C#, XML 

Puesto que casi siempre (en la mayoría de los casos), tenemos información acerca de los tipos de datos con los que trabajamos (sobre todo en ambientes strongly-typed como .NET), independientemente de la tecnología. Por ejemplo, cuando trabajamos con SQL, conocemos información acerca de las columnas, como el tipo, longitud, si es foreign key, si es primary key, si es valor único, etc. Esto nos permite hacer una relación de tipos entre diferentes ambientes de trabajo para la generación de mappers, y así, crear una representación respectiva de una entidad 

Por ejemplo dada la siguiente tabla de SQL Server
Alumnos
clip_image002
Deberíamos poder generar automáticamente las clases que interactuaran con el acceso, persistencia y entidades contenedores de datos, ya que tenemos suficiente información para inferir el mapeo correspondiente a cada uno de estos tipos “desconocidos” para el entorno .NET.

Al final una simple clase contenedora de un row de la tabla de Alumnos podría verse así: 


namespace Blog.CodeDom.GeneratedEntities
{ 
    using System;

    public class Alumno
    { 
        private Int32 _idAlumno;
        private String _nombre;
        private String _apellidoPaterno;
        private String _apellidoMaterno;
        private String _direccion;
        private Int32 _idSalon; 
        private Int32 _idEdificio;

        public Alumno() 
        {

        }

        public Alumno(Int32 _idAlumno, String _nombre, String _apellidoPaterno, String _apellidoMaterno, String _direccion, Int32 _idSalon, Int32 _idEdificio) 
        { 
            this._idAlumno = _idAlumno; 
            this._nombre = _nombre; 
            this._apellidoPaterno = _apellidoPaterno; 
            this._apellidoMaterno = _apellidoMaterno; 
            this._direccion = _direccion; 
            this._idSalon = _idSalon; 
            this._idEdificio = _idEdificio; 
        }

        public virtual Int32 IdAlumno 
        { 
            get 
            { 
                return this._idAlumno; 
            } 
            set 
            { 
                this._idAlumno = value; 
            } 
        } 

        public virtual String Nombre 
        { 
            get 
            { 
                return this._nombre; 
            } 
            set 
            { 
                this._nombre = value; 
            } 
        }

        public virtual String ApellidoPaterno 
        { 
            get 
            { 
                return this._apellidoPaterno; 
            } 
            set 
            { 
                this._apellidoPaterno = value; 
            } 
        }

        public virtual String ApellidoMaterno 
        { 
            get 
            { 
                return this._apellidoMaterno; 
            } 
            set 
            { 
                this._apellidoMaterno = value; 
            } 
        }

        public virtual String Direccion 
        { 
            get 
            { 
                return this._direccion; 
            } 
            set 
            { 
                this._direccion = value; 
            } 
        }

        public virtual Int32 IdSalon 
        { 
            get 
            { 
                return this._idSalon; 
            } 
            set 
            { 
                this._idSalon = value; 
            } 
        }

        public virtual Int32 IdEdificio 
        { 
            get 
            { 
                return this._idEdificio; 
            } 
            set 
            { 
                this._idEdificio = value; 
            } 
        } 
    }
} 

Vamos a analizar con más detenimiento el código que genera esta salida.


Creamos un objeto CodeTypeDeclaration, que es el objeto que utilizamos para crear la definición de la clase Alumno


CodeTypeDeclaration classAlumno = new CodeTypeDeclaration("Alumno");
            classAlumno.Attributes = MemberAttributes.Public; 

Agregamos cada una de las propiedades con sus respectivos campos de la clase, para esto he definido un método de ayuda. Existen dos clases principales utilizadas en este paso, CodeMemberField, que representa un campo y CodeMemberProperty que representa una propiedad


Al final agregamos dos constructores, uno sin parámetros y el otro con el mismo número de campos de la clase.
classAlumno.Members.AddRange(CodeDomHelper.CreateFieldAndProperty("Int32", "_idAlumno", "IdAlumno"));

            classAlumno.Members.AddRange(CodeDomHelper.CreateFieldAndProperty("String", "_nombre", "Nombre"));

            classAlumno.Members.AddRange(CodeDomHelper.CreateFieldAndProperty("String", "_apellidoPaterno", "ApellidoPaterno"));

            classAlumno.Members.AddRange(CodeDomHelper.CreateFieldAndProperty("String", "_apellidoMaterno", "ApellidoMaterno"));

            classAlumno.Members.AddRange(CodeDomHelper.CreateFieldAndProperty("String", "_direccion", "Direccion"));

            classAlumno.Members.AddRange(CodeDomHelper.CreateFieldAndProperty("Int32", "_idSalon", "IdSalon"));

            classAlumno.Members.AddRange(CodeDomHelper.CreateFieldAndProperty("Int32", "_idEdificio", "IdEdificio"));

public static CodeTypeMemberCollection CreateFieldAndProperty(string typeofProperty, string fieldName, string propertyName) 
        { 
            CodeMemberField field = new CodeMemberField(typeofProperty, fieldName); 
            field.Attributes = MemberAttributes.Private; 
             CodeMemberProperty property = new CodeMemberProperty(); 
            property.Name = propertyName; 
            property.Type = new CodeTypeReference(typeofProperty); 
            property.Attributes = MemberAttributes.Public; 
            property.GetStatements.Add(new CodeMethodReturnStatement() 
                                        { 
                                         Expression = new CodeFieldReferenceExpression() 
                                         { 
TargetObject = new CodeThisReferenceExpression(), 
                                             FieldName = field.Name 
                                         } 
                                        } 
                                        ); 
            property.SetStatements.Add(new CodeAssignStatement() 
                                        { 
                                            Left = new CodeFieldReferenceExpression() 
                                            { 
TargetObject = new CodeThisReferenceExpression(), 
FieldName = field.Name 
                                            }, 
                                             Right = new CodePropertySetValueReferenceExpression() 
                                        } 
                                        ); 
            CodeTypeMemberCollection members = new CodeTypeMemberCollection(); 
            members.Add(field); 
            members.Add(property); 
            return members; 
        }

Como habrán visto, cada uno de estos miembros de la clase son agregados a la variable classAlumno, que es el objeto contenedor, por así decirlo, de objetos como CodeMemberProperty, CodeMemberField, CodeConstructor, CodeTypeConstructor, CodeMemberMethod, etc. Y el objeto classAlumno es agregado al  objeto CodeNamespace


CodeNamespace nm = new CodeNamespace("Blog.CodeDom.GeneratedEntities");
nm.Types.Add(classAlumno); 


De tal forma que describimos un árbol de código de la forma siguiente:
clip_image003 Imagen tomada de http://www.willydev.net

Lo interesante hasta aquí es que en código que hemos escrito, aun no hemos especificado ningún lenguaje en el cual será convertido nuestro grafo de código, si bien es cierto el ejemplo está escrito en C#, esto no quiere decir que el código generado al final deba ser C#, podría ser de VB (aunque no me guste pondré como se vería la salida en VB)

Imports System 
Namespace Blog.CodeDom.GeneratedEntities 
     Public Class Alumno 
        Private _idAlumno As Int32 
        Private _nombre As [String] 
        Private _apellidoPaterno As [String] 
        Private _apellidoMaterno As [String] 
        Private _direccion As [String] 
        Private _idSalon As Int32 
        Private _idEdificio As Int32 

        Public Sub New() 
            MyBase.New() 
        End Sub 

        Public Sub New(ByVal _idAlumno As Int32, ByVal _nombre As [String], ByVal _apellidoPaterno As [String], ByVal _apellidoMaterno As [String], ByVal _direccion As [String], ByVal _idSalon As Int32, ByVal _idEdificio As Int32) 
            MyBase.New() 
            Me._idAlumno = _idAlumno 
            Me._nombre = _nombre 
            Me._apellidoPaterno = _apellidoPaterno 
            Me._apellidoMaterno = _apellidoMaterno 
            Me._direccion = _direccion 
            Me._idSalon = _idSalon 
            Me._idEdificio = _idEdificio 
        End Sub 

        Public Overridable Property IdAlumno() As Int32 
            Get 
                Return Me._idAlumno 
            End Get 
            Set(ByVal value As Int32) 
                Me._idAlumno = value 
            End Set 
        End Property

         Public Overridable Property Nombre() As [String] 
            Get 
                Return Me._nombre 
            End Get 
            Set(ByVal value As [String]) 
                Me._nombre = value 
            End Set 
        End Property 
 

        Public Overridable Property ApellidoPaterno()
As [String] 
            Get 
                Return Me._apellidoPaterno 
            End Get 
            Set(ByVal value As [String]) 
                Me._apellidoPaterno = value 
            End Set 
        End Property 
 

        Public Overridable Property ApellidoMaterno()
As [String] 
            Get 
                Return Me._apellidoMaterno 
            End Get 
            Set(ByVal value As [String]) 
                Me._apellidoMaterno = value 
            End Set 
        End Property 

         Public Overridable Property Direccion() As
[String] 
            Get 
                Return Me._direccion 
            End Get 
            Set(ByVal value As [String]) 
                Me._direccion = value 
            End Set 
        End Property 

        Public Overridable Property IdSalon() As Int32 
            Get 
                Return Me._idSalon 
            End Get 
            Set(ByVal value As Int32) 
                Me._idSalon = value 
            End Set 
        End Property 

        Public Overridable Property IdEdificio() As Int32 
            Get 
                Return Me._idEdificio 
            End Get 
            Set(ByVal value As Int32) 
                Me._idEdificio = value 
            End Set 
        End Property 

    End Class
End Namespace


Como había comentado antes, la especificación del proveedor, es el que, al final del día, nos proporcionará la transformación a los diferentes lenguajes. Y solo queda mostrar el código completo con el que se especifica el proveedor de código.

CodeNamespace nm = Blog.CodeDom.Samples.CodeDomManager.CreateClassAlumno();

            nm.Imports.Add(new CodeNamespaceImport("System"));

            CodeDomProvider provider = new Microsoft.CSharp.CSharpCodeProvider();

            provider.GenerateCodeFromNamespace(nm, Console.Out, new CodeGeneratorOptions() { BracingStyle="C" });

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.CodeDom;

namespace Blog.CodeDom.Samples
{
    public partial class CodeDomManager
    {
        public static CodeNamespace CreateClassAlumno()
        {
            CodeNamespace nm = new CodeNamespace("Blog.CodeDom.GeneratedEntities");
            CodeTypeDeclaration classAlumno = new CodeTypeDeclaration("Alumno");
            classAlumno.Attributes = MemberAttributes.Public;
            classAlumno.Members.AddRange(CodeDomHelper.CreateFieldAndProperty("Int32", "_idAlumno", "IdAlumno"));
            classAlumno.Members.AddRange(CodeDomHelper.CreateFieldAndProperty("String", "_nombre", "Nombre"));
            classAlumno.Members.AddRange(CodeDomHelper.CreateFieldAndProperty("String", "_apellidoPaterno", "ApellidoPaterno"));
            classAlumno.Members.AddRange(CodeDomHelper.CreateFieldAndProperty("String", "_apellidoMaterno", "ApellidoMaterno"));
            classAlumno.Members.AddRange(CodeDomHelper.CreateFieldAndProperty("String", "_direccion", "Direccion"));
            classAlumno.Members.AddRange(CodeDomHelper.CreateFieldAndProperty("Int32", "_idSalon", "IdSalon"));
            classAlumno.Members.AddRange(CodeDomHelper.CreateFieldAndProperty("Int32", "_idEdificio", "IdEdificio"));
            classAlumno.Members.Add(CodeDomHelper.CreateDefaultConstructor(classAlumno.Name));
            CodeDomHelper.CreateMembersConstructor(classAlumno);
            nm.Types.Add(classAlumno);
            return nm;
        }
    }
} 


Espero que este post ayude a que los desarrolladores volteen la mirada a este namespace tan olvidado y despierte en ellos la curiosidad y la inventiva para desarrollar nuevas soluciones basadas en estos temas.

Happy Coding!

martes, 2 de diciembre de 2008

Consumiendo un WCF Service desde Silverlight

El día de hoy hablaré de como consumir un WCF Service. E intentare resolver todos y cada uno de los errores que suelen ocurrir al momento de desarrollar el ejemplo que propongo.

Aunque pareciera algo trivial este ejemplo, lo cierto es que no todo es como se ve en los webcast, libros y conferencias. A veces surgen errores que no son comunes pero nos quitan mucho tiempo al momento de toparnos con ellos.


El ejemplo que propongo hoy, se trata de una simple calculadora que recibe un número y calcula su cuadrado, es decir X2.


Primero que nada, creamos el proyecto Silverlight que será el cliente del WCF service, junto con la pagina de prueba que utilizaremos para invocar el archivo .xap generado por el proyecto de Silverlight.
clip_image002
clip_image004
Agregamos un poco de código, cabe mencionar que pueden descargar el código de aquí.
clip_image006
Y ahora ejecutamos nuestra página de prueba que invoca el objeto Silverlight que acabamos de crear. Y entonces encontramos el primer problema a resolver:
clip_image008
Para fines de desarrollo este problema es de muy fácil resolución. Basta con que se cambie la propiedad “Copy Local” del ensamblado System.Web.Silverlight a “True”
clip_image010
clip_image012
Ahora Escribimos el código correspondiente al WCF Service
clip_image014
Una vez que el servicio está listo para ser ejecutado, debemos detenernos a revisar algunas implicaciones propias de trabajar con Silverlight.

1. Se debe cambiar el tipo de Binding que utiliza el servicio porque Silverlight no soporta el tipo de binding wsHttpBinding, el tipo de binding por defecto, por lo que debe ser cambiado por basicHttpBinding.

clip_image016
2. Cuando trabajamos con WCF Services y Silverlight, las llamadas siempre son usando el modelo asíncrono.
clip_image018
Una vez que tenemos presente estas importantes consideraciones, agregamos la referencia a nuestro servicio, desde el proyecto Silverlight
clip_image020
Agregamos el código necesario para llamar al servicio en el momento que el usuario quiera calcular el cuadrado de un número x. Compilamos y ejecutamos nuestra aplicación ASP.NET demo.
clip_image022
De nuevo nos encontramos con un error en el momento de realizar la solicitud al servicio.
Soporte para peticiones “Cross Domain”
Este es el momento para hablar acerca de dos archivos que debemos conocer para desarrollar con estas tecnologías.


CrossDomain.xml

Este archivo debe estar en el directorio raíz de donde se hostea nuestra aplicación, en este caso, nuestra aplicación aun no está instalada en ningún servidor web, así que basta con que sea agregado en la carpeta en que se encuentra nuestro servicio
La sintaxis de este archivo, básicamente indica los dominios desde los cuales se pueden realizar peticiones hacia nuestra página, en este caso el WCF Service.


<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
 <allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>


clip_image024
Sin embargo este archivo es viejo, desde los primeros días de Macromedia Flash, tal vez el porqué de que no sea totalmente soportado por Silverlight cuando se quiere hacer uso más a detalle del mismo, puesto que no cubre todos los escenarios. En su lugar Microsoft propone el siguiente archivo, que es de uso mas amplio.

ClientAccessPolicy.xml

Si lo que queremos es un control mas fino de cada uno de los detalles del acceso “Cross Domain” deberíamos usar el archivo ClientAccessPolicy.xml, tiene una estructura semejante al anterior pero con un mayor espectro de escenarios cubiertos.

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
 <cross-domain-access>
  <policy>
   <allow-from>
    <domain uri="*"/>
   </allow-from>
   <grant-to>
    <resource path="/" include-subpaths="true"/>
   </grant-to>
  </policy>
 </cross-domain-access>
</access-policy>

Por último tenemos el código completo para llamar a nuestro servicio.

using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Net;
 using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Documents;
 using System.Windows.Input;
 using System.Windows.Media;
 using System.Windows.Media.Animation;
 using System.Windows.Shapes;
 using System.Globalization;

 namespace SilverlightApplicationDemo
 {
     public partial class Page : UserControl
     {
         public Page()
         {
             InitializeComponent();
         }

         private void CallService(double number)
         {
             CalculatorProxy.CalculatorClient client = new SilverlightApplicationDemo.CalculatorProxy.CalculatorClient();
             client.SquareCompleted += new EventHandler<SilverlightApplicationDemo.CalculatorProxy.SquareCompletedEventArgs>(client_SquareCompleted);
             client.SquareAsync(number);
         }

         void client_SquareCompleted(object sender, SilverlightApplicationDemo.CalculatorProxy.SquareCompletedEventArgs e)
         {
             if (e.Error != null)
             {
                 MessageBox.Show('El servicio devolvio un error');
                 return;
             }
             txtResult.Text = e.Result.ToString(CultureInfo.CurrentUICulture);
         }

         private void Button_Click(object sender, RoutedEventArgs e)
         {
             double number = 0;
             if (Double.TryParse(txtNumber.Text, out number) == false)
             {
                 MessageBox.Show('Esto no es un número');
                 return;
             }
             CallService(number);
         }
     }
 }
Espero que este post les sea de utilidad y que les ahorre tiempo en sus futuros desarrollos.


Happy Coding!

viernes, 21 de noviembre de 2008

Silverlight 3

No hace mucho que Microsoft libero la version 2.0 de Silverlight (como comentamos anteriormente en este blog), y casi a la par, el sr. Scott Guthrie, quien es nada mas y nada menos que el Vicepresidente de la division de desarrollo de Microsoft, anunció que se espera que alrededor del tercer cuarto del 2009 sea liberado la versión 3 de Silverlight, que vendría traer a los desarrolladores nuevas caracteristicas como: Mejor rendimiento en cuanto a multimedia se refiere, incluyendo soporte para h.264, mejores caracteristicas en gráficos, soporte para 3D y aceleración por medio de la GPU, soporte para databinding, y nuevos controles!
Y por supuesto, las siguientes versiones de Visual Studio y Visual Web Developer, tendran soporte completo para Silverlight y nuevas herramientas para hacer DataBinding.

La batalla por este sector del mercado entre Flash y Silverlight se esta poniendo muy interesante, en mi opinión personal, hace tiempo que Adobe se dio cuenta que Flash no tenia mucho tiempo de vida, ese es el porque de su apuesta por otras tecnologias como AIR, a.k.a. Apollo.

De entre los anuncios que hubo en el pasado PDC 2008 (que fueron muchos), el no menospreciable periodico NYT, reporto los siguiente:
"A Microsoft official cited on Tuesday improvements planned for the company's Silverlight platform for rich Internet applications, including intentions to run Silverlight applications outside of a browser."

Acaso esto será la competencia directa de Apollo???, pues si es cierto!. Microsoft tiene grandes planes para Silverlight en el futuro próximo, y nosotros como desarrolladores no debemos perder de vista el rumbo que vayan tomando los nuevos releases de Silverlight y todo el espectro de projectos que se estan armando a su alrededor.

No dejen de visitar:

Happy Coding!

Etiquetas

SharePoint 2010 (38) Microsoft (32) Desarrollo SharePoint (31) Gerardo Reyes Ortiz (27) SharePoint (20) SharePoint 2013 (18) Errores SharePoint (12) México (10) PowerShell (9) Silverlight (8) Visio Services (7) Features (6) MVP (6) Silverlight 3 (6) WebCast (6) Workflows (6) Configuracion SharePoint 2010 (5) D.F. (5) API REST (4) Configuracion SharePoint 2010; (4) Troubleshooting (4) Visual Studio 2010 (4) Visual studio (4) WSS (4) Web parts (4) Apps (3) Comunidad SharePoint (3) Configuración SharePoint 2013 (3) ODATA (3) SharePoint Server (3) SharePoint; Instalación SharePoint; Troubleshooting; Search Service (3) Silverlight 3.0 (3) Silverlight Toolkit (3) WebParts (3) javascript (3) jquery (3) Eventos SharePoint (2) Office 2010 (2) PeoplePicker (2) REST (2) SQL Server (2) Scripting (2) Search Service Application (2) SharePoint Designer (2) UPA (2) UPS (2) Workflows SharePoint (2) host header (2) Apps Development (1) Big Bang (1) CAS (1) CSOM (1) Codeplex (1) CompartiMOSS (1) Configuracion SharePoint 2010; Errores SharePoint (1) Configuracion SharePoint 2010; SharePoint 2010 (1) Custom Actions (1) Custom Editor Parts (1) Delegate Controls (1) Deployment (1) DisableLoopbackCheck (1) Document Library (1) Entrevista (1) Examenes de Certificación (1) Extract WSP (1) FBA (1) FS4SP (1) Fakes (1) Fast Search Server 2010 For SharePoint (1) Fiddler (1) HTTP.SYS (1) HTTPS (1) JSON (1) Language Pack's (1) Latam (1) MAXDOP (1) MCSM (1) MSExpertos (1) MVC (1) Microsoft México (1) Microsoft; Codeplex; Screencast; (1) My Sites (1) SQL Server 2012 (1) SQL Server Reporting Services (1) Screencast (1) Screencast; (1) Service Applications (1) Service Pack (1) SharePoint 2007 (1) SharePoint 2010 SP 1 (1) SharePoint API (1) SharePoint Conference (1) SharePoint Emulators (1) SharePoint Farm (1) SharePoint Health Analyzer (1) SharePoint Magazine (1) SharePoint Online (1) SharePoint Search (1) SharePoint Test (1) SharePoint; Desarrollo SharePoint (1) Shims (1) Simposio (1) Simposio Latinoamericano (1) SkyDrive Pro (1) Soporte Microsoft (1) Templates (1) Tip (1) VSeWSS (1) Virtual Machine (1) Visual Studio 2012 (1) WCF (1) WSS; IIS 7 (1) Web API (1) Web Content Management (1) Web Services (1) Windows 8 (1) Windows Live ID (1) Xml (1) appcmd (1) iOS (1) jqGrid (1) onload function (1)