Interfaz Cerebro-Twitter

Adam Wilson, estudiante de ingeniería biomédica de la Universidad de Wisconsin-Madison, ha conseguido publicar una frase en twitter sin teclear, usando directamente su cerebro. Y sólo ha necesitado una gorra con electrodos en la cabeza enganchada a un ordenador que muestra letras en la pantalla. La nueva interfaz cerebro-ordenador podría revolucionar la comunicación de pacientes cuadrapléjicos.

Obviando el posible uso médico que se le pueda dar a esta tecnología. ¿alguien se imagina que las consolas en el futuro sean controladas mentalmente?, seria simplemente genial. Cada vez nos acercamos mas a crear la Matrix, jajaja.

Visto en: Muy Interesante

Guia de 10 minutos de diff y patch

Situación uno: estas tratando de compilar un paquete desde la fuente y descubres que alguien ya ha hecho el trabajo por ti de modificarlo ligeramente para compilar en tu sistema. Ellos dispusieron su trabajo en forma de parche (“patch” en inglés), pero no estás seguro de como hacer uso de éste. La respuesta es que aplicas el parche al código original con una herramienta de línea de comandos llamada, adecuadamente, patch.

Situación dos: bajaste el código fuente de un paquete open source y despues de más o menos una hora de editarlo, lograste compilarlo en tu sistema. Te gustaría que tu trabajo esté disponible para otros programadores, o para los autores del paquete, sin tener que redistribuir el todo paquete modificado. Ahora estás en la situación donde requieres crear tu propio parche, y la herramienta que necesitas es diff (de diferencia en inglés).

Esta es una guia rápida para diff y patch que te ayudará en esas situaciones, mediante la descripción de las herramientas más frecuentemente usadas. Te dice lo suficiente para empezar de la manera correcta. Despues, puedes aprender los pormenores de diff y patch en tu tiempo libre, usando las páginas del manual.

Aplicando parches con patch

Para aplicar un parche a un solo archivo, cambiate al directorio donde esta localizado el archivo e invoca a patch:

patch < foo.patch

Estas instrucciones asumen que el parche esta distribuido en un formato unificado, que identifica al archivo al cual el parche debe ser aplicado. Sino, puedes especificar el archivo desde la línea de comandos:

patch foo.txt < bar.patch

Aplicar parches a directorios enteros (quizás el caso más común) es similar, pero hay que tener cuidado acerca de elegir un “nivel p”. Lo que esto quiere decir es que, dentro de los archivos de parches, los archivos a ser parcheados se identifican por las rutas de acceso, las cuales pueden ser diferentes ahora que los archivos estan localizados en tu computadora en lugar de la computadora donde se creó el parche. El nivel p indica al parche que ignore partes de la ruta de acceso a fin de que pueda identificar correctamente los archivos. La mayoría de las veces servirá un nivel p de uno, así que usa:

patch -p1 < baz.patch

Debes cambiar al nivel superior del directorio fuente antes de ejecutar este comando. Si un nivel de parche de uno no identifica correctamente ningún archivo para parchear, revisa el archivo del parche en busca de los nombres de los archivos. Si ves un nombre como:

/users/stephen/package/src/net/http.c

y estas trabajando en un directorio que contiene net/http.c, usa

patch -p5 < baz.patch

En general, cuenta uno por cada separador (caracter slash) que remuevas desde el principio de la ruta, hasta que lo que quede sea la ruta que existe en tu directorio de trabajo. La cuenta alcanzada es el nivel p.

Para remover un parche, usa la opción -R, por ejemplo

patch -p5 -R < baz.patch

Creando parches con diff

Usar diff es simple si se trabaja con archivos individuales o directorios fuentes enteros. Para crear un parche de un único archivo, usa la forma:

diff -u original.c new.c > original.patch

Para crear un parche de un árbol fuente entero, haz una copia del árbol:

cp -R original new

Haz cualquier cambio requerido en el directorio new/. Entonces crea un parche con el siguiente comando:

diff -rupN original/ new/ > original.patch

Esta es toda la información que necesitas para iniciarte con diff y patch. Para más información usa:

man diff
man patch

Texto original de Sthepen Jungels, puedes leerlo en inglés aquí

