We are a Spain-based community but we are open to international friends and co-workers. We support both English and Spanish bloggers, so anyone can post to our community.

Posts in English
Posts in Spanish

Syndication

Blog Stats

Bloggers (last updates)

Welcome to Clearscreen Blogging Community

This a community of developers and tech-freak bloggers, mainly from Spain but we also accept international bloggers. The languagues we support are English and Spanish and we are open to new bloggers. So if you are interested in joining us, don't hesitate to contact

Contact us if you want to create a blog in blogs.clearscreen.com

Latest Posts

El futuro de aplicaciones enriquecidas y la red, mirado desde la perspectiva de SharePoint

Para rematar en estilo una semana de esas raras, me he puesto a mirar el cerro de E-mails acumulados, y me he encontrado un artículo de Michael K. Campbell en WindowsDev Pro (“The Future of Rich Internet Applications and the Web”). He estado buscando el articulo en Internet sin poderlo encontrar, así que no puedo dar una referencia, pero si a alguien le interesa leerlo, háganmelo saber y se los envío a vuelta de correo.

El artículo se trata de las modas que van y vienen (y desaparecen) en nuestro mundo informático, y sobre el tema de “Aplicaciones Enriquecidas” (“Rich Internet Applications”), o como lo llaman por ahí, el Web dos. Su premisa es que HTML, a pesar de todos los SilverLight de este mundo, seguirá vivito y coleando por este mundo virtual por muchos años más.

Como ejemplo representativo comenta del SQL CLR. No tiene ni idea que es el SQL CLR? Pues de eso se trata realmente, de que ya nadie se acuerda que es eso. El SQL CLR es la posibilidad de escribir código para SQL directamente desde CSharp o Visual Basic, sin tener que usar el T-SQL. Cuando el asunto apareció hace años en los betas de Yukon, todo el mundo estaba entusiasmado y dispuesto a usarlo. Yukon se convirtió en SQL 2005, SQL 2005 vino y se volvió a ir, y en el intermedio nadie ha creado un solo renglón de código en CSharp para conversar con SQL. Probablemente “nadie” es exagerado, pero como el señor Cambell dice, el no conoce a nadie que lo haya utilizado alguna vez, y yo menos aun.

Algo similar puede ocurrir con Silverlight. Silverlight es una enorme promesa, por su riqueza y potencia. Gracias a las herramientas que Microsoft ha creado para ser utilizadas con Silverlight, la cantidad de código que hay que escribir para hacer algo bueno, bonito y rápido es mínimo. Que Silverlight es el “killer” de Macromedia Flash, más o menos todo el mundo está de acuerdo. Flash fue hace diez años la promesa que es ahora Silverlight, y ya vemos en que se ha convertido: el medio para crear propaganda que nadie quiere ver. En realidad Flash se va a morir por sus características autistas: si alguna vez ha intentado hacer comunicar un video Flash con el mundo exterior, se habrá dado cuenta que es más o menos entre dificilísimo e imposible... problema que parece no está teniendo Silverlight.

Pero no todo es color de rosa para Silverlight, y algunas de sus características son inherentemente débiles. Como Michael Campbell comenta en su artículo, el problema mayor de técnicas como Flash o Silverlight es que son dirigidas a mejorar la “Experiencia del Usuario”, olvidando que detrás de imágenes bonitas y videos agarradores, de lo que la red se trata es de contenido. Es decir, la experiencia del usuario muestra solamente el contenido que (en su mayoría) se genera dinámicamente, y que por la manera intrínseca de funcionamiento de Flash o Silverlight, es invisible para maquinas de búsqueda: Google o Yahoo o Microsoft Live (alguien usa MS Live?) son incapaces de indexar contenido presentado con estas técnicas. Y para empresas que basan sus ingresos en número de visitantes (que es lo que mueve en realidad a Internet), estas técnicas, aunque muy interesantes visualmente, no son interesantes comercialmente.

Extrapolando el asunto a SharePoint, el asunto no solo es de indexación de contenido (al motor de búsqueda de SharePoint lo podemos configurar para que busque directamente en el contenido del sistema, sin necesidad de indexar las pantallas), sino que, a pesar de que es posible usar Silverlight para crear WebParts, la técnica es prácticamente inutilizable por complicada y poco confiable. Por supuesto que cada vez vemos mas y mas sitios de SharePoint usando a Silverlight, pero yo personalmente no me atrevo a crear una intranet o extranet para un cliente mío usando Silverlight pues no puedo garantizar que el asunto seguirá funcionando sin problemas por los próximos años, y con cargas incrementales de utilización. Alguien ha hecho pruebas de carga, por ejemplo, de un sitio con una WebPart creada con Silverlight? No que yo sepa...

PS: Cambiando de tema, me había prometido no comentar nada sobre el asunto, pero me parece que es injusto con todos los amigos que me han escrito los últimos días, enviándome sus congratulaciones. En realidad, nada del asunto habría sido posible sin este grupo de amigotes cabeciduros que se les había metido la ida terca de que Microsoft y yo tuviéramos un vínculo de trabajo más estrecho. En fin, ellos lo han logrado, y yo se los agradezco de corazón. A ver con que resultamos en los próximos años, ahora que podemos colaborar más estrechamente para divulgar a SharePoint como el producto grande que es... de nuevo, gracias a todos, ellos y ellas...

Gustavo - http://www.gavd.net/servers/
Escriba un Comentario que me haga reir...

posted @ 7/5/2008 3:29 AM by Gustavo


Las Cosas Claras: Desde Javascript interactuar con Silverlight

En el último post de la serie esta que comencé de "Las Cosas Claras" estuvimos viendo como podíamos acceder al DOM del explorador para, en el ejemplo, llamar a funciones javascript. Pues bien, hoy veremos como hacer precisamente lo contrario.

En el siguiente ejemplo veremos como desde javascript podemos provocar cambios en el Silverlight, en este caso cambiar la orientación de los elementos de un StackPanel, pero también podríamos provocar el inicio de una animación o pararla, etc.

En primer lugar utilizaremos el siguiente namespace ya que contiene lo necesario para realizar esto:

using System.Windows.Browser;

 

Centrándonos en la página principal del Silverlight Page.xaml. El código XAML será muy sencillo, un simple StackPanel con varios botones:

    <StackPanel x:Name="LayoutRoot" Background="White">
        <Button Content="Rojo" Background="Red"/>
        <Button Content="Verde" Background="Green"/>
        <Button Content="Azul" Background="Blue"/>
        <Button Content="Amarillo" Background="Yellow"/>
        <Button Content="Blanco" Background="White"/>
        <Button Content="Negro" Background="Black"/>
    </StackPanel>

Y en el código fuente debemos registrar la clase MiTipoScriptable para poderla usar desde javascript de la siguiente manera:

  • En el evento Loaded de la página registraremos el objeto que será usados para acceder desde javascript al método.
HtmlPage.RegisterScriptableObject("slObject", this);
  • Y por último decoraremos un método de la clase Page, donde hemos realizado el registro del objeto del punto anterior, con el decorador [ScriptableMember] el cual será el método al que podremos llamar desde javascript.
[ScriptableMember]
public void slMethod(string o)
{
    if (o != "H")
        LayoutRoot.Orientation = Orientation.Vertical;
    else
        LayoutRoot.Orientation = Orientation.Horizontal;
}

Ahora nos vamos a la página ASPX desde la cual llamaremos al método slMethod del Silverlight. Para esto en primer lugar obtendremos el contenedor del Silverlight el cual en nuestro caso del ejemplo se llama SilverlightContainer y por último accederemos al método registrado mediante la siguiente sintaxis:

function Orientacion(oo)
{
    var slPlugin = $get("SilverlightContainer");
     
    slPlugin.Content.slObject.slMethod(oo);
}

PD: Se han creado dos botones Vertical y Horizontal que llamarán a la función Orientacion para cambiar el tipo de orientación del StackPanel.

Stackpanel

Stackpanel2

posted @ 7/4/2008 1:09 AM by Fernando Cortés Hierro


Curso Windows Live APIs para desarrolladores Php y Jsp

Pues hoy ya esta disponible el curso on-line que realicé sobre como enriquecer, mediante las APIs de Windows Live las páginas web creadas por los desarrolladores PHP y JSP.

