Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

17 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
lunes, 31 de enero de 2011
Estos son los enlaces publicados en Variable not found en Facebook y Twitter desde el domingo, 23 de enero de 2011 hasta el domingo, 30 de enero de 2011.

Espero que te resulten interesantes. :-)
Y no olvides que puedes seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.

Publicado en: Variable not found
miércoles, 26 de enero de 2011
ASP.NET MVCDesde la primera versión de ASP.NET MVC se permite añadir a la mayoría de los helpers que generan etiquetas HTML atributos personalizados. Para ello, se introducían objetos anónimos cuyas propiedades eran transformadas a atributos en el momento del renderizado, como en el siguiente ejemplo:
Llamada a TextBoxFor() con atributos personalizados
Este código generaría el siguiente marcado:

Marcado generado

Ahora que se van a poner muy de moda los atributos personalizados al estilo HTML5, como los “data-xxxx”, nos encontramos con un pequeño problema a la hora de introducirlos en objetos anónimos: los lenguajes como C# o VB no permiten el uso de guiones en los nombres de propiedades, por lo que si escribimos el siguiente código, se generará un error de compilación:

Uso de propiedad incorrecta
En ASP.NET MVC 3, por convención, es posible introducir este tipo de propiedades, pero utilizando el guión bajo (“_”) en lugar del guión medio (“-“). O en otras palabras, si queremos que el helper genere un atributo data-xx en el marcado HTML, debemos nombrar la propiedad del objeto anónimo como data_xx, tal y como se hace en el siguiente ejemplo:

Uso del guión bajo


… que generaría el siguiente marcado, correcto en HTML5:

image

Publicado en: Variable not found.
martes, 25 de enero de 2011
Acceso a datos con .NET Framework 4
Días atrás presentaba el nuevo curso de ASP.NET MVC 3 en CampusMVP, y ahora le toca el turno a otro de los asuntos que me ha tenido bastante entretenido los últimos meses: el nuevo curso de preparación de la certificación 70-516 TS: Accessing Data with Microsoft® .NET Framework 4.

El objetivo del curso es ayudaros a preparar el examen 70-516 de Microsoft que os certificará como Technology Specialists en acceso a datos sobre la versión 4 del framework. Sin embargo, el curso está conceptualizado para lograr un objetivo aún mayor: aprender a identificar, seleccionar e implementar con éxito todas las tecnologías de acceso a datos disponibles en la última versión del marco de trabajo de Microsoft, de forma que los conocimientos adquiridos os sean de utilidad en vuestra vida profesional.

