Que es un ‘DevOps’ y por qué tu pequeña empresa debería contratar uno

Si tu PyME utiliza una buena cantidad de software propietario y de terceros, entonces probablemente deberías de contratar un Development Operations (DevOps). Estos desarrolladores son unos cerebritos que son responsables de una amplia gama de tareas, incluyendo escribir código, creación de aplicaciones, infraestructura, creación de entornos virtuales y automatización de sistemas y procedimientos. Ellos supervisan la ingeniería, Aseguramiento de la Calidad (Quality Assurance) y el correcto funcionamiento de toda la comunicación interna del departamento de software.

Sigue leyendo

C#: Leer información binaria de un archivo BMP

Desde C# podemos leer cualquier archivo de manera binaria con la clase BinaryReader, la cual en uno de sus constructores recibe una secuencia de bits especificada, es decir el archivo a leer con valores binarios, también necesitaremos usar algunas propiedades y métodos de esta clase que les explicaré más adelante. Para usar esta clase necesitamos el espacio de nombres System.IO en nuestro proyecto.

Desde una aplicación de consola en C# leeremos una imagen de formato BMP, y podremos obtener informaciones como el alto, ancho y cantidad de bits por pixeles, empecemos:

Luego de crear nuestro proyecto de consola en C# crearemos un método que nos permitirá especificar y validar la ruta donde se encuentre el archivo .bmp que queremos leer y la retorne para poder ser utilizada más adelante.

static string ValidateAndSetPath()
{

Console.WriteLine("Introduzca la ruta del archivo BMP | Enter the path of the BMP file:");

var localPath = Console.ReadLine(); //Guarda la ruta introducida | Save the path entered

//Valida que la ruta y la extension del archivo sean correctas
//Validate that the path and extension of the file  is correct
while ((!localPath.Contains(".bmp") && !localPath.Contains(".BMP")) || !File.Exists(localPath))
{
Console.WriteLine("\nES: Asegurese de que escribió la ruta y la extension (.bmp) correctamente\nEN: Be sure that the path and extension (.bmp) are correct");

localPath = Console.ReadLine();
}

return localPath;
}

El método Contains recibe como parámetro una cadena o string a buscar y determina si esta contenida dentro de otra cadena, en este caso de la cadena de la variable localPath, mientras que el método Exits de la clase File determina si un archivo existe en una ruta especificada. Como podrán ver esas sentencias están negadas (!) y evaluadas dentro de un ciclo while lo que indica que mientras la cadena introducida por el usuario no contenga el cadena .bmp o .BMP y el archivo no exista, avisará al usuario y le indicara que introduzca nuevamente la información correctamente, luego, si todo esta correcto devolverá la ruta del archivo.

Luego en el método Main de nuestro proyecto vamos a declarar varias variables que almacenaran la información que obtendremos del archivo como el alto, ancho y cantidad de bits por pixeles así como el archivo en binario, con la propiedad BaseStream que nos permite el acceso a los bits y el metodo Seek nos desplazaremos por los bytes hasta obtener la información que necesitamos, pero para eso tenemos que conocer la estructura de un archivo BMP.

BMP-File-Structure

Estructura de archivo BMP – Structure of BMP file

En la imagen anterior podemos ver que cada sección del archivo tiene una cantidad de bytes, por los cuales debemos movernos, la información que nos interesa está en la sección InfoHeader, por lo que debemos “pasar” la sección Header, y esto es sumamente fácil con el método Seek de la propiedad BaseStream, este método recibe como parámetro la cantidad de bytes que nos queremos desplazar y desde donde, en nuestro caso la primera información que queremos es el ancho o width en ingles, la cual esta a partir del byte 18, para saber eso simplemente sumé los 14 bytes de la sección Header más 4 bytes del Size (información que no nos interesa) que esta dentro de la sección InfoHeader, haciendo este desplazamiento desde el inicio del documento. Veámolos en código:

static void Main(string[] args)
{

//Variables
var path = ValidateAndSetPath();
var width = 0;
var heigth = 0;
var bitsPerPixel = 0;
BinaryReader bmpFile; //BMP File in binary


bmpFile = new BinaryReader(File.OpenRead(path)); //Lee la ruta como un archivo binario | Reads the path as a binary file

bmpFile.BaseStream.Seek(18, SeekOrigin.Begin); //Posiciona la "cadena" de bytes en el bit indicado | Set the position in the current stream.

width = bmpFile.ReadInt32(); //Guarda 4 bytes, correspondiente al ancho de la imagen | Save 4 bytes, of the width of the image
heigth = bmpFile.ReadInt32();//Guarda 4 bytes, correspondiente al alto de la imagen | Save 4 bytes, of the heigth of the image

bmpFile.BaseStream.Seek(2, SeekOrigin.Current); //Posiciona la "cadena" de bytes en el bit indicado desde la posicion actual | Set the position in the current stream from the current position

bitsPerPixel = bmpFile.ReadInt16(); //Guarda 2 bytes correspondientes a los bits por pixeles de la imagen | Save 2 bytes for the Bits por pixels of the imagen

Console.WriteLine($"\nAncho | Width: {width}\nAlto | Heigth: {heigth}\nBits por Pixel | Bits per Pixel: {bitsPerPixel} bits");


bmpFile.Close(); //Cierra el archivo en uso | Close the file


Console.ReadKey();

}

Y listo, con esto podemos tener obtener el el alto, ancho y cantidad de bits por pixeles de un archivo de imagen BMP. Elementos a tener en cuenta es utilizar el tipo de datos adecuado al momento de leer los bytes desde el archivo guiándonos desde la estructura del mismo, si se fijan para almacenar la información en la variables width y height utilicé el método ReadInt32() que lee 4 bytes, mientras que para la variable bitsPerPixel utilicé el método ReadInt16() que lee 2 bytes que son el tamaño correspondiente de estos datos indicados en la estructura del archivo, si utilizan un tipo de datos no adecuado podrían estar leyendo información de más o de menos. Otro punto importante es cerrar el archivo después de su uso.

BMP-Info-Reader

Prueba de la aplicación.

 

El código del proyecto completo esta disponible en mi GitHub: robertlluberes/BMP-File-Info-Reader

Referencias: [ BinaryReader, Structure of BMP file, C# Seek File Examples: ReadBytes ]

 

miCulturapp: la aplicación del Ministerio de Cultura

El pasado domingo 7 de agosto el Ministerio de Cultura lanzó la aplicación miCulturapp con el objetivo de facilitar el acceso de la ciudadanía a los eventos culturales de ese Ministerio en República Dominicana.

miCulturapp-Menus

miCulturaap

Desde la aplicación podrás:

  • Conocer y compartir todos los eventos y temas culturales del país, así como agendarlos dentro de la misma aplicación.
  • Acceso a contenido exclusivo y sintonizar eventos en vivo.
  • Enterarte de las últimas noticias del Ministerio de Cultura de la República Dominicana.
  • Obtener información básica de lugares a visitar, como museos y centros artísticos.
  • Acceso a literatura.
  • Escuchar música, podcast  acerca de actividades, información de eventos y noticias del Ministerio.

En mi opinión la aplicación es una buena iniciativa por parte del ministerio para hacer llegar eventos y actividades culturales a todos, sin embargo el contenido en la aplicación en cuanto a lugares a visitar, literatura y música es aún reducido, cosa que espero que cambie al pasar de los días.

miCulturapp está disponible para Android y para iOS.

Fuente [ Ministerio de Cultura ]