JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

QFE, GDR, COD... Siglas Microsoft para software por todas partes

El otro día leyendo este post de Bruno sobre un nuevo relase de Silverlight, Bruno decía que esta versión era un GDR. ¿Qué significa GDR? Bueno, pues se trata de terminología relacionada con un modelo de servicio incremental para liberar software, que es el que se está usando en Microsoft. De hecho los que empezaron con este modelo y terminología fueron los del equipo de SQL Server en el año 2007, pero otros equipos lo han adoptado también. El objeto de este modelo incremental es liberar parches y correcciones que tengan asegurada la calidad y al mismo tiempo permitan una planificación predecible y un tiempo razonable. Los dos tipos principales de parche que entran bajo este modelo son: · GDR: General Distribution Release. Es una versión de distribución general, para todo el mundo. Engloba todo lo que tiene un cierto nivel de importancia y que afecta a mucha gente, como parches de seguridad, actualizaciones críticas que cubren error graves, los llamados "feature packs" que añaden fu... [Más]

Cómo permitir la desactivación de los botones de radio

Esto, que parece una tontería, no lo es en modo alguno. Cuando colocas un conjunto de botones de radio en una página Web con etiquetas de tipo <input type="radio">, al pulsar sobre cualquiera de ellos, éste queda seleccionado. Al pulsar sobre cualquier otro del mismo grupo, el primero se deselecciona ya que sólo uno de ellos puede estar seleccionado al mismo tiempo. Este es el comportamiento normal y esperado. Sin embargo hay un problemilla que mucha gente se encuentra que con sorpresa no pueden solucionar: ¿qué pasa si quieres desactivarlos todos una vez que ya hay alguno seleccionado?. Prueba por ejemplo esta página. Al abrirla pulsa en los botones de radio de cualquiera de los grupos que contiene. Ahora intenta deseleccionarlos. No funciona. Normalmente estos botones de radio se usan para dar a escoger entre varias opciones excluyentes entre sí, pero también puede darse la posibilidad de que la elección sea 'ninguna'. Lo que suele hacer la gente para solucionarlo es i... [Más]

Matrices escalonadas o "jagged arrays"

En mi anterior post hablaba sobre cómo definir matrices multidimensionales en .NET. Lo cierto es que hay una forma alternativa de hacerlo que tiene ventajas de rendimiento y de características y que está totalmente soportada por el compilador: las matrices escalonadas. Entre otras cosas cambia la sintaxis y además nos permite definir matrices multidimensionales con diferentes tamaños en cada dimensión (en el modo normal son matrices rectangulares). Estas matrices escalonadas son verdaderamente "matrices de matrices", tal y como comentñe en el post anterior.Estas matrices én realidad sólo tienen una dimensión y cada elemento de las mismas es una matriz. Realmente lo que se hace es definir una matriz lineal normal y a cada elemento asignarle a su vez otra matriz, así por ejemplo: Dim jArr As Integer()() = { New Integer() {1, 2, 3, 4}, _ New Integer() {5, 6, 7}, _ New Integer() {8, 9}, _ New Integer() {10, 11, 12}, _ New Integer() {13} } De esta forma define... [Más]

Definición de matrices multidimensionales en .NET

Este post sale, como el anterior, de una pregunta concreta que me ha hecho un alumno en campusMVP. La cuestión viene acerca de cómo se definen las matrices de varias dimensiones en .NET, lo cual es válido tanto para VB como para C#. La clave está en que se debe pensar en las matrices de más de una dimensión como en "Matrices de matrices", y así se entiende mucho mejor. Por ejemplo, si quieres utilizar coordenadas de 3 dimensiones del estilo de (x,y,z) realmente no te hace falta una matriz tridimensional, ya que puedes guardarla en una de dos dimensiones si piensas en lo he dicho de "matrices de matrices". Así, por ejemplo para guardar coordenadas como las anteriores puedes escribir: int[,] arr1 = { {1,2,3}, {4,5,6} }; Es decir, aunque tus "ristras" de datos tengan tres elementos debes usar sólo dos dimensiones porque lo que obtienes es una matriz que contiene en cada fila a otras matrices, así que con la primera dimensión indicas la fila y con la segunda la columna, así: Cons... [Más]

¿ ASP.NET 3.5 ? ¿Windows Communication Foundation? Los terribles nombres de marketing de Microsoft

Este es un tema que en realidad llevo comentando desde hace años con bastante gente del mundillo, y es que nos rompieron los esquemas ya cuando sacaron .NET 3.0 hace ya bastante tiempo. Y es que no estoy de acuerdo, al igual que mucha gente, con muchos de los nombres que usa y ha usado Microsoft para sus productos para desarrolladores. Por ejemplo: ASP.NET 3.5. ¿Por qué demonios le llaman así? Presumiblemente por que así coincide con la versión 3.5 de la plataforma, el cual también es discutible que sea un nombre correcto si bien está más cerca de la realidad. Pero lo cierto es que ASP.NET 3.5 no es más que ASP.NET 2.0 + AJAX + exactamente 3 controles nuevos. Sí VS2008 tiene muchas mejoras en los editores pero no tiene que ver con la versión de ASP.NET sino con el propio entorno renovado. Y todo esto confunde mucho a la gente y la desanima. Para empezar el que haya trabajado con la versión 2.0 y AJAX pensará que ahora tiene que aprender muchísimas cosas nuevas y que va cas... [Más]