Para ello, se ha creado un completo temario exclusivo para el curso, en el que se incluyen más de 130 temas con orientación muy práctica, cerca de 4 horas de vídeos explicativos, aplicaciones de ejemplo, enlaces, y otros recursos, a través de los siguientes módulos:
  • Preparación de la certificación 70-516 TS: Accessing Data with Microsoft® .NET Framework 4 Introducción, donde hacemos una breve presentación del curso y una rápida revisión de las tecnologías de acceso a datos incluidas en .NET Framework 4 y que iremos desgranando a lo largo del curso.
  • El núcleo de ADO.NET, donde comenzamos desde cero tratando temas básicos como conexiones, comandos de consulta y actualización, o transacciones, hasta profundizar en asuntos algo más avanzados como la encriptación de cadenas de conexión, comandos asíncronos, MARS, el uso del LTM, técnicas de control de concurrencia, la abstracción del origen de datos usando factorías de proveedores, y muchos otros temas.
  • Uso de DataSets, la solución clásica para la gestión de datos desconectados que sigue siendo válida en determinados escenarios. En este módulo detallaremos el proceso de definición de conjuntos de datos en memoria (tablas, columnas, restricciones, etc.), la carga desde fuentes de datos externas usando adaptadores, fórmulas para la realización de consultas, actualización de datos en memoria y traslado a la base de datos relacional, la gestión de conflictos, la relación con XML, o la tecnología LINQ To DataSet, entre otros temas.
  • Entity Framework, donde partiremos de la descripción arquitectural del marco de entidades e iremos profundizando progresivamente en sus distintos componentes de forma práctica:
    • En El EDM, trataremos la creación y personalización del Entity Data Model, desde escenarios de mapeo simples hasta el modelado de herencia, el uso de tipos complejos o el mapeo avanzado de entidades.
    • La sección Entity Client describe las interioridades de este proveedor de acceso a datos a través de los modelos conceptuales. Veremos su paralelismo con otros data providers y aprenderemos a utilizar sus conexiones, a crear consultas utilizando el lenguaje eSQL, y a recuperar los datos obtenidos en ellas.
    • A continuación, estudiaremos Object Services y el papel fundamental que juega en la arquitectura de Entity Framework. Veremos el contexto de objetos, las fórmulas para la realización de consultas fuertemente tipadas sobre el modelo conceptual, y trataremos otras funciones vitales, como la materialización de entidades, la resolución de identidad o el seguimiento de estado.
    • Descrita ya toda la infraestructura, entraremos en LINQ to Entities, la extensión de LINQ que nos permite realizar consultas integradas sobre los modelos conceptuales.
    • También dedicaremos varios temas a describir en detalle cómo realizar operaciones de actualización del origen de datos utilizando Object Services (inserción, actualización, y eliminación), y deteniéndonos a tratar aspectos como la transaccionalidad, los problemas de concurrencia o el uso de objetos desconectados.
    • Por último, dedicaremos varios capítulos a la personalización de contextos y entidades mediante el uso de plantillas T4, la creación de STE (Self-Tracking Entities) y el uso de objetos POCO (Plan Old CLR Objects).
  • El siguiente módulo, LINQ to SQL, trataremos esta tecnología que, aunque ampliamente superada por Entity Framework, puede ser de utilidad en escenarios simples (bueno, y entra en el examen 70-516 ;-)). Veremos cómo crear modelos de objetos, su personalización y aprenderemos a utilizar el contexto de datos para la realización de consultas mediante LINQ, así como a actualizar el origen de datos gestionando los posibles problemas de concurrencia que pueden aparecer, pasando por aspectos como la transaccionalidad de las operaciones, o el uso de objetos desconectados.
  • En WCF Data Services detallaremos el uso de servicios WCF de acceso a datos utilizando OData (Open Data Protocol). Comenzaremos creando servicios y configurándolos para permitir el acceso a datos utilizando la semántica REST, y veremos cómo acceder a ellos de forma directa y utilizando las librerías cliente, tanto para consultar como para actualizar datos. También, entre otros asuntos, estudiaremos la creación de interceptores, operaciones personalizadas, y veremos cómo realizar operaciones asíncronas.
  • Terminando ya con el temario, realizaremos una introducción a Sync Framework, el marco de trabajo que nos permite implementar escenarios OCA (Ocassionally Connected Applications) mediante el uso de una base de datos local capaz de sincronizarse con otras fuentes de datos. Veremos cómo crear y configurar cachés locales, tanto en escenarios locales como distribuidos, y estudiaremos las operaciones de sincronización y el tratamiento de conflictos.
  • Y por último, una Guía del Examen, que incluye valiosos consejos y trucos vistas a superar el examen de certificación.
Como magníficos complementos y ampliaciones al temario, el material del curso incluye los siguientes libros en formato PDF, imprimibles y sin DRM:
El curso se imparte totalmente online, a través de la plataforma CampusMVP, sin horarios y a vuestro propio ritmo. La duración total del curso está estimada en 16 semanas (con una dedicación media de 8 o 10 horas por semana, dependiendo del nivel de partida), y durante las cuales, como tutor, contaréis con mi asistencia para resolver vuestras dudas.

¡Garantía de aprobado CampusMVP!Adicionalmente, para que vayáis bien preparados al examen, el curso incluye 6 meses de acceso a las simulaciones del examen oficial de MeasureUp, el único proveedor avalado por Microsoft. Durante este tiempo podréis practicar todo lo que necesitéis hasta estar bien preparados e ir al examen con total tranquilidad.

Ah, aprovecho también para decir que este curso está incluido dentro de la nueva iniciativa Garantía de aprobado de CampusMVP. Esto implica que si seguís la metodología propuesta y os preparáis a conciencia, en caso de no superar el examen de certificación se os devolvería el importe del curso, aunque ya os adelanto que no os va a hacer falta… ;-)

