Skip Ribbon Commands
Skip to main content

David Provencio

:

Home
Blog de David Provencio
December 09
¿Qué es la accesibilidad Web?

La accesibilidad Web consiste en ofrecer la información de una Web sin excluir a personas con deficiencias visuales, auditivas, motrices y/o cognitivas o que utilicen dispositivos con limitaciones de visualización o de velocidad.

Para promover la accesibilidad Web la W3C (World Wide Web Consortium) ha definido unas pautas para que los desarrolladores puedan mejorar fácilmente la accesibilidad de sus sitios.

La importancia de la accesibilidad Web

Realizar una Web accesible es una obligación social que debe tener presente el desarrollador Web. La accesibilidad Web permite hacer más asequible el acceso a la información a personas con discapacidad y sirve para mejorar el acceso desde dispositivos menos comunes como navegadores de voz, teléfonos móviles, navegadores de a bordo, etc. Existen una serie de pautas que el desarrollador puede seguir para conseguir una Web accesible a todos.

Los autores de las pautas sobre accesibilidad Web explican como la accesibilidad Web no es contraria al uso de imágenes, vídeo u otros contenidos, si no al contrario, mediante estás pautas los desarrolladores pueden fácilmente hacer accesibles estos contenidos.


Web Accesibility Initiative (WAI)

El Consorcio World Wide Web (W3C) desarrolla tecnologías inter-operativas (especificaciones, líneas maestras, software y herramientas) para guiar la Red a su potencialidad máxima a modo de foro de información, comercio, comunicación y conocimiento colectivo.

La WAI (Web Accessibility Initiative) es la iniciativa de la W3C para potenciar los contenidos Accesibles en la Web. Esta iniciativa comprende de una serie de pautas a seguir para realizar los contenidos accesibles y de unos niveles de prioridad que clasifican la accesibilidad de los contenidos en la Web.

Logo W3CLogo WAI

Logo de la WAI (Web Accessibility Initiative), inciativa del W3C.


Pautas de accesibilidad al contenido en la Web y Niveles de Prioridad

Las WCAG 1.0 (pautas de accesibilidad al contenido en la Web 1.0) son un conjunto de reglas desarrolladas por la W3C (World Wide Web Consortium) en su iniciativa sobre la accesibilidad Web que ayuda a los desarrolladores y a los editores de contenido a realizar una Web Accesible. Actualmente las WCAG 1.0 son la mejor guía de verificación de la accesibilidad Web.

Estas pautas se pueden encontrar en http://www.w3.org/TR/WCAG10/. Además, se dispone de una versión traducida al castellano en discapnet.es http://www.discapnet.es/web_accesible/wcag10/WAI-WEBCONTENT-19990505_es.html

Cada pauta contiene varios puntos de verificación que el desarrollador debe comprobar a la hora de crear contenidos Web para asegurar la accesibilidad. Estos puntos de verificación se clasifican en tres niveles de prioridad dependiendo de su importancia:

  • Prioridad 1: Son aquellos puntos que un desarrollador Web tiene que cumplir ya que, de otra manera, ciertos grupos de usuarios no podrían acceder a la información del sitio Web.
  • Prioridad 2: Son aquellos puntos que un desarrollador Web debería cumplir ya que, si no fuese así, sería muy difícil acceder a la información para ciertos grupos de usuarios.
  • Prioridad 3: Son aquellos puntos que un desarrollador Web debería cumplir ya que, de otra forma, algunos usuarios experimentarían ciertas dificultades para acceder a la información.

En el siguiente cuadro se ve el número de directrices de las WCAG 1.0 que existen en cada prioridad.

Tabla de pautas de Accesibilidad Web

La W3C-WAI establece además tres niveles de adecuación para permitir de manera sencilla clasificar los sitios Web en función de su accesibilidad.

  • El nivel de adecuación "A" (A), se aplica cuando el sitio cumple con los puntos de verificación de prioridad 1.
  • El nivel "Doble A" (AA), se aplica cuando el sitio cumple con los puntos de verificación de prioridad 1 y 2.
  • El nivel "Triple A" (AAA), se aplica cuando el sitio cumple con los puntos de verificación de prioridad 1, 2 y 3.

Si las páginas de su sitio Web siguen estas pautas de accesibilidad se pueden colocar unos logotipos que indican la conformidad de su página con el nivel de adecuación correspondiente.

Logo de Accesibilidad A Logo de Accesibilidad Doble-A Logo de Accesibilidad Triple-A

Estos logos permiten conocer fácilmente el nivel de accesibilidad de cada Web. Es responsabilidad del desarrollador el colocarlo si lo considera en su Web, ya que no es necesario solicitarlo al W3C ni este realiza ningún tipo de verificación al respecto. No obstante, la ubicación de estos logos en una Web conlleva gran responsabilidad del desarrollador de facilitar y mantener lo contenidos accesibles pero también conlleva muchas facilidades al usuario final aumentando incluso el número de posibles usuarios a nuestra Web.

 
January 12
Crear un Servicio de Windows con Visual Studio

