miércoles, 2 de abril de 2008

IV Jornadas Astronómicas de Almería

Del 18 al 26 de Junio se celebrarán las IV Jornadas Astronómicas del Almería. Todas las conferencias se realizarán en el Teatro Apolo a las 20:30, exceptuando la del día 25, que tendrá lugar en el Auditorio Maestro Padilla a las 21:00.

El programa es el siguiente:

Día 18:
Joao Alves. Astrofísico y Director del Observatorio Astronómico de Calar Alto.

Día 19:

Día 20:

Día 21:
Visita guiada al Observatorio Astronómico de Calar Alto a las 10:00.
Para apuntarse llamar al teléfono 607799634

Observación astronómica nocturna con la Asociación Astronómica Almeriense ORION a las 23:00.

Día 25:
Harrison Schmitt. Geologo de la NASA y Astronauta del Apolo XVII.

Día 26:
John Beckman. Profesor de investigación del Instituto de Astrofísica de Canarias (CSIC).

Espero que os resulte de interés. El año pasado tuve la oportunidad de ir y he de decir que fueron realmente interesantes. Este año me parece una gran oportunidad poder escuchar a John C. Mather, que seguro nos hablará de su Premio Nobel de Física 2006, compartido con George F. Smoot, otorgado por el descubrimiento de la forma de cuerpo negro y la anisotropía de la radiación cósmica de fondo, el cual tiene mucho que ver con el Big Bang y el origen del Universo, un tema que siempre ha despertado mi interés.

martes, 18 de septiembre de 2007

Radio Wave Cooling

Investigadores del National Institute of Standards and Technology descubren una nueva manera de enfriar objetos mediante radiofrecuencia.

Experimentos previos habían conseguido enfriar objetos a menores temperaturas mediante técnicas de laser, pero esta nueva técnica es capaz de enfriar mayores cantidades de átomos y mediante el control de la frecuencia ajustarla y alcanzar una temperatura cercana al cero absoluto. Es mucho más práctica que la utilizada mediante laser, ya que el equipamiento es más pequeño, fácil de fabricar e integrar.

En el experimento en cuestión consiguieron enfriar una placa de silicio de 200 x 14 x 1500 micrométros a una temperatura de -379 Fahrenheit, solo 46 por encima del cero absoluto. El movimiento de la placa de silicio es reducido por la fuerza creada entre dos placas cargadas eléctricamente, siendo una de ellas la propia de silicio, almacenando energía como si fueran condensadores En ausencia de movimiento la energía es estable, pero en este caso, es modulada por las vibraciones de la placa de silicio. La energía almacenada tarda un tiempo en cambiar en respuesta al movimiento de la placa de silicio, pero es este retraso el que fuerza a la placa levemente a perder su sincronía, reduciendo su movimiento, con la consiguiente reducción de temperatura.

Si estos experimentos resultan exitosos y se consiguen controlar las frecuencias y aumentar el tamaño de los objetos a enfriar, esta podría ser una técnica revolucionaria para la refrigeración de componentes electrónicos, permitiendo alcanzar una potencia y rendimiento asombroso en procesadores y demás componentes.


The Inquirer
National Institute of Standards and Techonology

Nota: He intentado hacer una traducción lo mas fiel posible al texto del NIST, siempre dentro de mis capacidades de entendimiento de la lengua de Shakespeare.

miércoles, 30 de mayo de 2007

Llegan las Interfaces Naturales

Pues sí, parece ser que alguien de Microsoft ha leido en mi blog la entrada que puse hace ya tiempo sobre Interfaces Naturales (que mas quisiera yo) y han decidido usar la tecnología de Jeff Han para implementar lo que ellos llaman Microsoft Surface, e incluso han ido un poco más allá dándole integración con otros dispositivos tales como cámaras digitales, PDAs, móviles, reproductores de MP3...

Microsoft Surface es una suerte de mesa cuya superficie esta formada por una pantalla multitáctil, lo que nos permite una interacción natural en el manejo del software que se esté utilizando. Tareas tales como visualizar fotos, consultar un mapa, reservar entradas, etc se convierten en algo sencillo e incluso divertido. En el video promocional incluso la usan como muestrario en una tienda, para ver las características de los productos que se depositen sobre ella e incluso comprarlos directametne depositando nuestra tarjeta de credito sobre la mesa.

La comunicación con el resto de dispositivos se realiza mediante conexión Wireless 802.11 b/g y Bluetooth 2.0.

