lunes, 12 de febrero de 2018

Tecnología - Google Glass

Publicado originalmente el 2013-02-22, en https://itsouvenirs.wordpress.com/2013/02/22/tecnologia-google-glass/. Es posible que algunos enlaces ya no estén disponibles o posean un contenido distinto el descrito en esta entrada.

Hola a todos. Solo quería compartirles este vídeo que acabo de encontrar en YouTube. Es acerca de la propuesta de tecnología de Google en la categoría de los aparatos "Smart", llamada "Glass". Básicamente consisten en unos lentes con cámara integrada, reconocimiento de voz, y conexión a Internet y redes sociales. Así como existen Smart Phones y Smart TV's, esto podría llamarse algo así como "Smart Glasses", jejeje.

Aparentemente este proyecto fue revelado desde el año 2012, y ya se han realizado demostraciones y pruebas con algunas personas. El vídeo es una especie de vídeo promocional del aparato, e incluye una compilación de tales pruebas: https://youtu.be/wTxFxk2dwaQ (en febrero de 2018 ya no está disponible el vídeo que ví originalmente, así que dejo el link a una copia del vídeo).

Para mayor información pueden visitar el Sitio web oficial de Google Glass. Y si viven en Estados Unidos, podrían aplicar para ser una de las personas elegidas para ser uno de los "Exploradores", respondiendo la pregunta: ¿Qué harías si tuvieras Glass?.

Realmente la tecnología está avanzando muy rápido a tal punto de ver cosas que hace unos 20 años solo existían en las películas de ciencia ficción.

jueves, 8 de febrero de 2018

SQL Server Snippets - Buscar columna en base de datos

Publicado originalmente el 2013-02-19, en https://itsouvenirs.wordpress.com/2013/02/19/sql-server-snippets-buscar-columna-en-base-de-datos/.

Saludos a todos. Aprovechando un poco mi hora de almuerzo (para escribir el post, aunque lo publiqué en la noche, jejeje), quería compartirles este pequeño snippet, que consiste en una consulta para obtener el listado de tablas en las que exista una determinada columna, y es básicamente el siguiente:

Dónde nombre_columna es el nombre de la columna que se desea buscar.

El snippet puede modificarse para buscar también las columnas en cuyo nombre se incluya cierta palabra, cambiando el igual (=) de la condición por un LIKE, así:

En este caso, el nombre de las tablas podría repetirse, en casos en los que más de una columna de la tabla posea la palabra buscada.

A modo de ejemplo, al ejecutar el siguiente script en la base de datos AdventureWorks:

La consulta nos devuelve los siguientes resultados:
Esta consulta me ha sido de gran ayuda en casos en los que la base de datos “relacional” no posee todas las debidas relaciones entre las tablas, ya que me permite encontrar las tablas en las que aparece cierta columna, para tratar de descubrir las posibles relaciones faltantes.

La consulta ha sido probada en SQL Server 2005 hasta SQL Server 2012, y funciona sin problemas. Muy posiblemente funcionará en versiones posteriores.

SQL Server Snippets - Pausa

Publicado originalmente el 2013-02-13, en https://itsouvenirs.wordpress.com/2013/02/13/sql-server-snippets-pausa/.

En esta ocasión les dejo un snippet corto, pero muy interesante, que consiste en hacer cómo hacer una pausa en SQL Server. Esto vendría siendo similar a un sleep en otros lenguajes de programación.

El comando es sencillo:
waitfor delay '00:01:00'
En dicho ejemplo se muestra el comando para hacer una pausa por un minuto.

Ahora, ¿por qué diantres quería yo hacer una pausa en SQL Server? En mi caso, lo utilicé para hacer pruebas con un trigger. Puse el comando dentro de un trigger "on update" porque quería saber si la aplicación actualizaba los datos de cierta tabla antes de realizar una determinada acción. Si la acción se realizaba luego de la pausa, sabría que el trigger se ejecutaba antes de dicha acción, y esto a su vez me indicaría que los datos de la tabla eran actualizados antes de la acción.

Este es solo un ejemplo, pero pueden haber muchos otros casos. La verdad es que si la sentencia existe, es porque alguien pensó que serviría para algo, jejeje...

Por cierto, esta sentencia solo la he probado en SQL Server 2005, pero probablemente aún siga disponible, incluso en la versión 2012 2016.

domingo, 14 de enero de 2018

WP - Atributo de MVC 2 para filtrar acciones para solicitudes AJAX

