Entradas

Jenkins sobre Docker

Imagen
Jenkins es una conocida herramienta  open-source  de integración continua.Es muy útil en desarrollo de software para automatizar compilaciones, pruebas de unidad e integración, y despliegues. Hoy vamos a aprender a configurar Jenkins en un contenedor de Docker para automatizar la compilación y un test de unidad sobre un proyecto alojado en GitHub. Para este ejemplo emplearemos el proyecto JSex , un intérprete de expresiones sobre objetos JSON. Instalar Docker y Jenkins En este tutorial partimos con Docker instalado. Si no lo tenemos instalado, podemos hacerlo siguiendo las instrucciones de Docker Store . Creamos y ejecutamos un nuevo contenedor para Jenkins: docker run -d -p 8080:8080 -p 50000:50000 --name jenkins -v jenkins_home:/var/jenkins_home jenkinsci/jenkins Explicación: docker run crea y ejecuta un nuevo container . Si la imagen (jenkinsci/jenkins) no se encuentra, la descarga de Docker Hub . -d lanza el contenedor en modo daemon (demonio), e...

Actualizar No-IP en Linux

Imagen
No-IP es un servicio muy interesante que nos permite registrar subdominios de forma gratuita. Muchos de nosotros tenemos una IP dinámica en casa, es decir, cada vez que reiniciemos nuestro router, se nos asignará una dirección IP diferente. Esto hace necesario actualizar continuamente la dirección del subdominio, bien desde la página web o bien desde un programa externo. No-IP ofrece clientes de actualización para Windows, Linux y Mac OS. El de Windows es muy interesante, pero en el caso de Linux decidí crear un programa propio. En lugar de ejecutarse como un servicio que actualice la IP y duerma, es un simple script que se registra en Cron como una tarea periódica. Se puede descargar del repositorio de GitHub: GitHub: vikman90/ip-update O bien se puede descargar directamente con Git desde Linux. Proporciona un instalador que lo hará todo por nosotros. Para descargarlo y configurarlo, hacemos así: $ git clone https://github.com/vikman90/ip-update.git $ cd ip...

Cambiar carpeta personal en Linux

Imagen
En ciertas ocasiones nos puede interesar almacenar nuestros archivos personales en una ubicación diferente a la carpeta home  de Linux, pero al mismo tiempo nos convenga acceder a ellos como si estuvieran allí. Por ejemplo, si usamos dual boot  con Windows y Ubuntu, o tenemos Linux instalado en una máquina virtual, es buena idea enlazar nuestra carpeta personal al directorio donde tenemos nuestra información. Ya que los sistemas operativos actuales clasifican los archivos de forma similar, es recomendable mantener la carpeta personal original de cada uno individualmente (para configuraciones y archivos que no queramos compartir) y vincular cada directorio (Documentos, Imágenes...) a la carpeta correspondiente en la ubicación maestra. Más abajo ofrezco un script en Bash que hace esto mismo: renombra cada carpeta de nuestro home  (o la ubicación que escojamos) y crea una serie de enlaces a los directorios que guardan nuestra información. Se configura fácilme...

Uso de switch en programación

Imagen
Orange switches artwork. Valentin Ruhry. ¿Para qué sirve la sentencia switch en C/C++ o Java? ¿Por qué los profesores insisten en que lo usemos, porque es más bonito? ¡Pues sí! No olvides que un código claro favorece una lectura más comprensible. Pero no somos nosotros los únicos que nos beneficiaremos: nuestro programa puede ser más eficiente. Recuerda que cuantas más y mejores pistas demos al compilador, mejor código podrá generar . Es cierto que un switch tiene el mismo diagrama de flujo que un if-else , pero es más estricto respecto a la condición. En primer lugar sólo admite expresiones constantes , y en segundo estamos usando etiquetas , con lo que se lo estamos poniendo muy fácil al compilador para que genere una tabla de functores . Precaución : no utilices etiquetas y sentencias goto en C/C++. Por ejemplo, supongamos este sencillo código en C: if (x == 1) a(); else if (x == 2) b(); else if (x == 3) c(); else if (x == 5) d(); else error(); Es mu...

