martes, 26 de enero de 2016

51. Nuestra historia (V) - Alan Turing

No se puede hablar de cómputo sin hablar de Alan Turing, uno de los más grandes científicos de nuestra era, y es considerado uno de los padres de la computación. Una historia de éxitos que tiene un trágico final, incomprendido en su época.

Una página en la que se pueden encontrar muchas referencias de él es http://www.turing.org.uk/

¿Quién fue Alan Turing?

Nació a principios del siglo XX en Paddington Inglaterra un 23 de junio de 1912, Matemático, científico, criptógrafo, filosofo, hizo grandes aportaciones al conocimiento humano.

Se puede considerar que su máquina de Turing sentó las bases de lo que hoy se conoce como algoritmo.

Trabajo en descifrar la maquina nazi Enigma, durante la segunda guerra mundial, diseño la bombe una máquina que permitía eliminar un conjunto de claves candidatas a fin de obtener la clave para descifrar el mensaje, la maquina Enigma es la maquina por medio de la cual la Alemania Nazi de la segunda guerra mundial se comunicaba con sus tropas.

Creo uno de los primeros computadores electrónicos programables en su natal Inglaterra.

Desarrollo el test de Turing que es una prueba para validar la inteligencia artificial de una máquina.

Diseño el primer programa de Ajedrez para una computadora que no existía, el trato de ejecutarlo en computadores de su época pero fue imposible.

Trabajo con la biología matemática buscando la explicación de la aparición de números de Fibonancci en los vegetales.

Fue procesado por homosexualidad en 1952, bajo los cargos de indecencia grave y perversión sexual, fue condenado a castración química, 2 años después y debido a los problemas que causo esta condena muere por envenenamiento con cianuro al ingerir una manzana envenenada, su muerte nunca fue esclarecida por completo, se trataron hipótesis de suicidio y de asesinato.

Una historia no confirmada dice que el logo de Apple es un homenaje a Alan Turing una de las mentes más grandes del siglo XX

La reina Isabel II lo exonero en el año 2013

Sin él no seriamos lo que somos ahora, un grande entre los grandes Alan Turing.

Hasta la próxima.

lunes, 25 de enero de 2016

50. Split (Ayuda Rápida XII)

Una de las funciones mas útiles al momento de separar cadenas es split, esta nos permite separar textos por algún carácter o conjunto de caracteres, por ejemplo

string cadenas = Hola|mundo

si aplicamos la funcion split

string[] cadena = cadenas.Split('|');

obtenemos un arreglo en el que el primer elemento es Hola y el segundo Mundo

cadena[0] = Hola
cadena[1] = Mundo

Pero el Split puede hacer mas que separar una sola cadena, puede separar por un conjunto de caracteres, ¿Esto para que nos sirve?, para garantizar que el separador del campo es único y reducir la cantidad de errores.

¿y como se usa?

List<string> cfdi = c.Split(new string[] { "\t@@|@@\t" }, StringSplitOptions.None).ToList();

La linea anterior esta buscando una secuencia compleja que es tabulador @@|@@ tabulador, es decir si yo tengo una cadena que reúna esa secuencia la separara.

Esto se vuelve útil cuando un carácter único puede aparecer en la cadena, sobre todo cuando dejamos que el usuario capture en un campo cualquier cadena.

Felices lineas.

viernes, 22 de enero de 2016

49. Diferencia de fechas SQL (Ayuda Rapida XI)

Así como vimos en un post anterior como obtener la diferencia entre 2 fechas en C# hoy veremos lo mismo desde SQL, como lo he comentado anteriormente un buen desarrollador debe tener conocimientos de alto nivel de base de datos, por que al final nuestro principal trabajo es el procesamiento de la información.

La función que emplearemos en SQL es DATEDIFF, esta función nos permite obtener la diferencia de tiempo entre 2 fechas, especificando la parte de la fecha con la que queremos obtener la diferencia entre una fecha y otra.

La función recibe 3 parámetros que son:

- Parte de fecha para obtener la diferencia, esta puede tomar los siguientes valores:
year
quarter
month
dayofyear
day
week
hour
minute
second
millisecond
microsecond
nanosecond

-Fecha Inicial
-Fecha final

Ejemplo

SELECT DATEDIFF(SECOND,FechaInicial,FechaFinal) FROM Tabla1

Esta instrucción nos da como respuesta la cantidad de segundos entre una fecha y otra

Hasta la próxima


jueves, 21 de enero de 2016

48. Reflexión sobre seguridad