En cualquier caso, vayáis al examen o no, los conocimientos adquiridos seguro os pondrán a la última en tecnologías de acceso a datos de Microsoft, y podréis aplicarlos de inmediato en la vida real. ¡Espero poder veros por allí!

Enlace: Preparación de la certificación 70-516 TS: Accessing Data with Microsoft® .NET Framework 4 en CampusMVP.

Publicado en: Variable not found.
domingo, 23 de enero de 2011
Estos son los enlaces publicados en Variable not found en Facebook y Twitter desde el lunes, 17 de enero de 2011 hasta el domingo, 23 de enero de 2011. Espero que te resulten interesantes. :-)
Y no olvides que puedes seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.

Publicado en: Variable not found
miércoles, 19 de enero de 2011
ASP.NET MVCEn el nuevo ASP.NET MVC 3 me he topado con dos helpers que no conocía y que, a pesar de su sencillez, en ocasiones pueden resultar bastante interesantes: ObjectInfo y ServerInfo. Vamos a verlos muy rápidamente.

ObjectInfo

El primero de ellos puede sernos útil cuando queremos volcar el contenido completo de un objeto sobre la página, por ejemplo cuando estemos depurando. La forma general de utilización es la siguiente:

ObjectInfo.Print(objeto, profundidad, elementos_enumeracion)

Los parámetros son:
  • objeto, que es el objeto que queremos volcar.
  • profundidad, el número de niveles en caso de tratarse de objetos cuyas propiedades son, a su vez, otros objetos.
  • elementos_enumeracion, el número de elementos mostrados cuando se trata de colecciones.
Un ejemplo (con el motor WebForms):


<%: ObjectInfo.Print(Model, 2, 5) %>

El resultado será un contenido HTML maquetado de forma que pueda apreciarse muy claramente el contenido del objeto. En la siguiente captura de pantalla se observa el resultado, teniendo en cuenta que hemos enviado al helper un objeto que contiene un enumerable de Personas :

Resultado de ObjectInfo.Print()

ServerInfo

Por otra parte, el helper ServerInfo muestra información sobre el servidor en el que se está ejecutando la aplicación: configuración y variables de servidor, información del runtime y variables de entorno.

Su único método, que además no tiene parámetros, retorna el string HTML listo para ser incluido en la salida, por ejemplo así (en Razor):


@ServerInfo.GetHtml()

Y el resultado sería como el que sigue:

Resultado de ServerInfo.GetHtml()


Publicado en: Variable not found.
lunes, 17 de enero de 2011
Estos son los enlaces publicados en Variable not found en Facebook y Twitter desde el lunes, 10 de enero de 2011 hasta el domingo, 16 de enero de 2011.

Espero que te resulten interesantes. :-)
Y no olvides que puedes seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.

Publicado en: Variable not found
A finales de la semana pasada, coincidiendo con el lanzamiento del producto, se ha publicado mi curso de ASP.NET MVC 3 en CampusMVP. Todo un récord, teniendo en cuenta el ritmo que llevan los de Redmond ;-D

