mar 21 2012

Propagación y herencia de permisos: la clase FileSystemAccessRule

by Jose M. AlarconCategorías: Programación | Seguridad | Sistemas operativos
Propagación y herencia de permisos: la clase FileSystemAccessRule La información que ofrece en ocasiones MSDN sobre la plataforma .NET se puede decir, eufemísticamente, que "no es todo lo buena que debiera ser". Un buen ejemplo de ello es la documentación de la clase FileSystemAccessRule y más en concreto lo que se refiere a los indicadores sobre propagación y herencia de permisos en el acceso al sistema de archivos. Consideremos este ejemplo. Necesitas controlar desde tu aplicación el acceso a un carpeta llamada "docs" de forma que te asegures de que el usuario "DOMINIO\Usuario" tendrá acceso de lectura a la carpeta y todas sus subcarpetas (y las hijas de éstas), pero sin embargo no tendrá acceso a ninguno de los archivos contenidos en éstas. Dejemos de lado la utilidad exacta de esto. Lo que quiero es mostrar lo retorcidas que han puesto las opciones correspondientes en la plataforma .NET :-S El código en C# que necesitaríamos incluir es este: 1: DirectorySecurity dirSec = Directory.GetAccessControl(@&quo... [Más]

Tags: , ,

ene 21 2011

Diferencias entre conversiones de tipos explícitas y mediante la clase Convert

José Manuel AlarconCategorías: Programación
Diferencias entre conversiones de tipos explícitas y mediante la clase Convert ¿Qué diferencia existe en C# entre hacer una conversión implícita y usar un método de la clase Convert?  En realidad lo que hacen por debajo la mayor parte de las veces los métodos de Convert es llamar a conversiones implícitas. Es fácil comprobarlo viendo el código fuente de la plataforma con, por ejemplo, Reflector. Sin embargo sí puede haber diferencias cuando se hacen conversiones entre tipos que pueden llevar a pérdida de información. Por ejemplo convertir desde un Int32 a un Int16, donde es posible que se pueda perder información ya que un Int32 puede contener números mayores que un Int16. En estos casos sí que podría haber diferencias ya que las conversiones explícitas y los métodos de conversión se comportan de forma ligeramente distinta puesto que los últimos introducen alguna lógica para avisarte de que se producen excepciones. Por ejemplo, si usas este código:double d = 123456.76; long l = (long)d; long l2 = Convert.ToInt32(d); La variable "l" contendrá el número... [Más]

Tags:

nov 15 2010

Normas para la creación de Excepciones propias en .NET

