11 de julio de 2011

¿Que es un valor NULL entre amigos?

Versión original: What's a NULL amongst friends?
http://weblogs.foxite.com/jimbooth/archive/2007/03/16/3458.aspx
Autor: Jim Booth
Traducido por: Luis María Guayán

NULL, ese valor de datos que sigue estando en el camino. ¿Cómo me libero de lo valores NULL? ¿Cómo es que NULL no es igual a NULL? ¿Suenan familiares estas preguntas?

NULL es un concepto muy importante en bases de datos relacionales, pero también es una molestia en el trasero cuando es permitido y/o usado inadecuadamente.

Simplemente decir NULL significa que "no sé cual es este valor". Si hace la pregunta si el valor de no sé es igual el valor de no sé, la única respuesta lógica es no sé.

¿Por qué NULL es tan molesto? Porque es permitido en lugares donde no debería ser permitido. El valor real de los NULL está en la situación donde es importante saber cuando el valor de un campo es desconocido, a diferencia de sólo 0 ó una cadena vacía.

Tome el ejemplo de un campo de código postal. Si el campo es una cadena vacía, entonces es obvio que el valor del código postal es desconocido, así que no hay realmente ninguna razón de permitir NULL en un campo de código postal. Uno puede simplemente proveer como valor por defecto una cadena vacía y terminar con esto. Esto quita la necesidad de ocuparnos de los valores NULL en ese campo, porque estos valores no estarán nunca allí.

Por otra parte imagine una aplicación de seguimientos de condiciones meteorológicas por un período de tiempo. Hay un campo para la temperatura y ese valor realmente puede ser 0. También puede haber una entrada en la tabla donde la temperatura no fue registrada y por lo tanto su valor es desconocido. ¿Cómo puede observar la diferencia entre una temperatura de 0 y una temperatura desconocida? Uso NULL. NULL significa que no sé (la temperatura no fue registrada). Hábilmente NULL evitará que los cálculos de la temperatura media sean incorrectos tratando una temperatura no medida como si fuera medida como 0. Por supuesto una vez que permite NULL en el campo, debe ocuparse de la posibilidad de que este valor esté allí. Si suma un campo en una tabla de 1.000.000 de registros donde solo un registro tiene NULL, la suma será NULL, entonces tiene que asegurarse de excluir los valores NULL en la suma.

De esta manera, al final ¿Es malo tener un valor NULL en un campo? No si es necesario por el diseño de aplicación, pero sí, si está allí simplemente porque no se tomó el tiempo para no permitirlo y proporcionar un valor por defecto.


9 de julio de 2011

Control UAC en Windows 7 / Vista

Como controlar el nivel de ejecución de nuestras aplicaciones bajo entornos Windows 7 / Vista. Y como podemos modificar este nivel con un archivo manifest (XML), previamente incrustado en nuestra aplicación.

En Windows XP los administradores no tienen ningún problema para ejecutar un instalador, modificar el registro, o crear carpetas en las areas protegidas por el sistema, pero en Windows 7, un administrador no tiene el acceso total.

Sin embargo, es posible establecer los privilegios de una aplicación desde su ensamblado para que ésta exija estos privilegios al sistema al ejecutarse, marcando privilegios en el manifiesto de la aplicación. Cuando se crea un nuevo proceso, el servicio de información de aplicaciones (AIS) inspecciona el manifiesto de la aplicación que está incrustado en los recursos de la aplicación. Esto prevalece sobre cualquier otro tipo de marcado de aplicaciones, incluido el marcado de compatibilidad de una aplicación o la detección del instalador de UAC (User Access Control). El manifiesto define un nivel de ejecución que indica a Windows los privilegios necesarios para ejecutar el archivo binario. El marcado del manifiesto de aplicación es relevante sólo para archivos EXE, no DLL, UAC no inspecciona archivos DLL durante la creación del proceso.