El material es una revisión del curso de MVC 2, que tanto éxito de crítica y público ha tenido durante el pasado año, adaptado por completo a las novedades presentes en la nueva versión del marco de trabajo:
  • Introducción a ASP.NET MVC, donde realizamos un primer acercamiento al framework MVC, y sentamos las bases sobre las que continuar el aprendizaje.
  • El siguiente módulo, la  primera aplicación ASP.NET MVC, crearemos nuestra primera aplicación partiendo de las plantillas por defecto de Visual Studio, que nos será de utilidad para comprender la estructura de este tipo de proyectos y el funcionamiento del marco de trabajo.
  • Continuaremos añadiendo funcionalidades a esta aplicación, donde introduciremos nuevas características partiendo desde cero, aprovechando la ocasión para profundizar en la creación de modelos, vistas y controladores.
  • Seguidamente estudiaremos la capa Modelo a fondo, viendo distintas formas de implementar sus componentes.
  • A continuación, nos sumergimos en la capa Controlador, detallando minuciosamente la creación de controladores, las posibilidades que nos ofrecen, y el conjunto de herramientas que nos facilita el framework para ellos, como el sistema de routing, el binding, filtros, o resultados de acciones.
  • También trataremos con gran detalle la creación de la capa Vista, donde describiremos sus tipos, implementación y mecanismos del marco de trabajo que nos facilitan la tarea, como los helpers estándar, plantillas, validadores, o los nuevos helpers de Webpages, entre otros, utilizando los motores de vistas Webforms (ASPX) y el nuevo Razor.
  • En Ajax con ASP.NET MVC realizaremos un recorrido por las distintas alternativas para la introducción de Ajax en nuestros sistemas, y mostraremos la solución a escenarios comunes.
  • También trataremos cómo organizar los proyectos en Áreas, y los cambios que implican en cuanto a la estructura y funcionamiento de las aplicaciones.
  • Y por último, dedicaremos un capítulo a temas adicionales, básicamente para tratar otros aspectos no incluidos en los módulos anteriores, como la realización de pruebas unitarias y las nuevas facilidades para la resolución de dependencias, internacionalización, el despliegue de aplicaciones, o el gestor de paquetes NuGet.
El temario está salpicado por más de dos horas de vídeos demostrativos, aplicaciones de ejemplo, recursos adicionales, y consejos del día a día, que seguro harán de MVC vuestro marco de trabajo favorito ;-)

El curso se imparte totalmente online, a través de la plataforma CampusMVP, sin horarios y a vuestro propio ritmo. La duración total del curso está estimada en 12 semanas (con una dedicación media de 5 o 6 horas por semana, dependiendo del nivel de partida), y durante las cuales, dado que soy el tutor, contaréis con mi asistencia para resolver vuestras dudas e inquietudes, y ayudaros a lo largo del proceso formativo.

Si estáis interesados, sólo tenéis que ir a la tienda online de CampusMVP y apuntaros directamente. Tened en cuenta que si trabajáis en España los cursos pueden salirle gratis a la empresa gracias a la formación bonificada.

¡Espero veros por allí! ;-)

Y recordad:

Curso de ASP.NET MVC 3

Publicado en: Variable not found.
martes, 11 de enero de 2011
Uno de los libros que recuerdo haber leído con más entusiasmo en los últimos años fue el primero de Krasis Press sobre Entity Framework (bueno, y de hecho era el primero a nivel mundial por entonces en tratar este tema). Ya entonces comenté por aquí lo que me pareció, una lectura de lo más recomendable para sumergirse en esta tecnología.

ADO.NET Entity Framework 4.0. Aplicaciones y servicios centrados en datosPor esta razón esperaba impaciente la actualización del mismo a la versión 4 de Entity Framework, que durante estas navidades he tenido oportunidad de devorar. Y de nuevo de la mano de un figura como Unai Zorrilla y sus colaboradores (Yamil Herández, César de la Torre y Pablo Peláez), he disfrutado de lo lindo.

Lo primero que me ha llamado la atención es que, aunque se podía esperar lo contrario, se trata de un libro nuevo. Es decir, no es el anterior con ligeras indicaciones sobre los cambios introducidos en la última versión del marco de entidades, sino que ha sido reescrito integrando en sus contenidos las novedades, lo que hace su lectura más natural, y sobre todo para los que aún no han trabajado con esta tecnología o no leyeron el libro anterior.

Eso sí, como introduce José Manuel Alarcón (director de Krasis y MVP en ASP.NET) en su prólogo, “no se trata de un libro de recetillas”; en él encontraremos desde trucos y aspectos eminentemente prácticos hasta fundamentos del funcionamiento interno de la tecnología que nos permitirán tener un mayor control sobre ella.

Tampoco es un libro para principiantes: tanto la temática como la forma de tratarla hacen necesario que el lector disponga de ciertos conocimientos sobre bases de datos, programación orientada a objetos, arquitecturas y lenguajes de programación para la plataforma .NET.