Los Servicios de Windows tienen muchas utilidades, permiten entre otras cosas tener un proceso ejecutándose continuamente, por ejemplo y con la ventaja añadida de que ese servicio se puede quedar corriendo e incluso arrancarse al reiniciar la máquina.

Para crear un Servicio de Windows Nuevo > Proyecto y en los proyectos de Windows seleccionamos Servicio de Windows.

nuevo_proyecto

Una vez creado crearemos una clase para el servicio y otra para el instalador del servicio, como se ve en la siguiente estructura:

servicio

En la clase MiServicio introducimos el siguiente código:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.IO;

namespace WindowsService_MiServicio
{
    class MiServicio : ServiceBase
    {
        private const string NombreServicio = "Mi Servicio";
        private const string CategoriaLogViewer = "Mi Servicio Log";

        public MiServicio()
        {
            this.ServiceName = NombreServicio;
            this.EventLog.Source = NombreServicio;
            this.EventLog.Log = CategoriaLogViewer;

            if (!EventLog.SourceExists(NombreServicio))
                EventLog.CreateEventSource(NombreServicio, CategoriaLogViewer);
        }

        static void Main()
        {
            ServiceBase.Run(new MiServicio());
        }

        protected override void OnStart(string[] args)
        {
            EventLog.WriteEntry(NombreServicio, "Servicio ARRANCADO");
            //nuestro código
        }

       protected override void OnStop()
       {
           EventLog.WriteEntry(NombreServicio, "Servicio PARADO");
           //nuestro código
       }

    }
}

En los eventos OnStart y OnStop es donde podemos meter nuestro código que se ejecutará cuando se arranque y se pare el servicio respectivamente.

Además en el código se han añadido trazas que se mostrarán en el Visor de Eventos de Windows.

Si lo que deseamos es que nuestro Servicio de Windows se ejecute continuamente realizando una acción determinada lo que se debe hacer es crear un timer y en el evento tick meter el código que queremos ejecutar. En el siguiente código se muestra un ejemplo:

 


