Ir al contenido principal

Entradas

Mostrando las entradas etiquetadas como Programación

Expresión Regular para números en Notación Científica (1.5e-10)

No cabe duda que las expresiones regulares tienen un potencial de mucho valor a la hora de analizar textos, ya sea para marcado, búsqueda de patrones, o incluso la programación de un compilador, un analizador de frases, de expresiones matemáticas, etc.   En esta ocasión he tenido que echar mano de ellas para el análisis de textos matemáticos en los cuales aparecen números en Notación Científica (con exponentes del tipo 1.5E-10). Pues bien, una expresión regular que me está funcionando bastante bien es la siguiente:   [-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?    Esta expresión regular se puede descomponer en los siguientes bloques, para poder interpretarla con mayor facilidad:  El primer bloque [-+]? está indicando que el número podría estar precedido opcionalmente de un signo - o un signo + El segundo bloque [0-9]* indica que podría aparecer un número de 0 o más dígitos del 0 al 9  El tercer bloque indica que también de manera op...

C++11 y constexpr

El estándar de C++ desde su versión 11, incluye el nuevo especificador 'constexpr'. En concreto me voy a centrar en la especificación 11 de C++, ya que en la versión 14 hay algunos cambios muy interesantes, pero el compilador que voy a utilizar (que será Visual C++ de Visual Studio 2015), solo incluye hasta la versión 11. A estas alturas me imagino que la mayoría de vosotros ya conocereis la existencia de este nuevo especificador, pero para aquellos que no lo sepan y por tanto, no lo hayan utilizado nunca, decir que se trata de un especificador para variables y funciones, que permitirá que éstas puedan ser utilizadas en expresiones constantes, las cuales en principio, podrán ser evaluadas en tiempo de compilación. Y como una imagen vale más que mil palabras y, para nosostros un pedazo de código vale más que mil párrafos de explicaciones, vamos con un sencillo ejemplo. Imaginad que definimos una plantilla que recibe un parámetro de tipo constante, y queremos que en ...

Descargar un archivo utilizando PowerShell

Hace tiempo publiqué como descargar un archivo alojado en un servidor remoto desde una aplicación programada en C# ( Descargar archivo con C#) Pues bien, en esta ocasión vamos a ver lo sumamente sencillo que resulta hacer la misma operación desde un script en PowerShell: $url = " http://www.manuelvillasur.com " $localFolder = "C:\FileName.txt" $client = New-Object System.Net.WebClient $client.DownloadFile($url, $localFolder) Así de fácil. Obviamente en $url debéis escribir la uri completa en la que se encuentra el archivo a descargar y en $localFolder la ubicación o el path completo de vuestro disco duro o unidad local de almacenamiento en la que queráis que sea guardado el archivo.

Ingeniería Inversa de Firmware en un PIC 16Fxxx de Microchip

Como parece que no tengo mejores cosas que hacer, no se me ocurre otra forma mejor de pasar una tarde de Sábado que hacer un poco de Ingeniería Inversa a un microcontrolador PIC de la casa Microchip.   En esta ocasión se trata de un microcontrolador de la familia 16Fxxx (tipo 16F876, 16F84, etc.) cuyos opcodes tienen un tamaño de 14 bits. El mismo sistema será válido para otros microcontroladores de otras familias o incluso fabricantes, incluso aún cambiando la arquitectura del microcontrolador, la base esencial del análisis será similar en multitud de casos.   Siempre que se me plantea una situación similar, me gusta entender los entresijos de lo que tengo entre manos y, en la medida de lo posible intento empezar "a mano" o "a pelo" en el proceso de obtención de los Nemotécnicos ó, en definitiva las instrucciones en lenguaje ensamblador.   A continuación os muestro un pequeño pedacito de un firmware que he estado analizando, se trata del comienzo del m...

WinDbg Breakpoint on key pressed

Imaginad por un momento que os surge la necesidad de detener la ejecución de un programa cuando se pulsa una determinada tecla o combinación de estas, en fin, algo normal que a cualquier persona se le puede pasar por la imaginación, ¿o no?. Bromas aparte, para conseguirlo podemos utilizar infinidad de técnicas y en esta ocasión voy a comentaros la última que he empleado yo en uno de los trabajos que estoy realizando actualmente. Esta técnica consiste en colocar un punto de ruptura en la llamada a la API TranslateAccelerator. Ahora bien, debemos tener en cuenta que si colocamos un breakpoint de ejecución sin más, el debugger estará constantemente saltando y no podremos conseguir nuestro objetivo o, cuando menos, será muy desesperante. Para evitar tal situación, lo que tenemos que hacer es utilizar un breakpoint condicional para indicarle al debugger que se detenga solamente cuando se cumple una determinada condición o condiciones y por consiguiente que continúe con la ejecución nor...

WinDbg Symbols Path

Si estás leyendo esta entrada del blog supongo que ya sabes perfectamente la importancia que tienen los símbolos (Públicos y Privados) a la hora de depurar software. En esta ocasión me voy a centrar en las formas que tenemos para indicarle al depurador de Microsoft donde se encuentran los símbolos. En el caso de WinDbg lo podemos especificar de diversas maneras: Desde línea de comandos con el comando -y Utilizando la variable de entorno _ NT_SYMBOL_PATH ó _NT_ALT_SYMBOL_PATH Desde el menú File\Symbol File Path Utilizando el comando .sympath Los símbolos pueden residir en una unidad de almacenamiento local (Ej. el disco duro) o bien proceder de una fuente o servidor remoto. En el la caso de una unidad local, indicaremos la ruta completa a los mismos, ej.; .sympath d:\desarrollo\windbg\symbols Cuando tengamos que cargar los símbolos desde un servidor remoto lo indicaremos así: .sympath srv*http://msdl.microsoft.com/download/symbols También podemos indicar ambos ...

Inicializar un std::vector en C++

Lo primero que tenemos que hacer es crear la plantilla que se va a utilizar para inicializar los vectores: template < typename T > class init_vector { public : init_vector < T >& operator<< ( const T & value ) {     internal_vector.push_back( value );     return * this ; } operator std:: vector < T >() const {     return internal_vector; } private : std:: vector < T > internal_vector; }; A la hora de inicializar un vector podemos utilizar esta plantilla de manera muy sencilla y elegante: std:: vector < int > v = init_vector < int >() << 0 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9; std:: vector < string > empresas = init_vector < string >() << "Google" << "Microsoft" << "Apple" << "Nokia" ;

Bucles for basados en rango, Inferencia de tipo y Referencia

#include <vector> int main() {     std::vector < string > meses;     meses.push_back( "Enero" );     meses.push_back( "Febrero" );     meses.push_back( "Marzo" );     meses.push_back( "Abril" );     meses.push_back( "Mayo" );     meses.push_back( "Junio" );     meses.push_back( "Julio" );     meses.push_back( "Agosto" );     meses.push_back( "Septiembre" );     meses.push_back( "Octubre" );     meses.push_back( "Noviembre" );     meses.push_back( "Diciembre" );     // Mostrar en consola los meses utilizando un bucle for basado en rango.         for ( string m: meses) {        cout << m << endl;         //m = "cadena_no...