El contenido está estructurado en cinco capítulos principales:
  • El primer capítulo nos introduce en el concepto de modelos de dominio, y presenta Entity Framework y sus distintos componentes.
  • A continuación se profundiza en el Entity Data Model y el diseño de modelos, desde mapeos básicos hasta conceptos algo más avanzados, como la herencia, table splitting, o las model defined functions.
  • El tercer capítulo nos presentará Entity Client, el proveedor de datos ADO.NET específico para trabajar con modelos conceptuales, y nos mostrará cómo trabajar directamente con él para consultar información.
  • Seguidamente, ascendemos un nivel más en las capas de abstracciones que Entity Framework establece sobre el almacén de datos, pasando a estudiar Object Services y LINQ to Entities, que de forma conjunta nos ofrecen ya las funcionalidades que nos permiten trabajar directamente con objetos del modelo, abstrayéndonos del motor subyacente a la hora de consultar y actualizar información. En este capítulo se describen además temas tan interesantes como las entidades self-tracking (STE) y POCO.
  • En el capítulo 5, llamado “EF 4.0 en el mundo real”, los autores desarrollan un completo escenario donde demuestran las posibilidades de uso de este marco de trabajo en sistemas n-layer, describiendo paso a paso cómo crear los distintos componentes que entran en juego.
Y adicionalmente se incluyen otros tantos anexos:
  • Fundamentos de LINQ, que nos permite conocer y familiarizarnos con el lenguaje integrado de consultas.
  • Referencia de eSQL (Entity SQL), el lenguaje de consultas de Entity Client.
  • Notas sobre el rendimiento de Entity Framework, con consejos y recomendaciones para hacer el acceso a datos de nuestras aplicaciones más eficiente.
  • Plantillas T4, donde se realiza una introducción a la creación de plantillas de este tipo.
  • Referencia de uso de la herramienta de línea de comandos edmgen.exe.
En definitiva se trata de un libro completo, que toca prácticamente todos los puntos necesarios para introducirnos de lleno en el mundo de Entity Framework 4, tanto si anteriormente hemos trabajado con esta tecnología como si lo que pretendemos es iniciarnos en ella.

El libro puede adquirirse directamente en la tienda online de Krasis, en formato papel y PDF. Además, desde esa misma página es posible descargar el código de los ejemplos del libro, y acceder al índice y primer capítulo en Scribd, por si queréis echarle un vistazo.

Ah, y como interesante complemento si queréis estar a la última, no os perdáis la serie de posts del autor, Unai, sobre Code-First, una extensión de Entity Framework (actualmente aún en pruebas) que permite crear bases de datos a partir del código, sin necesidad de usar los diseñadores de Visual Studio.

Publicado en: Variable not found.
lunes, 10 de enero de 2011
Inauguramos también los enlaces interesantes de este año, con los publicados en Variable not found en Facebook y Twitter desde el lunes, 20 de diciembre de 2010 hasta el domingo, 09 de enero de 2011.
Y no olvides que puedes seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.

Publicado en: Variable not found
domingo, 9 de enero de 2011
Top posts 2010 en Variable not foundPrimero, ya que este post inaugura el recién estrenado 2011 en Variablenotfound.com, aprovechar estas líneas para desearos a todos un feliz año nuevo. Espero que se cumplan vuestros sueños, con salud, y en buena compañía.

Y ahora, tal y como manda la tradición, comentaré los posts más vistos durante el año que acabamos de cerrar, distinguiendo entre los que han sido publicados en 2010, y los que forman ya parte del archivo histórico del sitio y que siguen teniendo gran aceptación.

Cosecha de 2010

Encabezando la lista, además con bastante diferencia sobre el siguiente, el post ASP.NET MVC 2: Quince cuestiones que deberías conocer, un megapost que ya va por su tercera versión (y probablemente pronto podamos tener la cuarta ;-)), en la que se responden preguntas muy básicas sobre ASP.NET MVC. Supongo que de alguna forma, demuestra que el interés de la comunidad de desarrolladores por este framework va creciendo a buen ritmo :-)