Actualmente ya puede encontrarse en el Sheraton New York Hotel & Towers disponible para el público.

En la página web de Microsoft Surface podeis encontrar videos, imágenes y demás información al respecto.

Espero que este sea el inicio de una serie de cambios en lo que respecta a la interacción con el software que usamos.

viernes, 18 de mayo de 2007

Crear nuevo Ribbon en Word 2007

Hay distintas maneras de crear una nueva cinta de opciones o Ribbon en Word 2007 u otro programa de la suite ofimática. Seguramente al buscar información habrá numerosas referencias a Visual Studio 2005. Aquí lo haremos de otra manera, sin necesidad de utilizar Visual Studio.

Lo primero que deberemos hacer es crear un documento de Word con macros habilitadas en el cual queremos que aparezca nuestra cinta de opciones. Después de crearlo cambiamos la extensión del mismo a ZIP (MiDocumento.docm -> MiDocumento.zip) y lo descomprimimos en una carpeta. La carpeta debería contener la siguiente estructura:
  • _rels
    • .rels
  • docProps
    • app.xml
    • core.xml
  • word
    • _rels
      • document.xml.rels
    • theme
      • theme1.xml
    • document.xml
    • frontTable.xml
    • settings.xml
    • styles.xml
    • vbaProyect.bin
    • webSettings.xml
  • [Content_Types].xml
Abrimos el archivo .rels de la carpeta _rels con Notepad para editarlo. El archivo debería contener lo siguiente:

Le añadimos una última etiqueta relationship (texto marcado en rojo), de tal manera que se quedaría así:

Ahora añadimos una nueva carpeta llamada customUI que estará al mismo nivel que las carpetas _rels, docprops y word. Dentro de esta carpeta creamos un nuevo archivo XML con nuestra configuración de cinta de opciones. A continuación expongo un ejemplo:

Esto creará una nueva cinta llamada Mi Ribbon y en ella creará un nuevo grupo de opciones llamado Mis opciones con un botón que ejecuta una macro del documento. Aquí un ejemplo de cómo quedaría la cinta de opciones que se indica más arriba.

Los atributos de un botón son:
  • id: Identificador del botón.
  • label: Etiqueta que mostrará el botón.
  • imageMso: Imagen que mostrará el botón perteneciente a la galería de Office (más abajo indico un link con información sobre los valores que puede tomar).
  • size: Tamaño del botón. Con el valor large muestra el botón grande, si no se indica usa el tamaño por defecto (pequeño).
  • tag: Valor similar al id, también sirve para identificarlo en la macro.
  • onAction: Aquí se indica el nombre del método que ejecutará al pulsarse. Más abajo se explica cómo hacer un método para nuestro botón de la cinta.
  • supertip: Descripción larga que aparece al mantener el puntero sobre el botón.

Una vez hecho todo esto comprimimos de nuevo todo el contenido en un archivo ZIP incluyendo la nueva carpeta customUI. Una vez comprimido renombramos el archivo de nuevo a formato Word (MiDocumento.zip -> iDocumento.docm). Abrimos el archivo y voila. Ya solo falta darle funcionalidad a nuestro botón.



Para crear un método para nuestro botón abrimos el editor de Visual Basic de Word y añadimos un nuevo módulo en el proyecto. Creamos un nuevo método que ha de llamarse igual que hemos indicado en el atributo onAction del botón, en este caso mensaje y como atributo del método una variable tipo IRibbonControl. Un ejemplo sería:

Una cinta de opciones da para mucho más que poner solo una serie de botones. En esta página, Jensen Harris: An Office User Interface Blog y más concretamente aquí encontrareis mucha información al respecto.

Los iconos que se pueden usar en un botón de la cinta de opciones son numerosos y variados, en la página Júlio Battisti puedes descargar un documento de Excel donde se pueden ver todos los iconos posibles que ofrece office, realmente muy útil.

martes, 17 de abril de 2007

Error ASP.NET 2.0.50727.42

A más de uno le habrá ocurrido este error. Llega a ser realmente molesto, sobre todo porque suele aparecer justo cuando hay una reunión y has de mostrar algo.