José Manuel AlarconCategorías: Programación
Normas para la creación de Excepciones propias en .NET Cuando el código de nuestro programa produce un error o una situación no esperada que se traduce en un fallo se produce una excepción. Aprende .NET, Cursos on-line tutelados:    · Visual Studio 2010 desde cero   · Fundamentos de la plataforma .NET 3.5 y Visual Studio 2005/2008   · Preparación examen 70–536: Fundamentos de desarrollo con la plataforma .NET (tutelado por mi)   · Preparación del examen 70-505: .NET Framework 3.5, Windows Forms Application Development   · Gestión de proyectos de software con Team System y Team Foundation Server .NET Framework ofrece gestión estructurada de excepciones, es decir, que podemos gestionar las excepciones de manera jerárquica en nuestro código, capturándolas en la rutina que las produce o en cualquier otro punto de la pila de llamadas de ésta (es decir, las excepciones "convergen" hacia los niveles superiores de la pila). La estructura Try-Catch-Finally (VB) o try-catch-finally (C#) nos ... [Más]

Tags:

oct 13 2010

La manera correcta de actualizar contadores de rendimiento personalizados

José Manuel AlarconCategorías: Desarrollo Web | Programación | Windows Forms
La manera correcta de actualizar contadores de rendimiento personalizados Esta es una pregunta interesante que ha surgido en el curso de fundamentos de la plataforma .NET que tutelo on-line en campusMVP. Se trata de una pregunta sencilla pero con una sutileza interesante respecto a la creación de contadores de rendimiento para Windows desde .NET. Cuando creamos un contador personalizado en .NET incrementamos o disminuimos su valor para actualizar la medición que queremos reflejar en el contador de rendimiento del sistema. Algunos ejemplos de contadores que podemos crear son: uno que indique el número de usuarios actualmente autenticados en nuestra aplicación Web, uno que indique el número de compras realizadas en una tienda on-line, el promedio de consultas lanzadas contra un almacén de datos, etc, etc... Tienen mucha utilidad ya que nos permiten monitorizar con las herramientas propias de Windows el desempeño de nuestras aplicaciones, tanto en tiempo real como haciendo trazas para un análisis posterior. El caso es que todos ellos implican generalmente e... [Más]

Tags: , ,

sep 23 2010

OrderedDictionary vs Dictionary

José Manuel AlarconCategorías: Programación
OrderedDictionary vs Dictionary Hoy, en el curso de preparación del examen 70-536, ha surgido la siguiente duda: “¿OrderedDictionary sólo se diferencia respecto a Dictionary, en qué se puede tener acceso además de por clave también por índice, o existe alguna otra diferencia mayor?” La verdad es que OrderedDictionary es un mal nombre para los programadores de habla hispana, porque hay la tendencia a pensar que ordena los elementos, cuando en realidad se refiere a que los guarda por el orden en que se han introducido con el método Add.  Un diccionario que ordene sus elementos es un SortedDictionary de tipo genérico. Así, si escribimos un código similar a este:using System; using System.Collections; using System.Collections.Specialized; public class Prueba { public static void Main() { OrderedDictionary od = new OrderedDictionary(); od.Add("05", "Cinco"); od.Add("02", "Dos"); od.Add("03", "Tres"); od.Add("04", "Cuatro"); od.Add("01", "Uno"); Console.WriteLine("Iterar como... [Más]

Tags:

sep 20 2010

Usando foreach con un diccionario genérico

José Manuel AlarconCategorías: Programación
Usando foreach con un diccionario genérico Lo habitual cuando tenemos una colección o un enumerable de cualquier tipo es recorrer sus elementos usando un bucle de tipo foreach. Sin embargo, cuando usamos una colección genérica de tipo System.Collections.Generic.IDictionary, como por ejemplo Dictionary<TKey,TValue> o SortedList<TKey,TValue>, (que son super-útiles en muchos casos) nos encontraremos con dificultades. Si intentamos hacer algo como esto:Dictionary dict = new Dictionary(); dict.Add("Uno", 1); dict.Add("Dos", 2); dict.Add("Tres", 3); foreach(int numero in dict) { Console.WriteLine(numero); } Descubriremos que obtenemos un error como este otro: Cannot convert type 'System.Collections.Generic.KeyValuePair<string,int>' to 'int' En el ejemplo anterior definimos un diccionario genérico que va a llevar laves de tipo texto y que usaremos para almacenar números enteros. El problema es que esta no es la forma correcta de iterar por colecciones genéricas que tengan pares de clave/valor. L... [Más]

Tags:

may 30 2010

"Serializar" objetos comprimiéndolos antes para ahorrar espacio y los problemas que podremos tener

José Manuel AlarconCategorías: ASP.NET | Programación
Esta pregunta surgió el otro día en uno de mis cursos on-line de campusMVP y la verdad es que es bastante interesante, no tanto porque sea especialmente difícil de hacer, si no por las implicaciones que tiene su aplicación en la práctica. La idea está muy bien: dado que estoy almacenando objetos de mi programa en disco (o enviándolos a través de la red), si los comprimo debería ahorrar espacio en disco y/o ancho de banda. De hecho, la idea es tan buena que en ASP.NET 4.0 una de las novedades es que el almacenamiento de sesión fuera de proceso (es decir, cuando guardamos la sesión en un servidor de estado remoto o en un SQL Server), tiene una nueva opción para permitir la compresión de los datos antes de enviarlos para su almacenamiento o recuperación de sesión. Esto es muy útil para sitios web que quieren acelerar la transferencia de información en una granja de servidores, pero tiene la contrapartida de que los procesadores estarán más cargados debido a las operacioens de compresión ... [Más]

Tags: ,

may 9 2010

Por qué debería importarte la programación paralela

José Manuel AlarconCategorías: Programación | Visual Studio
Por qué debería importarte la programación paralela De este tema ya había hablado en una ocasión en este blog (o más bien en su blog gemelo), y lo cierto es que levantó bastante polémica. Cuando hablo con alguna gente acerca de las novedades de Visual Studio 2010 y sale lo de las mejoras para la programación en paralelo, mucha gente lo ve como una mera anécdota, algo que no va con ellos en absoluto. Si bien es cierto que muchas aplicaciones que se hacen, como las de gestión por ejemplo, no suelen tener que sacarle partido, no es menos cierto que en muchas circunstancias nuestras aplicaciones deben poder sacarle el máximo rendimiento al hardware del que disponemos. Desde hace unos años lo más habitual en cualquier ordenador corriente es que disponga de un procesador con al menos dos núcleos. En servidores o máquinas destinadas a tareas más demandantes es muy frecuente que haya varios procesadores con al menos cuatro núcleos. La tendencia es que cada vez haya más núcleos en los procesadores, ya no sólo por rendimiento sino por las venta... [Más]

Tags: ,

abr 22 2010

Cómo llamar a una página Web desde código

José Manuel AlarconCategorías: Programación
Cómo llamar a una página Web desde código <DISCLAIMER>Han pasado unos cuantos días desde que he podido postear algo nuevo. Me ha pillado de lleno el famoso volcán islandés que ha paralizado el tráfico aéreo en Europa, por lo que he estado atrapado varios días en Bruselas sin posibilidad de salir de allí y, lo que es peor, ¡sin ordenador ni Internet! :-S </DISCLAIMER> Esta es una pregunta muy habitual que he visto por ahí y que realmente es muy sencilla de poner en marcha: "¿Cómo puedo llamar a una página Web (o recurso remoto HTTP) desde mi propio programa y mostrar el resultado en mi aplicación?" La respuesta es muy sencilla, pero no todo el mundo sabe cómo hacerlo. Básicamente hay que utilizar la clase WebRequest. Este método, por ejemplo, sirve para solicitar un determinado recurso a partir de su URL, que se le pasa como parámetro, devolviendo una cadena con el contenido del recurso (o generando una excepción si el recurso no existe o da un error): static string LeerRecursoWeb(string laUrl) { // C... [Más]

Tags:

mar 31 2010

Implementación de interfaces: implícitas vs explícitas - O cómo ocultar miembros de interfaces

José Manuel AlarconCategorías: Programación
Implementación de interfaces: implícitas vs explícitas -  O cómo ocultar miembros de interfaces Las interfaces en .NET y otros lenguajes son una manera de establecer un contrato entre dos clases, de manera que dejemos perfectamente definido de qué manera vana poder interactuar entre ellas. Así, si una clase implementa una determinada interfaz sabemos que dicha clase va a disponer de determinados métodos y podemos contar con ellos a la hora de trabajar con ésta. Además gracias a las interfaces podemos implementar ciertos tipos de polimorfismo o genericidad a la hora de trabajar con conjuntos de clases que implementan la misma interfaz. En fin, nada nuevo en el párrafo anterior para un programador mínimamente experimentado de .NET o cualquier otro lenguaje orientado a objetos. En nuestro curso de preparación del examen 70-536 se trata profusamente este tema, como es lógico. Lo interesante, y objeto de este post, viene a la hora de decidir cómo implementar una determinada interfaz en una clase. Así, si tenemos definida una interfaz cualquiera, por ejemplo esta:public interface IMiI... [Más]

Tags:

mar 26 2010

Clases y estructuras en .NET: cuándo usar cuál y otras cuestiones habituales

José Manuel AlarconCategorías: Programación
Clases y estructuras en .NET: cuándo usar cuál y otras cuestiones habituales Algunas preguntas que recibo con frecuencia en el curso de preparación del examen 70-536 en campusMVP están relacionadas con las estructuras y las clases en .NET. Esta misma semana he tenido un par de ellas muy interesantes, lo que me lo ha recordado y me he decidido a resumir aquí algunas de estas preguntas y sus respuestas. ¿Cuál es la principal diferencia entre una estructura y una clase? La principal diferencia entre Estructura y Clase es que las primeras son tipos por valor y las otras tipos por referencia. Es decir, aunque los primeros pueden trabajar como clases, realmente son valores ubicados en la pila directamente, y no punteros (referencias) a la estructura en memoria. Esto significa que los primeros se pueden gestionar más eficientemente al instanciarlos (se hace más rápido), sobre todo en grandes cantidades, como una matriz. Al crear una matriz de estructuras éstas se crean consecutivamente en memoria y no es necesario instanciar una a una y guardar sus referencias ... [Más]

Tags:

feb 6 2010

Objetos dinámicos en .NET 4.0: ExpandoObject

José Manuel AlarconCategorías: Programación | Visual Studio
Objetos dinámicos en .NET 4.0: ExpandoObject .NET 4.0 dispone de soporte para tiempo de ejecución de lenguajes dinámicos, el DLR (Dynamic Language Runtime). El propósito del DLR es permitir que los lenguajes de tipo dinámico -como PHP, JavaScript, Ruby, Python, Lisp o Groovy, por citar unos cuantos- puedan ejecutarse en la plataforma y además interactuar con código escrito en un lenguaje .NET -como C# o VB. El DLR introduce en el framework una serie de clases dinámicas de comportamiento dinámico que ayudan mucho a la hora de interactuar con estos lenguajes o acceder a COM, pero que abren la puerta a crear monstruos de código si son mal utilizados. De hecho gurús de la plataforma como mi buen amigo Octavio Hernández, reniegan de esta característica ;-) Lo cierto es que en general yo no recomendaría el uso de las clases dinámicas, pero sí que pueden llegar a ser útiles en algunas ocasiones. Por ello en este artículo voy a presentar la más útil y fácil de usar de todas, la clase ExpandoObject. Añadiendo miembros dinámicament... [Más]

Tags: ,

dic 12 2009

Notación asintótica para indicar la eficiencia de algoritmos

José Manuel AlarconCategorías: Programación
Notación asintótica para indicar la eficiencia de algoritmos El otro día un alumno del curso de preparación del examen 70-536 en campusMVP me hizo la siguiente (interesante) pregunta: "He revisando el tema de las coleciones y me han surgido las siguentes dudas: Al leer en el MSDN información sobre distintas colecciones a veces aparece la siguiente frase: 'La recuperación del valor de esta propiedad es una operación O(1); el establecimiento de la propiedad también es una operación O(1).' ¿exactamente a que se refiere con operación O(1)? El ejemplo que he puesto pertenece a ArrayList.Item (Propiedad) http://msdn.microsoft.com/es-es/library/system.collections.arraylist.item.aspx" ¿Y esto qué es? Lo de 0(1) es una notación matemática usada en algoritmia que indica el comportamiento límite de una función. A este tipo de notación se le llama "notación asintótica", "notación Landau" o "notación Big O". En la wikipedia hay un artículo muy completo sobre esta notación, pero básicamente lo que hay que saber para "andar por casa" es que lo que s... [Más]

Tags:

nov 8 2009

ARTÍCULO: Búsqueda de ensamblados en tiempo de ejecución en .NET

José Manuel AlarconCategorías: Programación
ARTÍCULO: Búsqueda de ensamblados en tiempo de ejecución en .NET Hoy he escrito un pequeño artículo sobre la carga de ensamblados por parte del motor de tiempo de ejecución de .NET. Se trata de algo que no muchos programadores de .NET tienen totalmente claro y que creo que puede resultar de interés general. En este documento explico los tipos de ensamblados que tenemos en .NET, cómo el motor de tiempo de ejecución de la plataforma busca los diferentes ensamblados que usan nuestras aplicaciones, y cómo podemos incluir referencias a ensamblados de la GAC desde Visual Studio. Finalmente, como apéndice, explicaré un truco para poder ver ensamblados propios en el diálogo de agregar referencia de Visual Studio. Como ves no hay más que ensamblados por todas partes ;-) Lo he colgado en la página en Scribd de Krasis Press, y lo puedes leer on-line y también descargártelo. ARTÍCULO: Búsqueda de ensamblados en tiempo de ejecución en .NET ¡Espero que te resulte útil!

Tags:

ago 19 2009

Herramientas de prototipado de aplicaciones Web

José Manuel AlarconCategorías: ASP.NET | Programación
Herramientas de prototipado de aplicaciones Web Algo muy habitual en los equipos de desarrollo Web es el dibujar maquetas de las pantallas y sus elementos, de forma que podamos transmitir mejor la idea de lo que queremos a los programadores que lo van a implementar. Esto es válido también para los clientes, que a veces no se hacen una idea de lo que les estamos contando si no lo ven dibujado. Este tipo de croquis o prototipos pintados a mano de las Webs (llamados generalmente wireframes) son muy útiles, pero hacerlos realmente a mano es problemático porque no suelen quedar muy bien y luego muchas veces ni siquiera se hacen. Una herramienta especializada viene de maravilla para hacerlo mejor, más rápido y que quede de manera presentable. A continuación pongo una lista de productos, tanto gratuitos como comerciales, que sirven para hacer esto y que están muy bien: iPlotz Protoshare Justinmind Balsamiq: este es de pago pero me gusta especialmente gliffy Smartdraw Jumpchart Pencil Axure Si trabajas con ... [Más]

Tags: ,

jul 30 2009

El último fallo seguridad de IE se debía a un simple "&"

José Manuel AlarconCategorías: Programación | Seguridad
El último fallo seguridad de IE se debía a un simple Por si alguno no estaba convencido aún de la importancia de escribir código pensando en la seguridad que se lea este artículo sobr eel último fallo de seguridad de Internet Explorer: http://blogs.msdn.com/sdl/archive/2009/07/28/atl-ms09-035-and-the-sdl.aspx Y si el tema te interesa de verdad: ya sabes.   Foto por Gui Tavares, Flickr

Tags: ,

jul 25 2009

TRUCO: Inspecciones flotantes en Visual Studio 2010

José Manuel AlarconCategorías: Programación | Visual Studio
TRUCO: Inspecciones flotantes en Visual Studio 2010 Soy fan de esos pequeños detalles de calidad que muchas veces pasan inadvertidos pero que, una vez descubiertos, no puedes vivir sin ellos. En este caso me gustaría hablar de una nueva característica del depurador de Visual Studio 2010 que me resulta muy útil y que echo de menos cuando tengo que volver a versiones anteriores: las inspecciones/watches flotantes. Quizá no lo hayas notado, pero cuando te colocas encima de una variable o de una expresión cualquiera en el código mientras estás depurando, en la habitual ventanita flotante que te permite inspeccionar las variables y los objetos verás una especie de cuadrito amarillo a la derecha,como en la figura siguiente (por cierto, depurando JavaScript, o sea que funciona con todos los lenguajes): Si lo pulsas verás que la ventana flotante se convierte en el típico Post-it que se queda visible de forma permanente, y puedes arrastrar a donde queiras. De este modo puedes tener tus objetos de interés siempre visibles, de manera muc... [Más]

Tags: ,

jul 2 2009

La misteriosa página que se envía dos veces

José Manuel AlarconCategorías: ASP.NET | Programación
La misteriosa página que se envía dos veces Este es uno de los problemas/bugs más raros con los que me he topado en años, y puede llegar a ser desesperante. Si has llegado aquí a través de una búsqueda de Google porque tienes el problema que indico en el título del post, estoy seguro de que me vas a dejar una nota de agradecimiento por el consejo :-) Hace unos días hicimos una nueva plantilla estética para un cliente de nuestra plataforma de e-Learning, SELF. La plataforma tiene un sistema muy potente de plantillas estéticas que permite personalizar mucho la estética y parte de la funcionalidad de la interfaz. Se pueden asociar plantillas a los diferentes campus (entornos cerrados de formación) y también se pueden asignar muchas plantillas/fachadas diferentes a cada campus de forma que se pueda acceder con aspectos diferentes para cada cliente al mismo campus a través de diferentes URLs o directorios virtuales. Una de estas plantillas, preciosa por cierto, provocaba un extraño efecto sobre todas y cada una de las páginas ... [Más]

Tags: ,

abr 9 2009

Sistema operativo en varios idiomas al mismo tiempo para prueba de aplicaciones

José Manuel AlarconCategorías: Programación | Sistemas operativos | Trucos y consejos genéricos
Sistema operativo en varios idiomas al mismo tiempo para prueba de aplicaciones ¡Fenomenal!: nos ha salido ese cliente en Arabia Saudí o Finlandia y ahora toca localizar nuestra aplicación a esos idiomas y, sobre todo, probarla en el sistema operativo real para no llevarnos sorpresas. Lo primero que suele hacer todo el mundo es correr hacia el MSDN y rezar para no haber tirado los DVDs de Windows en todos esos idomas raros que envían. Eso o descargarlo de MSDN Online para instalarlo en algún equipo. Lo que mucha gente no sabe es que la ediciones más profesionales de Windows viene con la posibilidad de trabajar en varios idiomas al mismo tiempo. En el caso concreto de Windows Vista, las ediciones Ultimate y Enterprise disponen legalmente de esta interesante capacidad. De esta manera no es necesario que nos instalemos varios sistemas operativos diferentes en varios idiomas, ni tendremos que andar con máquinas virtuales ni nada similar: nuestro sistema operativo de trabajo, normal y corriente, nos permitirá cambiar de idioma y localización de manera muy sencilla. ¿... [Más]

Tags: , ,

feb 25 2009

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

José Manuel AlarconCategorías: Programació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]

Tags: