Tecnología y cosas varias
Un poco de todo.
miércoles, 2 de abril de 2008
IV Jornadas Astronómicas de Almería
martes, 18 de septiembre de 2007
Radio Wave Cooling
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
viernes, 18 de mayo de 2007
Crear nuevo Ribbon en Word 2007
- _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
- 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:
martes, 17 de abril de 2007
Error ASP.NET 2.0.50727.42
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.
Artículo de la KB de Microsoft 928607
martes, 10 de abril de 2007
Feliz 100.000.000 iPod
miércoles, 28 de marzo de 2007
Generar y agregar un WebPart con C#
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
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
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.
lunes, 5 de marzo de 2007
Creación de Informes Word de Listas de SharePoint
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;
}
}
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:
{
/* 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++)
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
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
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(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
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.
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)
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.