Tras probar varias soluciones por fin hay una realmente efectiva. El problema surgía cuando se cargaba el Framework 2.0 en lugar de 1.1, entonces al intentar cargar algún sitio de SharePoint 2003 aparecía el mensaje “no se ha configurado este servidor virtual de Windows SharePoint Services para usarlo con ASP.NET 2.0.50727.42”. Se soluciona creando un archivo de configuración de la siguiente manera:
  • Abrir el administrador de IIS.
  • Seleccionar Extensiones de servicio Web.Seleccionar ASP.NET 1.1 y pulsar en Permitir.
  • Abrir en un explorador la carpeta contenedora de W3wp.exe que se haya por defecto en windir\system32\inetsrv
  • En esta carpeta crear un nuevo documento W3wp.exe.config con el texto siguiente:

  • Guardar el archivo.
  • Reiniciar el IIS.
Despues de esto ya no deberia volver a aparecer el molesto mensaje.

Artículo de la KB de Microsoft 928607

martes, 10 de abril de 2007

Feliz 100.000.000 iPod

No he podido evitarlo, tengo que poner una entrada del iPod.

Se ha vendido el iPod 100.000.000, ese aparatito que se ha convertido en indispensable en mi día a día. Enhorabuena.

Gracias a él ahora mi vida tiene banda sonora.

El mío es el iPod mini. ¿Cuál es el tuyo?

miércoles, 28 de marzo de 2007

Generar y agregar un WebPart con C#

Tal vez no parezca realmente útil generar una WebPart mediante código para agregarlo a un sitio, pero nunca se aprende suficiente y menos en SharePoint.

El caso es que necesitaba que un sitio tuviera un WebPart, pero el contenido del WebPart no se sabría hasta que el usuario no seleccionara una serie de opciones, así que investigando y probando llegué a esta solución. Puede que no sea la solución más efectiva o elegante, pero por lo menos aprendí algo nuevo.

El método en cuestión es muy sencillo, solo hay que obtener el sitio que se quiera, su colección de WebPart de la página donde queramos agregarlo, construir el WebPart y añadirlo a la colección. Veamos el código:

Está en una imagen debido a problemas con las etiquetas del WebPart, espero que sea perfectamente legible.

Donde indica ruta_sitio es un string con la ruta relativa del sitio de SharePoint donde queremos agregar el WebPart (por ejemplo: “/sites/proyectos/”).

Donde pone Contenido del WebPart (donde si no) va nuestro código HTML con el WebPart que queremos generar, cualquier cosa que se nos ocurra. En el HTML podemos integrar cualquier dato que podamos obtener del modelo de objetos de SharePoint.

lunes, 26 de marzo de 2007

Gráficos en SharePoint

Como se suele decir una imagen vale más que mil palabras, así que extrapolándolo a SharePoint, una gráfico vale más que mil listados. Bueno, tal vez sea un poco exagerado, pero lo cierto es que un gráfico bien pensado complementa y da mucha riqueza a un sitio y además mostramos información, no solo datos como con las listas.
Lo más cómodo y a mi parecer indicado para hacer gráficos es tener una base de datos en nuestro SQL Server donde almacenar las consultas que hagamos, de las cuales se nutrirá nuestro gráfico. En esta base de datos crearemos un usuario con permisos de lectura que usaremos para acceder desde SharePoint. También crearemos una nueva vista de todos los datos de las listas y bibliotecas de nuestro SharePoint, la consulta será:

SELECT li.tp_Title, ud.*
FROM [BD SharePoint].dbo.UserData ud INNER JOIN
     [BD SharePoint].dbo.Lists li ON
     li.tp_ID = ud.tp_ListId

De esta vista podremos extraer los datos de una lista concreta mediante el campo tp_Title realizando una consulta y guardándola en una nueva vista. Muy interesante resultan los gráficos de barras para extraer las medias en encuestas o los gráficos circulares para porcentajes por ejemplo de tipos de contenido, todo depende de nuestra pericia con las consultas SQL. Aquí van dos ejemplos:



Para poder poner nuestro gráfico en SharePoint necesitamos tener instalado los Office Web Components.
Una vez tengamos los Office Web components agregamos la WebPart Gráfico Dinámico de Office que está en la galería de servidor virtual.

Al agregarlo a nuestra página nos dará la opción de conectarse a un origen de datos externo y al pulsar sobre ella seleccionamos agregar una conexión con SQL Server.
Nos saldrá un asistente donde primero deberemos poner el nombre de nuestro servidor y la opción de usar nombre de usuario y contraseñas, donde pondremos el usuario que nos creamos en nuestra base de datos para las vistas, el cual tenía acceso de lectura.