Ya llevo un par de meses trabajando con ASP.NET MVC Framework 2, y debo decir que me ha encantado. Y sé que van por la versión 4, pero en el trabajo contamoscon Visual Studio 2008, así que hay que aprovechar lo que se tiene, y debo decir que en realidad no es poco.

En esta ocasión quiero mostrar una forma de crear un atributo de filtrado para acciones que deben ser ejecutadas solamente mediante solicitudes Ajax. Esto es útil para acciones que deseamos utilizar exclusivamente para estas solicitudes, y que queremos que el usuario común tenga acceso a ellas solamente a través de esta forma, mediante alguna interacción con la interfaz de usuario (UI), por ejemplo.

Primero, es necesario encontrar una forma de identificar que el tipo de solicitud es XML HTTP request, que es la clase de solicitudes que se hacen mediante AJAX. El objeto HttpRequest del que disponemos en una aplicación ASP.NET no cuenta con un método propio para identificar este tipo de solicitud, por lo que es necesario trabajar un poco en esta parte. Para ello, crearemos un método de extensión que se encargue de verificar esto. El método que presento a continuación es prácticamente una copia de la respuesta de Charlino a la pregunta de StackOverflow titulada How to check if request is ajax or not in codebehind - ASP.NET Webforms, que a su vez se basa en el código fuente del MVC Framework (que es open source, o código libre, por cierto).


Como puede observarse, el método revisa directamente el encabezado del request, para verificar el tipo de solicitud. Si el tipo de solicitud es XMLHttpRequest, devuelve verdadero, y falso en caso contrario.

Actualización: Existe un método de extensión para la clase HttpRequestBase en el espacio de nombres System.Web.Mvc, con el mismo nombre y funcionalidad que el del método propuesto (IsAjaxRequest). Podría usarse este en vez de crear una nueva extensión, solamente incluyendo el espacio de nombres System.Web.Mvc.

Teniendo este método disponible, podemos proceder a crear el atributo de filtro. Este es un atributo de filtro convencional, por lo que será descendiente o derivado de la clase ActionFilterAttribute. Como se observa a continuación, el atributo es bastante simple:


Como puede observarse, todo el proceso de verificación se realiza sobrecargando el método OnActionExecuting, que se ejecuta justo antes de proceder a ejecutar la acción. Acá hacemos uso del método de extensión para verificar si la solicitud (request) es de tipo Ajax, y si no lo es, devolvemos como resultado una vista completa, que bien puede ser una página de error personalizada. Cabe mencionar que digo vista completa porque el resultado a generar es un ViewResult. Dado que sabemos que no es una solicitud Ajax, lo común no sería devolver una vista parcial, sino una página completa (.aspx). También, en vez de devolver de una sola vez la página de error, podríamos redireccionar hacia otra acción que consideremos conveniente, a través de un RedirectResult.

Finalmente, decoramos la acción que deseamos filtrar con el atributo que hemos creado, de la siguiente manera:


Acá les dejo un enlace que encontré por allí, que tiene varios ejemplos de atributos de filtro de acciones bastante interesantes, que puede que les sean de utilidad: Creating Custom Action Filters in ASP.NET MVC

NOTA: Aunque este atributo fue elaborado y probado en MVC Framework 2, creería que de igual forma es aplicable para las versiones 3 y 4 del framework.

Cualquier comentario será bien recibido, y como dicen por allí, Happy coding!

Publicado originalmente el 30/10/2012, en https://itsouvenirs.wordpress.com/2013/02/13/diseno-web-panel-de-carga-loading-panel/.

jueves, 4 de enero de 2018

Hola mundo con Kotlin, Gradle y Akka



Hola, por acá les dejo mi primer prueba con Kotlin, un hola mundo utilizando Gradle y la librería Akka, creado con el IDE IntelliJ IDEA Community Edition 2017.

Repositorio: https://github.com/guillegr123/hello-kotlin-akka-gradle

Quedé algo picado por la imagen de arriba. Pero después mi primera prueba, de momento me sigue gustando más el pattern matching de Scala a la hora de extraer valores de las case classes, ya que aparentemente Kotlin no puede hacer eso con sus data classes.

Por otra parte, parece que la programación funcional y la orientada a objetos es la tendencia.

Saludos.

miércoles, 6 de diciembre de 2017

WP - Diseño Web - Panel de carga (loading panel)


Hola nuevamente. Tratando de manternerme conectado, (y mientras espero a que se termine de instalar SQL Server), en esta ocasión quiero compartirles una forma bastante sencilla de hacer un panel de cargado con CSS y javascript. El panel de cargado usualmente es un componente que se utiliza para invalidar un área determinada de la página web mientras se realiza algún proceso, para evitar que el usuario realice alguna acción dentro de dicha área.