Los 10 mandamientos de GNU/Linux

  1. No iniciarás como root.

    Usa “sudo” o “su -” para las tareas de administración del sistema.

  2. Usarás el gestor de paquetes todo lo posible.

    Algunas veces instalar desde las fuentes no se puede evitar, pero cuando uses el gestor de paquetería de tu distro para instalar software, también podrás usarlo para actualizarlo y quitarlo. Esta es una de las fortalezas de Linux.

  3. Serás parte de una comunidad.

    Libremente da lo que has recibido gratuitamente. Ofrece ayuda y consejo en todo lo que puedas.

  4. Leerás la documentación y manuales.

    Siempre lee la documentación. La gente que escribe el software intenta anticiparse a tus preguntas, y proporcionar respuestas antes que preguntes.

  5. Usarás el sistema de soporte.

    Cambiarse a Linux puede ser difícil. Puede ser frustrante, pero hay gente que puede y quiere ayudarte. Déjalos hacer su trabajo.

  6. Buscarás.

    En la mayoría de los casos, tus preguntas y problemas han sido respondidos. Intenta buscar las respuestas que han sido resueltas antes de preguntar a alguien.

  7. Explorarás.

    Linux te abre un nuevo mundo de opciones y posibilidades. Intenta todo lo que puedas.

  8. Usarás la línea de comandos.

    Especialmente para configuraciones, usa las interfases gráficas para que tu sistema funcione a la perfección, pero intenta conocer la versión en línea de comandos también. En algunos casos, la línea de comandos es la única forma de usar alguna de las tantas características avanzadas de Linux.

  9. No intentarás recrear Windows.

    Linux no intenta ser un clon de Windows. Es diferente. Acepta y aprecia las diferencias.

  10. No te darás por vencido.

    Intenta con diferentes distribuciones hasta encontrar la que más te guste. Instala distros de vez en cuando. Intenta con diferentes programas que sirvan para un sólo propósito antes de establecerse (amarok, xmms, beep, exaile para música; azureus, ktorrent, deluge para bittorrents). Si ni te gustan los programas “de fábrica”, recuerda que casi siempre puedes cambiar a lo que más se te acomode.

Conversión a Números Romanos en C/C++

Para cierta tarea universitaria necesite un programa para convertir un número entero en un número romano, así que investigue un poco. Según Wikipedia las equivalencias para los números son las siguientes:

Romano I V X L C D M
Decimal 1 5 10 50 100 500 1000

Pero hay que seguir una serie de reglas para construir el número que ustedes podrán consultar en el link de wikipedia.

El proceso a realizar consiste en descomponer el número dado en ciertas cantidades que tengan su equivalente en romano, comenzando desde el mayor hasta el más pequeño. Ej. 15 = 10 + 5 = XV . La manera de descomponer el número no es otro que haciendo divisiones sucesivas desde el numero mayor hasta el menor, si la división es posible, agregamos la equivalencia al resultado y restamos el numero ya agregado y continuamos. as letras I, C, M se colocan tantas veces como exista una división entera posible.

  1. numero = 234
  2. numero / 100 = 2; Agregamos dos C al resultado (Resultado = CC)
  3. numero - 200 (numero es ahora 34);
  4. numero / 10 = 3; Agregamos tres X al resultado (Resultado = CCXXX)
  5. numero - 30 (numero ahora es 4);
  6. numero / 1 = 4; Agregamos cuatro I al resultado (Resultado = CCXXXIIII)

Comprendido a medias lo anterior proseguimos a ver el código de la función que dado un número entero devuelve una cadena con el número romano correspondiente:

string convertirRomano (int n)
{
	/* Se explican los 3 tipos de casos, los demas son análogos */
	int z;
	string respuesta = "";
 
	/* Se recorre cada caso y se verifica divisibilidad */
	if ((z = n/1000) > 0)
	{
		for (int x =0; x < z; x++)
			/* Si es divisible agrega las letra a la cadena de respuesta */
			/* esto se hace tantas veces el caso sea multiplo del número en cuestion */
			respuesta = respuesta + "M";
		/* Se resta la cantidad correspondiente a cuantas veces cabia el caso entre el número */
		n -= 1000 * z;
	}
 
	if ((z = n/900) > 0)
	{
		/* Si es divisible agrega las letras a la cadena de respuesta */
		respuesta = respuesta + "CM";
		/* Resta el valor de la letras ya agregadas */
		n -= 900;
	}
 
	if ((z = n/500) > 0)
	{
		/* Si es divisible agrega la letra a la cadena de respuesta */
		respuesta = respuesta + "D";
		/* Resta el valor de la letra ya agregada */
		n -= 500;
	}
 
	if ((z = n/400) > 0)
	{
		respuesta = respuesta + "CD";
		n -= 400;
	}
 
	if ((z = n/100) > 0)
	{
		for (int x =0; x < z; x++)
			respuesta = respuesta + "C";
		n -= 100 * z;
	}
 
	if ((z = n/90) > 0)
	{
		respuesta = respuesta + "XC";
		n -= 90;
	}
 
	if ((z = n/50) > 0)
	{
		respuesta = respuesta + "L";
		n -= 50;
	}
 
	if ((z = n/40) > 0)
	{
		respuesta = respuesta + "XL";
		n -= 40;
	}
 
	if ((z = n/10) > 0)
	{
		for (int x =0; x < z; x++)
			respuesta = respuesta + "X";
		n -= 10 * z;
	}
 
	if ((z = n/9) > 0)
	{
		respuesta = respuesta + "IX";
		n -= 9;
	}
 
	if ((z = n/5) > 0)
	{
		respuesta = respuesta + "V";
		n -= 5;
	}
 
	if ((z = n/4) > 0)
	{
		respuesta = respuesta + "IV";
		n -= 4;
	}
 
	if ((z = n) > 0)
	{
		for (int x =0; x < z; x++)
			respuesta = respuesta + "I";
		n -= z;
	}
 
	return respuesta;
 
}