En el siguiente paso seleccionamos nuestra base de datos y la vista con los datos para nuestro gráfico.
En el último paso marcamos la casilla para guardar la contraseña en el archivo y almacenamos el archivo de conexión en una biblioteca de SharePoint donde todos los usuarios tengan acceso, si no habrá usuarios que no puedan visualizar el gráfico.

Una vez tenemos todo esto ya solo queda pelearse con las opciones de la WebPart para dejar nuestro gráfico como nos guste.

Un sitio bien configurado al que le agreguemos un gráfico puede ser un gran sitio. Podemos por ejemplo configurar un sitio para evaluación de proveedores o clientes, donde tengamos la ficha con la información del cliente, unas listas con sus pedidos y lo complementemos con unos gráficos sobre su media en las evaluaciones y sobre sus pedido o histórico de ventas.

Además de todo esto los gráficos entran mas por los ojos, sobre todo si tienen unos buenos colores.

miércoles, 21 de marzo de 2007

Disponible la Web del V CAIQ


Como anuncié anteriormente, los días 19, 20 y 21 de Abril se celebrará en Almería el V Congreso Andaluz de Ingeniería Química.

El V CAIQ contará con el patrocinio y colaboración de numerosas empresas del sector y asociaciones, muy especialmente AIQU, asociación organizadora del congreso.

No dudeis en visitar la Web del V CAIQ que ya se encuentra operativa, donde podéis encontrar toda la información del congreso.

miércoles, 7 de marzo de 2007

E=MC2 ¿Es realmente cierto?


Científicos del NEC Research Institute de Princeton han conseguido superar en 300 veces la velocidad de la luz.

Los investigadores manipularon un vapor de átomos irradiados por laser que acelera la velocidad de las ondas de luz, produciendo que un pulso atravesara la cámara preparada con el vapor unas 300 veces más rápido que si lo hiciera en el vacío.

El hecho invita a pensar que Albert Einstein no estaba en lo cierto en su teoría de la relatividad, ya que según esta nada puede viajar más rápido que la luz. Pero parece ser que la teoría de la relatividad es relativa. Me explico, nada con masa puede viajar más rápido que la luz.

Lo mas curioso del experimento es que el pulso salió de la cámara antes de entrar en ella. Cito textualmente del artículo original "cuando las ondas de luz están distorsionadas, el pulso viaja hacia delante en el tiempo", parece de ciencia ficción.

La investigación del NEC se publicara en la revista Nature.

Artículo original en CBC News.

lunes, 5 de marzo de 2007

Creación de Informes Word de Listas de SharePoint

Todos conocemos las bondades de SharePoint, pero a pesar de tener toda la información que se pueda desear bien almacenada y organizada y de las herramientas de filtro, búsqueda, vistas y demás, se sigue queriendo tener un informe en papel para distribuir, anotar, leer, etc.
Para solventar esa ‘necesidad’ de imprimir de los usuarios se puede crear una aplicación de escritorio para generar informes de las listas que nos interesen. Para ello crearemos una aplicación Windows Form en la que usaremos los WebService que nos brinda SharePoint y el modelo de objetos de Microsoft Word.


Primero deberemos obtener los elementos de la lista que nos interesa. Para usar el WebService que nos hace falta debemos agregar una referencia web a nuestro proyecto, para ello pulsamos con el botón derecho en “Referencias Web” y seleccionamos agregar. En la zona URL ponemos “http://spserver/_vti_bin/lists.asmx” (donde spserver es la ruta del sitio donde se halla la lista que nos interesa) y cambiamos el nombre de referencia web por “WSList” para que nos sea más fácil a la hora de programar. También deberemos añadir los espacios de nombres System.Net y System.Xml para poder implementar el siguiente método:

public bool obtenerElementos()
{
  try
  {
    WSList.Lists lista = new WSList.Lists();
    lista.Credentials = new NetworkCredential(usuario, password, dominio);

    lista.Url = "http://spserver/_vti_bin/lists.asmx";

    XmlDocument xmlDoc = new XmlDocument();
    XmlNode nodeQ = xmlDoc.CreateNode(XmlNodeType.Element, "Query","");
    XmlNode nodeVF = xmlDoc.CreateNode(XmlNodeType.Element, "ViewFields","");
    XmlNode nodeQO = xmlDoc.CreateNode(XmlNodeType.Element, "QueryOptions","");

    XmlNode xmlNode = lista.GetListItems("Noticias",null,nodeQ,nodeVF,null,nodeQO);

    string xpathQuery = "//*[local-name() = 'data' and namespace-uri() = 'urn:schemas-microsoft-com:rowset']/*[local-name() = 'row' and namespace-uri() = '#RowsetSchema']";

    noticias = xmlNode.SelectNodes(xpathQuery);

    return true;
  }
  catch(Exception ex)
  {
    return false;
  }
}