Justo detrás en las más visitadas, encontramos dos entradas clasificadas en la categoría de “humor”, lo cual ya dice bastante sobre el tipo de fauna que pulula por aquí ;-D… La primera, muy reciente, es 32 Síntomas que indican que estás afectado por el desarrollo, una particular colección de extrañezas conductuales en las que los desarrolladores parece que coincidimos bastante, mientras que la segunda es un post de hace ya varios meses, Consejos imprescindibles por si algo falla, donde recogía una lista de recomendaciones y buenas prácticas a tener en cuenta cuando nuestras aplicaciones pretenden dejarnos en mal lugar.

En cuarto puesto tenemos el artículo llamado Edición elegante de fechas con jQuery Datepicker y MVC, paso a paso, en el que mostraba cómo combinar templated helpers de ASP.NET MVC con jQuery para crear editores de propiedades de tipo fecha muy profesionales.

Curiosamente, el quinto puesto lo ocupa un post de esos que escribes cuando descubres algo que probablemente todo el mundo conocía menos tú, pero resulta que no, que es útil para más gente: Acceder al contenido de un .vhd desde Windows XP/Vista.

En el sexto lugar, encontramos la serie Leyes epónimas relacionadas con el desarrollo de software, donde se recogían un buen número de leyes que llevan el nombre de su creador, con alguna o mucha relación con nuestra profesión.

En séptimo, un post que mostraba cómo utilizar JSON para el intercambio de datos entre cliente y servidor, sobre tecnología ASP (sin el .NET de detrás): Ajax con ASP: intercambio de datos JSON.

Los puestos octavo y noveno son para artículos muy técnicos y centrados en ASP.NET MVC: Validación de rangos decimales en cliente y servidor para ASP.NET MVC 2, y Formularios con autoguardado en ASP.NET MVC.

Y por último, en el décimo, se ha colado en el último momento el post Llega la Programación Gestual: Visual Studio Kinect Edition, la inocentada del pasado 28 de diciembre que, como todos los años, tanto me divierte escribir.

Cosecha de años anteriores

A continuación cito los artículos escritos años anteriores, pero que siguen estando entre los más visitados del blog.

Como siempre, en cabeza no podía faltar la eterna serie de citas célebres del mundo de la informática, tres posts algo viejunos que recogían más de 300 frases imprescindibles de nuestro mundillo, y que siguen atrayendo visitas de forma impresionante.

A continuación, y no a demasiada distancia de los anterior, jqGrid: Grids espectaculares para ASP.NET MVC, paso a paso, un artículo que describía paso a paso cómo utilizar el plugin jqGrid para implementar rejillas de datos en aplicaciones ASP.NET MVC.

Seguidamente, un clásico del año 2007: Bordes redondeados en webs (sin esfuerzo) con Nifty Corners Cube, que pone de manifiesto la pesadilla que sigue siendo la creación de esquinas redondas en elementos de bloque HTML. Menos mal que CSS3 viene al rescate pronto…

En sexto lugar, más de la cosecha de 2007, Llamar a métodos estáticos con ASP.NET Ajax, un artículo que describía la utilización de PageMethods como mecanismo de comunicación cliente-servidor utilizando Ajax. Aunque se refería a la versión 2.0 de ASP.NET, parece ser que todavía la información es útil.

Sin duda el 2007 fue un gran año, pues justo detrás tenemos el post Evitar el postback al pulsar un botón en ASP.Net, donde se mostraban diversos escenarios en los que podría ser interesante la cancelación del postback al pulsar un botón en formularios web ASP.NET.

Prácticamente igualado con el anterior, 32 técnicas de producción de ideas, un resumen de técnicas para la generación de ideas publicadas allá por 2008 en Neuronilla (ahora hay más), que sigue atrayendo muchos visitantes.

Por último otro gran clásico, 13 Consejos para comentar tu código, que recoge una serie de recomendaciones y buenas prácticas para comentar el código fuente y hacerlo más legible. Como curiosidad, este artículo ha sido traducido y publicado en varios idiomas (inglés, chino, y otros que soy incapaz de identificar), e incluso ha aparecido publicado en una revista India.

Y hasta aquí el tradicional resumen anual, espero que os sea interesante para descubrir entradas que en su día os perdisteis, o simplemente, por la curiosidad de conocer los temas que más interesan de este sitio.

Espero seguir viéndoos por aquí en 2011, no me faltéis, eh? Guiño

Publicado en: Variable not found.