Las tres posibilidades de nivel de ejecución son:
  • asInvoker: la aplicacion obtiene los privilegios de aquel usuario o proceso que lo ejecutó (esta configuracion es la que se establece por defecto en cualquier proyecto nuevo).
  • highestAvailable: la aplicacion exije los privilegios mas altos posibles de acuerdo al usuario que ejecutó el programa.
  • requireAdministrator: establece que el proceso se debe crear con un token de usuario que sea miembro del grupo administradores. Si el usuario que intentó crear este proceso no es administrador, se mostrará un cuadro de diálogo para que proporcione sus credenciales.
Para ver los actuales privilegios que posee nuestra aplicación. Podemos acceder al archivo manifest que tiene incrustado nuestro aplicativo. La manera mas sencilla es a través del bloc de notas (NotePad.exe).
Con la ventana de comandos abierta ejecutamos lo siguiente:
Notepad   myapp.exe  
Una vez dentro pulsamos las teclas de búsqueda "Ctrl+B". Nos aparecerá la ventana de búsqueda de texto y tecleamos "assembly" (sin comillas), Pulsamos <Intro>. Y acto seguido nos localizará el archivo manifest que tiene nuestra aplicación incrustado. Tal y como se muestra en la siguiente figura.



Como se podrá comprobar, se "ve" perfectamente el archivo manifest que tiene incrustada nuestra aplicación. Con las funciones propias de copiar y pegar podemos extraer el contenido, y analizar el archivo.

<assemblyIdentity
  type="win32"
  name="myapp"
  version="1.0.0.0"
  processorArchitecture="*"/>
 <description>myapp - VFPX</description>
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  <security>
   <requestedPrivileges>
    <requestedExecutionLevel
     level="AsInvoker"
     uiAccess="false"/>
   </requestedPrivileges>
  </security>
 </trustInfo>
 <dependency>
  <dependentAssembly>
   <assemblyIdentity
    type="win32"
    name="Microsoft.Windows.Common-Controls"
    version="6.0.0.0"
    publicKeyToken="6595b64144ccf1df"
    language="*"
    processorArchitecture="*"/>
  </dependentAssembly>
 </dependency>
</assembly>

Se puede ver en negrita el privilegio actual que posee nuestra aplicación.
Podemos cambiar el privilegio, por algunos de los tres modos mencionados anteriormente: asInvoker, highestAvailable, requireAdministrator.

Guardamos el archivo como un archivo de texto con el nombre de nuestra aplicación : myapp+exe+manifest. En el mismo directorio donde ya se ubica nuestro ejecutable.
myapp.exe.manifest
Ahora vamos a incluir el archivo manifest dentro de nuestro ejecutable. Para eso primero compilamos nuestro proyecto dentro del Fox y con una pequeña utilidad de Microsoft, incluida dentro del Windows SDK MT.EXE (http://msdn.microsoft.com/en-us/library/aa375649%28v=vs.85%29.aspx).

Incrustaremos nuestro archivo manifest. Siempre desde la línea de comandos. También se puede generar un archivo .BAT para que nos automatice todo el proceso. La instrucción quedaría de la siguiente manera.
MT -manifest  myapp.exe.manifest    -outputresource:myapp.exe;1
Así de sencillo y fácil se pueden incluir archivos manifest en nuestros ejecutables. Y con los privilegios que nos sean necesarios en cada situación. Yo por ejemplo utilizo un ejecutable para actualizar mis programas a través de Internet y por supuesto tiene los privilegios de Administrador (requireAdministrator). Así se pueden registrar OCX, acceder al registro del sistema etc. Etc.

Se puede descargar el MT.EXE desde aquí: http://dl.dropbox.com/u/10421838/mt.exe

Antonio L. Montagut ( www.ontarioxb.es )

Enlaces de Interés:
http://blogs.msdn.com/b/calvin_hsia/archive/2007/04/13/add-a-manifest-to-control-your-application-vista-uac-behavior.aspx
http://msdn.microsoft.com/en-us/library/aa375649%28v=vs.85%29.aspx
http://es.wikipedia.org/wiki/Control_de_cuentas_de_usuario
http://en.wikipedia.org/wiki/User_Account_Control