Una muralla impenetrable puede ser derribada muy fácilmente, si el enemigo ya se encuentra dentro de nuestro hogar..., algo que se ha hablado por mucho tiempo incluso desde antes de que la informática existiera, y que mayor ejemplo que lo que es el caballo de trolla.

Las mayores fugas y problemas de seguridad dentro de una organización no ocurren desde afuera, ocurren desde dentro, el hecho de que los miembros de una organización no se sientan parte de ella abre brechas de seguridad muy importantes. 

Crear desconfianza entre los integrantes de la organización es el peor error que podemos cometer, ya que el ser humano tiende a revelarse, la mejor seguridad que podemos construir es en base a la confianza, a ser una empresa, y a trabajar como un verdadero equipo.

Por seguridad basada en la confianza no me refiero a abrir todas las puertas, sino me refiero a que debo confiar en mi organización, transmitir ese sentimiento de confianza para crear una responsabilidad compartida, para que los integrantes de mi organización se sientan parte de ella, se sientan comprometidos y por ende no traicionen a la organización.

Una seguridad basada en la confianza nos ayuda a protegernos mutuamente, en vez e buscar el pretexto para enviar un correo broma (cosa que en muchas organizaciones ocurre) cuando alguien deja su sesión abierta con el pretexto de dar una lección a esta persona, cerramos la sesión considerando el elemento como parte del equipo de trabajo, de un equipo con el mismo objetivo.

Ahí vamos a otro tema, los integrantes de esta organización segura deben tener objetivos similares, y un plan de vida definido, saber a donde van, ese saber a donde van da estabilidad, y nos permite incorporarlos a un plan único de la organización.

La mejor seguridad siempre se construye desde el interior.

Bueno es solo un comentario

47. GetFiles Vs EnumerateFiles (Ayuda rápida X)

Obtener los archivos de un directorio se puede considerar un tema muy sencillo sin embargo puede convertirse en un dolor de cabeza, sobre todo cuando la cantidad de archivos que se encuentran en una unidad es demasiado grande.

Cuando manejamos grandes cantidades de archivos, no solo es responsabilidad de nosotros como desarrolladores su manejo, dependemos de varios factores como son velocidad de los discos, el formato de los mismos y el sistema operativo.

Ahora buen tenemos 2 formas de determinar el contenido de un directorio:

string[] dirs = Directory.GetFiles(@"c:\", "c*");

que nos permite obtener un arreglo de cadenas con las ubicaciones en las que se encuentra un archivo especifico, esta función también nos permite usar un patrón de búsqueda

string[] dirs = Directory.GetFiles([RUTA], [PATRON]);

sin embargo esta función solo se recomienda cuando el numero de archivos es relativamente pequeño, por que muestra un resultado hasta después de que ha leído todos los archivos del disco, en mi caso personal me ha funcionado hasta 1 000 000 de archivos con un formato NTFS.

Ademas existe otra funcion para consultar el contenido de un directorio EnumerateFiles, esta es muy parecida a GetFiles

var txtFiles = Directory.EnumerateFiles(sourceDirectory);

sin embargo esta es asíncrona, podemos trabajar con ella aun cuando no tengamos todos los archivos, si bien en un conteo es mejor GetFiles, si debemos hacer algún procesamiento a cada uno de los archivos que encontremos EnumerateFiles(sourceDirectory) nos permite trabajar con los archivos conforme el sistema operativo los va descubriendo en el disco

foreach (string currentFile in Directory.EnumerateFiles(sourceDirectory))
{
string fileName = currentFile.Substring(sourceDirectory.Length + 1);
        Directory.Move(currentFile, Path.Combine(archiveDirectory, fileName));
}

Hasta la proxima

martes, 19 de enero de 2016

46. Día Inicial de un mes SQL (Ayuda Rápida IX)

En muchos casos es necesario obtener el primer día de cada mes en SQL, yo he empleado una función muy sencilla y rápida para hacer esto:

DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)

¿Que hace?

Bueno toma la cantidad de meses que hay desde la fecha inicial de SQL, y a esa fecha que es ya un día uno, incrementa dicha cantidad de meses.

Saludos

45. C# 6.0 (IV) Null-Conditional Operators

Siendo franco esta es una de las características que mas me ha gustado de C# 6.0, ya que es una característica que simplifica mucho el código, hace validaciones limpias y elimina errores que tienen que ver con un mal manejo de nulos.