using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using System.IO; namespace WindowsService_MiServicio { class MiServicio : ServiceBase { private const string NombreServicio = "Mi Servicio"; private const string CategoriaLogViewer = "Mi Servicio Log"; public MiServicio() { this.ServiceName = NombreServicio; this.EventLog.Source = NombreServicio; this.EventLog.Log = CategoriaLogViewer; this.CanHandlePowerEvent = true; this.CanHandleSessionChangeEvent = true; this.CanPauseAndContinue = true; this.CanShutdown = true; this.CanStop = true; if (!EventLog.SourceExists(NombreServicio)) EventLog.CreateEventSource(NombreServicio, CategoriaLogViewer); double interval = 30 * 1000; //cada 30 segundos timer = new System.Timers.Timer(interval); timer.Elapsed += new System.Timers.ElapsedEventHandler(this.ServiceTimer_Tick); } static void Main() { ServiceBase.Run(new MiServicio()); } protected override void OnStart(string[] args) { EventLog.WriteEntry(NombreServicio, "Servicio ARRANCADO"); timer.AutoReset = true; timer.Enabled = true; timer.Start(); } protected override void OnStop() { EventLog.WriteEntry(NombreServicio, "Servicio PARADO"); timer.AutoReset = false; timer.Enabled = false; } protected override void OnPause() { EventLog.WriteEntry(NombreServicio, "Servicio PAUSADO"); this.timer.Stop(); } protected override void OnContinue() { EventLog.WriteEntry(NombreServicio, "Servicio CONTINUADO"); this.timer.Start(); } private void ServiceTimer_Tick(object sender, System.Timers.ElapsedEventArgs e) { this.timer.Stop(); //nuestro código EventLog.WriteEntry(NombreServicio, "Servicio TICK"); this.timer.Start(); } } }

Finalmente, la clase instalador es la siguiente:

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq;

using System.ServiceProcess;

namespace WindowsService_MiServicio
{
    [RunInstaller(true)]
    public class WindowsServiceInstaller : Installer
    {
        private const string NombreServicio = "Mi Servicio";

        public void MiServicio_Installer()
        {
            //para instalar poner el la ventana de comandos del visual studio
            //c:\>installutil /i c:\debug\WindowsService_MiServicio.exe

            //para desinstalar poner el la ventana de comandos del visual studio
            //c:\>installutil /u c:\debug\WindowsService_MiServicio.exe

            ServiceProcessInstaller serviceProcessInstaller = new ServiceProcessInstaller();
            ServiceInstaller serviceInstaller = new ServiceInstaller();

            serviceProcessInstaller.Account = ServiceAccount.LocalSystem;
            serviceProcessInstaller.Username = null;
            serviceProcessInstaller.Password = null;

            serviceInstaller.DisplayName = NombreServicio;
            //serviceInstaller.Description = string.Empty;
            serviceInstaller.StartType = ServiceStartMode.Automatic;
            serviceInstaller.ServiceName = NombreServicio;

            this.Installers.Add(serviceProcessInstaller);
            this.Installers.Add(serviceInstaller);
        }
    }
}
Para instalar el Servicio se debe ir a la ventana de comandos de
Visual Studio y ejecutar el siguiente comando, con la ruta del
servicios que hemos creado:
c:\>installutil /i c:\debug\WindowsService_MiServicio.exe

De manera similar, para desintarlarlo ejecutamos el comando con /u:

c:\>installutil /u c:\debug\WindowsService_MiServicio.exe

December 22
Problema al instalar Visual Studio 2008
Hace poco al instalar Visual Studio 2008 me salio un error bastante extraño en los primeros pasos de instalación que decía: "Visual studio web authoring component ó Componente de creación web de Microsoft Visual Studio".

Este problema es debido a que hemos instalado Office 2007 antes de haber instalado Visual Studio 2008. El problema es por uno de los componentes de Office 2007, el InfoPath MUI 2007.

Para desinstalarlo sin tener que desintalar el Office, h
ay que ir a Inicio > Ejecutar y ejecutar la siguente instrucción:
 

msiexec /x {30120000-0044-0C0A-0000-0000000FF1CE}

Con esto desinstalamos el componente y ya se puede instalar visual Studio 2008.

December 09
Resize de una máquina virtual de Virtual PC
En este caso de que se necesite más espacio libre en la máquina virtual seguir los siguientes pasos:

1. Descargar la aplicación VHD Resizer de http://vmtoolkit.com/files/default.aspx, es gratuita, sólo es necesario registrarse.

2. Indicar la máquina virtual a la que queremos aumentar el espacio, el nombre de la máquina virtual nueva ya aumentada, y el espacio final de disco duro que deseemos.



3. Abrir la nueva máquina virtual y expandir el disco duro existente. Para ello iremos a Administrador del servidor > Almacenamiento > Administración de discos, seleccionamos la unidad C: y con el botón derecho pinchamos expandir.



También es posible hacerlo desde la línea de comandos de DOS con el comando DISKPART.

C:\>DiskPart DISKPART> list volume
DISKPART> select volume c
DISKPART> extend
DISKPART> exit
November 14
Remix 2009

remix.jpg

Este es un resumen de las charlas más interesantes del Remix 2009 de Madrid.


La Web oficial es http://msdn.microsoft.com/es-es/remix.aspx desde donde se pueden descargar las presentaciones de cada charla.

 



Charla 1 De tecnología a realidad

Resumen oficial: Antes de comenzar las sesiones, veremos aplicaciones reales que posibilitan el momentum tecnológico en el que nos encontramos.

En ocasiones no aprovechamos las ventajas de .NET, de Expression o de Visual Studio porque las seguimos usando como hace 4 años. Telecinco y Playmusic.fm nos mostrarán cómo aprovecharlo al máximo


Resumen: Esta charla era un poco filosófica, sobre la evolución de .Net y tal, hablaron mucho de potenciar Silverlight y de mejorar los interfaces de usuario para que sean más espectaculares ya que hoy en día tenemos la tecnología para hacerlo.

Lo + interesante, anunciaron que ayer sacaron la Web de http://www.microsoft.com/web/default.aspx en donde la gente puede entrar con su usuario de Passport y descargar proyectos ya terminados, denominados Windows Web App Gallery.



Además también es posible descargar desde esta Web el Microsoft Web Platform Instaler, que tiene proyectos en .Net de Blogs, foros, wikis, etc.. incluso proyectos de código abierto en PHP que ahora corren en el nuevo IIS 7.0!!

http://www.microsoft.com/web/downloads/platform.aspx



También se anuncio WebSiteSpark

http://www.microsoft.com/web/WebsiteSpark/

Con el programa Microsoft WebsiteSpark, se ofrecen licencias gratuitas de diversas aplicaciones a los desarrolladores. Incluso para entornos de producción y poder vener sus propias aplicaciones.

Los desarrolladores y empresas que cumplan las condiciones podrán obtener licencias de Visual Studio 2008, Expression Studio, Windows Web Server, SQL Server y DotNetPanel durante tres años de forma gratuita. Con ellas podremos desarrollar aplicaciones con tecnologías como ASP.NET, Silverlight o PHP, entre otras.

Las condiciones para obtener esas licencias son desarrollar sitios o aplicaciones para otros clientes y tener menos de diez empleados en la empresa. Evidentemente, al pasar esos tres años deberemos adquirir las correspondientes licencias de las aplicaciones si queremos seguir usándolas.

Además, la inscribirse en la web se dará soporte técnico gratuito a los desarrolladores y diseñadores profesionales!!! Y se entrará en una red de contactos para fomentar el negocio.

 


Charla 2 Plataforma Windows Azure

Resumen oficial: La "nube" es una nueva plataforma para el desarrollo de aplicaciones, favorece la descentralización de servicios, el ahorro de costes, pago por uso, la escalabilidad de aplicaciones,… La plataforma Windows Azure nos permite aprovechar todas estas ventajas mediante el consumo de diferentes servicios como Hosting, Almacenamiento o Mensajería.

Resumen: Windows Azure http://www.microsoft.com/azure/services.mspx es una nueva plataforma de Microsoft para poner servicios o aplicaciones en la "nube". Esto de la nube quiere decir que TODO está en internet, desde el servidor (por medio de máquinas virtuales), las aplicaciones web´s, servicios, etc.… e incluso la base de datos. Se compone de 3 elementos principalmente.

  • Windows Azure

  • .Net Services

  • SQL Azure



La idea es que sólo se page por lo que se consume (almacenamiento, ancho de banda, etc.…) y todo se gestione de manera on-line sin necesidad de tener servidores físicos en la propia organización.


Charla 3 Sketch Flow, de concepto a producción

Resumen oficial: De la mano de Miguel, veremos una nueva funcionalidad de Expression Blend 3 para construir Bocetos/prototipos de una forma rápida y sencilla. Esta herramienta agiliza la discusión en cuanto a navegación, usabilidad y experiencia de usuario en nuestras aplicaciones.

Esta aplicación me parecio muy interesante, en este otro post lo explico con más detallehttp://dprovencio.blogspot.com/2009/10/sketch-flow.html


Charla 4 Windows 7 para desarrolladores

Resumen oficial: Además de dar un paseo por Windows 7 desde una perspectiva profesional (Direct Access, Búsqueda federada…), veremos cómo integrar aplicaciones en la experiencia Windows 7. El uso de la Taskbar mejorada para dar feedback al usuario de lo que ocurre en la aplicación ó cómo exponer funcionalidad para que el usuario la tenga accesible desde el Explorer son dos ejemplos de la funcionalidad que veremos en la sesión.



Aquí llego el plato fuerte!!, realmente a la gente de Microsoft se les veía con ganas de sacarlo al público, igual que el Vista era una patata metida en una caja muy bonita con Windows 7 se lo han currado mucho. Según dicen el sistema operativo arrancará en 20 segundos, además dicen que funcionará perfectamente en un notebook con un procesador a 1.6Ghz.

En Windows 7 le han dado mucha importancia al consumo de energía, consume 1/3 menos de energía que el vista, es posible ver que aplicaciones están consumiendo más energía en nuestro PC (con el comando cmd >powercfg -energy) y cerrarlas si queremos, esto es interesante en un portátil por ejemplo, en el que la batería no suele durar más de 2 horas.

Novedades destacadas en cuanto a funcionalidad:

· Direct Access, adiós a las vpn, este servicio estará integrado en el propio S.O.

· La barra de tareas a cambiado bastante, ahora las aplicaciones avisan desde la barra de tareas y no solo cuando se activan, si no por ejemplo cuando llega un mensaje del Messenger, se pueden colocar estos iconos, podemos ver previsualizaciones en ventana grande al pasar el cursor por encima, se ha añadido la JumpList y las chinchetas, para cargar la aplicación de música directamente con una canción o navegar directamente a una página concreta que no tiene por que ser la predeterminada.

· Silverligh 3 preinstalado, quieren potenciar mucho este tipo de aplicaciones.

· Librerías, esto es un concepto nuevo, se trata de agrupar las carpetas en librerías, para no tener que acordarnos en donde dejamos la carpeta de fotos o en donde tenemos la carpeta de la aplicación x.

· Búsquedas federadas, de esto sabe Antonio, ;), permite buscar desde el cuadro de diálogo de Windows en sitios muy dispares, de manera que parece que si estamos buscando una foto en nuestro PC y podremos obtener también resultados de Internet, del trabajo, de organizaciones externas, de flicker, facebook, etc.… (Siempre que cumpla con el nuevo estándar de OpenSearch)

· Device experiencia, ahora al instalar una impresora podemos personalizar el icono con el propio de la impresora y toda la pantalla de propiedades, para poder descargar los drivers directos de la impresora, resolución de problemas más personalizado, etc..

Por supuesto, todas las cosas nuevas de la barra de tareas, el device experience, y todos los temas de ahorro de energía los tendremos que programar a mano, para ello existe el "Training kit de Windows 7", el Windows SDK

Tour Windows 7: http://www.microsoft.com/windows/windows-7/features/tour.aspx


Charla 5 Silverlight 3: Tecnología para la experiencia de usuario

Resumen oficial: Con numerosos casos de éxito a nivel mundial, Silverlight se ha consolidado como tecnología puntera para el desarrollo de aplicaciones ricas en internet (RIA). Oscar nos ayudará a apreciar el valor real de Silverlight, no sólo para enriquecer el aspecto visual de las aplicaciones, sino entre otras para enriquecer su usabilidad.

Esta charla fue bastante penosa, un tío de Raona estuvo contando todas las aplicaciones que tienen en Silverlight y lo chulas que son, sólo dos de las ppt contaban las diferencias entre Silverlight 2 y 3, básicamente son nuevos controles para igualarse cada vez más a WPF (Windows Presentation Foundation), una novedad curiosa es la posibilidad de poder descargarse la aplicación en Silverlight para ejecutarla como una aplicación de escritorio.


Charla 6 Domina el Vídeo en Internet

Resumen oficial: Con la proliferación de portales de video en internet, el formato video ha pasado a ser un ciudadano de primer nivel en el tipo de contenido de internet.

Boris tiene una gran experiencia en el manejo de este formato, tanto a nivel de cliente como de servidor. Aprenderemos a trabajar con video, desde la exposición hasta el consumo en un portal.

Esta charla también fue un poco mala, hablaron de cómo codificar un vídeo para hacer streaming con Expression Encoder 3 y como publicarlo, ahora con la versión 3 de Expression Encoder nos crea una página HTML de prueba y todo, con un player muy chulo.

Además dijeron que la versión de Windows Media Services 2008 (la que usamos en canal mityc) va a ser la última, ya que a partir de ahora el servidor de streaming se va a integrar con el IIS (servidor web)


Charla 7 Aplicaciones Multitouch


Resumen oficial: WPF y Silverlight son tecnologías con las que podemos desarrollar aplicaciones Multitouch, ya sea para PC o para Surface…

El equipo de Plainconcepts es el más experimentado en este tipo de aplicaciones en nuestro mercado. Veremos el modelo de interacción natural tras este tipo de aplicaciones y algunos consejos para empezar a abordar este tipo de desarrollos.

En esta presentación explicaban las ventajas e inconvenientes entre aplicaciones Touch (de pantalla táctil) y aplicaciones Surface, y se explicaban también cosas a tener en cuenta a la hora de desarrollar, como por ejemplo el tamaño de los controles para que se puedan pulsar con el dedo y el evitar hacerle escribir al usuario en la medida de lo posible.

Básicamente, las diferencias es que las aplicaciones touch son monousuario y las de surface permiten gestionar hasta 52 contactos simultáneos y permiten reconocer objetos (siempre que lo programemos manualmente claro), se hizo una demo de desarrollo de surface con visual studio y Expression blend para diseñar la aplicación en XAML, que luego la cargaron en Surface. Existen ya muchos controles específicos para programar en Surface.

Demo Touch: http://www.microsoft.com/windows/windows-7/features/videos.aspx?vindex=11


Demo Surface: http://www.microsoft.com/surface/Pages/Experience/Videos.aspx

October 01
Sketch Flow
Adiós a los wireframes con Visio!!, ahora la aplicación Expression blend 3 (que se usa para diseño con Silverlight y WPF) se le ha añadido otra nueva llamada Sketch Flow http://expression.microsoft.com/en-us/cc507094.aspx, esta aplicación permite diseñar bocetos Web de manera sencilla como si fuese un diagrama.



Además, cada página se puede personalizar con dibujos, anotaciones, etc.. y arrastrar controles de prueba (que luego incluso si queremos pueden ser totalmente funcionales al programar).



Como vemos, los diseños son como hechos a mano, esto es para que el cliente se fije más en la colocación y en la funcionalidad que en los colores. Aunque también los podemos hacer con apariencia totalmente real. Incluso permite crear automáticamente datos de prueba, como nombres, direcciones, teléfonos, emails, etc.., para que no todo sea “lorem ipsum…”.

Lo mejor de Sketch Flow:

· Es posible importar un psd de photoshop para tener cada campo como elementos para colocar en la página.

· Es posible exportar el wireframe a un documento Word con comentarios automáticos o crear una aplicación Silverlight que se puede navegar si lo configuramos así.

· Permite que el cliente de feedback sobre los propios wireframes y graba todo a modo de histórico.
September 14
Buscador de vídeos de YouTube con .Net

Todos conocemos el buscador de vídeos YouTube. En este artículo vamos a ver cómo se pueden añadir vídeos a nuestra Web en .Net de manera más personalizada.

La forma natural de insertar vídeos en nuestra página es copiando y pegando el object de HTML que nos proporciona YouTube al visualizar el vídeo.

<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/CZrr7AZ9nCY&hl=es&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/CZrr7AZ9nCY&hl=es&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>
 

En YouTube cada vídeo tiene un identificador, por ejemplo para el vídeo http://www.youtube.com/watch?v=CZrr7AZ9nCY, el identificador es CZrr7AZ9nCY, si vemos el código anterior lo que diferencia un vídeo de otro es este identificador.

Una manera fácil de mostrar un vídeo en una página sería escribir el object en el html en función de este identificador. Para ello podemos utilizar el siguiente método:

private string mostrarVideoYoutTube(string id)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            sb.Append(@"<object width='320' height='240'> ");
            sb.Append(@"<param name='movie' value='http://www.youtube.com/v/" + id + "'></param> ");
            sb.Append(@"<param name='allowFullScreen' value='true'></param> ");
            sb.Append(@"<param name='allowscriptaccess' value='always'></param> ");
            sb.Append(@"<embed src='http://www.youtube.com/v/" + id + "' ");
            sb.Append(@"type='application/x-shockwave-flash' allowscriptaccess='always' ");
            sb.Append(@"allowfullscreen='true' width='320' height='240'> ");
            sb.Append(@"</embed></object>");
            return sb.ToString();
        }

Para usarlo lo podemos pintar en un literal:

ltlVideo.Text = mostrarVideoYoutTube("CZrr7AZ9nCY");

¿Pero qué pasa cuando no sabemos el identificador del vídeo?. En el caso de que no sepamos el identificador del vídeo lo que podemos hacer es buscarlo, una manera puede ser preguntándoselo a YouTube y leyendo el HTML de respuesta. Por ejemplo para el vídeo anterior preguntaríamos a YouTube lo siguiente:

http://www.youtube.com/results?search_query=Microsoft+Surface+Parody

Por tanto, podemos preguntar a YouTube por un vídeo y leer el HTML resultante, como se muestra a continuación.

Uri url = new Uri("http://www.youtube.com/results?search_query=Microsoft+Surface+Parody);
string html = getHTML(url);

El método getHTML es el siguiente:

using System.Net;
public static string getHTML(Uri url)
{
WebClient wc = new WebClient();
return wc.DownloadString(url);
}

De esta forma incluso podemos desarrollar un buscador que busque vídeos. Aunque hay que aclarar que hay algunos vídeos que no se verán debido a que la opción de insertar en un sitio Web no está disponible en YouTube para ese vídeo.

Si queremos mostrar un buscador de vídeos en nuestra página y que se vean todos los vídeos, lo mejor es recurrir al API de google. En él encontraremos varios wizards, uno de ellos es el Video Search Wizard que nos ayudará a crear nuestro buscador de vídeos.

http://www.google.com/uds/solutions/wizards/videosearch.html

La consulta inicial de los vídeos a mostrar se puede modificar en el script que nos proporciona el Wizard con el parámetro Query, dentro de la función LoadVideoSearchControl.

function LoadVideoSearchControl() {
                            var options = {
                                twoRowMode: true
                            };
                            var videoSearch = new GSvideoSearchControl(
                              document.getElementById("videoControl"),
                              [{ query: “Shakira”}], null, null, options);
                        }

Es posible personalizar está consulta inicial, podemos llamar a esta función de javascript en el evento onload de la página y pasar la consulta por parámetro con .Net. Para ello añadiríamos el parámetro de consulta a la función y la ejecutaríamos en el evento Page_Load:

function LoadVideoSearchControl(consulta) {
                            var options = {
                                twoRowMode: true
                            };
                            var videoSearch = new GSvideoSearchControl(
                              document.getElementById("videoControl"),
                              [{ query: consulta}], null, null, options);
                        }

El método Page_Load sería:

protected void Page_Load(object sender, EventArgs e)
{
            if (Request.QueryString["q"] != null)
            {
                bodyvideos.Attributes.Add("onload", "LoadVideoSearchControl('" + Request.QueryString["q"].ToString() + "')");
            }
            else
            {
                bodyvideos.Attributes.Add("onload", "LoadVideoSearchControl('videoclips')");
            }
}

Como vemos, lo que hemos hecho es lanzarla en el método onload del body de la página pasando por parámetro la consulta de vídeos que queramos.

August 18
Obteniendo datos programáticamente de MOSS (parte 2 de 2)

Obteniendo datos de listas

Como se vio en la primera parte del artículo, MOSS 2007 permite crear sitios Web fácilmente mediante la generación de páginas y listas. En el anterior artículo vimos como consultar páginas programáticamente y mostrarlas en pantalla, en este veremos cómo consultar listas y como mostrarlas.

Las listas en MOSS se utilizan para guardar datos, de modo similar a las tablas de una base de datos. Estos datos pueden ser manejados desde las propias listas o se pueden mostrar en páginas mediante Web Parts o con controles de usuario y programación.

El siguiente código obtiene los datos de una lista en un DataTable desde el evento Page_Load de nuestro control de usuario o WebPart.

using Microsoft.SharePoint;
using Microsoft.SharePoint.Publishing;
protected void Page_Load(object sender, EventArgs e)
{
   DataTable dt = new DataTable("Lista");
   System.Text.StringBuilder caml = new System.Text.StringBuilder();
   caml.Append("<orderby><fieldref name="Title"></orderby>");          
   string viewFields = @"<fieldref name="Title"><fieldref name="URL"><fieldref name="Descripcion">";
   dt = Listas.ObtenerElementosLista(“http://MiSitio/Subsitio1", “Lista1”, CamlQuery, viewFields, 100, false, string.Empty);
}

En este ejemplo se obtienen los campos Title, URL y Decripcion de una lista llamada Lista1 situada en el sitio http://MiSitio/Subsitio1. Los datos se ordenan y se filtran mediante una consulta CAML. Igual que se vio en el anterior artículo se pueden construir fácilmente consultas CAML con el U2U CAML Query Builder.

El código del método ObtenerElementosLista es el siguiente:

/// <summary>
/// Obtiene un datatable con los datos de la lista especificada como parametro
/// </summary>
/// <param name="oSPWeb">Objetos SPWeb con la web</param>
/// <param name="nombreLista">Nombre de la lista</param>
/// <param name="camlQueryXML">Consulta caml para filtrar los elementos de la lista</param>
/// <param name="viewFieldsXML">String en formato XML con los campos que queremos recuperar</param>
/// <param name="nroRegistros">Limitar el número de registros a obtener</param>
/// <param name="bRecorrerSubcarpetas">Índica si se deben recorrer las subcarpetas</param>
/// <returns>Datatable con el contenido de la lista</returns>
public static DataTable ObtenerElementosLista(SPWeb oSPWeb, string nombreLista, string camlQueryXML, string viewFieldsXML, UInt32? nroRegistros, bool bRecorrerSubcarpetas, string vista)
{
   try
   {
      DataTable dt = new DataTable();
      //Obtención de la lista
      using (SPSite oSPSite = new SPSite(nombreWeb))
      {
         using (SPWeb oSPWeb = oSPSite.OpenWeb())
         {

            DataTable dt = new DataTable();
            SPList lista = oSPWeb.Lists[nombreLista];
            if ((camlQueryXML == null) &amp;&amp; (viewFieldsXML == null))
            {
                dt = lista.Items.GetDataTable();
            }
            else
            {
                #region query
                SPQuery query = new SPQuery();
                query.DatesInUtc = false;
                query.Query = camlQueryXML;
                query.ExpandUserField = false;
                // Se indican los campos a seleccionar
                if (viewFieldsXML != null)
                {
                    query.ViewFields = viewFieldsXML;
                }
                // Se indica si se limíta el número de registros a obtener
                if (nroRegistros != null)
                {
                    query.RowLimit = UInt32.Parse(nroRegistros.ToString()); // asignamos el nro de registros a obtener como máximo
                }
                // Se indica si hay que recorrer las subcarpetas de la lista
                if (bRecorrerSubcarpetas)
                {
                    query.ViewAttributes = "Scope=\"RecursiveAll\"";
                }
                #endregion
                SPListItemCollection listaFiltrada;
                if (vista == string.Empty)
                {
                    listaFiltrada = lista.GetItems(query);
                }
                Else
                {
                    listaFiltrada = lista.GetItems(query,vista);
                }
                dt = listaFiltrada.GetDataTable();
            }
         }//Se realiza el dispose de SPWeb
      } //Se realiza el dispose de SPSite
      return dt;
   }
   catch (Exception ex)
   {
      //registramos el error
      throw;
   }
}

 
July 17
Obteniendo datos programáticamente de MOSS (parte 1 de 2)
MOSS 2007 permite construir fácilmente todo tipo de sitios Web, desde portales colaborativos tipo intranet a portales Web, Wikis, Blogs, etc. Básicamente, su funcionamiento se basa en una o varias aplicaciones Web, que se pueden crear desde la Administración central que proporciona MOSS, y que se localizan en el IIS.

Todo el contenido de estos sitios Web se guarda automáticamente en base de datos SQL Server. Existe un API que nos proporciona el producto para poder acceder programáticamente desde .Net a todo el contenido, además de una serie de servicios Web que nos brinda acceder al contenido de los portales de MOSS de forma remota.



Independientemente del tipo de sitio que creemos en MOSS (Intranet, Wiki, blog, etc.) la estructura es siempre la misma. Esto es, una serie de sitios con subsitios y que a su vez se componen de una serie de páginas y listas que contienen información. Las listas permiten mostrar información al estilo de tablas de datos, existiendo todo tipo de listas, desde listas genéricas (GenericList), listas para documentos (DocumentLibrary), listas para imágenes (PictureLibrary), etc.


 
En este artículo vamos a ver como acceder programáticamente desde .Net a páginas y listas contenidas en sitios Web creados en MOSS 2007.

Obteniendo datos de páginas

Imaginemos que nuestro sitio Web tiene por ejemplo un subsitio de novedades, en donde se muestrá un listado de novedades. En MOSS esto se traducirá en una galería de páginas con uná página de listado y una serie de páginas que serían el detalle de cada novedad concreta.

Para obtener esta lista de páginas de novedades y poder mostrarla al usuario podemos crear un WebPart o un control de usuario que obtenga esta información.

El siguiente código obtiene los datos de páginas devolviendo un DataTable desde el evento Page_Load de nuestro control de usuario o WebPart.


using Microsoft.SharePoint;
using Microsoft.SharePoint.Publishing;

protected void Page_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable("Paginas");
System.Text.StringBuilder caml = new System.Text.StringBuilder();
caml.Append("");
caml.Append("");
caml.Append("DetalleNovedad"); //Tipo de contenido DetalleNotaPensa
caml.Append("1"); //Páginas aprobadas
caml.Append("");
dt = Paginas.ObtenerDatosDePaginas(“http://MiSitio/Novedades", "Contenido,LinkFilename,Created,URLNovedad,Title", null, caml.ToString());
}
La obtención de los datos se realiza mediante una consulta CAML, en este caso la consulta obtiene las páginas con el tipo de contenido de “DetalleNovedad” y que estén publicadas.

<Where><And>
<Eq><FieldRef Name=\"ContentType\" /><Value Type=\"Text\">DetalleNovedad</Value></Eq>");  //Tipo de contenido DetalleNotaPensa<Eq><FieldRef Name=\"_Level\" /><Value Type=\"Integer\">1</Value></Eq> //Sólo páginas aprobadas
 <And></Where>

Para construir consultas CAML se pueden utilizar diversos programas, como por ejemplo el U2U Query Builder.



El método que obtiene los datos de MOSS mediante la consulta CAML es el siguiente:
        public static DataTable ObtenerDatosDePaginas (string nombreWeb, string camposDeContenido, int? NumeroDeRegistrosAObtener, string camlQueryXML)

{
using (SPSite oSPSite = new SPSite(nombreWeb))
{
using (SPWeb oSPWeb = oSPSite.OpenWeb())
{
return ObtenerDatosDePaginas (oSPWeb, camposDeContenido, NumeroDeRegistrosAObtener, camlQueryXML);
} //Se realiza el dispose de SPWeb
} //Se realiza el dispose de SPSite
}


Prívate DataTable ObtenerDatosDePaginas (SPWeb oSPWeb, string camposDeContenido, int? NumeroDeRegistrosAObtener, string camlQueryXML)
{
try
{
DataTable dtPaginas = new DataTable("Paginas");
//Obtenemos la lista de páginas

if (PublishingWeb.IsPublishingWeb(oSPWeb))
{
PublishingWeb publishingWeb = PublishingWeb.GetPublishingWeb(oSPWeb);
if (camlQueryXML == string.Empty)
{
//pages = publishingWeb.GetPublishingPages();
SPList pagesList = oSPWeb.Lists[PublishingWeb.GetPagesListId(oSPWeb)];
dtPaginas = pagesList.Items.GetDataTable();
}
else
{
SPQuery query = new SPQuery();
if ((NumeroDeRegistrosAObtener != -1) && (NumeroDeRegistrosAObtener != null))
{
query.RowLimit = UInt32.Parse(NumeroDeRegistrosAObtener.ToString());
}
if (camposDeContenido != string.Empty)
{
}
query.DatesInUtc = false;
query.Query = camlQueryXML;

//pages = publishingWeb.GetPublishingPages(query);
SPList pagesList = oSPWeb.Lists[PublishingWeb.GetPagesListId(oSPWeb)];
SPListItemCollection items = pagesList.GetItems(query);
dtPaginas = items.GetDataTable();
}
}

return dtPaginas;
}
catch (Exception ex)
{
//Registramos el error
throw;
}
}
Es importante resaltar que la instanciación de los objetos SPSite y SPWeb se realiza mediante using, de esta manera se asegura la liberación de memoria al salir del using.
 
June 30
Despliegue rápido de código en MOSS
Una manera rápida de desplegar código en MOSS es agregando en el proyecto un fichero .bat que copie los ficheros que deseemos cuando la compilación es correcta.

De esta forma, cada vez que compilemos el proyecto, este fichero substituirá las dll´s y los ficheros .ascx que tengamos en el directorio virtual de MOSS en el que estemos trabajando.

El fichero para este ejemplo se llama despliegue.bat. Debe encontrarse dentro del proyecto de Visual Studio. Para llamarlo sólo hay que poner estas líneas en la pestaña de “eventos de compilación” dentro de las propiedades del proyecto.

cd "$(ProjectDir)"
"$(ProjectDir)despliegue.bat"

 



El contenido del fichero .bat es el siguiente:

copy /Y controls\*.ascx C:\Inetpub\wwwroot\wss\VirtualDirectories\30000\_controls
copy /Y bin\*.* C:\Inetpub\wwwroot\wss\VirtualDirectories\30000\bin


En este caso, nuestra aplicación Web de MOSS está en el puerto 30000.

De esta manera cada vez que compilemos estaremos actualizando automáticamente nuestro código en MOSS.

1 - 10Next
 

 About this blog

 
About this blog
Welcome to SharePoint Blogs. Use this space to provide a brief message about this blog or blog authors. To edit this content, select "Edit Page" from the "Site Actions" menu.