El panel que les mostraré básicamente es un DIV que poseerá un GIF animado como indicador de procesamiento. Este “panel” se superpondrá a otro elemento DIV, que es el área a invalidar.

Primeramente, este es el HTML de la página web:



Obsérvese que el DIV que se desea invalidar es el que posee el ID "area_invalidar". Dentro de este se ha colocado el DIV que servirá de panel de cargado, como primer elemento hijo (ID="panel_carga").

Luego, tenemos el archivo CSS ("estilos.css"):



La parte de mayor interés está marcada entre los comentarios "Clases CSS de interés". Nótese que el DIV que representa el área a invalidar tendrá la propiedad position con el valor relative, mientras que el DIV que será nuestro panel de carga tendrá el valor de absolute. Esto se debe a que queremos indicar que las propiedades de posición y tamaño del DIV panel de carga serán relativas con respecto al DIV área a invalidar. Gracias a ello podemos especificar el ancho y alto del DIV panel de carga como 100%, para indicar que éste ocupará todo el espacio del área a invalidar.

Luego, en la misma clase utilizada para el panel de carga, tenemos la propiedad de opacidad (alpha para Internet Explorer, opacity para Mozilla Firefox y otros), con la cual especificamos la razón o porcentaje de opacidad del panel de cargado. Al combinarla con un color de fondo (background-color) se logra un efecto de oscurecimiento y transparencia sobre el área invalidada. Adicionalmente a ello se coloca una imagen de fondo, que en este caso es un GIF animado, mediante la propiedad background-image, para que muestre al usuario un indicador de que se está realizando alguna clase de procesamiento. La imagen es centrada y aparece solamente una vez, gracias a las propiedades background-position:center y background-repeat:no-repeat, respectivamente.

También se tiene la propiedad z-index, que indica la “altura” o nivel del elemento. Dicha propiedad tiene significado dentro del elemento padre, por lo que tiene influencia para todos los nodos hermanos. El valor por defecto es cero, por lo que al colocar un valor de, por ejemplo, 10, nos aseguramos de que el panel de cargado estará sobre el resto de elementos contenidos en el DIV de área a invalidar.

Finalmente tenemos la propiedad de visibilidad, que le colocamos el valor de hidden, para que el panel de carga aparezca oculto al mostrarse la página.

Por otra parte se tiene el archivo de código fuente de Javascript. El javascript es necesario para realizar el cambio de las propiedades CSS a través de las acciones del usuario.



En este caso, según puede observarse en la página HTML (arriba), al presionar el botón "Enviar" se ejecutará la función procesar, que recibe como parámetro el ID del DIV que sirve de panel de carga. Dicha función básicamente se encarga de mostrar el DIV de carga.

Nótese que para efectos demostrativos, al final de la función se colocó una llamada a la función setTimeout, para que el panel de cargado se oculte después de 5 segundos. En una aplicación web real, el panel debería de ocultarse una vez se haya obtenido alguna respuesta o resultado después del proceso solicitado.

Este es el resultado final, antes de presionar el botón:


Luego de presionar el botón, nótese el aparecimiento del panel de cargado solamente sobre el área a invalidar, que para efectos de este ejemplo corresponde al mismo formulario web:


Finalmente después de 5 segundos se oculta el panel de cargado, gracias al uso de la función SetTimeOut.

Como pueden observar este método es una forma fácil, rápida y directa de crear un panel de cargado DIV, utilizando solamente HTML, CSS y javascript puros.

Les debo el código fuente para descargar, ya que lo dejé en otra computadora que he prestado por el momento.

Saludos.

Publicado originalmente el 13/02/2013, en https://itsouvenirs.wordpress.com/2013/02/13/diseno-web-panel-de-carga-loading-panel/.

WP - Nueva sección: SQL Server Snippets

Saludos. En este día quiero anunciarles que he decidido iniciar una nueva sección, llamada SQL Server Snippets, con el objetivo de no dejar de lado el blog debido a la falta de tiempo, y compartir algunas de las cosas que aprendo día a día en mi trabajo con SQL Server. Esta sección consistirá básicamente en entradas breves con segmentos de código (snippets) generalmente cortos, pero muy útiles e interesantes.

Los invito a ver mi primera entrada de esta sección: Tablas con columna autonumérica

Feliz día.

Publicado originalmente el 09/02/2013, en https://itsouvenirs.wordpress.com/2013/02/09/nueva-seccion-sql-server-snippets/.
Con la tecnología de Blogger.