Uno de los errores mas comunes a la hora de programar es dar por hecho que uno objeto existe o que este tiene datos, cuando estos errores ocurren llegan a ser muy complicados de detectar, la sintaxis para controlarlos también era complicada, ya que era necesario hacer una estructura if que validara las diversas opciones que tiene un objeto.

Veamos un ejemplo:



¿que hace este código?

pregunta si esta asignado calle1, si este e un nullo, regresa el valor sin calle, veamos su ejecución



Modifiquemos para asignar un valor a la calle


Y ejecutemos el programa nuevamente


Como podemos ver con el operador ?. preguntamos si es nulo y con el operador ?? indicamos con que valor se sustituirá en caso de ser nulo.

Nuevamente nos encontramos ante una característica del lenguaje que no mejora el rendimiento de la aplicación, lo que mejora es la legibilidad del código, haciendo que una evaluación que es tan común como el manejo de un nullo, pueda ser expresada en una forma mucho mas concisa que con una estructura condicional tradicional.

saludos

jueves, 14 de enero de 2016

44. Reinstalar todos los paquetes nuget de una aplicación (Ayuda Rápida VIII)

Nuget es una gran herramienta que nos facilita el desarrollo de software, algunos lo comparan como una gran dulceria para los programadores, en ella tenemos cientos de dll a nuestra disposición para facilitarnos el trabajo.

Otra forma de usarlo es como un organizador de dll en nuestra organización tal como lo describí en el articulo: http://carlosamonroy.blogspot.mx/2015/07/herramientas-mi-propio-nuget.html, esto nos permite estar al día con la ultima versión de nuestras dll con un costo muy bajo y con una alta reutilización de los componentes.

Trabajamos menos hacemos mas y mejor.

Sin embargo existen casos en los que una dll puede corromperse, por copiado, desarrollo, una y mil maneras, ante nuget, la dll seguirá instalada, pero podemos tener un comportamiento no deseado en nuestra aplicación, o simplemente esta no funcionara.

¿Que hacer en ese caso?

Mi recomendación es reinstalar las dll de nuget, esto se realiza en forma automática, y para ello es necesario hacer lo siguiente:

1. Ir al menú herramientas en Visual Studio

2. Abrir la consola de administración de paquetes nuget.


3. Ejecutar la siguiente instrucción:

Update-Package -Reinstall

Esto reinstalara todas las dll del proyecto, como buena practica antes de hacer esto, les recomiendo sacar una copia del proyecto sobre el que están trabajando.

Felices lineas



miércoles, 13 de enero de 2016

43. Deuda técnica

El proceso de desarrollo de software, es un proceso complejo, artesanal, en el que las decisiones de los involucrados a diferentes niveles pueden llevarnos al éxito o al fracaso.

La deuda técnica es un concepto que lleva a trabajar más por malas decisiones, en otras palabras por hacer mal las cosas.

Cuando el tiempo supera la calidad y por cumplir plazos se eliminan funcionalidades del producto, se omiten procesos, se permite que el producto llegue con bugs conocidos, se adquiere esa deuda técnica, deuda que en la mayoría de los casos se paga con grandes intereses.

Por qué digo esto, la deuda técnica generara problemas de re-trabajo, falta de confianza por parte del cliente, inestabilidad, bajas expectativas, no entregas a tiempo después de las primeras versiones, inestabilidad de los sistemas.

El costo puede ir desde crear nuevamente algunas partes de un sistema a recrearlo completamente cuando esta ya no es sostenible.

Demasiadas cosas que no se encuentran bien hechas hacen que pequeños cambios requieran demasiado tiempo para su ejecución, un sistema inestable puede requerir procesos de prueba muy complejos que nos hace perder nuestra ventaja competitiva.

La deuda técnica por lo regular son componentes faltantes o no desarrollados de la manera adecuada en un proyecto, bug conocidos no solucionados.

Un sistema inestable hace que el prestigio de una empresa se pierda, crea desconfianza con el consumidor y con el cliente, traslademos esto al mundo actual, principalmente a una aplicación móvil, en donde el consumidor en cuanto encuentra una falla la abandona, la deuda técnica es un riesgo muy elevado para el éxito de un producto.

Lo barato sale caro es una frase que aplica con la deuda técnica, el querer ahorrar recursos (tiempo, calidad) y tomarlos para deuda técnica, hace que los desarrollos incrementen su grado de complejidad en el momento del mantenimiento.

Una analogía de la deuda técnica, es un globo, cada vez que asumimos que algo se convierta en deuda técnica, inflamos este globo, en un principio, el globo hasta se ve lindo, pequeño, controlable, pero conforme este va creciendo y ocupando más espacio, este explota, y es cuando la deuda técnica nos ha superado.