Búsqueda paralela de números primos

Imagen
"Sieve for Seven", Scot Nelson . Los números primos son aquellos números naturales mayores que 1 que sólo tienen dos divisores: el 1 y él mismo. Hay muchos problemas en Matemáticas relacionados con los números primos, algunos de ellos aún sin resolver, como la Conjetura de Goldbach . El objetivo de hoy será hallar todos los números primos hasta 2·10 9 . Existen varios algoritmos para obtener listas de números primos, tal vez el más común sea la criba de Eratóstenes , que consiste en escribir una lista con todos los números que queremos estudiar y, partiendo del primero, tachar todos sus múltiplos, y repetir el proceso cada vez con el primer número que no hayamos tachado. Este algoritmo presenta dos problemas: Es destructivo (consiste en descartar), por lo que a priori consume demasiada memoria, y mucho tiempo en escribir candidatos. Eliminar objetos de una lista impide trabajar con ella desde otra hebra, ni siquiera para iterar, con lo que perdemos la posibilid...

Algoritmo de relleno

Imagen
Esta historia parte de un pequeño proyecto de antaño en el que intenté implementar la herramienta de relleno de Paint o Photoshop. Estamos hablando de un algoritmo de relleno por difusión : el objetivo es pasar por todos los puntos no coloreados partiendo de uno arbitrario y la solución se antojaba sencilla: un algoritmo de  backtracking .  Estuve cerca de lograrlo pero cuando la superficie a rellenar era medianamente grande, el programa se colgaba por desbordamiento de pila . El problema es que, al tratarse de una función recursiva , con cada paso que daba había que guardar en la pila el punto anterior, y si el espacio es grande podemos estar hablando de miles o millones de pasos. Esta información se guarda en la pila de llamadas , una zona de memoria especialmente rápida... y pequeña. La solución es muy fácil: convertir la función recursiva en iterativa , y guardar cada punto a explorar dentro de un contenedor de pila ( QStack en la biblioteca Qt), cu...

Milestones en Alexis Viernes

Imagen
Los Milestones volvemos a la carga y estaremos este fin de semana en Alexis Viernes ,  un conocido restaurante sito entre Atarfe y Santa Fe, con música en vivo. Tocaremos versiones de los 70's y 80's, junto a temas más actuales. Entre nuestro repertorio están Donna Summer, Elvis Presley, Tina Turner, Blues Brothers y Bee Gees. ¡La entrada es gratis!  Os esperamos allí el sábado a las 12 de la noche (entre sábado y domingo).

Entrada de emergencia en Windows

