Título                     Modelo de acceso en SharePointTexto    Como nos proponemos hablar de aquellos temas sobre los q...
Todos los sitios en la colección comparten la URL del sitio raíz.Cada sitio a su vez almacena su propio contenido en las l...
Veamos pues los dos pasos que debemos realizar para darpermisos de acceso a nuestros usuarios:   1. Autenticación: ¿es el ...
pudiendo por ejemplo emplear los datos de un fichero plano (nomuy recomendable, por otra parte…). Para esto se emplea lo q...
Podemos definir nuestros MP (que como hemos dicho se empleanal definir el método de autenticación de nuestra aplicación We...
AutorizaciónUna vez que nuestros usuarios tienen acceso al sistema, debemosconocer a qué contenidos del mismo pueden acced...
nivel de sub-sitio, librería o elemento.UsuarioPodemos asignar permisos a un usuario particular identificadomediante un mé...
sus cuentas de usuario o implícita por su pertenencia a un grupode seguridad o rol. El uso de grupos de SharePoint es el m...
proporcione ese elemento.         Lo primero es autenticarnos con el método de autenticación en un         MP. Una vez hec...
lenguaje.Pero lo realmente importante es como personalizar laspáginas en las que se muestran nuestras listas. Estapersonal...
Y navegamos mediante el explorador mostrado a laizquierda de la pantalla hasta donde se encuentre la Listaque nos interesa...
interese modificar (“Announcements” en nuestro caso) yabrimos el ASP “DispForm.aspx”, haciendo doble-clicksobre él:Selecci...
Tras realizar este paso se mostrará un menú en el queelegiremos el tipo de Lista que queremos usar, en estecaso es de “Ann...
en este ejemplo: Title, Body y Expires. En el caso de quehubiéramos creado más columnas personalizadas que seencontraran a...
Tras pulsar en Save, deberemos decirle a SharePoint queesta es la plantilla que queremos que use cada vez quenos muestre u...
al campo “Display item form” y pulsaremos sobre Browsey en la ventana que se nos desplegará elegiremos nuestro“DispPrueba....
También, se podría haber personalizado colores, tamaño           de fuentes u otros aspectos de la página. De este modo   ...
este procedimiento, seremos capaces de generar mallas concualquier API y para cualquier motor gráfico. Aquí se puede verun...
| Usage.WriteOnly, CustomVertex.PositionCol                     ored.Format, Pool.Default);            vertices = new Cust...
Al igual que en él VertexBuffer, este se rellena. En este caso, conenteros que indican las posiciones de los vértices.    ...
(x + 1) + (y + 1) * width;                       indices[(x + y * (width - 1)) * 6 + 5] =(x + 1) + y * width;             ...
Catego CES MicrosoftríasTema     DesarrolloAutor    Goretti Ortigosa RadaMes      MayoAño      2008Boletín 05Título       ...
efoque global de las herramientas necesarias          para   eldesarrollo y pruebas de aplicaciones en MHP.               ...
le pueden asignar.           Los componentes que pueden emplearse en una             página y sus propiedades.          ...
   AltiComposer (de la empresa coreana Alticast):       integra entorno de desarrollo y emulador (el cual       permite l...
 No se cuenta con un entorno muy amigable.                    Se desarrollará de forma más lenta.                    La...
siguiente caso:      1.    Tenemos una aplicación que imprime páginas de         un documento.      2.    Puede imprimir t...
Queremos construir un módulo que dada una cadena quecumpla las condiciones arriba descritas, nos devuelva losnúmeros de la...
listaElementos     elemento             --> ENTERO                        |     ENTERO GUION ENTEROen la que los no termin...
Dada la cadena 2, 5--8 no tenemos un árbol dederivación para la misma puesto que no podemos producirdos guiones seguidos ‘...
Ahora bien tenemos un pequeño problema: el analizadorléxico va a ir leyendo la cadena de entrada carácter acarácter, como ...
cómo obtenerla), en la que señalo en negrita los caracteresque va obteniendo el lexer de la cedena 2, 5-8:     Current cha...
|          {}donde con {} denotamos la cadena vacía.Y hacemos otro tanto con:      elemento          --> ENTERO           ...
elemento                  --> ENTERO                                  {num1 = valor(ENTERO);                              ...
código fuente que manejase todo esto, de forma que el          mantenimiento fuese sencillo.          Afortunadamente exis...
servicio nfs y montando los archivos del repositorio de una en laotra.PREPARACIÓN DEL SISTEMA:Lo primero que hay que hacer...
telinit 3Se actualizan los paquetes con:yum upgradeyum puede quejarse de conflictos o requerimientos. Esto se deberáprobab...
Después de comprobar que está instalado en la máquina unservidor de NFS se debe editar el archivo /etc/exports e introduci...
servicio NFS se deberá indicar al sistema que vuelva a leer el       fichero y active los cambios. Esto se puede hacer rei...
Año    2008Boletín 05
Cesnavarra 2008-boletín 5
Upcoming SlideShare
Loading in...5
×

Cesnavarra 2008-boletín 5

341

Published on

Respuesta Digital

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
341
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Cesnavarra 2008-boletín 5

  1. 1. Título Modelo de acceso en SharePointTexto Como nos proponemos hablar de aquellos temas sobre los que trabajamos día a día en los CES, este artículo espero que sirva para aclarar los conceptos del modelo de acceso (Autenticación y Autorización) de Microsoft Sharepoint (tanto en Windows SharePoint Services WSS 3.0 como Microsoft Office SharePoint Server 2007). Hablaremos primero de la organización de los sitios SharePoint, para después describir los métodos Autenticación y Autorización que emplea y finalizar hablando sobre cómo establecer los permisos de acceso adecuadamente. Sitios SharePoint: Aplicaciones Web y Colecciones de Sitios SharePoint es una aplicación Web y como tal es Microsoft Internet Information Server (IIS) el encargado de procesar las peticiones de los usuarios inicialmente, que son enviadas como una URL (por ejemplo http://www.cesnavarra.net/cesdigital/Lists/Noticias%20C ESDigital/TemaDesarrolloSoft.aspx). IIS puede soportar múltiples sitios Web, cada uno identificado por su IP, puerto y header o etiqueta de encabezado. La instalación de SharePoint sobre IIS lo que hace es extender un sitio Web de IIS y hacer que sea SharePoint el que se encargue de las peticiones. Esto implica que un mismo IIS puede soportar múltiples aplicaciones Web de SharePoint. El que necesitemos o no diversas aplicaciones Web depende de varios motivos como seguridad o aislamiento de contenidos, etc. Desde el punto de vista de la seguridad, es cada aplicación Web la que controla el método de autenticación (somos quienes decimos que somos) en cada URL de SharePoint particular, y cada aplicación Web puede usar un método independiente. En SharePoint 2007 tenemos el concepto de “granjas” que agrupa a un conjunto de servidores Web en los que se ejecuta la misma aplicación Web. Dentro de una granja la definición de cada aplicación Web se distribuye de manera automática (lo que simplifica la tarea de administración) de manera que el mismo método de autenticación se usa de manera consistente, independientemente de qué servidor Web físico usemos. Cada aplicación Web a su vez acoge una o más colecciones de Sitos, y cada colección a su vez consiste en un sitio raíz y uno o más subsitios.
  2. 2. Todos los sitios en la colección comparten la URL del sitio raíz.Cada sitio a su vez almacena su propio contenido en las listas ylibrerías de documentos de SharePoint.
  3. 3. Veamos pues los dos pasos que debemos realizar para darpermisos de acceso a nuestros usuarios: 1. Autenticación: ¿es el usuario quien dice que es? 2. Autorización: ¿puede el usuario ver lo que quiere ver?AutenticaciónComo hemos comentado, es IIS el que se encarga de autenticarlas aplicaciones Web de SharePoint. Para ello, contamos condiversos métodos siendo el más habitual el uso de Active Directory(AD). Sin embargo, dado que soporta cualquier modelo deautenticación de ASP.NET disponemos de mucha más flexibilidad
  4. 4. pudiendo por ejemplo emplear los datos de un fichero plano (nomuy recomendable, por otra parte…). Para esto se emplea lo quese denomina “membership provider” (MP) que es el responsablede autenticar los usuarios con un método concreto. ASP.NET 2.0nos proporciona por defecto un MP para SQL, y MOSS añade unopara LDAP.Cada aplicación Web sólo puede tener un método de autenticaciónasociado (y por tanto emplea un único MP). Si necesitamosproporcionar acceso al mismo contenido con distintos métodosdeberemos extender nuestra aplicación Web a otra zona. Existencinco zonas disponibles: Default, Internet, Extranet, Intranet yCustom, siendo cada zona básicamente un sitio Web en IISconfigurado con un método de autenticación adecuado. La zona“Default” es la empleada por defecto siendo su método deautenticación Windows.Cuando extendemos una aplicación Web a otra zona le damos unaURL concreta para la zona, por lo que podemos usar distintas URLpara usar métodos de autenticación distintos para el mismocontenido. En la siguiente imagen vemos esto en acción: en laprimera usamos Windows para autenticarnos, en la siguienteForms.
  5. 5. Podemos definir nuestros MP (que como hemos dicho se empleanal definir el método de autenticación de nuestra aplicación Web)según nuestras necesidades y para esto les daremos un nombreque se nos mostrará cada vez que necesitemos identificar usuariosen SharePoint, para saber a qué usuario nos estamos refiriendosin dudas.En el ejemplo siguiente vemos que un usuario nos lo proporcionael propio SharePoint y el otro el S.O. Windows de la máquinasobre la que se ejecuta (WSSV3)
  6. 6. AutorizaciónUna vez que nuestros usuarios tienen acceso al sistema, debemosconocer a qué contenidos del mismo pueden acceder y quépueden hacer con ellos, mediante el proceso de autorización.Para definir la autorización disponemos de 5 componentes:Permisos individualesProporcionan la posibilidad de realizar acciones concretas, comover los elementos de una Lista (View Items). Estos permisosaplican a nivel de granja web y se pueden controlar por unadministrador.Nivel de permisoLos niveles de permiso agrupan los permisos individuales parafacilitar su gestión. WSS incluye cinco niveles: Acceso Limitado,Lectura, Contribución, Diseño y Control Total. MOSS añade otroscomo Aprobación y Gestión de Jerarquía. Se pueden añadir nivelesde permiso adicionales o modificar los existentes. Su alcance espor cada sitio y pueden heredarse del sitio padre o definirse a
  7. 7. nivel de sub-sitio, librería o elemento.UsuarioPodemos asignar permisos a un usuario particular identificadomediante un método de autenticación, como hemos vistoanteriormente.GrupoUn grupo es un conjunto de usuarios, que pueden ser bien ungrupo de usuarios Windows, un rol proporcionado por un gestor deroles o un grupo de SharePoint, como Propietarios del sitio oVisitantes del sitio. Estos Grupos proporcionan a losadministradores de las colecciones de Sitios la flexibilidad paraagrupar usuarios sin tener que depender del departamento deSistemas para que creen grupos de usuarios Windows.Objeto securizableLos Grupos anteriores son asignados niveles de permisos sobreobjetos securizables concretos: sitios, listas, librerías dedocumentos, carpetas, documentos o elementos. Por defecto lospermisos para listas, librerías, carpetas, documentos y elementosse heredan del padre (sitio, lista o librería en cada caso). Peroaquellas usuarios con Nivel de permiso que incluya la Gestión dePermisos de un objeto securizable particular pueden cambiar lospermisos de éste.SharePoint permite otorgar permisos a nivel de elemento, por loque para una librería de documentos podríamos conseguir que unusuario tenga acceso a un documento concreto pero no a todos losdemás.Este modelo de permisos también se aplica al interfaz de usuariode SharePoint de manera que podemos lograr que un usuario veao no partes de nuestra página (Web Parts) sólo si tiene permisosde acceso de lectura adecuados, o que sólo pueda ver aquellasacciones para las que dispone de permisos.Es recomendable emplear grupos cuando asignemos estospermisos ya que de otra manera nos complicaremos mucho lagestión de permisos en nuestra aplicación. Dar permisos a unusuario particular es algo que deberíamos emplear sólo de maneraexcepcional (y eso es válido para cualquier otro sistema).Almacenamiento de permisos de UsuariosDe acuerdo a lo dicho anteriormente tenemos que los usuariospueden recibir acceso a los objetos de manera explícita mediante
  8. 8. sus cuentas de usuario o implícita por su pertenencia a un grupode seguridad o rol. El uso de grupos de SharePoint es el métodopreferido por la facilidad que nos permite.Cuando un usuario recibe un permiso de acceso a un recurso enuna colección de sitios se crea un registro en la tabla UserInfo dela base de datos de contenido asociada a esa colección. Susdetalles se introducen en la lista User Information, y esainformación es la que vemos mediante la vista “Todas laspersonas” (“All People”) de SharePoint. Por tanto, si un usuariotiene diversos accesos a distintas colecciones de sitios existirán unnúmero correspondiente de entradas en la tabla UserInfo de laBBDD de contenido que soporta esas colecciones. Esta tablacontiene un identificador interno propio de SharePoint que sirvecomo clave en otras tablas, un indicador de si se trata de ungrupo de seguridad o un rol y el identificador de seguridad queproporciona el MP empleado en el método de autenticación de laaplicación Web. En el caso básico de emplear autenticaciónWindows se trata del Security Identifier (SID) del usuario ogrupo. Si concedemos a un usuario acceso implícito a un recurso através de un grupo de seguridad o rol, la entrada en la tablaUserInfo se crea la primera vez que este usuario accede alrecurso.Existen otras cuatro tablas empleadas para soportar este modelode autorización: Groups y GroupMembership para grupos y Rolesy RoleAssignment para los roles. La tabla Groups contiene lainformación sobre los grupos (definición, privilegios, etc.) yGroupMembership a su vez enlaza los grupos con los usuarios. Lastablas Roles y RoleAssignment proporcionan los permisos exactosque tiene un usuario o un grupo referidos a su rol concreto en unacolección de sitios. Por tanto, para conocer qué permisos tiene unacuenta particular necesitaremos agregar los permisos del grupo deseguridad al que pertenece, los del grupo de SharePoint a quepertenece y los de los roles que le hayan sido asignados. “Sólo”nos falta otro componente: las Web Application Policies, queactúan como un supervisor global a nivel de aplicación Web (esdecir, afectan a todas las colecciones de sitios que soportan) ytienen precedencia sobre todo lo demás.El acceso a los objetos, en definitivaEn SharePoint, cualquier acceso a un recurso consiste en pedir unelemento de un sitio. En la página de inicio pedimos el elemento“default.aspx”, al editar el “EditForm.aspx”, etc. Por tanto,necesitamos seguir un proceso para que el servidor web nos
  9. 9. proporcione ese elemento. Lo primero es autenticarnos con el método de autenticación en un MP. Una vez hecho eso, el MP proporciona un identificador que por simplificar asumiremos que es el SID (es decir, usamos autenticación Windows). Con este SID se obtienen nuestros datos de la tabla UserInfo, en concreto el identificador de SharePoint, con el que obtendrá mediante una combinación de datos del resto de las tablas los permisos de que disponemos y en caso de ser suficientes nos proporcionará el recurso solicitado. Esto implica que si cambiamos nuestro SID en Windows (por una migración de dominio, habitualmente) tendremos problemas. Para evitarlos, podemos usar la utilidad “stsadm” con el switch “- migrateuser” que reemplazará la cuenta antigua con la nueva. El artículo “Stsadm: Taking control of SharePoint administration” proporciona más información sobre su uso.Catego CES MicrosoftríasTema DesarrolloAutor Rafael Flores YoldiMes MayoAño 2008Boletí 05nTítulo Personalización de Paginas de ListasTexto En este artículo vamos a ver como personalizar las paginas que nos muestran la información de Listas, la estructura básica de almacenamiento de información de SharePoint (comparable a las tablas de cualquier base de datos) para ello usaremos Microsoft Office SharePoint Designer 2007, la herramienta de Microsoft para personalizar las aplicaciones de SharePoint (WSS y MOSS), que a efectos prácticos es el sucesor mejorado de FrontPage. La principal ventaja de esta herramienta reside en el hecho, de que nos permite adaptar a nuestro gusto el aspecto de las páginas sin necesidad de conocimientos en ningún
  10. 10. lenguaje.Pero lo realmente importante es como personalizar laspáginas en las que se muestran nuestras listas. Estapersonalización podrá ser aplicada a todas las plantillasque son empleadas para mostrar, crear o editarcontenidos de las Listas de SharePoint, como son laspáginas ASP con nombre “AllItems.aspx”,“DispForm.aspx”, “EditForm.aspx” y “NewForm.aspx”, asícomo crear nuevas plantillas que sustituyan a cualquierade estas 4.De hecho eso es lo que vamos a hacer, vamos a crear un“DispForm.aspx” personalizado, en el que sólomostraremos las columnas asociadas que nos interesen.Para ello abriremos desde SharePoint Designer el sitioSharePoint (WSS o MOSS) que contiene nuestras Listas:
  11. 11. Y navegamos mediante el explorador mostrado a laizquierda de la pantalla hasta donde se encuentre la Listaque nos interesa personalizar:Dentro del nodo de Listas, desplegamos la que nos
  12. 12. interese modificar (“Announcements” en nuestro caso) yabrimos el ASP “DispForm.aspx”, haciendo doble-clicksobre él:Seleccionamos el elemento ListFormWebPart y loborramos, pues lo vamos a sustituir por uno personalizado(nota: seleccionar el elemento concreto que queremos aveces es un poco difícil, todo es cuestión de habituarse).Para ello, estando colocados en el lugar donde loqueremos insertar, pincharemos sobre el menúInsert  SharePoint Controls  Custom List Form
  13. 13. Tras realizar este paso se mostrará un menú en el queelegiremos el tipo de Lista que queremos usar, en estecaso es de “Announcements” y dentro de este tipo de Listadeseamos mostrar el tipo de contenidos “Announcement”.En caso de tener otros tipos de contenidos asociado a laesta Lista, se nos permitiría seleccionarlos en este menú.Finalmente seleccionamos el tipo de formulario quequeremos crear, en nuestro ejemplo será un “Display itemform”, que es con el que estamos trabajando:Tras pulsar OK, vemos que nos aparecerán las trescolumnas por defecto que tenemos asociadas a esta lista
  14. 14. en este ejemplo: Title, Body y Expires. En el caso de quehubiéramos creado más columnas personalizadas que seencontraran asociadas a esta lista, nos apareceríanlistadas.Ahora y para seguir con nuestro ejemplo, supongamos quedeseamos eliminar el campo Expires. Simplementetendremos que seleccionar esa fila y elegirDelete  Delete Rows. Con esto lo que habremosconseguido es que este campo no se muestre en nuestronuevo “DispForm.aspx”, pero el campo seguirá en uso esdecir, que el elemento expirará una vez cumplida la fechay sus contenidos podrán utilizarse de la manera habitual,pero este campo no será visible para los visitantes delelemento:Ahora una cosa que es altamente recomendable, esguardar todas estas modificaciones con otro nombre, paraevitar sobreescribir el fichero “DispForm.aspx” que nosproporciona SharePoint por defecto, dado que SharePointDesigner no se ocupa de gestionar este versionado por sísólo. Para ello pulsaremos File  Save As y guardaremosnuestra página en el mismo lugar que se encuentra el“DispForm.aspx” que hemos usado, para nuestro ejemplousaremos el nombre de “DispPrueba.aspx”:
  15. 15. Tras pulsar en Save, deberemos decirle a SharePoint queesta es la plantilla que queremos que use cada vez quenos muestre un elemento de lista “Announcements”. Paraello, pulsaremos con el botón derecho sobre“Announcements” y en el menú que se nos desplegaráseleccionaremos Properties:En el correspondiente menú que se nos despliega, iremos
  16. 16. al campo “Display item form” y pulsaremos sobre Browsey en la ventana que se nos desplegará elegiremos nuestro“DispPrueba.aspx” y pulsaremos OK en ambas ventanas:Tras esto, recargaremos en el navegador la página de“Announcements” en la que se nos mostraba un elementode la Lista y veremos el resultado de nuestrapersonalización, ya no se muestra el campocorrespondiente a la columna Expires:
  17. 17. También, se podría haber personalizado colores, tamaño de fuentes u otros aspectos de la página. De este modo hemos visto una manera sencilla de adaptar la información mostrada por SharePoint a nuestras necesidades.Categorí CES MicrosoftasTema DesarrolloAutor David Valiño MartinezMes MayoAño 2008Boletín 05Título Generación de mallas mediante Buffers de Vértices e ÍndicesTexto Como ya he comentado en artículos anteriores, para representar objetos en el mundo 3D nos basamos en la utilización de mallas formadas por primitivas básicas, fundamentalmente triángulos. En está ocasión vamos a ver como se generan dichas mallas usando Buffers de Vértices e Índices. Ya que si tenemos claro
  18. 18. este procedimiento, seremos capaces de generar mallas concualquier API y para cualquier motor gráfico. Aquí se puede verun ejemplo, con lenguaje C#, de creación de una mallaen Mogre, una versión de código “managed” del motorgráfico Ogre (Object-oriented Graphics Rendering Engine).En nuestro caso en concreto, vamos a crear una mallacon Direct3D a partir de una imagen bitmap, de la cual,obtendremos la coordenada Z (altura) de nuestros vértices.Los pasos a seguir son los siguientes:1. Inicializamos el nodo raíz, conocidocomo device en DirectX (o como root en Ogre/Mogre) que essobre el que se actúa como contenedor de todos los elementos denuestra aplicación y por tanto será en este nodo en el que loscrearemos.2. Declaramos los vértices. Para ello definimos el Buffer deVértices a representar: 1. Tipo de vértices que debe soportar(PositionColored). 2. Longitud que debe tener, que depende de las dimensiones de nuestra imagen(ancho*alto). 3. El uso que vamos a dar (escritura, lectura…), el formato que debe tener y el lugar(pool)donde se carga la información asociada al VertexBuffer.Luego se pasa a rellenar dicho Buffer con los valores de losVértices, tanto con su posición, como con su color. Para ello esnecesario acceder al contenido del buffer, por lo tanto hay quebloquearlo, y una vez rellenado, desbloquearlo. Todo esto se hacemediante el método SetData. private void VertexDeclaration() { vb = new VertexBuffer( typeof(CustomVertex.PositionColored), width * height, device, Usage.Dynamic
  19. 19. | Usage.WriteOnly, CustomVertex.PositionCol ored.Format, Pool.Default); vertices = new CustomVertex.PositionColored[width * height]; for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { vertices[x + y * width].Position= new Vector3(x, y, heightData[x, y]); vertices[x + y * width].Color= Color.White.ToArgb(); } } vb.SetData(vertices, 0, LockFlags.None); }3. Declaramos los índices. Para ello definimos el Buffer deÍndices, que se utiliza para almacenar la posición de los Vérticesdentro del Vertex Buffer, es decir, realiza la función de puntero.Por lo tanto algunos parámetros de su definición son diferentes alos del VertexBuffer: 1. El Tipo de índices, son números enteros. 2. La Longitud en este caso es ((ancho -1)*(alto -1)*6). Se multiplica por 6, ya que cada “cara” de nuestra superficie, está formada por 2 triángulos y por lo tanto necesitamos 6 índices para definir cada una de ellas.
  20. 20. Al igual que en él VertexBuffer, este se rellena. En este caso, conenteros que indican las posiciones de los vértices. private void IndicesDeclaration() { ib = new IndexBuffer(typeof(int), (width - 1) *(height - 1) * 6, device, Usage.WriteOnly, Pool.Default); indices = new int[(width - 1) * (height - 1) *6]; for (int x = 0; x < width - 1; x++) { for (int y = 0; y < height - 1; y++) { indices[(x + y * (width - 1)) * 6] = x +(y + 1) * width; indices[(x + y * (width - 1)) * 6 + 1] =(x + 1) + y * width; indices[(x + y * (width - 1)) * 6 + 2] =x + y * width; indices[(x + y * (width - 1)) * 6 + 3] =x + (y + 1) * width; indices[(x + y * (width - 1)) * 6 + 4] =
  21. 21. (x + 1) + (y + 1) * width; indices[(x + y * (width - 1)) * 6 + 5] =(x + 1) + y * width; } } ib.SetData(indices, 0, LockFlags.None); }4. Y por último dibujamos la malla creada:protected void Draw(System.Windows.Forms.PaintEventArgs e) { device.BeginScene(); device.VertexFormat= CustomVertex.PositionColored.Format; device.SetStreamSource(0, vb, 0); device.Indices = ib; device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, width * height, 0, indices.Length / 3); device.EndScene(); }Por lo tanto, vemos como se siguen los pasos fundamentales decualquier aplicación 3D, que ya mencionamos tambiénen artículos anteriores: Inicialización, Actualización, Dibujado.El resultado sería el siguiente:
  22. 22. Catego CES MicrosoftríasTema DesarrolloAutor Goretti Ortigosa RadaMes MayoAño 2008Boletín 05Título TDT: herramientas para desarrollo MHP (Parte 1)Texto Este informe se dividirá en dos partes: Una primera que da a conocer las herramientas de desarrollo existentes para el desarrollo de aplicaciones MHP. Y una segunda parte que presenta soluciones para el montaje de un entorno de pruebas que simule las condiciones reales de emisión en TDT y la inyección de aplicaciones MHP. De esta forma daremos un
  23. 23. efoque global de las herramientas necesarias para eldesarrollo y pruebas de aplicaciones en MHP. Entorno de desarrolloPara construir aplicaciones en MHP exsisten dos posibilidades:se puede usar una herramienta MHP de autor, o bien sepuede emplear un editor de texto y un compilador de Java.Algunos prefieren usar una herramienta de autor porquesimplifica las tareas, mientras que a otros no les gusta porqueno es suficientemente flexible o por la calidad del código quegenera.Las herramientas de autor suelen incluir en una librería lasclases necesarias para compilar la aplicación MHP, dado quela especificación MHP solo contempla un subconjutno declases Java. Para aquellos que prefieran usar un editor detexto y el compilador de Java, deben hacerse con esteconjunto de clases o librería, para poder crear aplicacionesMHP que cumplan con el estándar.El desarrollo de aplicaciones interactivas en MHP es unatecnología que lleva tiempo investigándose pero que nocuenta con muchas implementaciones comerciales reales, noestá madura. Por tanto, existen posibilidades limitadas dondeelegir.La gran mayoría de la oferta presente en el mercado sonherramientas de autor, propietarias y de pago. Existenalternativas de código abierto que aportan algunasherramientas para el desarrollo de aplicaciones en MHP,aunque, debe tenerse en cuenta que, por el momento, nocumplen todas las especificaciones de estándar. Esto es unaconsideración importante a tener presente. Así mismo, elcódigo abierto no ha sido probado tan exhaustivamente comolas soluciones comerciales, debido al tamaño del mercado y alnúmero de diferentes combinaciones posibles deequipamiento, parámetros y streams. Entre estos factores yla falta de integración entre varias soluciones de códigoabierto presentes en el mercado, no resulta recomendable suuso exclusivo para la creación de aplicaciones en producción.El uso de un entorno de desarrollo especializado en MHP tienemuchas ventajas:  Agiliza la creación de aplicaciones.  Permite una adopción de la tecnología sencilla.  Permite comprender fácilmente:  Las capas en las que se divide la presentación de una aplicación.  La creación de páginas y las propiedades que se
  24. 24. le pueden asignar.  Los componentes que pueden emplearse en una página y sus propiedades.  Las propiedades de navegación entre páginas.Es decir, permitirá cumplir de forma más fiel y eficiente conlos requerimientos del proyecto. Su uso es, por tanto, muyrecomendable.Adicionalmente, para efectuar pruebas de desarrollo deaplicaciones MHP, se precisa de emuladores. Estos permitenla ejecución de aplicaciones MHP en un PC simulando lascaracterísticas de un decodificador MHP. Eso hace sencillo eldesarrollo porque pueden ignorarse algunos de los aspectosmás complicados del mismo.Tener la plataforma de desarrollo al completo en un soloordenador es muy útil para demostraciones y el ciclo decompilación, pruebas y depuración.Existen versiones comerciales y alternativas de códigoabierto gratuitas. Estas generalmente carecen de muchasfuncionalidades. No obstante son un buen punto de partida,aunque no son recomendables para desarrollar aplicacionesque se van a desplegar en producción.Se aconseja el uso del mayor número diferente deemuladores posibles para probar todo tipo de escenarios.Una cosa que un emulador no puede hacer es simular elredomiento en ejecución en un STB (Set Top Box =decodificador) real. Esto es debido parcialmente a ladiferencia de HW, pero también por la naturaleza de laaplicación, su paso por un TS (Transport Stream = Flujo detransporte), y su carga en el STB. Similarmente, emuladoresno pueden probar características intrínsecas del formato decodificación MPEG, eventos, información de servicio, etc. Portanto, lo emuladores son un valor añadido al kit de desarrollode la aplicación pero para un entorno de pruebas lo más realposible, son mejores STB reales.Herramientas de autorComo se ha comentado anteriormente, existen herramientasde autor especializadas en el desarrollo de aplicaciones enMHP.Nombraré algunas de ellas:  IDesigner (de la empresa alemana Mit-Xperts): integra entorno de desarrollo y emulador.  Cardinal Studio: integra entorno de desarrollo y emulador. Esta a diferencia del resto, si genera código fuente.
  25. 25.  AltiComposer (de la empresa coreana Alticast): integra entorno de desarrollo y emulador (el cual permite la ejecución de aplicaciones MHP creadas con otros entornos de desarrollo).  JAME Author: integra entorno de desarrollo y emulador.  mimundoTV: emulador comercial. Ventajas:  Interfaz muy visual que permite la construcción rápida de las pantallas de la aplicación MHP.  Agiliza mucho el desarrollo y por tanto, reduce el tiempo del mismo.  Se mejora el acabo final de la presentación. Esto, en mi opinión, es una causa deribada de la anterio, hay más tiempo para mimar el diseño.  No precisa de conocimientos en Java, aunque a la hora de la verdad no es así.  Diferencia claramente 3 capas: presentación, propiedades y contenidos. Permitiendo su manejo y comprensión de forma independiente. Inconvenientes:  Se trata de una herramienta de un alto coste.  No se profundiza en el desarrollo de aplicaciones MHP a bajo nivel.  No se tiene control sobre el código generado y por tanto, este no se puede optimizar.  Dependencia del entorno de desarrollo.Herramientas Open SourceDe acometer el proyecto usando herramientas de códigoabierto, tenemos la opción de contar con un entorno dedesarrollo (ej: Eclipse, Netbeans) y el kit de desarrolloJava, JDK.Estas son herramientas de código abierto, no obstante,también son unas herramientas de carácter genérico que seemplean en el desarrollo de cualquier tipo de aplicación y, porlo tanto, no presentan funcionalidades ni ayudas para eldesarrollo específico de aplicaciones en MHP.En cuanto a las posibilidades de emulación, están disponiblesde forma gratuita emuladores librescomo XletView y OpenMHP. Son una buena forma deempezar teniendo poco presupuesto. No obstante ambos, sonimplementaciones incompletas de MHP. Ventajas:  Se precisan conocimientos en Java.  Se profundiza en el desarrollo de aplicaciones MHP.  Se tiene total control sobre el código de la aplicación y por tanto sobre la calidad y optimización del mismo. Inconvenientes:
  26. 26.  No se cuenta con un entorno muy amigable.  Se desarrollará de forma más lenta.  La presentación final puede no ser tan satisfactoria sino se le dedica tiempo. Conclusión En definitiva, no existen actualmente herramientas de código abierto que sean una alternativa fiable frente a las existentes en el mercado de autor. El uso de una herramienta de autor permitirá el desarrollo ágil del proyecto, en tiempos y con el diseño deseado. No obstante, esto impedirá obtener un buen conocimiento y dominio en el desarrollo de aplicaciones MHP a parte de una ausencia de control sobre el código generado. Si el proyecto se vale únicamente de medios de código abierto, se penalizarán un poco más los tiempos de desarrollo, al menos al comienzo, durante la curva de aprendizaje. Además, visualmente se precisará de más esfuerzos para conseguir unos resultados en la interfaz similares a los de una herramienta de autor. Por el contrario, se tiene absoluto control sobre el código generado y por tanto, la posibilidad de optimizarlo, dado los bienes escasos que son el ancho de banda en emisión y los recursos de los decodificadores. (En la segunda parte se completará el artículo con información sobre opciones para montar un entorno de pruebas que simule condiciones reales.)Categorías CES OpenSouce/JavaTema DesarrolloAutor Raúl Sanz de AcedoMes MayoAño 2008Boletín 05Título Lexers, parsers, JavaCC (I).Texto Este artículo empieza una serie en la que intentaremos explicar conceptos referentes a técnicas de programación que tienen como base los analizadores léxicos (lexers), sintácticos (parsers) y su aplicación con una herramienta llamada JavaCC. Para ello intentaremos seguir el hilo de la resolución del
  27. 27. siguiente caso: 1. Tenemos una aplicación que imprime páginas de un documento. 2. Puede imprimir todas las páginas, la página actual o las páginas que elija el usuario. 3. En este último caso el usuario puede indicar aquellas páginas que desea imprimir de acuerdo a la siguiente sintaxis: a. Un número suelto indica que desea imprimir esa página. Ej: 12 quiere decir que imprima la página nº 12. b. Dos números separados por un guión indican que se imprima el intervalo de páginas incluido entre ellos, ambos inclusive. Ej: 5-8 quiere decir que se impriman las páginas 5, 6, 7 y 8. 8-5 quiere decir que se impriman las páginas 8, 7, 6 y 5. c. Las condiciones a. y b. se pueden concatenar separadas por comas. Ej: 12, 5-8 quiere decir que se impriman las páginas 12, 5, 6, 7 y 8. d. Si un número de página se indica en más de una ocasión, sólo se tomará en cuenta una única vez. Ej: 15, 13-15 quiere decir que se impriman las páginas 15, 13 y 14, y no 15, 13, 14 y 15. e. Las páginas se imprimen en el orden indicado. Ej: 12, 5-8 quiere decir que se impriman las páginas 12, 5, 6, 7 y 8 y no 5, 6, 7, 8 y 12. f. Al módulo se le pueden indicar el número máximo de páginas de forma que si el usuario solicita una página fuera de ese intervalo, se indicará un error. Ej: si el documento tienen 134 páginas y el usuario introduce 56-60, 210, se producirá un error. g. Si el usuario introduce el número 0, se producirá un error. h. Si el usuario introduce caracteres que no son cifras ni comas, guiones o espacios se producirá un error. Ej: si el introduce 85-90, a100, se producirá un error.En resumen, se trata de implementar un módulo quegestione lo que un usuario escribe en lo resaltado en rojo enesta imagen:
  28. 28. Queremos construir un módulo que dada una cadena quecumpla las condiciones arriba descritas, nos devuelva losnúmeros de las páginas a escribir en una lista y produzca unerror si se introducen caracteres erróneos o si el usuarioindica páginas incorrectas (la página número 0 o el númerode una página por encima del máximo permitido).Vamos en primer lugar a definir la gramática que especificala sintaxis que siguen las cadenas introducidas por elusuario.Una gramática describe de forma natural la estructurajerárquica de muchas construcciones de los lenguajes deprogramación.Se compone de: 1. Un conjunto de componentes léxicos denominados símbolos terminales o tokens. 2. Un conjunto de no terminales. 3. Un conjunto de producciones o reglas, en el que cada producción consta de un no terminal, llamado lado izquierdo de la producción, una flecha (u otro separador) y una secuencia de componentes léxicos y no terminales, o ambos, llamado lado derecho de la producción. 4. La denominación de uno de los no terminales como símbolo inicial.Una primera aproximación a la gramática sería ésta: inicio --> listaElementos listaElementos --> elemento | elemento SEPARADOR
  29. 29. listaElementos elemento --> ENTERO | ENTERO GUION ENTEROen la que los no terminales son inicio, listaElementos yelemento y los terminales son ENTERO, GUION ySEPARADOR. El símbolo inicial es inicio. El símbolo --> indicaque la parte izquierda de la regla produce la parte derecha.El símbolo | indica que la parte izquierda de la producciónpuede producir más de una, pero sólo una, de las partesderecha. Ej.: dada la regla elemento --> ENTERO | ENTERO GUION ENTERO elemento puede producir el token ENTERO o puede producir los tokens ENTERO GUION ENTEROLos no terminales los podemos especificarmediante expresiones regulares, de la siguiente forma: <ENTERO:(["0"-"9"])+> <GUION: "-"> <SEPARADOR:([" "])*","([" "])*>ENTERO es una cadena de al menos un carácter de longitudcompuesto de cifras. Ej.: 0, 1, 232, 2342, 43 son ENTERO a, B, 9c no son ENTEROGUION es una cadena de un carácter „-„.SEPARADOR es una cadena compuesta al menos por unacoma con cero o más espacios por delante y/o por detrás: Ejs.: ‘ ‘, ‘ ‘ es SEPARADOR , es SEPARADORCualquier otra cadena será un token no admitido por lagramática definida arriba.Mediante la gramática descrita y representando lasproducciones como árboles sintácticos, podemos expresarcualquier cadena introducida por el usuario a través de lasderivaciones producidas por los no terminales. Toda cadenareconocida por la sintaxis (o que cumpla sus reglas) tendrá almenos un árbol de derivación, y las que no estén reconocidasno lo tendrán. Ej.: dada la cadena 2, 5-8 tenemos este árbol dederivación para la misma
  30. 30. Dada la cadena 2, 5--8 no tenemos un árbol dederivación para la misma puesto que no podemos producirdos guiones seguidos ‘--‘ con la sintaxis indicada.En este punto tenemos una gramática que define la sintaxisde las cadenas que queremos controlar y los tokens queconforman dichas cadenas.Vamos a construir un analizador léxico (lexer) que dada unacadena obtenga los tokens que la conforman y se los pase alanalizador sintáctico (parser) para que nos asegure si dichostokens cumplen una sintaxis determinada.De forma gráfica:
  31. 31. Ahora bien tenemos un pequeño problema: el analizadorléxico va a ir leyendo la cadena de entrada carácter acarácter, como indica esta traza (más adelante veremos
  32. 32. cómo obtenerla), en la que señalo en negrita los caracteresque va obteniendo el lexer de la cedena 2, 5-8: Current character : 2 (50) at line 1 column 1 No string literal matches possible. Starting NFA to match one of : { <ENTERO>, <SEPARADOR> } Current character : 2 (50) at line 1 column 1 Currently matched the first 1 characters as a <ENTERO> token. Possible kinds of longer matches : { <ENTERO>, <SEPARADOR> } Current character : , (44) at line 1 column 2 Currently matched the first 1 characters as a <ENTERO> token. Putting back 1 characters into the input stream. ****** FOUND A <ENTERO> MATCH (2) ******El lexer ha leído el carácter „2‟ , por lo que intenta ver si haymás caracteres entre el 0 y el 9 para producir la cadena máslarga posible que encaje con un token <ENTERO>. Por ellolee el carácter „,‟ e interrumpe la lectura, vuelve atrás en lamisma e indica que lo que ha encontrado un ENTERO.Ahora bien ¿cuál de estas dos producciones debe seguir elparser con el token encontrado por el lexer ENTERO | ENTERO GUION ENTERO ?Y cuando encuentre un elemento, ¿qué deberá elegir en lasiguiente producción? listaElementos --> elemento | elemento SEPARADOR listaElementosEl parser no puede decidirlo. Para ello aplicaremos unatransformación gramatical, denominada factorización por laizquierda, tantas veces sea necesario.Dada la producción listaElementos --> elemento | elemento SEPARADOR listaElementosla transformamos en: listaElementos --> elementorestoListaElementos restoListaElementos --> SEPARADORlistaElementos
  33. 33. | {}donde con {} denotamos la cadena vacía.Y hacemos otro tanto con: elemento --> ENTERO | ENTERO GUION ENTEROque se transforma en: elemento --> ENTEROrestoListaElementos2 restoListaElementos2 --> GUION ENTERO | {}Con lo que la gramática queda como sigue: inicio --> listaElementos listaElementos --> elementorestoListaElementos elemento --> ENTEROrestoListaElementos2 restoListaElementos --> SEPARADORlistaElementos | {} restoListaElementos2 --> GUION ENTERO | {}En este momento tenemos una gramática que refleja lasintaxis que deben cumplir las cadenas introducidas por elusuario pero: ¿cómo pasamos de ahí a obtener una lista quenos devuelva los números de las páginas?Para ello debemos asociar acciones semánticas en algunasproducciones, esto es fragmentos de programa, quecolocaremos entre llaves. Las acciones semánticas que podemos insertar son: inicio --> {inicializacionVariables} listaElementos {procesarDatos} listaElementos --> elementorestoListaElementos
  34. 34. elemento --> ENTERO {num1 = valor(ENTERO); Si (num1 > maxPaginas) or (num1==0) ent error} restoListaElementos2 restoListaElementos --> SEPARADOR {insertarElemento(num1, num2); inicializacion(num1); inicializacion(num2);} listaElementos | {} {insertarElemento(num1, num2); inicializacion(num1); inicializacion(num2);} restoListaElementos2 --> GUION ENTERO { num2 = valor(ENTERO); Si (num2 > maxPaginas) or (num2==0) ent error} | {}En resumen lo que hemos hecho es: - Inicializar las variables que vamos a utilizar antes de analizar los datos introducidos por el usuario. - Cada vez que encontramos un token que es ENTERO chequeamos que no supere el límite o sea 0 y entonces, lo almacenamos. Si tenemos la cadena 2, 5-8 almacenaremos, sucesivamente, en num1 2 y 5 y en num2 8. - Cuando se encuentre un SEPARADOR, será el momento de guardar los valores que hemos obtenido, ya sea uno único o un intervalo. - Procesar los datos cuando todo ha ido correctamente.La creación de un analizador sintáctico, uno léxico y unasacciones asociadas para implementar la funcionalidad quequeremos va a suponer: programar un autómata quereconozca los tokens y una matriz más una pila quecontrolan las transiciones de la gramática.Aunque esto se puede hacer (yo lo he hecho en VisualBasic y JavaScript, por ejemplo), lo ideal sería que dada unagramática una herramienta nos generase automáticamente el
  35. 35. código fuente que manejase todo esto, de forma que el mantenimiento fuese sencillo. Afortunadamente existen este tipo de herramientas, llamadas generadores de analizadores sintácticos. Existen varios que dada una gramática producen el código fuente que realiza el análisis sintáctico y léxico de la misma: algunos son clásicos comoLex&Yacc, que producen código C. Para ilustrar nuestro ejemplo vamos a utilizar JavaCC, que nos generará código Java. Esto lo veremos en el siguiente artículo. Referencia: - Compiladores. Principios, técnicas y herramientas. Aho, Lam, Sethi, Ullman. Si quieres enviar algún comentario o sugerir temas a tratar en otros artículos, escribe a: curtasun[simboloArroba]cein.esCateg CES OpenSouce/JavaoríasTema DesarrolloAutor Carlos UrtasunMes MayoAño 2008Boletí 05nTítulo Configuración de las máquinas Linux servidor y cliente para tener repositorios remotos con Subversion (Parte 1)Texto El problema que se pretende solucionar es la configuración de un repositorio remoto de subversion. Se trabajaría con dos máquinas, en las que una contendría el repositorio de subversion y la otra un servidor apache. El objetivo de esto es hacer una arquitectura de dos capas que permita separar la lógica de la información. El ejemplo aquí aplicado se ha hecho sobre dos máquinas CentOs 5.1 sin entorno gráfico que tienen activados tanto el firewall con Iptables como SELinuxen modo enforcing. Se pretende hacer que una de ellas contenga un repositorio de Subversion y la otra el servidor apache que manejará las peticiones a la misma. Esto se puede hacer utilizando el
  36. 36. servicio nfs y montando los archivos del repositorio de una en laotra.PREPARACIÓN DEL SISTEMA:Lo primero que hay que hacer en las dos máquinas es comprobar sitienen instalado el paquete yum. Si no fuera el caso habría quedescargarlo e instalarlo. Esto se debe a que resulta interesantecomprobar antes de ponerse a hacer cosas más complicadas si losproblemas que causa Selinux se resuelven con una actualización dela política del mismo.Una vez instalado se ejecuta:yum install yum-fastestmirrorEntonces se eliminan todos los restos de la versión que se va aabandonar de la caché de yum en /var/cache/yum mediante elcomando:yum clean allPara la actualización del yum es buena idea hacerlo desde fuera delentorno de gráfico, si es que se tiene. Para ello hay que salir delentorno gráfico e ir a una consola empleando:ctrl + alt + F1se accede como root, y se va al runlevel 3 para accederdirectamente a un terminal sin entorno gráfico.
  37. 37. telinit 3Se actualizan los paquetes con:yum upgradeyum puede quejarse de conflictos o requerimientos. Esto se deberáprobablemente a que se han usado repositorios no estándar o sehan instalado paquetes no estándar manualmente. Trate deadivinar qué paquetes causan el problema (o al menos si son unaparte de la cadena de dependencias) – desinstálelos y pruebe denuevo. Recuerde volver a instalar los paquetes de nuevo si sonesenciales.Asegúrese que todos los nuevos paquetes esenciales de la nuevaversión se han instalado con:yum groupupdate BaseUna vez que se ha actualizado todo, incluido las políticas de selinux,etc. se puede pasar a hacer las configuraciones pertinentes.CONFIGURACIÓN DE SUBVERSION:Además de esto se deberán descargar en el lado del servidor elmódulo mod_dav_svn y en el otro, los módulos de subversion ymod_dav_svn.Se debe actualizar el fichero httpd.conf delservidor Apache añadiendo tras la directiva LoadModuledav_module modules/mod_dav.so, la directivaLoadModuledav_svn_module modules/mod_dav_svn.so y luego hay que añadiral menos en el fichero:<Location /Nombre> DAV svn SVNPath /Path/to/Repository</Location>Este apartado de location se puede complicar añadiendoautentificación, autentificación por repositorio, etc. Sirve para decirque cada vez que se invoque al servidor web conhttp://URLServidor/Nombre, se muestre el contenido del repositoriosituado en /Path/to/Repository.NFS:
  38. 38. Después de comprobar que está instalado en la máquina unservidor de NFS se debe editar el archivo /etc/exports e introducirpor cada directorio a exportar/Directorio IPMáquina (opciones)o/Directorio IPRed/Máscara (opciones)Hay varias opciones posibles como ro para dar acceso en modo sólolectura, rw si se quiere añadir también permisos de escritura,opciones de sincronización, etc. Para ver la lista completa se deberecurrir al manual. En el caso de estudio propuesto lo que se hizofue:/Directorio IPMáquina (rw,sync,no_root_squash)La prudencia aconseja editar los ficheros /etc/hosts.allow y/etc/hosts.deny para acabar de especificar qué ordenadores de lared pueden usar los servicios del servidor. La documentación delNFS recomienda las siguientes entradas/etc/hosts.denyportmap:ALLlockd:ALLmountd:ALLrquotad:ALLstatd:ALL/etc/hosts.allowportmap:Red/Máscara o IPDelOrdenadorConcretolockd:192 Red/Máscara o IPDelOrdenadorConcretomountd: Red/Máscara o IPDelOrdenadorConcretorquotad: Red/Máscara o IPDelOrdenadorConcretostatd: Red/Máscara o IPDelOrdenadorConcretoDe todos modos se podría hacer una configuración mucho más finaespecificando para cada servicio las direcciones IP que tendránacceso a él.Si se ha cambiado el fichero /etc/exports después de iniciar el
  39. 39. servicio NFS se deberá indicar al sistema que vuelva a leer el fichero y active los cambios. Esto se puede hacer reiniciando el demonio nfsd o bien mediante exportfs -ra Una vez iniciado el servicio nfs y el servicio portmap, el directorio se monta con nfs en el servidor que tiene Apache como: mount –t nfs –o rw,context=system_u:object_r:httpd_sys_content_t ipServidorNFS:/Directorio/a/montar /Directorio/donde/se/monta Es importante añadirle ese contexto, puesto que lo que permite es que el SELinux permita al apache que pueda interactuar con él. Para las operaciones de lectura y escritura del apache sobre subversion, es importante que el propietario del repositorio sea apache:apache (chown –R apache:apache /Directorio). Si se quiere que el sistema de ficheros NFS sea montado al arrancar se deberá añadir una entrada en el fichero /etc/fstab. En el ejemplo se añadiría: IPMáquinaRepositorioSubversion:/Path/to/Repository /Directorio/de/montaje nfs rw,context= system_u:object_r:httpd_sys_content_t 0 0 ENLACES DE INTERÉS: YUM  http://fedoraproject.org/wiki/YumUpgradeFaq NFS  http://bulma.net/body.phtml?nIdNoticia=1255 Subversion  http://svnbook.red-bean.com/  http://es.wikipedia.org/wiki/SubversionCatego CES OpenSouce/JavaríasTema DesarrolloAutor Blanca Cubas CruzMes Mayo
  40. 40. Año 2008Boletín 05

×