Con este método ya tenemos almacenados los elementos de nuestra lista de Noticias en un objeto XmlElement que lo declararemos de forma global para la aplicación. Ahora solo queda crear el informe en Word.

Para poder crear un informe en Word deberemos primero agregar unas referencias a nuestro proyecto. Para ello seleccionamos agregar nueva referencia y en la pestaña COM seleccionamos “Microsoft Word Object Library” y la agregamos.

Para poder implementar el método hemos de poner en nuestro código la llamada a la librería de Word, using Word = Microsoft.Office.Interop.Word. Y el código de nuestro método para generar un informe en Word es:
public string crearInformeWord()
{
/* Creamos la aplicacion word y el documento */
Word._Application oWord;
  Word._Document oDoc;
  oWord = new Word.Application();

  for(int i=0; i'<'noticias.Count; i++)
  {
    try
    {
      object oMissing = System.Reflection.Missing.Value;
/* \endofdoc es un bookmark predefinido
* para el final del documento */
      object oEndOfDoc = "\\endofdoc";

/* Creamos un nuevo documento de Word */
      oDoc = oWord.Documents.Add(ref oMissing,ref oMissing,ref oMissing,ref oMissing);
      object oRng;

/* Creamos el párrafo para insertar el titulo */
Word.Paragraph oParrafoTitulo;

/* Establecemos la referencia del parrafo
* al final del documento */
      oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
      oParrafoTitulo = oDoc.Content.Paragraphs.Add(ref oRng);

/* El texto del párrafo será el título de la noticia */
      oParrafoTitulo.Range.Text = noticias[i].Attributes[“ows_Title”].Value;
      oParrafoTitulo.Range.Font.Name = "Tahoma"; //Fuente de la letra
      oParrafoTitulo.Range.Font.Size = 12; //Tamaño de la letra
      oParrafoTitulo.Range.Font.Bold = 1; //Negrita SI/NO
      oParrafoTitulo.Format.SpaceAfter = 12; //Espacio con el parrafo siguiente
      oParrafoTitulo.Range.InsertParagraphAfter(); //Inserta el párrafo

/* Creamos el párrafo para insertar el cuerpo */
      Word.Paragraph oParrafoCuerpo;

/* Establecemos la referencia del parrafo al final del documento */
      oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
      oParrafoCuerpo = oDoc.Content.Paragraphs.Add(ref oRng);

/* El texto del párrafo será la descripción de la noticia */
      oParrafoCuerpo.Range.Text = noticias[i].Attributes[“ows_Descripcion”].Value;
      oParrafoCuerpo.Range.Font.Name = "Tahoma"; //Fuente de la letra
      oParrafoCuerpo.Range.Font.Size = 10; //Tamaño de la letra
      oParrafoCuerpo.Range.Font.Bold = 0; //Negrita SI/NO
      oParrafoCuerpo.Format.SpaceAfter = 6; //Espacio con el parrafo siguiente
      oParrafoCuerpo.Range.InsertParagraphAfter(); //Inserta el párrafo

/* Salto de página para poner una noticia en cada página del informe
* Solo saltamos de página si no es la última noticia */
      if(i+1 < noticias.Count)
      {
        Word.Paragraph oParaSalto;
        oRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;
        oParaSalto = oDoc.Content.Paragraphs.Add(ref oRng);
        object oPageBreak = Word.WdBreakType.wdPageBreak;
        oParaSalto.Range.InsertBreak(ref oPageBreak);
      }

    }
    catch(Exception ex)
    {
/* Muy importante ponerlo también en el catch
* Ya que si falla y no se pone Word queda abierto en segundo plano */
      oWord.Visible = true;
    }
  }
}

También podemos generar una tabla con todas las noticias:

public string crearTablaWord()
{
/* Creamos la aplicación Word y el documento */
  Word._Application oWord;
  Word._Document oDoc;
  oWord = new Word.Application();

  try
  {
/* Calculo del numero de filas
* para poner en cada fila dos noticias (2 columnas) */
    int filas = 1;

    if(noticias.Count%2 == 1)
    {
      filas = (noticias.Count/2)+1;
    }
    else
    {
      filas = noticias.Count/2;
    }

/* Creamos el objeto tabla */
    Word.Table oTable;

/* Establecemos la posición al final del documento */
    Word.Range wrdRng = oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range;

/* Indicamos el numero de filas y columnas */
    oTable = oDoc.Tables.Add(wrdRng, filas, 2, ref oMissing, ref oMissing);
    oTable.Range.ParagraphFormat.SpaceAfter = 6;
    oTable.Columns.Borders.Enable = 1; //ponemos bordes a la tabla
oTable.Range.Font.Bold = 0;

/* Agregamos el texto a las celdas */
    int r, c, pos;
    pos = 0;
    string text;
    for(r = 1; r '<'= filas; r++)
    {
      for(c = 1; c '<'= 2; c++)
      {
/* Controlamos si en la última celda no se va a escribir nada */
      if(r==filas && c==2)
      {
        text = "Título: ";
        oTable.Cell(r, c).Range.Text = text;
        text = "Autor: ";
        oTable.Cell(r, c).Range.Text += text;
        text = "Creado: ";
        oTable.Cell(r, c).Range.Text += text;
      }
      else
      {
/* Ponemos el titulo, autor y fecha de creación de la noticia */
          text = "Título: "+ noticias[pos].Attributes["ows_title"].Value;
          oTable.Cell(r, c).Range.Text = text;
          text = "Autor: "+ noticias[pos].Attributes["ows_Author"].Value;
          oTable.Cell(r, c).Range.Text += text;
          text = "Creado: "+ noticias[pos].Attributes["ows_Created"].Value;
          oTable.Cell(r, c).Range.Text += text;
        }

        pos++;
      }
    }
  }
  catch(Exception ex)
  {
/* Muy importante ponerlo también en el catch ya que si falla
* y no se pone, Word queda abierto en segundo plano */

    oWord.Visible = true;
  }

  oWord.Visible = true;
}

Si queremos que nuestro informe quede mejor, podemos crear una plantilla de Word con un encabezado y pie de página, donde podremos poner un logo, número de páginas, etc y crear el informe a partir de esa plantilla. Para hacer esto solo habrá que cambiar lo siguiente al principio del método:

/* Hay que cambiar esto */
oDoc = oWord.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing);

/* Por esto otro */
object oPlantilla = "c:\\plantilla.dot";
oDoc = oWord.Documents.Add(ref oPlantilla,ref oMissing,ref oMissing, ref oMissing);

Con esto tenemos un generador de informes de cualquier lista de SharePoint que a más de un usuario le puede interesar.

viernes, 2 de marzo de 2007

No es una producción de Jerry Bruckheimer


Vía Xataka me he encontrado con este vídeo, en el cual se ve una nueva investigación para mejorar el transporte ferroviario, pero por lo que se ve se podría aplicar a muchos tipos de transporte (habéis visto los coches en Minority Report).

Se trata básicamente de enfriar un imán con nitrógeno líquido y al ponerlo sobre una superficie metálica el imán la repele pero a su vez la atrae, permitiendo al tren levitar sobre los raíles pero sin separarse de ellos ni salirse. Las vías pueden estar debajo, en el lateral o incluso encima del medio de transporte. El único inconveniente es que se evapore el nitrógeno líquido.

Ya me veo subiendo a mi 117º piso en mi coche.

viernes, 23 de febrero de 2007

Agregar integrantes a un sitio de SharePoint


Como complemento a Creación de Sitios de SharePoint con C#, publicado unas entradas más abajo, expondré ahora como agregar integrantes a los sitios de SharePoint desde nuestro código, lo que puede ser muy útil para dejar configurado por completo un sitio desde nuestra aplicación.

