viernes, febrero 16, 2007

Teclas Rápidas en Vista

Win-Space: Mostar sidebar.

Win-D: Mostar Escritorio.

Win-Tab: Flip 3D.

Ctrl Win-Tab: Deja activado el Flip 3D para poder navegar entre las pantallas usando las teclas direccionales.

Win-E: Abrir explorador de ventana.

Win-R: Abrir la ventana de ejecución.

Win-T: Navega entre las aplicaciones abiertas en la barra de tareas.

Win-Q: Lanza el Office communicator.

Win-F: Abrir la ventana de búsqueda.

Win-G: Da el foco a la Sidebar y cuando presionas esta combinación de teclas puedes navegar entre los gadgets que se encuentran en ella.

Win-L: Bloquear el ordenador. Muy útil en la mi oficina.

Win-U: Abrir Ease of Access Center.

Win-M: Minimizar todas las ventanas.

Shift Win-M: Maximizar ventanas.

Win-X: Abrir Windows Mobility center.

Win-Number: Presiona la tecla Win y elige el número de la aplicación que se encuentra en la barra de enlaces rápidos (quick launch task bar). Por ejemplo el tercer icono de la barra de enlaces rápidos es el Explorer, así que si presionas Win-3 se abrirá el navegador.

Ctrl-Shift-Esc: Abrir el Task Manager.

jueves, febrero 01, 2007

Globalizando el Calendar de Ajax Control ToolKit

Ayer estuve probando los nuevos controles que incorpora la última versión de Ajax Control ToolKit, para decidir si los incorporaba al proyecto en el que estoy trabajando.

Una de las primeras cosas que intente hacer fue cambiar el idioma del control a español, ya que por defecto se muestra en inglés. Así que me fui directo a las propiedades del control y busqué a ver si por un casual había una donde le pudieras indicar la cultura que quieres utilizar, pero mi gozo en un pozo no hay tal propiedad. A buscar en el google…

En un foro de Microsoft ya encontré que se podía poner la propiedad EnableScriptGlobalization del ScriptManager a True para habilitar la globalización de los controles. ¡¡¡Bien!!! Las etiquetas de los días ahora están en Español, pero… la etiqueta de cabecera (January 2007) y la del pie (Today: January 30,2007) siguen en inglés. Entonces, ¿¿¿Qué tengo que hacer para poner esto en español???.

Sencillísimo… Ir al código fuente del control y en el archivo js (CalendarBehavior.js) que lo acompaña cambiar lo siguiente:

1- this._title.innerHTML = visibleDate.format("MMMM, yyyy") por this._title.innerHTML = visibleDate.localeFormat("MMMM yyyy");

2- dayCell.title = currentDate.format("D"); por dayCell.title = currentDate.localeFormat("dd/MM/yyyy");

3- this._today.innerHTML = "Today: " + todaysDate.format("MMMM d, yyyy"); por this._today.innerHTML = "Hoy: " + todaysDate.localeFormat("dd – MMMM - yyyy");

El Today está puesto a pelo en el código así que no se puede globalizar.

A la, ya esta globalizado o por lo menos apañado, ¿¿¿no se les podría haber ocurrido hacerlo antes???.

lunes, septiembre 04, 2006

Los Libros Son Muy Caros

Hace unos mes me recomendaron esta lista de libros sobre: refactoring, xp, patrones de diseño y esas cosas, pues bueno, se nos ocurrió meterla en Amazon a ver cuánto podrían costar todos eso libros y hay esta el resultado, un pastón. Menos mal que existen fuentes más económocas… Os dejo la lista de libros, seguramente os resulte interesante.

TÍTULOS PRECIOS
Coder to Developer: Tools and Strategies for Delivering Your Software $19.79
Writing Secure Code, Second Edition $32.99
Design Patterns: Elements of Reusable Object-Oriented Software (Addison-Wesley Professional Computing Series) $46.54
Joel on Software: And on Diverse and Occasionally Related Matters That Will Prove of Interest to Software Developers, Designers, and Managers, and to Those Who, Whether by Good Fortune or Ill Luck, Work with Them in Some Capacity $16.49
Code Complete, Second Edition $32.99
Extreme Programming Explained: Embrace Change (2nd Edition) $37.99
Refactoring to Patterns (Addison-Wesley Signature Series) $37.11
Refactoring: Improving the Design of Existing Code $41.88
Don't Make Me Think: A Common Sense Approach to Web Usability (2nd Edition) $22.05
User Interface Design for Programmers $19.77
Object Thinking (DV-Microsoft Professional) $49.99
The Pragmatic Programmer: From Journeyman to Master (Paperback) $34.59
TOTAL $ $392.18
TOTAL € 305,86€

martes, agosto 29, 2006

SQL DINÁMICO

En ocasiones es necesario crear consultas dinámicamente dentro de un procedimiento almacenado, este proceso no es muy díficil de realizar como se puede ver en el pequeño ejemplo que se muestra a continuación, pero es importante tener cuidado con él porque puede ser un arma de doble filo.

USE AdventureWorks

CREATE PROCEDURE FilterCustomers

DECLARE @field VARCHAR(50), @filter VARCHAR(250) AS BEGIN

DECLARE @query VARCHAR(1000)

/*consulta dinámica*/ SELECT @query = 'SELECT * FROM Person.Contact WHERE ' + @field + '=' + @filter

EXEC(@query)

END

Esta técnica debe ser usada con mucho cuidado, ya que puede ser una puerta a la inyección de sql por parte del usuario. A través de las variables pasadas como parametros podemos introducir código malicioso y concatenarlo a la sentencia que estamos creando.

Otro problema con el que nos podemos encontrar, es que el rendimiento de la aplicación puede verse disminuido notablemente. Al usar EXEC() para ejecutar la consulta el procedimiento almacenado que la contenga no quedará compilado. Por lo tanto, tendrá que recompilarse cada vez que sea necesario su uso, ya que el optimizador de consultas del SQL Server no será capaz de volver a utilizar el plan de ejecución generado en el primer uso del procedimiento.

Estos dos problemas pueden solucionarse utilizando SP_EXECUTESQL en vez de EXEC(), ya que si la consulta permanece constante y sólo cambian los parametros de entrada el optimizador del SQL Server podrá reutilizar el plan de ejecución. Y además se solucionan los problemas de seguridad ya que se hace uso de parámetros.

USE AdventureWorks

CREATE PROCEDURE FilterCustomers DECLARE @field VARCHAR(50), @filter VARCHAR(250) AS BEGIN

DECLARE @query VARCHAR(1000)

/*consulta dinámica*/ SELECT @query = 'SELECT * FROM Person.Contact WHERE ' + quotename(@fiel)

+ ' = @filter'

EXEC sp_executesql @query, N'@filter NVARCHAR(250)',@filter=@filter

END

Nota: QUOTENAME: Devuelve una cadena Unicode con los delimitadores agregados para convertirla en un identificador delimitado válido de Microsoft SQL Server 2005.