JASoft.org

En todas partes se hacen chapucillas de vez en cuando...

En todas partes se hacen chapucillas de vez en cuando...
Brad Adams es uno de los que estuvo en el desarrollo de la plataforma .NET desde el principio, en 1998, y que también ha participado en el desarrollo de Longhorn. Me ha llamado la anteción leer en su Blog personal un post que habla del porqué de la existencia de un método DontTouchThis() en la clase Int32 y en otras similares dentro del código fuente de Rotor (la implementación de código abierto de la plataforma .NET). Parece ser que lo hacen exclusivamente para que el compilador no les lance una advertencia por tener un miembro privado que aparentemente no se usa y que en realidad sirve para almacenar el valor asociado a la clase. Es una tontería pero me ha parecido curioso comprobar cómo incluso en productos tan trabajados como .NET sus experimentados programadores hacen chapucillas como esta de vez en cuando. Yo os aseguro que si tengo que hacer algo similar para salir del paso acabaría pensando que seguro que hay una forma mejor (o correcta) de hacerlo y que se me está escapando ... [Más]

Cambiar el propietario de una tabla de SQL Server

Cambiar el propietario de una tabla de SQL Server
Cuando restauramos una copia de seguridad de una base de datos de SQL Server desde un servidor a otro diferente es posible que los propietarios de las tablas de la base de datos recién restaurada no coincidan con el propietario que tenemos en el resto de bases de datos o con el de las tablas del sistema. Si deseamos establecer de forma manual el propietario de una tabla (o en general de cualqueier objeto) de SQL Server podemos recurrir al procedimiento almacenado sp_changeobjectowner. Basta con abrir el analizador de consultas y escribir: sp_changeobjectowner 'propietario.tabla', 'nuevo_propietario' para cambiarlo. Por ejemplo: sp_changeobjectowner 'usuario.Articulos', 'dbo' cambiaría el propietario a 'dbo', es decir, el propietario por defecto de los objetos de una base de datos y el que normalmente se utiliza.

Cortocircuito de expresiones y su importancia

Cortocircuito de expresiones y su importancia
Se trata esta de una observación que, aunque obvia, en muchos casos puede pasar inadvertida y me parece por tanto interesante destacarla aquí. Las expresiones condicionales en C# se cortocircuitan. Esto quiere decir que se detienen las comprobaciones en cuanto no es necesario comprobar el resto de condiciones por haber hecho suficientes pruebas para determinar el resultado. Me explico. Todo el mundo sabe que para que una condición AND proporcione un valor positivo (true) ambas condiciones que se comprueban deben ser positivas (true). Por ello, cuando C# encuentra una condición AND, y verifica que la primera de las dos condiciones que se comparan es falsa, automáticamente deja de comprobar la que falta, puesto que aunque fuese cierta el resultado será falso al serlo ya la primera y, entonces, ¿para qué seguir perdiendo el tiempo?. Lo mismo ocurre con los otros tipos de operadores booleanos. Por ejemplo, en una expresión O... [Más]

Funciones útiles para matrices en C# (y II)

Funciones útiles para matrices en C# (y II)
Siguiendo con el post anterior de las matrices, vamos a ver ahora como emular de forma genérica la instrucción Redim Preserve de Visual Basic desde C#. private static Array RedimPreserve(Array matriz, int nuevoTamanho) {  Array m = Array.CreateInstance(matriz.GetValue(0).GetType(), nuevoTamanho);  int longACopiar = nuevoTamanho;  if (nuevoTamanho > matriz.Length) longACopiar = matriz.Length;  Array.Copy(matriz, 0, m, 0, longACopiar);  return m; } Esta versión devuelve una matriz con el tamaño indicado y preservando los elementos contenidos en la matriz original. Se usa el método Copy de la clase Array para copiar de manera eficiente los elementos y evitar hacer un bucle. Al igual que en el post anterior también podemos considerar la versión que transforma directamente la matriz que se le pase por referencia:  private static void RedimPreserve(ref Array matriz, int nuevoTamanho) {  Array m = Array.CreateInstance(matriz.GetValue(0).GetType(), nuevoTamanho);  int longACopiar = ... [Más]

Funciones útiles para matrices en C# (I)

Funciones útiles para matrices en C# (I)
En Visual Basic (clásico y .NET) hay un par de funciones para tratamiento de matrices que siempre me han parecido muy útiles. Se trata de Redim y Redim Preserve. Ambas sirven para redimensionar una matriz sin tener que volver a declararla. La diferencia entre ellas estriba en que la primera crea una amtriz nueva y se pierden los elementos que contenía, mientras que la segunda (la más interesante), permite crear una matriz nueva de diferente tamaño y que conserva los elementos que ésta contuviera previamente. En C# la primera función tiene poco sentido ya que podemos redefinir una matriz cuando queramos, por ejemplo: int[] matriz = new int[5];matriz = new int[8]; Ningún problema con esto. Por lo único que se me ocurre ahora mismo que podríamos necesitar la función Redim es para hacer lo anterior de forma genérica, es decir, para poder hacerlo sin importar el tipo de datos que contiene la matriz original. Esta función sería tan sencilla como la siguiente:  private Array Redim(Arr... [Más]

Creación de métodos con un número arbitrario de argumentos en C#