Cómo convertir texto a formato título con un método extensor

La clase String posee sendos métodos para convertir todas las letras de un texto a mayúsculas o a minúsculas. Curiosamente no ofrece otros me´todos que también serían útiles como por ejemplo uno que he necesitado hoy: convertir el texto a formato título (es decir la primera letra de cada palabra en mayúsculas). Para este tipo de casos sería estupendo que la clase que nos interesa dispusiese de este método. Así, en mi ejemplo, lo que me gustaría es que la clase String tuviese un método ToTitle que convirtiera mis cadenas al formato apropiado para este caso. Pues gracias a la "magia" de los métodos extensores de C# 3.0 conseguirlo es muy fácil. Lo primero es crear un método que nos permita conseguir ese formato que queremos. Hay muchas formas de hacerlo. la más obvia es ir buscando espacios en la cadena y sustituir el siguiente caracter por el mismo en mayúsculas, pero es es algo muy ineficiente. La plataforma .NET nos da ya hecho esto gracias a la clase TextInfo de System.Globalizati... [Más]

Clon de RunAs.exe (II): petición segura de contraseña

En mi anterior post hablaba de cómo construir un programa "clon" de la utilidad de línea de comandos Windows RunAs. En esta primera parte vimos cómo se lanzaba un proceso suplantando a un usuario, que era el objetivo principal de la aplicación, si bien es la parte más fácil. La tarea que nos quedó pendiente de ver es la más complicada y consiste en solicitar al usuario la clave de manera segura, sin que llegue a estar almacenada en claro en la memoria siquiera. Para ello usamos la clase SecureString, que apareció para estos menesteres en la versión 2.0 del framework. Sin más vueltas vamos a ver directamente cómo se solicita dicha clave y pasamos a explicar los puntos de interés: private static SecureString PideClave(string nomUsuario) { Console.WriteLine("Escriba la contraseña para {0}:", nomUsuario); int top, left; ConsoleKeyInfo cki; SecureString clave = new SecureString(); top = Console.CursorTop;... [Más]

Clon de RunAs.exe: cómo suplantar a un usuario con .NET 2.0

Esta es la primera parte de una serie de dos. El planteamiento es crear un programa que replique la funcionalidad básica de "RunAs", la utilidad de línea de comandos que permite ejecutar cualquier programa suplantando a otro usuario. Nuestro particular RunAs se encargará de solicitarnos de forma segura la clave para el usuario indicado y luego lanzará el .exe indicado suplantando al mismo y por lo tanto permitiéndonos hacer una escalada de privilegios o, por el contrario, ejecutar un programa con menos privilegios que el usuario actualmente autenticado en el sistema. Su uso básico es este: runas usuario ejecutable.exe o bien runas dominio\usuario ejecutable.exe si queremos indicar el dominio también. En este primer post voy a mostrar lo más sencillo que es lanzar el proceso suplantando a un usuario. Dejaré para el próximo la obtención de la clave del usuario y su almacenamiento seguro y pondré el código completo para descarga. El código principal del programa es el que muest... [Más]

Cómo averiguar si un usuario está actualmente "logueado" en el sistema

Los sistemas Windows actuales son capaces de gestionar varias sesiones de trabajo simultáneas, para diferentes usuarios. Windows Xp o Vista sólo permiten una sesión interactiva al mismo tiempo pero es una simple cuestión de licencia, ya que en realidad internamente las gestionan de ese modo (de hecho existen programas en el mercado que desbloquean esta limitación). En Windows Server con terminal Services o en modo administrativo esto ya no es una limitación y se pueden tener tantas sesiones de usuario interactivas abiertas como soporte el hardware. Puede que a nuestro programa le venga bien saber en un momento dado si un determinado usuario está con una sesión iniciada o no. O incluso obtener una lista de usuarios que están actualmente en el sistema. La forma de conseguirlo es mediante una consulta WMI (Windows Management Instrumentation). En el siguiente fragmento se ve un método que, dado un nombre de dominio y un nombre de usuario comprueba si éste está "logueado" actualmente... [Más]

Como obtener los roles a los que pertenece un usuario: revisited

Hace ya un montón de tiempo (en septiembre de 2004), escribí un post, creo que interesante, sobre cómo obtener los roles a los que pertenecía un usuario de Windows. El caso es que entonces la única manera de conseguirlo era mediante reflexión saltarse las normas de acceso a miembros para llamar a un método interno de la clase WindowsIdentity que devolvía esa información. El caso es que desde entonces no lo había vuelto a revisar (ni falta que me hizo), pero hoy uno de los alumnos de nuestro curso 70-536 de fundamentos de desarrollo en .NET para certificación, me ha hecho notar que en -NEt 2.0 y superiores ya no funciona, y además me ha sugerido la forma de hacerlo con las nuevas versiones (muchas gracias Miguel Ángel, vero que el curso te está cundiendo mucho, jeje), que sería así:        private static string[] ListaDeRolesNET2(WindowsIdentity wId)         {        &nb... [Más]