viernes, 22 de noviembre de 2013

Delegados y Expresiones Lambda… perdiendo el miedo

Artículo para: Desarrolladores .NET con nivel intermedio

Delegados

Antes de empezar a entrar en el detalle sobre este tema indicar que el presente documento no es un libro, por lo que no nos extenderemos mucho. Lo cierto es que suele dar bastante miedo al programador porque son conceptos que no se entienden bien ni con un libro, por lo que trataremos de explicarlo sin que sea excesivamente técnico, ni exhaustivo.

Un delegado es la definición de una función que sirve para pasarla como parámetro a otra. Así de sencillo y claro. Quizá se encuentren otras definiciones mejor redactadas y mucho más confusas, pero esta se entiende tal cual.

public delegate bool DelegateFunction(int parameter1, int parameter2);

Así se declara un delegado, no requiere más que esto y sirve como carcasa para pasar por parámetro a otra función una con este mismo tipo de declaración: dos números enteros de entrada y un booleano de salida.

Ahora viene el crear una función que utilice el delegado como parámetro:

public string ExampleFunctionWithParameterDelegate(DelegateFunction df, int p1, int p2)
{
if (df(p1, p2))
{
return String.Format("Se cumple la condición de la función df usando {0} y {1}",
                    p1,
                    p2);
}
return String.Format("NO se cumple la condición de la función df usando {0} y {1}",
                    p1,
                    p2);
}


Esto nos lleva a empezar a entender cómo funcionan los delegados. Ahora nos bastará con crear funciones que cumplan los parámetros de entrada (dos enteros) y salida (un booleano) como las que siguen:

public bool DelegateExampleFunctionP1IsLessThanP2(int parameter1, int parameter2)
{
return parameter1 < parameter2;
}

public bool DelegateExampleFunctionP1IsMoreThanP2(int parameter1, int parameter2)
{
return parameter1 > parameter2;
}

Bueno, ahora lo hilamos todo realizando llamadas como las que siguen:

var p1 = 5;
var p2 = 2;
var returned1 = ExampleFunctionWithParameterDelegate(
DelegateExampleFunctionP1IsLessThanP2, p1, p2);
var returned2 = ExampleFunctionWithParameterDelegate(
DelegateExampleFunctionP1IsMoreThanP2, p1, p2);


¿Podéis adivinar los valores de las variables returned1 y returned2 después de la ejecución del juego de instrucciones? Pues son los siguientes:

returned1 = "NO se cumple la condición de la función df usando 5 y 2"
returned2 = "Se cumple la condición de la función df usando 5 y 2"

Como podemos observar, esto nos permite hacer funciones mucho más flexibles, incluso “mutantes”. Ahora pasaremos a explicar las expresiones Lambda, utilizando el mismo ejemplo para los delegados.

Expresiones Lambda





Siguiendo la estela anterior y sin más dilación, aporto un ejemplo de expresión Lambda que servirá para comprender a la perfección cómo funcionan, comparándolo con el anterior desarrollo de ejemplo, marcamos en amarillo la expresión lambda:


var returned1 = ExampleFunctionWithParameterDelegate(
DelegateExampleFunctionP1IsLessThanP2, p1, p2);
var lambdaReturned1 = ExampleFunctionWithParameterDelegate(
(parameter1, parameter2) => { return parameter1 < parameter2; }, 
         p1, p2);

var returned2 = ExampleFunctionWithParameterDelegate(
DelegateExampleFunctionP1IsMoreThanP2, p1, p2);
var lambdaReturned2 = ExampleFunctionWithParameterDelegate(
(parameter1, parameter2) => { return parameter1 > parameter2; },
p1, p2);


Se empieza a vislumbrar que la única diferencia con el código anterior de delegados es que ahora ya no necesito las funciones auxiliares creadas, las creo “al vuelo” y sin definición directamente dentro de los parámetros de llamada de la función principal con el delegado.

Como imaginaréis, el resultado será el siguiente, exactamente idéntico a su predecesor ejemplo de delegados:

returned1 = "NO se cumple la condición de la función df usando 5 y 2"
lambdaReturned1 = "NO se cumple la condición de la función df usando 5 y 2"
returned2 = "Se cumple la condición de la función df usando 5 y 2"
lambdaReturned2 = "Se cumple la condición de la función df usando 5 y 2"


Las expresiones lambda y los delegados se encuentran implementados en multitud de funcionalidades de los objetos del framework. Uno de los sitios más usuales donde encontrarlas es en los objetos de la clase System.Collections.Generic , por ejemplo en las listas y nos será de gran utilidad su buen empleo para realizar consultas sobre dichas colecciones.
C# y Programación

jueves, 14 de noviembre de 2013

Borrado seguro de ficheros en Windows - File Predator




 


Artículo para: Todo tipo de usuarios