El curso esta disponible para su descarga desde Aqui, y se tratarán las siguientes APIS:

  • API Search
  • Virtual Earth API
  • Windows Live ID API
  • Messenger Activities
  • IM Control & Presence API
  • En el curso también se incluyen vídeo explicativos y sí, lo reconozco, como creo que le pasa a casi todos los mortales, no me gusta escuchar mi voz grabada :S

    Habrá novedades sobre algún curso nuevo de más APIs de Windows Live que se publicará en un futuro.

    Pues a enriquecer se ha dicho.

    posted @ 7/2/2008 3:16 AM by Fernando Cortés Hierro


    Las Cosas Claras: Llamar funciones javascript desde Silverlight

    Hoy veremos algo que nos puede resultar muy útil en nuestras aplicaciones Silverlight. Estamos hablando de la posibilidad de acceder al DOM (Document Object Model) del navegador para llamar a una función javascript que hará lo que queramos en el cliente.

    Para ello necesitamos en primer lugar usar el siguiente Namespace:

    using System.Windows.Browser;

    En este namespace disponemos de la clase HtmlPage que será la que nos permita tener el acceso necesario al DOM del navegador.

    Para este post he montado en un momentillo un ejemplo muy fácil. Son dos botones y una caja de texto. El primer botón llama a una función que muestra un alert con un mensaje predefinido en el cliente y el segundo botón muestra un alert con el texto del TextBox como mensaje. Algo sencillo pero que muestra lo más básico que podemos hacer: Llamar a una función con y sin parámetros.

    Sltobrowser

    En el código fuente podemos ver como utilizando el método GetProperty al que se le pasa el nombre de la función javascript, obtenemos un objeto de tipo ScriptObject. Este tipo de objeto dispone del método InvokeSelf que se encarga de hacer la llamada a la función en cuestión. Este método recibirá los parámetros que le serán pasados a la función javascript.

    private void bttLaunch_Click(object sender, RoutedEventArgs e)
    {
        ScriptObject scriptMethod = (ScriptObject)HtmlPage.Window.GetProperty("MostrarAlerta");
        scriptMethod.InvokeSelf();
    }
    
    private void bttLaunch2_Click(object sender, RoutedEventArgs e)
    {
        ScriptObject scriptMethod = (ScriptObject)HtmlPage.Window.GetProperty("MostrarAlerta2");
        scriptMethod.InvokeSelf(txtMessage.Text);
    }

    Un muestra del resultado por ejemplo al pulsar el segundo botón seria el siguiente:

    Capture

    En el siguiente post de esta serie veremos como hacer lo contrario. Llamar desde el cliente, el navegador, a un función del Silverlight.

    posted @ 6/27/2008 3:28 AM by Fernando Cortés Hierro


    Activando Actividades que no han sido Activadas: Actividades de SharePoint

    “The list of workflow actions on the server references an assembly that does not exist.  Some actions will not be available.  The assembly strong name is bla-bla-bla.  Contact your server administrator for more information.”

    Error encontrado a último minuto, cuando estaba preparando una conferencia que debía dar el lunes a primera hora (junto con Hadi Hariri, aunque él estaba hablando de cosas completamente diferentes). Mala cosa, ya tienes todo pensado y preparado y en el ultimo pedazo de código para rematar brillantemente la hora de conferencia, te sale SharePoint con algo por el estilo...

    Empecemos por el principio. Todo el asunto se trataba de SharePoint y el Windows WorkFlow Foundation: juntando mundos que andan por caminos separados: SharePoint y la Fundación no tienen en principio nada que ver el uno con el otro, pero cuando se ponen a trabajar juntos se pueden hacer cosas realmente brillantes. Y hay dos formas para crear Flujos de Trabajo en SharePoint: SharePoint Designer o Visual Studio; otros dos mundos separados, que en principio no tienen nada que ver el uno con el otro (es más, hasta llegan a ser enemigos), pero que si se pueden conjugar de una u otra forma, nos pueden solucionar problemas peliagudos.

    El problema que he estado viendo en varios proyectos los últimos tiempos es que los Flujos de Trabajo se están volviendo más y más complicados: las variables de entrada no hacen más que aumentar, los caminos a recorrer son cada vez más intrincados, las reglas de negocios menos y menos manejables. Por el otro lado, Flujos tienden a ser utilizados una sola vez, en una sola Lista o Librería (también como consecuencia de que cada vez son más especializados en realizar una tarea específica). Crear Flujos de Trabajo de este tipo es imposible de hacer con el SharePoint Designer, hay que usar Visual Studio, por lo tanto son bastante costosos de desarrollar (tiempo de desarrollador no es especialmente barato), y si hay que modificarlos de vez en cuando, el problema no hace más que aumentar, y nuestros clientes están cada vez menos contentos...

    Con SharePoint Designer se pueden “ensamblar” Flujos de Trabajo de una forma realmente sencilla, y es muy fácil contarle a alguien que trabaje directamente con la instalación de SharePoint como hacerlo en muy poco tiempo. Pero el Designer no tiene ninguna capacidad para hacer cosas realmente interesantes. Como combinar los puntos fuertes de los dos (hacer lo que nos de la gana con VS, hacerlo fácilmente con SharePoint) para mitigar los puntos flacos de los dos (costos y conocimientos necesarios para usar VS, falta de posibilidades en Designer)? La respuesta es Actividades...

    Actividades son esos pequeños bloques de funcionalidad que están en el Cuadro de Herramientas de Visual Studio y en las Acciones del Designer. Qué tal si dividimos el problema en bloques funcionales, creamos Actividades para ellos en Visual Studio y los instalamos en Designer de tal forma que nuestro cliente se “ensamble” sus Flujos por sí mismo? Combinamos mundos divergentes (el titulo de la conferencia) para solucionar un problema real y actual: bajar costos y aumentar flexibilidad. Un ejemplo que me he topado con frecuencia es en instalaciones de SharePoint en Universidades en donde hay un formulario para que nuevos estudiantes se inscriban: algunas facultades quieren que después de que el formulario se ha recibido, primero se haga una cita para conversar con el interesado, y luego se registra a la persona en el sistema. Otras facultades quieren registrar el interesado directamente para que no se les escape (las facultades de ingeniería por ejemplo... nadie quiere estudiar ingeniería, así que si a alguien le da por ahí, hay que agarrarlo inmediatamente) y luego hacer la cita. Como construir el Flujo detrás del formulario? De tal forma que pueda seguir los dos caminos dependiendo de variables de entrada? O crear dos Flujos, a los que hay que instalar, darles mantenimiento, etc? Porque no crear una Actividad “Formulario” (que se comunica con un formulario de InfoPath, por ejemplo), otra Actividad “Hacer Cita” (que mira en los calendarios de los entrevistadores, reserva tiempos en ellas, manda E-mails a todo el mundo) y una tercera Actividad “Registrar” (que crea un numero de registro, hace cosas en PeopleSoft, etc.), luego registramos las Actividades (creadas en Visual Studio) en SharePoint Designer y finalmente algún empleado de nuestro cliente se encarga de crear la Lista necesaria y ensamblar las Actividades en el orden indicado para crear el Flujo? Este es un ejemplo muy sencillo, pero al mismo tiempo muy real...

    Bueno, de eso se trataba mi conferencia, y lo único que me faltaba al final era configurar a SharePoint Designer para que me mostrara una Actividad de ejemplo que ya tenía lista. Y allí me salió el error. Por eso de que no hay información de Microsoft al respecto (por alguna razón extraña ya ni me da rabia, estoy tan acostumbrado...), me he sacado un Profiler del bolsillo para ver qué era lo que pasaba cuando arrancaba a Designer y en el momento de intentar ver la Actividad. Pues bien, lo primero interesante que ocurre es que el Designer llama al método “FetchLegalWorkflowActions” (del que hay una página de información de Microsoft, http://msdn.microsoft.com/en-us/library/ms774779.aspx, que por supuesto no dice nada), pero que me indica que el Designer está usando WebServices para mirar en el archivo de configuración del sitio... hmmmm... todos los días se aprende algo nuevo... Luego se van recorriendo todos los ensamblados en la configuración y revisando si los encuentra en el GAC. Y si no encuentra alguno, sale el mensaje. El problema es que mi ensamblado estaba perfectamente firmado e instalado en el GAC, y lo peor de todo, que SharePoint lo encontraba sin problemas. Así que el proceso que realiza el Designer es muy sencillo, y todo estaba perfectamente configurado, pero el error me seguía saliendo y todo el asunto se atrancaba miserablemente...

    Después de revisar todo una y otra y otra vez y ejecutar mil y un iisreset, estaba empezando a pensar en cambiar mi conferencia a algo así como “Posibles causas del embarazo de las gallinas verdes australianas”... así que me dio por cerrar a SharePoint Designer y reiniciarlo de nuevo... brillante, genial, fenomenal !!! Funciona!!!... Mi Actividad es visible y usable, y nada de errores... Muchas gracias Microsoft, me han proporcionado una de las horas más miserables de mi vida intentando encontrar un error inexistente, y todo gracias a que alguno de sus programadores no hizo su trabajo bien hecho, y gracias a que sus probadores no probaron el producto bien probado... Pero pude dar mi conferencia, y hasta me parece que a por lo menos una persona le ha gustado...

    Gustavo - http://www.gavd.net/servers/
    Escriba un Comentario que me haga reir...

    posted @ 6/26/2008 4:44 AM by Gustavo


    Twitter desde Silverlight Beta 2

    Fácilmente! Esa es la forma en la que podemos obtener desde Silverlight Beta 2 nuestro post en Twitter. Este nos provee de una forma de obtener en diferentes formatos, nuestros últimos post y más información.

    Con la siguiente URL: http://twitter.com/statuses/user_timeline/USERNAME.xml podemos obtener en formato XML los post y más información. Solo decir que debemos autenticarnos para poder recibir esta información.

    Twitter provee los siguientes formatos: RSS, XML y JSON

    Para más información sobre códigos de error posibles, limitaciones de uso, etc: Twitter API Documentation

    En el ejemplo de hoy vamos a consumir el último mensaje del usuario de este blog FernandoBlog.

    TwitterSL

    Para ello crearemos en primer lugar una aplicación Silverlight hospedada en un Sitio Web también creado en el mismo momento. De la forma en la que lo haremos, crearemos un servicio WCF que expondrá un método de obtención de los mensajes del usuario. En la siguiente imagen se puede ver las clases que necesitaremos para tal servicio:

    TwitterSL4

    • Service: Expone el contrato del servicio. En este caso dos métodos para obtener los mensajes del usuario identificado y otro para obtener los mensajes de un usuario a cuyos mensajes tenga acceso el usuario identificado.
    • TwitterHelper: Es la clase que realiza la petición HTTP al API de Twitter y donde se procesan los datos recibidos
    private List<TwitterPost> GetRequest(string uri)
    {
        WebRequest request = HttpWebRequest.Create(uri);
    
        if (!string.IsNullOrEmpty(_ttUser) && !string.IsNullOrEmpty(_ttPwd))
        {
            request.Credentials = new NetworkCredential(_ttUser, _ttPwd);
        }
    
        WebResponse res = request.GetResponse();
        StreamReader stream = new StreamReader(res.GetResponseStream());
        TextReader reader = new StringReader(stream.ReadToEnd());
    
        XDocument xDoc = XDocument.Load(reader);
    
        return (from post in xDoc.Descendants("statuses").Descendants("status")
               select new TwitterPost
               {
                   Id = post.Element("id").Value,
                   CreatedAt = DateTime.ParseExact(post.Element("created_at").Value, "ddd MMM dd HH:mm:ss zzzzz yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal),
                   Text = HttpUtility.HtmlDecode(post.Element("text").Value)
               }).ToList<TwitterPost>();
    }
    • TwitterPost: Representa un mensaje de twitter. El API devuelve mucha información que para este ejemplo solo con el Identificador, el texto del mensaje y la fecha de la creación del mismo nos es suficiente.

     

    En la parte de Silverlight simplemente añadiremos una referencia la servicio WCF creado y haremos una llamada al método correspondiente.

    public Page()
    {
        InitializeComponent();
        ServiceClient client = new ServiceClient();
        client.TwitterPostsCompleted += new EventHandler<TwitterPostsCompletedEventArgs>(client_TwitterPostsCompleted);
        client.TwitterPostsAsync();
    }
    
    private void client_TwitterPostsCompleted(object sender, TwitterPostsCompletedEventArgs e)
    {
        List<TwitterPost> twitter = e.Result;
        if (twitter.Count > 0)
        {
            TwitterPost lastTwitter = (from post in twitter orderby post.CreatedAt descending select post).First();
            txtPost.Text = lastTwitter.Text;
            txtTime.Text = RelativeCreatedAt(lastTwitter.CreatedAt);
        }
    }

    Como curiosidad se muestra la función utilizada para mostrar la fecha de creación del mensaje en relación al día en la que se obtiene el mensaje desde Silverlight:

    private string RelativeCreatedAt(DateTime _createAt)
    {
        TimeSpan _time = DateTime.Now.Subtract(_createAt);
    
        int _days = Convert.ToInt32(_time.TotalDays);
        if (_days > 0) return string.Format("Hace {0} dia{1}", _days, _days > 1 ? "s" : "");
    
        int _hours = Convert.ToInt32(_time.TotalHours);
        if (_hours > 0) return string.Format("Hace {0} hora{1}", _hours, _hours > 1 ? "s" : "");
    
        int _minutes = Convert.ToInt32(_time.TotalMinutes);
        if (_minutes > 0) return string.Format("Hace {0} minuto{1}", _minutes, _minutes > 1 ? "s" : "");
    
        int _seconds = Convert.ToInt32(_time.TotalSeconds);
        if (_seconds < 0) _seconds = 0;
        return string.Format("Hace {0} segundo{1}", _seconds, (_seconds > 1 || _seconds == 0) ? "s" : "");
    }

    Finalmente el resultado sería el siguiente.

    TwitterSL2

    posted @ 6/20/2008 4:26 AM by Fernando Cortés Hierro


    Cuantos elementos caben en una Lista de SharePoint?

    2000 según Microsoft. No, no es cierto, después de 2000 elementos la Lista empieza a tener problemas para mostrar los elementos en pantalla (http://www.gavd.net/servers/sharepointv3/spsv3_item.aspx?top=inf&itm=382 ). Así que en realidad cuantos elementos se pueden meter en una Lista antes de que SharePoint diga “hasta aquí voy yo” y deje de funcionar? De nuevo, según Microsoft, por los cinco millones...

    Pero una cosa es meter elementos en una Lista, y otra muy diferente poder hacer algo con ellos. Si después de una cierta cantidad es infinitamente demorado encontrar uno de los elementos, no tenemos nada con cinco millones...

    Problema: Una intranet de una empresa con más o menos 20.000 usuarios. Cada mes el sistema de administración (separado de SharePoint) suministra un archivo pdf (7 kb) con el extracto del salario de cada empleado (usuario) y uno de los requisitos de la Intranet es que los usuarios puedan ver sus extractos en la Intranet, y de una forma segura. Esto significa que cada mes habrá que meter por lo menos 20.000 archivos pdf en algún lado en el Portal... en una Librería, por supuesto, pues SharePoint es todo Listas y Librerías.

    Especulación: Usar una Librería por año? Un cuarto de millón de elementos en una Librería debería ser posible según Microsoft, pero cuanto se demora SharePoint en encontrar un archivo de un usuario de un determinado mes?

    Una Librería por mes? Si la Librería puede con cinco millones, tiene que poder con 20.000, pero la pregunta sigue: que tan rápido se puede encontrar un elemento?

    Una Librería por usuario (en MiSitio, por ejemplo), con solamente sus archivos? Y cuanto se demora el sistema en subir 20.000 archivos en 20.000 diferentes sitios?

    Pruebas: Como no existen estadísticas al respecto, lo mejor es probar a ver qué pasa. Primero crear una Librería e irle metiendo archivos hasta que reviente (o no), y al mismo tiempo ver cuánto tiempo cuesta encontrar un elemento random en ella. Algunos resultados:

     

    Número de Elementos en la Lista Tiempo para encontrar un Elemento (milisegundos)
    10 2,156
    100 2,170
    1.000 2,640
    10.000 6,420
    100.000 37,125

    La búsqueda se realizó “a lo bestia”, es decir recorriendo uno por uno de los elementos en busca de uno generado en forma random. Esto se hizo así para ver que tan ágil es el Modelo de Objetos para “loopear” (no muy ágil, por lo visto). Haciendo la búsqueda con una consulta CAML (la forma inteligente) los resultados varían de 2,203 milisegundos para encontrar un elemento entre 1.000 y 2,296 en una Librería con 100.000 elementos (eso está mucho mejor). Y si la columna de búsqueda en la Lista se indexa, cuesta 2,140 milisegundos en la Librería con 100.000 elementos.

    Nota separada No. 1: parece que siempre hay un “threshold” de 2 milisegundos, probablemente el tiempo necesario para hacer que el JIT se despierte, y para que toda la burocracia de DotNet empiece a funcionar.

    Nota separada No. 2: es interesante ver cómo crece la Base de Datos de contenido de SharePoint: con los 100.000 elementos (de 7 kb cada uno) creció en 797.076.928 bytes, lo que indica que hay un “desperdicio” de 10%... probablemente no desperdicio sino espacio para los meta-datos o algo así...

    Conclusión: Buscar a lo bestia es de lo mas bestia... no hacerlo. Buscar con consultas CAML funciona de maravilla, y no importa si hay que buscar en una Librería con 100 o con 100.000 elementos, el tiempo de búsqueda es igual. Y si se indexa la columna a buscar, mejor aún. Y hay una carga interna de 2 milisegundos de la que no nos libramos por nada del mundo...

    Y como se ha hecho el asunto: Un SharePoint Job ejecuta cada día al amanecer y escanea un directorio en busca de los archivos generados (solamente una vez al mes encontrara algo, pero eso no se lo vamos a contar para que no se vuelva perezoso). Cuando encuentra archivos, el Job crea una Librería y sube todos los archivos del mes de una sola vez, asegurando los derechos de cada archivo para que solamente el dueño tenga suficientes derechos para leerlo. Una WebPart revisa las Librerías de cada mes en busca de los archivos de salario del CurrentUser y muestra lo que encuentra. Solucionado. SharePoint contento, cliente contento, todos contentos...

    Nota: como subir 100.000 elementos a una Librería de SharePoint manualmente es bastante aburrido, se ha usado una herramienta gratis, el “BulkFiller”, que pueden encontrar en http://www.sharepartsshop.com (búsquelo en la sección de “Gratis”); subir 100.000 elementos a una Librería cuesta un par de minutos, increíble. Y para borrarlos, en el mismo sitio hay otra herramienta, el “BulkCleaner”, que hace lo mismo pero al revés, y aun mas rápido...

    Gustavo - http://www.gavd.net/servers/
    Escriba un Comentario que me haga reir...

    posted @ 6/19/2008 4:28 AM by Gustavo


    ASP.NET Development Server: Port Number Error

    El otro día conseguí resolver el problema que comenté en el post Internet-Explorer cannot display the webpage y cerré el post comprobando que cuando intento depurar un sitio web, el puerto en el que escucha ASP.NET Development Server luego no es el que intenta acceder el IE7.

    En la siguiente imagen se aprecia el ASP.NET Development Server levantado en el puerto

    Asp.netDevelopmentServer

    Y vemos como se lanza el IE7 intentando acceder al puerto

    Asp.netDevelopmentServer2

    Yo en el anterior post pensaba en un primer momento que podía deberse al antivirus que tengo ESET Nod3d Antivirus, pero finalmente no fue así. Sin embargo, esto si que huele a antivirus. Investigando un poco, encontré que se puede excluir el ASP.NET Development Server de ser monitorizado por el antivirus.

    Asp.netDevelopmentServer3

    Asp.netDevelopmentServer4

    Por tanto, desmarcando de la sección Web browsers y Active mode el ejecutable de ASP.NET Development Server, podremos por fin tener un comportamiento normal en nuestro entorno de desarrollo.

    posted @ 6/17/2008 3:08 PM by Fernando Cortés Hierro


    Silverlight Beta2: CrossDomain

    Hasta la salida de la Beta 2 de Silverlight, cuando queríamos con la Beta 1 realizar una llamada un Servicio Web o WCF sabíamos que debíamos de colorar los ficheros Crossdomain.xml o ClientAccessPolicy.xml en el raíz del Sitio Web donde estuviese el Servicio a consumir por Silverlight. Silverlight por defecto irá a buscar el fichero ClientAccessPolicy.xml y sino lo encuentra buscará el Crossdomain.xml

    Si hacemos pruebas desde Silverlight Beta2, nos encontraremos que aun teniendo estos ficheros, recibimos el siguiente error depurando:

    SLBeta2WS

    El formato del fichero ClientAccessPolicy.xml que teníamos hasta ahora con el que conseguíamos que funcionase era:

    <?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>

    Pero para esta versión necesitamos realizar un sutil cambio en el fichero:

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

    Ahora si que funciona nuestro Silverlight.

    posted @ 6/16/2008 6:56 AM by Fernando Cortés Hierro


    Internet Explorer cannot display the webpage

    Vamos por partes. Máquina con Windows Vista y Microsoft Visual Studio 2008 recién instalado. Creamos un nuevo sitio web y cuando queremos depurar, nos encontramos con esto:

    NoEncuentralocalhost

    ¿Qué será?....El problema esta en el puñetero IPv6, y ¿Cómo deshabilitar esto?

    Abrimos Regedit.exe y en HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\tcpip6\Parameters añadimos un DWORD de nombre DisabledComponents y asignamos el valor decimal 255.

    Después de reiniciar he conseguido que funcione, a pesar de que aunque el ASP.NET Development Server levanta un puerto, en el IE 7 intenta acceder a otro!!

    Otro día busco porqué!

    posted @ 6/16/2008 6:16 AM by Fernando Cortés Hierro


    Movimiento Circular: Senos y Cosenos

    ¿Como nos pueden ayudar los Senos y Cosenos en nuestras aplicaciones Silverlight o Windows Presentation Foundation?

    675px-Sin_Cos_Tan_Cot_unit_circle_svgnbsp;

    Imaginemos que tenemos una elipse y queremos que realice un movimiento circular. Utilizando las funciones trigonométricas Seno y Coseno de un ángulo dado podemos obtener el punto X e Y de la circunferencia imaginaria por donde queremos mover nuestra elipse.

    Un ejemplo sencillo y que tal vez no tenga mucho sentido, pero que se puede ver el concepto del que estamos hablando:

        public partial class Window1 : Window
        {
            DispatcherTimer _timer;
            double _angle = 0;
            public Window1()
            {
                InitializeComponent();
                this._timer = new DispatcherTimer();
                this._timer.Interval = new TimeSpan(10000000);
                this._timer.Tick += new EventHandler(this.timer_Completed);
                this._timer.Start();
            }
            private void timer_Completed(object sender, EventArgs e)
            {
                double newX = Math.Sin(_angle) * 10;
                double newY = Math.Cos(_angle) * 10;
                Canvas.SetTop(elli, newY) ;
                Canvas.SetLeft(elli, newX);
                _angle++;
                if (_angle > 360)
                    _angle = 0;
            }
        }

    posted @ 6/15/2008 1:18 AM by Fernando Cortés Hierro


    BizTalk: Noticias de Oslo

    Durante las sesiones de presentación de Bill Gates y Oliver Sharp en el TechEd se anunció que cuando termine el TechEd se hará pública la CTP (community technology preview) de parte de Oslo. Es una gran noticia para todos los que queremos empezar a juguetear un poco con lo que nos depara el futuro dentro de la división de sistemas conectados de Microsoft.

    http://geekswithblogs.net/bloesgen/archive/2008/06/04/122609.aspx

    Saludos.

    posted @ 6/14/2008 12:08 AM by Tomás Hernández


    BizTalk: Documento de integración de BTS06 R2 y WCF

    Como he podido conocer a través del Blog de Eduardo Adanza, se ha publicado un completo documento técnico sobre el soporte que da BizTalk Server 2006 R2 a WCF.

    http://www.microsoft.com/downloads/details.aspx?familyid=43A3C7C5-9482-4154-B236-C2CE28C61B6C&displaylang=en

    Saludos.

    posted @ 6/13/2008 8:21 PM by Tomás Hernández


    Nuevo Blog FernandoCortes.net

    Hola,

     Despues de un buen tiempo sin postear nada de nada, comenzaré de nuevo a escribir en este nuevo blog http://www.fernandocortes.net  al igual que en http://blogs.clearscreen.com/nandy donde compiaré los mismos post.

     Escribiré apartir de ahora sobre ASP.NET, Silverlight, algo de WPF, y bueno lo que me vaya surgiendo.

     Saludos.

    posted @ 6/12/2008 7:12 PM by Fernando Cortés Hierro


    La velocidad de SharePoint

    Por fin un par minutos de tranquilidad para poder hacer algo interesante con SharePoint, no el cotidiano tira-y-afloja con clientes que no saben que es lo que quieren, y que cuando les cuentas que es lo que quieren, empiezan a creer que son “conocedores” de SharePoint... yo solo conozco a dos personas que sean “conocedoras” de SharePoint, y ninguna de las dos es cliente mío...

    Perdón por irme por las ramas. Al tema: Velocity, el nuevo juguete de Microsoft. Jorge Serrano ya ha contado de que se trata (“Microsoft Project Code Named Velicity” http://geeks.ms/blogs/jorge/archive/2008/06/03/microsoft-project-code-named-velocity-ctp1.aspx e “Información general sobre el proyecto Velocity” http://geeks.ms/blogs/jorge/archive/2008/06/07/informaci-243-n-general-sobre-el-proyecto-velocity.aspx) así que no me pongo a repetir lo que ya el contó bien contado. El asunto se trata de cacheo, algo con lo que SharePoint siempre ha tenido una relación amor-odio, o, aun mejor dicho, una relación sado-masoquista.

    Cacheo de datos es estupendo en aplicaciones Web. Por la forma intrínseca de este tipo de aplicaciones, datos tienen que ser generados una y otra y otra vez, así que meterlos en un depósito temporal para no tener que hacer todo el proceso continuamente es una excelente idea. SharePoint es una aplicación Web, ergo, debe usar cacheo. Y en realidad lo hace: MOSS utiliza las técnicas de cacheo de datos que proporciona el ASP.NET 2.0 y le agrega un mecanismo más preciso (Profile Caching) para mejorar la granularidad (como se puede traducir "granularity" al cristiano?), permitiendo crear perfiles de cacheo diferentes que se puedan aplicar a colecciones de sitios o sitios individuales. Como nota curiosa, WSS no dispone del mecanismo de cacheo que tiene MOSS... y es por eso de la relación rara de que hablábamos anteriormente.

    En realidad, a SharePoint no le gusta usar cacheo. Inclusive en las versiones anteriores se podía activar por medio de un cambio en el web.config, pero era prácticamente prohibido hacerlo. Por una razón muy sencilla: SharePoint es un sistema creado para suministrar información a cientos de miles de usuarios, dándole información personalizada a cada uno de ellos (piense nada más que cada usuario puede modificar su propia interface) y si le vamos a dar cache a cada usuario, simplemente no existe batería de servidores con suficiente memoria RAM para mantener el cacheo; o habría que limitar el cacheo a un par de segundos, lo que tampoco tiene mucho sentido.

    Pero a SharePoint 2007 le pusieron todo el asunto de Content Management, con lo que ya SharePoint no solamente sirve para crear sitios de trabajo individuales e individualizados, sino también para crear sitios Web comunes y corrientes (Publishing Feature). Y como en sitios de este tipo la información cambia muy poco en el tiempo, y no cambia para nada para cada usuario, cacheo es simpatiquísimo. Así que SharePoint 2007 tiene cacheo, pero solamente para MOSS, pues WSS no tiene la Característica de Publicación, así que no se puede usar para crear sitios Web comunes y corrientes, y, ergo de nuevo, no queremos meterle cacheo...

    Como nota al lado, otra de las cosas simpáticas de cacheo en SharePoint es que en granjas de servidores se ve frecuentemente que la información presentada no es consecuente (o, por lo menos, eso es lo que mis queridos clientes siempre dicen); veamos: servidor A tiene en memoria pagina A por 60 segundos; la información de la pagina ha sido cambiada en el momento que el cache del servidor B ha expirado, así que ahora los dos servidores tienen información diferente; el usuario que acaba de ver la pagina desde el servidor A regresa a la pagina, pero esta vez es redirigido por el Load Balancing al servidor B: la información es diferente; vuelve a hacer un refresco de la pagina, y el Load Balancing lo manda al servidor A: regreso a la información antigua... estoy empezando a creer que al final mis pobres clientes hasta puede que tengan razón...

    Pero bueno, es el día de irse por las ramas... Velocity: sistema para distribuir el cacheo entre los diferentes servidores de la granja, evitando, de pasada, los problemas de los que hemos estado hablando... suena bien para metérselo a SharePoint... manos a la obra: bajar el software (2.5 MB, no está mal)... buscar una granja de prueba de SharePoint (dos front end, nada del otro mundo)... intentar instalar el software... empieza a instalar sin problemas... llegamos a la pantalla de configuración... error... cancelar el error y seguir adelante... error... volverlo a intentar... error... bueno, al fin y al cabo es software beta... y a SharePoint no le gusta ese asunto del cacheo... habra que esperar hasta la proxima version...

    Gustavo - http://www.gavd.net/servers/
    Escriba un Comentario que me haga reir...

    posted @ 6/12/2008 4:57 AM by Gustavo


    BizTalk: Recopilación de Bloggers de BizTalk

    Os podeis subscribir y tendreis todos los bloggers más importantes en un único feed.

    http://biztalkblogs.com/

    Saludos.

    posted @ 6/9/2008 6:45 PM by Tomás Hernández


    SharePoint AllWebs no hace lo que yo quiero... y si lo hace, lo hace mal

    Pregunta para los fanáticos de optimalización en programación: como leer todas las subWebs de un SPSite de SharePoint de la forma más rápida, efectiva y eficiente posible?

    Primero que todo el problema: para un portal (bastante) grande de SharePoint, en donde al final habrá algunos miles de subSites, es necesario crear una especie de “árbol” con la estructura. Usar un cacheo del árbol después de que se ha leído de arriba abajo mejora el rendimiento, por supuesto, pero primero hay que haber leído todos los sitios y sus subsitios y sus subsitios ad infinitum... La estructura es bastante dinámica, cambiando en (en el peor de los casos) dentro de minutos, así que el cacheo no se puede mantener por más de algunos minutos sin correr el riesgo de que el usuario pierda información.

    Lo primero es que hay que usar recursividad para poder entrar por todas partes, eso es seguro. Pero dentro del lazo de la recursión es necesario conseguir el SPWebCollection de alguna forma. En principio tenemos dos maneras: con “SPSite.AllWebs()” o con “SPSite.OpenWeb().GetSubwebsForCurrentUser()”. El primer método se descarta bastante rápido por problemas de seguridad: si el usuario que está creando el árbol no tiene derechos suficientes en una u otra SPWeb en el camino, recibirá simplemente un “Access Denied” sin más, y el asunto se detiene irremediablemente. Peor aún, el usuario tiene que tener derechos de “Full Control”, de otra forma SharePoint simplemente se niega a seguir adelante.

    Así que queda el segundo método. Para mi gran sorpresa, tampoco funciona en la forma deseada. Por una u otra razón, el método tampoco devuelve todas las subWebs directamente bajo la Web actual. Después de renegar, sudar, llorar y rogar, al final resulta que hay que usar el asunto por medio del “SPSite.RootWeb.GetSubwebsForCurrentUser()” y no por medio del “OpenWeb()”. Porque? Ni idea... según la fantastica información proporcionada por el SDK, la propiedad RootWeb “Gets the root Web site of the site collection” y el método “OpenWeb” “Returns the site that is associated with the URL that is used in an SPSite constructor”... más claro no canta una gallina... y según mi humilde entender, los dos hacen lo mismo, pero de diferente manera... lo de diferente manera es seguro, en cualquier caso...

    Pero el asunto va por otro lado. AllWebs y GetSubwebsForCurrentUser son simplemente asesinos del rendimiento, pues los dos no hacen más que un bucle de web en web para sacar la lista requerida. Cuando estamos hablando de unos cuantos de sitios, que hay que leer de vez en cuando, simplemente no importa como lo hacen. Cuando hay que leer miles de sitios con mucha frecuencia, los servidores de la granja simplemente se van a 100% de CPU, y el usuario se puede ir a tomar un café mientras la información aparece en pantalla.

    Por eso de que a veces quedan marcas en la memoria de cosas leídas hace un montón de tiempo, me he acordado de un documento de Steve Peschka (Microsoft) de hace más de un año: “Working with large lists in Office SharePoint Server 2007” (http://go.microsoft.com/fwlink/?LinkId=95450&clcid=0x409) que describe cómo usar la clase “PortalSiteMapProvider”. Esta es una clase de SharePoint que probablemente solo conoce el desarrollador que la hizo, y que fue creada originalmente para ayudar a cachear la navegación (según las palabras de Steve Peschka). La clase contiene un “PortalWebSiteMapNode” que a su vez contiene la propiedad “GetChildNodes” que nos entrega una colección de los subWebs que estamos buscando... perfecto... casi perfecto... hmmm... inservible... “PortalSiteMapProvider” es una clase de MOSS y yo lo necesito para WSS...

    Gustavo - http://www.gavd.net/servers/
    Escriba un Comentario que me haga reir...

    posted @ 6/4/2008 10:54 PM by Gustavo


    BizTalk Services y SharePoint

    Hace un par de semanas Microsoft ha liberado el “Microsoft BizTalk Services”. Según el boletín de prensa de Microsoft mismo, “...The new BizTalk Relay Services facilitate the traversal and bridging of physical networks, enabling high-fidelity interconnection between cooperating systems for cross-organizational messaging behind firewalls...” ... lo que en realidad son 26 palabras que no dicen nada...

    Veamos: BizTalk Services viene del “BizTalk Labs” (http://biztalk.net/) que es tres cosas: Identity Services para poder identificar quien es quien y arreglar otras cosas de identificación internamente (con AD, por ejemplo), Connectivity Services para manejar “mensajes” a lo largo de redes y el BizTalk Labs SDK para podernos enterar como ponerlo todo junto.

    Como dice el sitio del BizTalk Labs, esta es una pieza del “Bus de Servicios de Internet” (http://biztalk.net/Overview.aspx) que no es más que una manera para interconectar aplicaciones distribuidas... ya nos vamos entendiendo...

    BizTalk ha sido siempre el servidor “negociador” de Microsoft: si es necesario conectar un sistema cualquiera con otro sistema cualquiera, BizTalk es el pegante que los puede llevar a que conversen juntos, y, sobre todo, a que se entiendan. Personalmente, BizTalk es como el primer amor de juventud, del que siempre sigues enamorado, pero que desafortunadamente nunca funciono como debería. No es que no ame a SharePoint, ese el amor con el que vivo cotidianamente, sino que BizTalk siempre me ha gustado poderosamente sin que nunca haya tenido la oportunidad de hacer proyectos serios con él. Y ese el drama de BizTalk también: hasta ahora ha sido un servidor muy poderoso, pero también muy difícil de implementar y programar, que necesita recursos físicos demasiado grandes (12 Bases de Datos, si no me acuerdo mal, para una instalación por defecto), y que siempre ha sido demasiado costoso. Todo eso junto significa que mientras hay clientes haciendo fila para crear sistemas con SharePoint, BizTalk hay que metérselo por las narices a la fuerza a nuestros clientes para que lo acepten...

    A ver si BizTalk Services alivia los problemas. BizTalk Services (http://www.microsoft.com/biztalk/en/us/soa.aspx) nos permiten usar BizTalk sin tener que hacerle el hosting, sin tener problemas de uso en ambientes mezclados (intranet-extranet, problema que siempre se tiene con una instalación propia de BizTalk, la que cuesta infinita cantidad de problemas para hacerla pasar a través de FireWalls) y sin tenernos que preocupar por instalación, mantenimiento y todas esas cosas que nosotros, los pobres pica-código, no tenemos ganas ni paciencia para hacer (ni, la verdad sea dicha, los conocimientos técnicos para hacerlo bien hecho).

    Todo funciona por medio de SOA, es decir, por medio de WebServices. Un sistema en cualquier parte del mundo (o al lado de nuestro escritorio, qué más da) necesita datos de otro sistema en cualquier otra parte del mundo (o en el mismo servidor, da igual), los procesa y se los entrega a otro sistema, ustedes ya saben en donde... El problema es que cada uno de los sistemas espera/entrega los datos de una manera diferente... BizTalk es el “negociador” que convierte los datos de un sistema para que el otro los entienda, y luego recoge los datos procesados para “trasladarlos” en la forma que el siguiente proceso también pueda hacer algo con ellos, y el siguiente, y el siguiente. Y entre proceso y proceso se queda esperando pacientemente, manteniendo el estado de todas las transacciones, enviando mensajes si es necesario, preparando café y desayuno cada mañana, avisando a qué hora es la próxima cita con el dentista, etc... (Bueno, las dos últimas cosas pueden ser un poquito exageradas, pero ustedes ya entienden por donde va el agua al molino).

    Y todo esto es simplemente estupendo para SharePoint. Con los Flujos de Trabajo del WorkFlow Foundation y el Business Data Catalog se pueden hacer un montón de cosas bonitas, pero una de las limitaciones que SharePoint siempre ha tenido (aunque la situación ha mejorado notablemente con la versión 2007) es que es un servidor terriblemente egocéntrico: toda su información tiene que estar en sí mismo, y conectarlo con el mundo exterior nunca ha sido fácil. Con un sistema de BizTalk que no sea costoso ni difícil de utilizar se pueden mejorar radicalmente los rasgos autistas de SharePoint, y hacerlo comunicar con todo ese mundo de datos que existen fuere de él. Las posibilidades son múltiples: sistemas Back-Office con datos de cualquier tipo que se pueden presentar en el Portal, automatización de flujos de documentos e información (en lo que SharePoint es grande) proveniente del mundo externo, envío de datos contenidos en SharePoint a sistemas fuera de el, el cielo es el limite... de pronto el primer amor se junta con el amor cotidiano en un trío incestuoso...

    Gustavo - http://www.gavd.net/servers/
    Escriba un Comentario que me haga reir...

    posted @ 5/30/2008 8:21 AM by Gustavo


    BizTalk: Changing a VPC Computer Name with BizTalk

    Al hilo del anterior post, una de los problemas más repetidos cuando se trabaja con BizTalk, cómo cambiar el nombre de máquina:

    Solución:

    Export any information from the BizTalk databases (business rules etc.)
    Run ConfigFramework /u
    Delete BizTalk jobs in SQL Server Agent
    Delete BizTalk logons in SQL Server Security
    Delete BizTalk databases
    Change computer name
    Re-start computer
    Change SQL Server Name (with sp_dropserver, sp_addserver)
    Run ConfigFramework
    Change BizTalkMgmtDB connection in Visual Studio
    Change rules engine DB connection in Business Rules Policy Editor
    Re-enable BackupBizTalk server DBs job
    Add any Hosts and host instances using BizTalk Server Administration
    Import information to the BizTalk databases (business rules etc.)

    Workaround, para que las máquinas de desarrollo accedan a recursos externos como SourceSafe:

    No cambiar el nombre de máquina, usar Shared Networking (NAT) en la VM para que tu máquina host haga de gateway.

    Ahora hay dos posibilidades:

    - Crear un usuario local en la VM con las mismas credenciales que tu cuenta de dominio usada para autenticarse en los recursos externos

    - Si no quieres crear una cuenta local, lanza:

    net use \\<servername>\ipc$ /user:<your domain name>\<your user name>

     

    Saludos

    posted @ 5/29/2008 9:57 PM by Tomás Hernández


    BizTalk: BizTalk Server 2006 Virtual Multi-Box Install

    El señor Alan Smith ha publicado un post que me parece muy interesante, y como este blog aparte de ser un medio para comunicarme con el exterior sobre temas con los que suelo estar trabajando, es tambien mi memoria extendida, por eso posteo esta guía sobre como montar un laboratorio BizTalk multiserver.

    http://geekswithblogs.net/asmith/archive/2007/05/29/112820.aspx

     

    Introduction

    One of the great improvements in BizTalk Server 2006 was the ease of the installation and configuration of a developer machine install. Whilst single box installs are now relatively simple, there is still quite a challenge in installing BizTalk Server in a multi-server environment. This article will run through a basic multi server installation of BizTalk Server 2006 using Virtual PC to host the servers.

    It’s worth running through a multi server installation using Virtual PC before trying it with real hardware. Using undo disks across multiple virtual machines means you can roll back and try again if the configuration fails, which is a definite time saver. If you want to try this at home, you’ll need basic knowledge of BizTalk 2004 or 2006 single box installation, along with installing all the other server products that go with it. A basic knowledge of creating an Active Directory domain, and creating domain users and groups is good to have too.

    I have bullet pointed a few of the setup tasks, but as this is a BizTalk lab, not an Active Directory, IIS, or Windows Server lab, so you’ll have to forgive me for not detailing these too well (there’s plenty of documentation out there for these tasks anyway, right?).

    Simplified Install

    This lab will focus on the installation of the core BizTalk Server components:

    • Enterprise SSO
    • BizTalk Group
    • BizTalk Runtime
    • MSMQT
    • Business Rules Engine

    Software Used for this Lab

    For this lab, I used the software listed below.

    • Microsoft Virtual PC 2004 with SP1
    • Windows Server 2003 Standard Edition with SP1
    • SQL Server 2005 Developer Edition
    • BizTalk Server 2006 Developer Edition

    I found the best option was to download the ISO files for these from MSDN, which saves swapping CDs.

    Using Microsoft Virtual PC

    I used Microsoft Virtual PC to host the virtual machines for this setup, it works well, and it’s now free to use. Virtual Server or other products may also work fine.

    Cunning Use of Undo Disks

    If your first BizTalk multi-box install goes anything like my first attempt, you will be glad of the ability to create undo disks in Virtual PC. For the configuration stages, I usually set undo disks on all the VPC images, then run the configuration, and skip changes if anything went wrong. It’s much easier to run the configuration from a clean setup than to have to manually delete all the databases.

    Virtual Machine Settings, RAM and HD Requirements

    If you have a gig of ram, you should just be able to have three virtual machines running at the same time, provided you set the ram for each VM accordingly. I’ve found using two gigs of RAM gives much better results.

    Here’s a rough guide to how you should set the VM ram.

    If you have…

    Then…

    2 GB

    Use 512 MB for each virtual machine

    1 GB

    Use 256 MB for each virtual machine

    Less than 1 GB

    Buy more RAM

     

    I ran this lab with 2 gig ram, and used 512 for each VM. This meant the VMs were running pretty slowly, but it was fine for functionally testing the install.

    You’ll also need about 10 - 15 GB hard disk space for the virtual machines. I found that using an external USB2 hard drive gave me more performance than using the internal drive on my laptop.

    Local Only Networking

    As we are creating a domain for the BizTalk server group, it’s best to work with local only networking on all the VMs. This means it’s easy to set a static IP address for the domain controller VM, and have the other servers use it for DNS and DHCP.

    Multi-Box Install Overview

    In this lab, I went for the simplest option of a three server configuration, one for Active Directory, SQL Server, and SSO Master Secret Server, and two BizTalk boxes.

    ServerName

    Description

    ADSQL

    Active directory server hosting the BizTalk domain user accounts and groups, also hosts SQL server and the SSO Master Secret Server.

    BizTalk1

    First BizTalk Server to be installed, the Create Group configuration is run on this server.

    BizTalk2

    Second BizTalk server to be installed, the Join Group configuration is run here.

     

    I placed the SSO Master Secret Serve on the ADSQL Server, as the latest documentation is recommending that in small deployments (where you don’t have a separate cluster for the Master Secret Server), you can have it installed on the same cluster that is hosting the SQL Server.

    Creating a Base Image

    To save some time installing Windows Server three times, I created a base image that I could copy, SysPrep, and use for the other server installs. To create a base image:

    • Install Windows Server 2003 With SP1
    • Install Virtual Machine Additions

    We can now SysPrep this image to create our servers.

    Using SysPrep

    The SysPrep tool is used to rename the virtual machine, and ensure that all the security identifiers are replaced in the operating system. If we just rename the machine in the computer properties, we may well run into DTC problems when we attempt to create the BizTalk group using the BizTalk configuration wizard.

    The file sysprep.exe is located in the CAB file DEPLOY.CAB in the SUPPORT\TOOLS folder of the windows install disk.

    Run SysPrep on the base image to seal it:

    • Create a folder C:\Install\Sysprep on the VPC installation
    • Copy the contents of DEPLOY.CAB to C:\Install\Sysprep
    • Run sysprep.exe
    • In the main dialog box, click Reseal

    You can then create your servers for the multi-box install starting from this image. Note that you have to enter the key for Windows Server 2003 so keep it handy.

    I’ve also tried using the NewSid tool to rename VPCs, but this tends to cause problems with DTC when configuring the BizTalk Servers.

    Installing the AD/SQL Server

    The first server to install is the Active Directory and SQL Server. This will host the BizTalk domain user accounts and groups, and also the BizTalk Server databases. As this server would be a SQL Server cluster in the real world, the Enterprise Single Sign on Master Secret Server will also be hosted on this server.

    Create and Activate the VM

    • Make a copy of the base image hard disk file (VHD), rename it to ADSQL Hard Disk.vhd.
    • Create a Virtual Machine named ADSQL which uses this drive, set the RAM according to the RAM on your host machine.
    • Set the Networking property to Local Only
    • Start the Virtual Machine

    When the VM starts, it will enter Mini Setup, you will have to enter your key, set the password, and set the time zone. Accept all the other settings as default.

    Install Active Directory

    When the image starts, you are ready to install Active Directory. The following procedure will install Active Directory, DHCP, and DNS.

    • Set the VM to have a static IP address of 192.168.0.1 (Control panel, Network Connections, Local Area Connection, Properties, TCP/IP, Properties, Use 192.168.0.1 for the IP address, and the DNS server).
    • Run Manage Your Server, and click Add or Remove a Server Role
    • Select Typical configuration for a first server, and enter biztalk.local as the domain name
    • Accept all the defaults, selecting No, do not forward queries for the DNS page
    • When the install is almost complete, the VM will restart and finish the install

    Install SQL Server 2005

    Perform a basic installation of SQL Server 2005, selecting SQL Server Database Services and Workstation components, Books Online and Development tools. Use the Local System account as the Service Account, and select SQL Server Agent to start at the end of the setup. This will take a while, and you will be prompted to change discs half way through the process.

    Whilst the SQL Install is running, you can also:

    • Configure the domain users and groups
    • Create, activate, and install BizTalk1
    • Create, activate, and install BizTalk2

    The BizTalk configuration requires SQL Server to be running.

    Configure SQL Server for Remote Connections

    In order for the BizTalk servers to connect to SQL Server, remote connections need to be enabled.

    • Run SQL Server Surface Area Configuration
    • Select Surface Area Configuration for Services and Connections
    • On the Database Engine, enable local and remote connections for both protocols
    • Restart the database engine

    Creating the BizTalk Domain Users and Groups

    As we are working in a multi-box environment, we will need to create the active directory users and groups. We will also need to create memberships for some of the accounts in the relevant groups.

    Use the Active Directory Users and Computers tool for these tasks; it’s in Administrative Tools on the start menu.

    Create a BizTalk Organizational Unit

    To keep things tidy, we will place all the BizTalk users and groups in an ou (Organizational Unit).

    • Create a new Organizational Unit named biztalk to the biztalk.local domain.

    Create the Users

    The users are required for the various BizTalk services. I used the same password for all the users, and kept it in a txt file on the desktop so I could copy-paste it when I needed to. (Not good to do in production though). I also copy-pasted the user and group names, you can do this from this article.

    Create an organizational unit (ou) names biztalk, and the users and groups in this ou.

    For each user:

    • Paste the username into FirstName, and User logon name
    • Paste the password in both password boxes
    • Uncheck User must change password…, check User cannot change password, and Password never expires

    User

    Description

    SsoService

    Enterprise Single Sign-On service account

    BizTalkHost

    BizTalk Server host service account

    BizTalkIsoHost

    BizTalk Server isolated host account

    ReuService

    The Business Rules Engine update Service

     

    Create the Groups

    • Copy-paste the group names to create the following groups in the biztalk ou.
    • Add the relevant users to the groups.

    Group

    Members

    Description

    SSO Administrators

    Administrator

    SsoService

    Group for administrating SSO

    SSO Affiliate Administrators

     

    Group for administrating SSO

    BizTalk Server Administrators

    Administrator

    BizTalk administration users

    BizTalk Server Operators

     

    BizTalk operation users

    BizTalk Application Users

    BizTalkHost

    BizTalk in process host instances

    BizTalk Isolated Host Users

    BizTalkIsoHost

    BizTalk out of process host instances

     

    These groups will be used for the security configuration of the BizTalk Server databases.

     

    Configure DTC

    In order for BizTalk to run against the databases on a remote SQL server, you will need to configure the DTC options.

    • In the Add or Remove Programs section of the control panel, select Add/Remove Windows Components
    • Select Enable network COM+ access and Enable network DTC access
    • Restart the server

     

     

    Install and Configure Enterprise Single Sign-On Master Secret Server          

    The SSO Master Secret server will be installed on the ADSQL Server. In a production environment, the SQL Server would probably be hosted on a clustered server, it is also possible to host the Master Secret Server in the same cluster as the SQL Server hosting the BizTalk databases.

    • Run the BizTalk Server Installation
    • On the Installation options, select ESSO Administration module and ESSO Master Secret Server only
    • After the installation, launch Configuration, and select Custom Configuration
    • Configure the SSO Service to create a new SSO System
    • Use the SSO Service domain account (BIZTALK\SsoService)
    • Set the SSO groups to BIZTALK\SSO Administrators and BIZTALK\SSO Affiliate Administrators respectively
    • Set a password and reminder for the Master Secret backup
    • Apply the configuration
    • Use Event Viewer to verify the ENTSSO service has started successfully

     

    Install the First BizTalk Server

    • Make a copy of the base image hard disk file (VHD), rename it to BizTalk1 Hard Disk.vhd.
    • Create a Virtual Machine named BizTalk1 which uses this drive, set the RAM according to the RAM on your host machine.
    • Set the Networking property to Local Only
    • Start the Virtual Machine
    • Complete the mini-setup, using BIZTALK1 as the computer name

     

    Install BizTalk Server 2006

    As we are using local networking, we will need to download the BtsRedistXpEN32.cab file in order to install the BizTalk prerequisites. To save a bit of drive space I created a compressed folder named Install, and copied the Bts Install files and the CAB file into it.

    These are the options I selected:

    • Documentation
    • Server Runtime (without Base EDI Adapter)
    • Administration Tools
    • Additional Software / Business Rules Components

     

    Copy the Image to create BizTalk2

    We can now make a copy of BizTalk1 Hard Disk.vhd, and rename it to BizTalk2 Hard Disk.vhd, this will allow us to SysPrep this image to create BizTalk2.

    • Shut down BizTalk1
    • Make a copy of BizTalk1 Hard Disk.vhd
    • Rename the copy BizTalk2 Hard Disk.vhd

     

    Join the biztalk Domain

    Use My Computer – Properties – Computer Name to join the biztalk domain.

    Configure DTC

    In order for BizTalk to run against the databases on a remote SQL server, you will need to configure the DTC options.

    • In the Add or Remove Programs section of the control panel, select Add/Remove Windows Components
    • Select Enable network COM+ access and Enable network DTC access
    • Restart the server

    Creating the BizTalk Group

     

    Set Undo Disks

    Now it the time to use the undo disks, if things go bad, it’s great to be able to roll back to how things were before, and have another try.

    • Shut down VMSQL and BIZTALK1
    • Enable undo disks on both VMs
    • Start VMSQL
    • Start BIZTALK1
    • Logon to BizTalk1 as the BIZTALK domain administrator (BIZTALK\Administrator).

    Configure BizTalk1

    In order to access the domain accounts, you will need to logon to BizTalk1 as the BizTalk domain administrator (BIZTALK\Administrator).

    Run Configuration from the BizTalk 2006 menu, and select Custom configuration.

    Configure BizTalk as follows:

    Section

    Tasks

    Enterprise SSO

    Enable ESSO

    Join an existing SSO system

    Database Server Name – ADSQL

    Set the account name to BIZTALK\SsoService

    Enterprise SSO Secret Backup

    No changes

    Group

    Enable BizTalk Server Group on this computer

    Create a new BizTalk Group

    Database Server Name – ADSQL (3 databases)

    Set the group names to BIZTALK\BizTalk Server Administrators and BIZTALK\BizTalk Server Operators

    BizTalk Runtime

    Register BizTalk Server runtime components

    Create BizTalk In-Process Host and Host Instance

    Create BizTalk Isolated Host and Host Instance

    Set the account names to BIZTALK\BizTalkHost and BIZTALK\BizTalkIsoHost)

    Set the group names to BIZTALK\BizTalk Application Users and BIZTALK\BizTalk Isolated Host Users

    MSMQT

    No changes

    Business Rule Engine

    Enable Business Rules Engine on this computer

    Database Server Name – ADSQL

    Set the account name to BIZTALK\ReuService

     

    HWS Runtime

    No changes

    BAM Tools

    No changes

    BAM Alerts

    No changes

     

    Export Configuration

    BizTalk 2004 provided the option to save the configuration file after completing the Wizard. BizTalk 2006 allows you to export, and import configuration files, which means you can re-use your create group configuration settings for using when you join the group on the second server. Better still, you can leave the passwords out of the configuration, meaning configuration files can be distributed without them containing sensitive information. This allows an administrator to import the configuration, set the passwords, and then configure the server, ensuring that the users, groups, and database settings are consistent.

     

    Apply configuration

    Apply the configuration. This is the most likely point of failure in this lab (hence the undo disks). If things go bad, take a while to look at the problem, and check that you have completed the setup of the servers correctly.

    Checklist

    DTC Settings Enabled

    Verify Configuration

    Check the Application section of the Windows Event log, there should be lots of Information entries, and no errors or warnings relating to BizTalk or ESSO.

    Start the BizTalk Server administration console and verify the BizTalk Server host instance is started.

    Try stopping and starting the host instance.

    Configure the BizTalk2

    The second BizTalk server will be configured with the “Join Group” option.

    Activate the Image and Join the Domain

    • Create a Virtual Machine based on BizTalk2 Hard Disk.vhd, ensure that you have selected Local Only networking
    • Start the VM, and then run SysPrep.
    • Start the VM again, and complete the mini-setup, using BIZTALK2 as the computer name.
    • Join BizTalk2 to the BIZTALK domain
    • Restart BizTalk2, and log on as the BIZTALK domain administrator (BIZTALK\Administrator).

    Configure BizTalk2

    As you have already configured BizTalk1, and exported the configuration file, you can use this file for the basic settings of the BizTalk2 configuration. When you import this configuration file, you will need to set some of the options, and set the passwords for the accounts.

    • Ensure you are logged on as the BIZTALK domain administrator (BIZTALK\Administrator).
    • Copy the configuration file to BizTalk2
    • Start the BizTalk Configuration application
    • Import the configuration file
    • Use the “Join Group” option in the configuration section

    The configuration for BizTalk2 will run much faster than for BizTalk1, as the BizTalk databases have already been created on ADSQL.

    Troubleshooting

    Hopefully I’ve covered all the important points to get up and running with a multi-box install. But there are bound to be issues that people will hit. Some of the common ones are:

    • DTC Configuration Issues – Check the settings. Sometimes it may help configure the servers as application servers, (adds IIS and DTC functionality), as this seems to set the correct DTC settings.
    • SID Conflicts – If the virtual images are not sys-prepped, the SIDs can cause conflicts with the DTC configuration.
    • Security Issues – Make sure you are logged on as Domain Admin when you configure the BizTalk servers.
    • Databases Already Exist – If a configuration fails, you will need to delete the existing BizTalk databases before you run config again. I find it’s easiest to use undo disks, and skip changes if there’s an error.

    Testing the Installation

    Once you have the multi-server environment setup, there’s quite a few things you can test on it.

    • Creating a mult