Y que pasa cuando se asume la deuda técnica, independientemente de todos los controles que se tengan, en muchos casos los equipos de desarrollo terminan asumiendo deuda técnica, deuda que en muchos casos se ve controlable, lo que debemos hacer es gestionarla, documentarla, y pagarla, nunca dejar que se acumule, los equipos de desarrollo deben estar conscientes de su existencia y tomar medidas para controlarla, reducirla y erradicarla

La deuda técnica es un gran riesgo, que debemos evitar a toda costa.


Hasta la próxima

martes, 12 de enero de 2016

42. Fin de soporte Windows 8 - Internet Explorer

Es importante que como encargados del desarrollo de aplicaciones tengamos siempre en mente las fechas en las que termina el soporte de componentes sobre los que estamos trabajando, esto por que debemos siempre pensar en el tiempo en el que nuestra aplicación se encontrara activa.

Si bien nuestras aplicaciones continúan operando aun cuando el soporte de un componente termine, es importante avisar a nuestros clientes de ello, por que esto vuelve en muchos de los casos los sistemas vulnerables.

Un sistema sin soporte ya no recibe actualizaciones de seguridad.

Lo siguiente es tomado de la pagina https://support.microsoft.com/es-mx/lifecycle#gp/Microsoft-Internet-Explorer


A partir del 12 de enero de 2016, solo la versión más actual de Internet Explorer disponible para un sistema operativo compatible recibirá soporte técnico y actualizaciones de seguridad, tal como se indica en la siguiente tabla:
Sistemas operativos de sobremesa de WindowsVersión de Internet Explorer
Windows Vista SP2Internet Explorer 9
Windows 7 SP1Internet Explorer 11
Actualización para Windows 8.1Internet Explorer 11

Sistemas operativos Windows ServerVersión de Internet Explorer
Windows Server 2008 SP2Internet Explorer 9
Windows Server 2008 IA64 (Itanium)Internet Explorer 9
Windows Server 2008 R2 SP1Internet Explorer 11
Windows Server 2008 R2 IA64 (Itanium)Internet Explorer 11
Windows Server 2012Internet Explorer 10
Windows Server 2012 R2Internet Explorer 11

Sistemas operativos Windows EmbeddedVersión de Internet Explorer
Windows Embedded for Point of Service (WEPOS)Internet Explorer 7
Windows Embedded Standard 2009 (WES09)Internet Explorer 8
Windows Embedded POSReady 2009Internet Explorer 8
Windows Embedded Standard 7Internet Explorer 11
Windows Embedded POSReady 7Internet Explorer 11
Windows Thin PCInternet Explorer 8
Windows Embedded 8 StandardInternet Explorer 10
Windows 8.1 Industry UpdateInternet Explorer 11

A los clientes que utilicen una versión anterior de Internet Explorer, como Internet Explorer 8 en el Service Pack 1 (SP1) de Windows 7, Microsoft les recomienda que se planteen migrar a uno de los sistemas operativos y combinaciones de navegadores compatibles que se indican más arriba a más tardar el 12 de enero de 2016.
Ademas de internet explorer el día de hoy también culmina el soporte para windows 8

Hasta la proxima

jueves, 7 de enero de 2016

41. .NET 4.5 (I) - Compresión de directorios

El framework de .NET a ido evolucionado, esta evolución se muestra en que día a día se incluye nueva funcionalidad, que nos permite tomar componentes del propio framework para efectuar nuevas tareas, facilitándonos el trabajo y quitando la dependencia de componentes de terceros.

Hoy voy a hablar de uno de esos componentes, este se encuentra disponible a partir de la versión 4.5 de .Net Framework, este nos ofrece una funcionalidad muy útil, la compresión (en formato .zip) de directorios.

Para ello tenemos que hacer lo siguiente:

1. Creamos un nuevo proyecto.
2. Es necesario agregar la referencia a System.IO.Compression.FileSystem

3. Codifiquemos nuestro programa

¿Que hace?

El programa usa la funcion: Zipfile.createFromDirectory, esta construye nuestro .zip desde un directorio seleccionado y lo deja en un archivo.zip, muy importante comprime el directorio y sus subdirectorios.

Zip.ExtracToDirectory nos ayuda ha hacer lo contrario, extrae un archivo Zip hacia un directorio que estamos especificando.

seguiremos analizando las herramientas que nos entrega el framework en futuros Post, por cierto muy feliz 2016, que sea un año de éxitos, y mucho código.

Saludos