Creación de métodos con un número arbitrario de argumentos en C#
Esta cuestión es probable que a alguno le resulte trivial, si bien es cierto que a muchos programadores de C# (incluso a algunos experimentados) se les pasa por alto a veces, así que no está de más hacer un recordatorio. La cuestión es la siguiente: ¿cómo construyo un método (función) que me permita pasarle un número cualquiera de parámetros? Por ejemplo, imaginemos para simplificar que quiero construir una función que sume todos los enteros que se le pasen. Puedo definir varias versiones de la misma, cada una de las cuales tomando un número diferente de parámetros (un entero, dos enteros, tres, etc...). Hacerlo así, obviamente, aparte de ser una pérdida de tiempo es una cuestión bastante absurda: siempre encontraríamos un límite de parámetros, aparte de ser algo así como "matar moscas a cañonazos". La solución en C# es muy sencilla: basta con indicarle al compilador que nuestra función necesitará un número arbitrario de parámetros, que no sabemos de antemano cuántos serán. Esto se ... [Más]

El ordenador del futuro ya está aquí y se llama OQO

El ordenador del futuro ya está aquí y se llama OQO
Este nuevo dispositivo puede representar un nuevo hito en el sector de la computación portátil, al constituir un híbrido que, en el tamaño de una PDA, encierra una completa computadora operando bajo Windows XP. Hasta ahora, el OQO parecía más un caso típico de "vaporware" (software o hardware que se anuncia, despierta grandes expectativas, pero no se llega a presentar nunca de forma oficial como producto acabado) que una apuesta de futuro real. No obstante, recientemente ha sido presentado al público y lanzado a la venta. El aparato en cuestión representa un "gadget" electrónico muy avanzado, una computadora personal portátil que monta un procesador Crusoe de Transmeta a 1 Ghz., disco duro de 20 Gb., 256 Mb. de RAM DDR, conectividad a redes inalámbricas 802.11b, Bluetooth, FireWire, USB 1.1, y una docking station que incluye otro puerto USB, otro FireWire y puerto Ethernet. Todo esto encerrado en una minúscula caja de tamaño no muy superior al de una PDA: 12,4 centímetros de largo p... [Más]

Generación automática de DLLs para expresiones regulares

Generación automática de DLLs para expresiones regulares
Las expresiones regulares son una de las herramientas más útiles con las que contamos los programadores a la hora de analizar cadenas de texto, esto es, contenidos de archivos, expresiones y comandos, etc... Por analizar me refiero no sólo a buscar partes de textos sino a extraerlas, transformarlas, y muchas otras tareas. Se trata de un elemento que desde mi punto de vista todo programador que se precie debiera conocer. Las expresioes regulares pueden llegar a ser muy complejas. Cuando se establece una expresión regular se genera en memoria código especializado que implementa el análisis indicado por éstas. Debido a ello cada vez que se declara una se debe generar dicho código, lo cual puede ser más o menos costoso en función de la complejidad de la expresión regular. Para expresiones sencillas no tendremos demasiado problema. Con expresiones muy complejas que usemos mucha veces (muy a menudo) dentro de una aplicación esta compilación previa ya puede ser más significativa. Para mejo... [Más]

Cómo comprobar los permisos requeridos por un ensamblado

Cómo comprobar los permisos requeridos por un ensamblado
Al hilo del post de ayer me parece apropiado comentar que, para averiguar nosotros mismos qué permisos ha declarado un ensamblado (exe o dll), podemos utilizar una pequeña utilidad incluida en el SDK de la plataforma .NET llamado permview.exe. Su sintaxis es la siguiente: permview nombre_ensamblado.exe o permview nombre_ensamblado.exe /otuput: archivo.txt para enviar los resultados a un archivo. Lo que hace es "escupir" la información sobre los permisos declarados en formato XML, distinguiendo los permisos mínimos requeridos, los opcionales y los restringidos por la propia aplicación (tal y como vimos). Necesitarás ejecutarlo desde la consola del SDK o de Visual Studio. Puede resultar útil como herramienta de diagnóstico.

Cómo declarar qué permisos necesita mi ensamblado

Cómo declarar qué permisos necesita mi ensamblado
Si desarrollamos una aplicación que deberá tener acceso a ciertos recursos del sistema restingidos normalmente por motivos de seguridad (por ejemplo acceso al sistema de archivos) es posible que en determinados casos falle por carecer de dichos permisos. Esta carencia de permisos puede deberse a configuración del sistema (por ejemplo permisos NTFS) o bien por la cofiguración de permisos de la propia plataforma .NET (por ejemplo un ensamblado que se ejecute desde Internet o desde la Intranet). ¿No sería interesante en estos casos hacer que la aplicación, directamente, ni siquiera se ejecutase si no tiene los permisos suficientes? Se puede conseguir este efecto declarando directamente en el ensamblado qué permisos son necesarios. Incluso más interesante aún: se pueden restringir más todavía los permisos de nuestro programa respecto a los que le otorga el propio entorno (.NET o el sistema operativo) evitando así un uso indebido de nuestras aplicaciones. Para conseguirlo lo que se hace... [Más]

Este soy yo y este es mi blog técnico, dedicado al software y a la programación.

¡Sígueme en Twitter!

Mis otros blogs

- JM Alarcón @ campusMVP.es
Contenido técnico en español orientado a desarrolladores
- JMAlarcon.es
Blog personal no técnico: sociedad, innovación, empresa...

Krasis

- campusMVP.es:
Los mejores cursos online de programación en español

- SELF LMS:
La plataforma de elearning más potente del mercado.

Histórico