No os quiero asustar pero, el borrado de Windows eliminando en la papelera NO ES SEGURO. De hecho, nunca lo ha sido, por lo que hay que tener en cuenta que si hacemos un borrado de ficheros clásico, nuestros ficheros no serán realmente eliminados hasta que, por casualidades de la vida, los ficheros sean totalmente sobreescritos.

Aunque ha sido por casualidad, este tema lo ha hecho tristemente célebre la falta de conocimiento sobre el mismo a la hora de borrar los datos de un disco duro de la trama Bárcenas. Os aseguro que antes de la publicación del asunto yo ya estaba haciendo la aplicación y este post.

Antes de empezar esta entrada en sí, os explicaré cómo borra Windows los ficheros sobre el disco duro, para que podáis entender por qué es tan importante eliminar los archivos de un modo correcto, máxime si nos deshacemos de un disco duro. También indicaros que estoy tirando de memoria de la asignatura Sistemas Operativos de la carrera y cabe la posibilidad que la explicación no sea 100% precisa; pero lo que pretendo es que cualquiera lo entienda. Se aceptan comentarios para mejorar el artículo.

Cómo se distribuyen los ficheros a lo largo del disco duro
En un sistema operativo Windows (pasa lo mismo en Linux) los ficheros se almacenan en el disco duro secuencialmente (aunque esto no es exactamente así, se entiende mejor), al final, todo se reduce a secuencias de bits (ceros y unos) unos detrás de otros. Parte de esta información se denomina el nodo-i o i-nodo que es la información que el sistema operativo lee para determinar la información básica del fichero: la posición de la memoria donde empieza el fichero y sus metadatos como la longitud del fichero.
Dos ficheros eliminado en el anterior esquema del disco duro
Windows exclusivamente borra el i-nodo en las dos pasadas (mandar a la papelera y vaciarla) y, como es de esperar, la información permanece intacta en el disco duro hasta que el propio Windows pone encima de aquellos datos que estaban otros nuevos. Esto puede pasar al poco tiempo del borrado de los anteriores... ¡o podría no pasar nunca!
Cómo las aplicaciones recuperan los datos

Existen multitud de herramientas sencillas y muy baratas (incluso gratuitas) que son capaces de recuperar estos datos incluso después de formatear el disco duro (siempre que no sea un formato a bajo nivel), por lo me reafirmo: el borrado de Windows NO ES SEGURO. Dichas herramientas leen el disco duro y comprueban que ficheros se encuentran huérfanos de i-nodo y les crean uno para que Windows vuelva a mostrarlos con normalidad. Siempre que dichos ficheros no hayan sido sobreescritos en parte o en su totalidad, las aplicaciones restauradoras se harán cargo de recuperar los ficheros. De estas herramientas y sobre cómo recuperar ficheros perdidos hablaremos en el próximo post, ahora nos centraremos en el borrado seguro, motivo del presente.

Presentación File Predator

Para ayudaros a borrar vuestros ficheros de una forma segura, directamente he optado por crearos una aplicación yo mismo. Existen más y diversas, no suelen ser gratuitas. La mía sí y podéis descargarla aquí:


Unas cosas antes de empezar y son de vital importancia:

  • La aplicación es totalmente gratis y no puedes ni pagar ni cobrar por ella
  • Puedes ponerla en cualquier web siempre que no olvides poner una reseña a este blog y al post y no cambies el contenido del fichero rar que hay en mi web ni los ficheros de licencia del mismo
  • ¡Mucho cuidado con su uso! Lo que borres no serás capaz de recuperarlo.
  • Lo usas BAJO TU PROPIA RESPONSABILIDAD 
  • Me eximo de toda responsabilidad de cualquier problema que puedas tener: ni virus que te hayan adjuntado en los ejecutables, ni errores de la propia aplicación, ni errores humanos utilizándola.
Si no estás de acuerdo con lo dicho antes, no la bajes ni la utilices. Soy claro: no es mi problema. Te hago un regalo que me cuesta esfuerzo y trabajo; y te lo entrego "AS IS" (como está). Por supuesto, siempre trataré que la aplicación esté libre de fallos, pero como todos sabemos la programación tiene fallos históricos que han hecho millones de dólares en daños a grandes compañías; así que es evidente que una aplicación gratuita podrá tener fallos (es más que seguro). Si detectas fallos y quieres reportarlos por favor, comenta.

El manejo de la aplicación es sumamente sencillo e intuitivo, así que os dejo que vayáis descubriéndola y en siguientes artículos os iré poniendo al día de cómo usarla. Se entrega la compilación para ser descomprimida, requiere el framework 4.0 o superior para que se ejecute correctamente.

En próximas entradas de este blog os explicaré cómo hacer vuestros propios algoritmos de borrado seguro para que los podáis añadir en la aplicación, ¡no os lo perdáis!




Windows

 

Webs amigas:

  • Copyright © Los vericuetos .NET 2015
    Distributed By My Blogger Themes | Designed By Templateism