Imagen
Ayer eliminé por accidente todos los administradores de mi ordenador. Sin administradores no podremos realizar cambios en el equipo, así que podemos, o bien reinstalar Windows, o bien solucionar el problema más elegantemente.  Hoy vamos a ver cómo entrar en Windows, aprovechando una vulnerabilidad de seguridad . Será como olvidar las llaves dentro de casa, y no tener más remedio que entrar por una ventana abierta —y nunca mejor dicho, hablando de Windows—. StickyKeys   es una característica de accesibilidad de Windows que permite pulsar las teclas especiales de una en una (en lugar de mantenerlas pulsadas) y se activa pulsando la tecla Mayúsculas cinco veces. Lo que hace realmente es ejecutar el programa sethc.exe , y lo mejor de todo: funciona incluso en la pantalla de bienvenida, ¡en modo Administrador! ¿Y por qué no lo cambiamos por la consola? Todo lo que tenemos que hacer es reiniciar el ordenador (en Windows 8 no sirve apagar, porque hiberna el kernel ...

Lenguajes de programación

Imagen
Los lenguajes de programación son los que nos permiten describir programas mediante estructuras de datos y algoritmos . Hay una gran cantidad de lenguajes de programación, cada uno enfocado a un objetivo y con sus pros y contras.  Aunque podemos agruparlos de muchas maneras, se clasifican principalmente en tres paradigmas: Imperativos. Describen mediante instrucciones cómo realizar una tarea. Los más conocidos son C y Fortran. Declarativos. Describen el problema declarando condiciones, proposiciones y restricciones. Aquí tenemos a Prolog y LISP. Orientados a objetos. Utiliza clases y objetos que interaccionan entre sí para diseñar aplicaciones. C++, Java y Python son algunos de ellos. Los primeros son los más clásicos, empezando por el ensamblador, el de más bajo nivel, del que nos abstraen otros lenguajes de alto nivel; son muy eficientes. La programación declarativa no describe la solución, sino el problema; es más expresiva y será el programa intérprete el que...

Optimizaciones en paralelo (II)

Imagen
La programación paralela, esa gran desconocida... Muchos de nosotros ya tenemos ordenadores, o incluso teléfonos móviles y tablets con capacidad para ejecutar varias instrucciones a la vez. Hacer un programa que aproveche este potencial no es muy difícil en la mayoría de los casos. Los procesadores de hoy en día nos permiten paralelizar programas mediante dos mecanismos: Multinúcleo o multihebra. Dos procesos se pueden ejecutar simultáneamente en el mismo procesador, cada uno en un núcleo. Instrucciones SIMD. Single Instruction, Multiple Data . Se trata de instrucciones que se aplican a varios datos a la vez. La primera tecnología es más conocida: procesadores como los Intel Core Duo llevan dos núcleos, incluso algunos de ellos utilizan HyperThreading , que brinda dos hebras por cada núcleo físico, el sistema operativo ve dos procesadores donde hay sólo uno, y entrega las tareas de dos en dos, ganando un poco de velocidad extra. Son muchas las herramientas que tene...

Problema de las N reinas

Imagen
El problema de las ocho reinas es un juego que consiste en colocar ocho reinas en un ajedrez sin que se amenacen entre sí. La solución a este problema se encuentra con un algoritmo de backtracking , que consiste en asignar una fila a cada reina, y progresivamente colocar cada reina en una posición diferente. Si una reina es amenazada en cualquier casilla de su fila, la retiramos y colocamos la reina anterior en otra posición. El programa termina cuando se ha conseguido colocar a todas las reinas en posiciones seguras. Aquí dejo una propuesta dinámica para N reinas, en lenguaje C: >>  Descargar reinas.c  << Mejorando el algoritmo Tiempo después de publicar originalmente este post, estudié que éste es realmente un problema de satisfacción de restricciones . Resolver un problema NP completo puede costarnos mucho tiempo, ya que el espacio de búsqueda crece enormemente respecto al tamaño del problema. La aproximación por backtracking  "a...

Automontar carpetas compartidas de VirtualBox en Linux

Imagen
VirtualBox tiene una opción para automontar carpetas compartidas en un huésped Linux, pero no siempre funciona bien. Hace tiempo propusimos un script para hacerlo manualmente . En esta ocasión vamos a hacer que se monten automáticamente . Supongamos que tenemos una carpeta compartida llamada Datos. La forma más sencilla de montarla en nuestro huésped es escribir en el terminal: sudo mkdir /media/Datos sudo mount -t vboxsf Datos /media/Datos El problema es que al hacerlo como superusuario, el dueño de la carpeta es root , y no se monta con el conjunto de permisos más adecuado. Para cambiar esto, vemos la ayuda del programa /sbin/mount.vboxsf y aplicamos las opciones pertinentes. Tutorial: Permisos en Linux Bien es sabido que la seguridad de Linux descansa en su sistema de archivos. Si escribimos ls -l en cualquier carpeta, podemos ver los conjuntos de permisos RWX que tiene cada elemento. R= Read , W= Write , X= Execute . La primera tríada es para el usuario prop...

Utilizando claves seguras

Imagen
¡Una clase de Criptografía! ¿Cómo funciona la seguridad de los sitios webs? ¿Qué hace a una clave segura? ¿Se puede conseguir la contraseña de un amigo (o enemigo) para entrar en su Facebook? Lo primero que debemos saber es que nunca se guarda una contraseña , lo que se almacena es una huella de nuestra clave. Para hacernos una idea, el ejemplo más fácil de huella es la letra del DNI, que se obtiene realizando cálculos sobre el número. Pues bien, el mismo método (aunque de una forma más sofisticada) se emplea para obtener una huella de la palabra que escribimos cuando creamos una clave nueva. Cuando entramos a un sitio y escribimos nuestra clave, sencillamente  se calcula su hash y se compara con la huella guardada . Pero al igual que de una letra de DNI no se puede sacar el número (hay muchísimos números que dan la misma letra), tampoco se puede extraer por las buenas una clave a partir de su huella . Si se pudiera, las firmas digitales no tendrían razón de ...

Cifrado de Vernam

Imagen
El cifrado de Vernam es un algoritmo de encriptación en flujo , es decir, consiste en combinar cada uno de los bits del mensaje con otro bit que actúa como clave de cifrado. Numerosos protocolos criptográficos, como el sistema WEP que utilizan nuestros routers o el A5/1 que se usa en las redes de teléfonos móviles, están basados en el cifrado de Vernam. Este procedimiento requiere, a diferencia de los sistemas de encriptación por bloques, una clave que sea tan larga como el mensaje . Entonces necesitamos alguna forma de obtener una clave pseudoaleatoria que pueda tener una longitud muy larga, y variable. Una forma de conseguir una clave fiable con facilidad, es utilizar un LFSR (Linear Feedback Shift Register), o Registro de Desplazamiento con Retroalimentación lineal. No nos asustemos por ese nombre, es lo más fácil del mundo: Fuente: Wikipedia . Un registro de desplazamiento es un conjunto de bits que tienen la capacidad de moverse a través de las celdas en las que...

Optimizaciones en paralelo (I)

Imagen
Hace unos días leí acerca del procesador de la consola PS3 y su capacidad para realizar varias operaciones aritméticas en una sola instrucción . Es decir, dado que tiene un bus de 128 bits, podría sumar 4 valores de 32 bits en una operación. Me sirvió para darle vueltas a la cabeza e intentar hacer lo mismo en mi ordenador. La anchura del bus de un procesador es equivalente al número de cifras que puede tener la pantalla de una calculadora simple, sólo que en lugar de tratarse de dígitos decimales (del 0 al 9) son dígitos binarios (0 ó 1). El planteamiento es sencillo: supongamos que tenemos una calculadora de 12 dígitos y necesitamos sumar cuatro parejas de números de tres cifras -suponiendo que estamos seguros de que nunca nos vamos a pasar de 999-. Por ejemplo: 293 + 266 496 + 357 459 + 330 458 + 471 En lugar de realizar cuatro operaciones y dejar nueve ceros a la izquierda, podemos agrupar los números y "pegarlos" en dos sumandos: 293.496.459.458...

Encima de piratas, egoístas

Imagen
El cierre de Megaupload por parte del FBI ha sido un golpe bajo para muchos internautas. Y para muchos de nosotros, con la mano en el pecho, el poder descargar gratis un montón de software (programas, películas, música, etc.) es una de las principales razones por la que tenemos Internet. Por un momento parece que se acaba el mundo, las leyes SOPA, PIPA y Sinde, todo se vuelve en nuestro contra y no nos damos cuenta de que esto era una burbuja que tarde o temprano iba a explotar. No me gusta la política, y hoy no me voy a meter en ella. Sólo quiero puntuar la forma en que nos hemos vuelto tan ansiosos y, encima de piratas, egoístas . ¿Ya nadie se acuerda de las redes P2P? Estas redes, llamadas  Peer-To-Peer (cliente-a-cliente), permiten que un usuario cualquiera comparta archivos con otras personas directamente, sin subirlas a un servidor como Megaupload, Rapidshare y una larga lista. Cuando alguien descarga cualquier cosa, al mismo tiempo está subiendo y compartiendo ...

Spyware en Twitter

Imagen
Hoy he estado a punto de ser víctima de software espía a través de Twitter. Ya son famosas las páginas de Internet a las que accedemos para que nos desvelen qué contactos nos han borrado de Messenger, y es sabido que la mayoría de estas webs almacenan nuestra contraseña . Pero esta variante es nueva para mí: He recibido un mensaje privado de BlogConsolas ( @BlogConsolas ) a través de Twitter , que dice, en inglés, que alguien está escribiendo actualizaciones desagradables sobre mí. Junto al mensaje adjuntan un enlace a ktwitteri.com/timed-out-sessions , una web con una interfaz idéntica a Twitter , pero totalmente falsa. Éste es el correo que he recibido: Correo recibido de @BlogConsolas. No sé si BlogConsolas ha sido el autor o una víctima más de este ataque, porque seguramente cuando alguien cae en la trampa, esa web reenvía el mensaje a todos sus seguidores. Estad atentos a este tipo de mensajes y aseguraos de dónde escribís vuestra contraseña , porque puede que al...

Curvas de Bézier

Imagen
Las curvas de Bézier son un sistema ideado para el dibujo técnico , que permite trazar curvas a partir de una serie de puntos. Fue ideado por Pierre Bézier, un ingeniero que trabajó para la Renault, para diseñar la carrocería de los coches . Captura del programa. Os presento un programa que sigue el método de Bézier para dibujar curvas suaves, a partir de una poligonal de control que el usuario puede modificar creando nuevos puntos a lo largo de ella. Una aplicación bastante simple, pero que da una buena idea de cómo funciona esta técnica y puede servir  perfectamente de ejemplo para introducirse en el uso de la biblioteca Qt . bezier.zip Como de costumbre, la descarga comprende el programa compilado (para Windows) y el código fuente, portable a cualquier sistema compatible con Qt.

Desafiando las leyes de la computación (II)

Imagen
¡Hola a todos de nuevo! Después de casi seis meses sin escribir, vuelvo al blog con una nueva meta: refutar el problema de la parada de Alan Turing . El problema de la parada enuncia, a grandes rasgos, que es imposible escribir un programa que detecte que otro se bloquearía en algún caso. Nosotros lo hemos complicado aún más: ¿Se puede hacer un programa que detecte que él mismo se ha bloqueado? ¡Y hemos encontrado la forma! La solución es muy sencilla: construimos una aplicación con dos hebras que se envían señales entre sí . Si una de ellas se bloquea, la otra se daría cuenta al enviar señales pero no recibir respuestas. Presentamos un programa que se divide en dos hebras: una de ellas dibuja figuras en memoria, y la otra representa en pantalla lo que la primera ha escrito. La hebra principal envía cada segundo una señal a la auxiliar, y ésta devuelve una respuesta. Si tarda más de medio segundo en hacerlo, la primera mostrará una alerta. En el programa encontramo...

Desafiando las leyes de la computación (I)

Imagen
¿Decíais que no? ¿Que un programa se bloquea por entrar en un bucle infinito? Bueno, hablemos de ello. Para los más profanos, un bucle es un fragmento de código que se repite , atendiendo a una condición. Mientras ésta se cumpla, el bucle sigue en funcionamiento. Claro que la limitación que impongamos es harina de otro costal. No vamos a entrar en detalles de programación. El bucle de Manolo , así bautizado esta mañana en una clase de Informática, juega con esta cláusula e introduce el concepto de falso infinito , que nos acabamos de inventar. for (i = 1; i > 0; i++) { } ¿Qué ocurre con esta sentencia? ¿Es un bucle infinito? Pues sí, pero no: es un bucle de Manolo. Lo que expresa es lo siguiente: Sea i un valor numérico que, inicialmente, vale 1 . Mientras i sea estrictamente mayor que 0 , ejecutar el código entre llaves e incrementar i en una unidad. Visto desde un punto de vista matemático, dado que los números son infinitos, el programa que impleme...