Inicialmente este código seria mas fácil de construir (aunque no lo parezca) ya que vemos cada caso separadamente, pero luego cualquiera puede darse cuenta de que cada bifurcación es casi igual a la anterior. Así que el código anterior se podría convertir en esto:

string convertirRomanoCorto (int n)
{
	/* Se establece un arreglo con los casos y sus equivalentes */
	string romanos[13] = {"I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"};
	int enteros[13] = {1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000};
	string respuesta = "";
 
	/* Se recorre el arreglo de mayor a menor */
	for (int x=12; x >= 0; x--)
	{
		/* Se verifica si el numero es divisible entre el entero del arreglo */
		while ((n / enteros[x]) > 0)
		{
			/* Si es divisible agrega la letras a la cadena de respuesta */
			respuesta = respuesta + romanos[x];
			/* Resta el valor de la letra ya agregada */
			n -= enteros[x];
		}
		/* El ciclo menor se detiene cuando ya el valor no sea divisible entre el valor del caso */
	}
	/* El ciclo menor se detiene cuando se chequearon todos los casos */
 
	return respuesta;
}

Si quieren ver el código completo, esta disponible en este link.

Las conversiones son posibles para cualquier entero entre 1 y 3000 inclusive, por cuestiones de facilidad. Si alguno consigue como representar las letras con la barra horizontal para los miles, esta libre de hacer la modificación. Buena suerte!

60 Hechos interesantes pero ciertos (II parte)

  1. Tu quemas mas calorias durmiendo que viendo televisión.
  2. Una persona normal morirá de falta total de sueño antes que de hambre. La muerte ocurrirá casi a los 10 dias sin dormir, mientras que de hambre toma un par de semanas.
  3. La Mona Lisa no tiene cejas.
  4. Cuando la Luna esta directamente sobre tu cabeza, tu peso es ligeramente menor.
  5. Alexander Graham Bell, el inventor del teléfono, nunca llamo a su esposa o su madre porque ambas eran sordas.
  6. Al igual que las huellas dactilares, la impresión de la lengua de todos es diferente.
  7. Si la población de China pasase delante de ti en una sola línea, la línea nunca terminaría debido a la tasa de reproducción.
  8. China tiene mas hablantes de Ingles que Estados Unidos.
  9. Una persona promedio usa el baño 6 veces por día.
  10. Los bebés nacen con 300 huesos, pero un adultez solo tenemos 206 en nuestros cuerpos.
  11. La barba es el crecimiento de cabello mas rápido del cuerpo humano. Si un hombre promedio nunca recorta su barba, esta creceria a casi 30 pies de largo en toda su vida.
  12. El lugar con el nombre mas largo aún en uso es: Taumatawhakatangihangaoauauotameteaturi-Pukakpikimaungahoronukupokaiwhenuakitanatahu - un pueblo en Nueva Zelanda.
  13. Si dejas Tokyo en avión a las 7:00 am, arrivaras a Honolulú a aproximadamente a las 4:30 pm del día previo.
  14. Más de 40000 parásitos y 250 tipos de bacterias son intercambiados durante un beso francés.
  15. El nombre mas común en el mundo es Mohammed.
  16. Hay dos dos tarjetas de credito por cada persona en los Estados Unidos.
  17. ¡Las mujeres parpadean casi el doble que los hombres!.
  18. No puedes matarte si aguantas la respiración.
  19. Es físicamente imposible para los cerdos de mirar el cielo.
  20. Si estornudas demasiado duro, te puedes fracturar una costilla. Si intentas reprimir un estornudo, te puedes romper un vaso sanguíneo en la cabeza o el cuello y morir.
  21. 111,111,111 x 111,111,111 = 12,345,678,987,654,321
  22. Pregunta - La única comida que no se estropea. ¿Cuál es?. Resp: - Miel
  23. En los últimos 4000 años, ningun nuevo animal ha sido domesticado.
  24. En promedio, las personas temen más a las arañas que a la muerte.
  25. El corazón humano crea suficiente presión cuando bombea al cuerpo como para un chorro de 30 pies.
  26. La ratas se multiplican tan rapidamente que en 18 meses, dos ratas pudrían tener mas de un millón de descendientes.
  27. Cuando una persona sacude su cabeza de un lado a otro, el esta diciendo “sí” en Sri Lanka.
  28. El primer propietario de la compañía de cigarrillos Marlboro murió de cáncer de pulmón.
  29. La salsa de tomate (Ketshup) se vendió en 1830 como un medicamento.
  30. Como el metal era escaso, los Oscars dados durante la Segunda Guerra Mundial fueron hechos de madera.

Segunda Parte