Para agregar un integrante necesitamos la ruta del sitio en cuestión y que la persona que queremos agregar ya sea usuario de nuestro SharePoint. La ruta que hace falta para la implementación que expondré es relativa al servidor (si el sitio es “http://spserver/sites/proyectos/” la ruta que nos hace falta es solo “/sites/proyectos/”). El usuario que le vamos a pasar al método debe tener el formato “DOMINIO\nombre_usuario”, así lo podremos obtener la colección de usuarios de SharePoint sin problemas.

Para agregar uno o varios integrantes hay que introducir los datos en un vector SPUserInfo (correo electrónico, nombre de usuario y nombre para mostrar) y será dicho vector el que añadamos a la colección de usuarios. También tendremos que decidir que rol le otorgaremos a los usuarios que agreguemos ya que si no agregamos los usuarios también al rol no llegarán a formar parte del sitio.

El método que a continuación se expone es para agregar un solo usuario:

private bool agregarIntegrante(string ruta, string usuario)
{
  try
  {

/* Obtenemos la colección de sitios de nuestro portal
* y el sitio especificado por 'ruta' */

    SPGlobalAdmin ga = new SPGlobalAdmin();
    SPSiteCollection col = ga.VirtualServers[0].Sites;
    SPSite s = col[ruta];

    s.AllowUnsafeUpdates = true;

/* Obtenemos la colección de usuarios del sitio
* y creamos el rol que tendrán los nuevos integrantes
* en este caso el rol es de Administrador */

    SPWeb w = s.OpenWeb();
    SPUserCollection ucoll = w.SiteUsers;
    SPRole rol = w.Roles["Administrador"];

/* Obtenemos al usuario que queremos agregar como integrante
* del portal principal, creamos el vector de SPUserInfo
* y agregamos los datos del usuario */

    SPUser u = col[0].OpenWeb().Users[usuario];
    SPUserInfo[] ui = new SPUserInfo[1];

    ui[0].Email = u.Email;
    ui[0].LoginName = u.LoginName;
    ui[0].Name = u.Name;

/* Agregamos el vector SPUserInfo a la colección de usuarios
* y al usuario en concreto en el rol especificado anteriormente */

    ucoll.AddCollection(ui);
    rol.AddUser(u.LoginName, u.Email, u.Name, u.Notes);

    return true;
  }
  catch(Exception ex)
  {
    return false;
  }
}



Como también dije con la creación de sitios, agregar integrantes desde nuestro código puede ser muy interesante si lo aplicamos a un flujo de trabajo y muchísimo más interesante si combinamos la creación de sitios con el método para agregar integrantes.

martes, 20 de febrero de 2007

Interfaces naturales





Increíble ¿no os parece? Este video está en FastCompany, en el se puede ver una demostración de Perceptive Pixel, una empresa creada por Jeff Han para el desarrollo de los sistemas táctiles multi-punto. En este desarrollo de Jeff Han está la evolución de los sistemas táctiles. Este siguiente paso nos lleva a un manejo natural y sencillo de las aplicaciones.
Solo hay que fijarse en el éxito de un producto, supongo todos conocéis, el Apple iPhone. Todos están de acuerdo en que podría ser 3G, llevar GPS, tener una pantalla 16:9 en lugar del formato que usa, incorporar lector de tarjetas y más cosas que todo teléfono móvil-SmartPhone-PDA-reproductor audio/video debería llevar. Pero aun así es el objeto de deseo de numerosas personas (entre las cuales me incluyo).

Creo que su éxito se debe a la facilidad de uso, a su pantalla táctil multi-punto, a lo simple y completa de su interfaz (puede que también a que es la siguiente generación del iPod). ¿A cuántos nos cuesta realizar una multiconferencia o dejar en espera la llamada que atendemos porque hay otra entrante? Pues fíjense en lo fácil que resulta con el iPhone, en cómo se desplaza a través de la lista de contactos o del Cover Flow (los álbumes de música) y lo fácil que es el manejo de las fotos.

Espero que dentro de poco no necesitemos ni teclado ni ratón para usar nuestro ordenador, simplemente una pantalla táctil como la de Jeff Han.

lunes, 19 de febrero de 2007

V Congreso Andaluz de Ingeniería Química (V CAIQ)

En próximas fechas, concretamente el 19, 20 y 21 de Abril, se celebrará en Almería el V Congreso Andaluz de Ingeniería Química.

No es que la ingeniería química sea un tema que me apasione, pero hay que darlo a conocer y de paso ofrezco un poco de apoyo a AIQU (es especial a Eli y Estefanía), la asociación que se está encargando de toda la organización del congreso.

Les deseo que todo les salga bien y que sea un éxito.


Por cierto, el cartel lo ha creado un servidor con la encomiable colaboración de un amigo. En breve también tendremos lista la página web del congreso, donde se podrá consultar toda la información referente al V CAIQ.