Wednesday, October 27, 2010

Moviendo Casas


Suena extravagante, pues no lo es tanto, posiblemente han visto programas en el discovery channel al respecto, donde companias se dedican al exclusivo negocio de mover grandes estructuras, como casas, puentes, etc.

En esta oportunidad vemos como aca esta casa que sirvio de oficinas de una compania constructora, luego que terminaron sus funciones en esta area, es tiempo de moverla a otro sitio donde funcionara nuevamente como oficina temporal. Talvez logran apreciar en la foto, la plataforma de un trailer, esta bajo la casa, se pueden observar las ruedas abajo de la casa al lado izquierdo y al lado derecho de la casa, esta previamente ha sido desconectada de los simientos y posteriormente levantada de los mismos para meter la plataforma del trailer que se encargara de transportarla a su nuevo destino.

Es divertido incluso ver anuncios de ventas de casa donde el precio de la misma esta casi por los suelos, pero tienen el requisito que luego de comprarla, el nuevo dueño se la tienen que llevar, y eso paso hace unos meses con unas casas en un area donde pasaria una nueva carretera, la ciudad ordeno la venta de las casas, pero estas no podian permanecer en el terreno, sino que tenian que ser retiradas del lugar una vez fueran adquiridas.

Pueden encontrar mas fotos de este tipo si hacen un busqueda por imagenes de house movers en Google.


Saludos y hasta la proxima.

Monday, October 11, 2010

We got a new pet at home!

My kids has been asking for a dog in the last months, so in order to see how they're going to feel with a pet at home, we decide to build one, this little guy was built using the Lego Mindstorm set, which is a line of programmable robotics/construction toy that comes in a kit containing many non traditional pieces as well as sensors, cables and the main computer called the NXT brick, which is were you connect the sensors, store and run the programs.

So this little fella, goes around the house, avoiding much of the big obstacles (like walls), turns his head and using the ultrasound sensor (eyes) can see where there's more room to go; using the sound sensor (nose) , it can try to follow you if you call him; one good thing about him, it won't bark and won't do any mess, unless you program it :D

I remember using some of the first Lego Dacta sets back in 1998, when I was working for Futurekids in El Salvador, a company focused on the teaching of computers to young kids, and robotics was one of the areas, at that time we use a controll module that was connected to the wall and the sensors were connected to this module, those were pretty much static designs, but fun to watch.

The design, building steps and programs for the Robo-Puppy can be found here: NXT Programs

More info:

Tuesday, September 21, 2010

Jupiter a su máxima expresión.

En estos dias de septiembre del 2010, 20 al 22, es cuando el planeta gaseoso mas grande de nuestro sistema solar se encuentra en su punto mas cercano a nuestro planeta (perigeo), la Tierra y Jupiter se encuentran cada 13 meses, pero como las orbitas no son circulos perfectos, no siempre se encuentran a la misma distancia. En esta oportunidad, Jupiter estara 75millones de kilometros mas cerca que lo normal, y pasara asi por las siguientes semanas, pero anoche era el dia que mas cerca estarian; la Tierra y Jupiter no estaran a esta distancia sino hasta el 2022.

La vista por el telescopio fue excelente, las fotografias no hacen honor a lo que se ve desde el objetivo del telescopio, algo curioso de las fotografias es que se observa como el cinturon sur ecuatorial de Jupiter ha desaparecido por completo, segun los cientificos esta debajo de nuves que se han elevado mas en la atmosfera del gigante gaseoso y solo es cuestion de tiempo para que reaparezca de nuevo.

Aqui les dejo unas fotos de la sesion de anoche, que las disfruten, por cierto, al ver por un telescopio la imagen se invierte, la parte superior de las fotos es el polo sur de Jupiter, al igual que las fotos de la luna, donde se observa el crater Tycho en el polo sur.
















Thursday, September 9, 2010

Reglas de Cálculo (Slide Rulers) destinadas a la extincion?


Quien ha escuchado hablar de las reglas de cálculo? posiblemente algunos, pero quién ha visto a alguien usar una? o más raro, quién ha usado una antes?

El uso de las reglas de cálculo decreció considerablemente con el advenimiento de las llamadas calculadoras de bolsillo, que antes no eran tan de bolsillo como ahora, pero esa fue la causa principal de su desaparición. Yo use una regla de cálculo alla por el 88-90, en esa epoca para calcular algoritmos, y si no se podia usar una calculadora, era necesario aprender a usar las tablas de logaritmos y tablas trigonometricas, de esas si posiblemente algunos se acuerden, asi que en lugar de usar las tablas de logaritmos, yo usaba la regla de cálculo y los profesores estaban de acuerdo con eso. El uso de las reglas de cálculo esta relegado ahora a un pequeño grupo de personas que recuerdan como se utilizaban; posiblemente personas muy observadoras habran visto el uso de una de estas en la pelicula Apollo 13, cuando los operadores en la Tierra, hacian calculos para mantener con vida a los astronautas en el modulo lunar. Recuerdo que en San Salvador, en la tienda de articulos de dibujo llamada Diseõ, vendian estas reglas de cálculo, pero cuando ya nadie se acordaba de ellas fueron sacadas de inventario y cuando alguien preguntaba si aun tenian, las regalaban, de hecho yo tengo varias de esas.

Las reglas de cálculo fueron inventadas alla por 1620-1630, luego que John Napier publicara su estudio sobre los logaritmos, Edmund Gunter de Oxford desarrolló un dispositivo que era capaz de efectuar cálculos mediante escalas logarítmicas; la primera descripción de este aparato fue en Paris en 1624 por Edmund Wingate, matemático inglés en su libro titulado: Uso de la regla de proporciones en aritmética y geometría. En 1630, William Oughtred de Cambridge inventó una versión circular, y luego en 1632, combinando manualmente dos reglas usando el diseño de Gunter, esta última dio pie al diseño de la regla de cálculo tal y como se le conoce en la actualidad.

En su forma más básica, la regla de cálculo usa dos escalas logarítmicas con las cuales se pueden efectuar multiplicaciones y divisiones. Otras reglas más complejas, permiten operaciones como raiz cuadrada, exponentes, logaritmos y trigonometría. En general, las reglas consisten de tres bandas lineales de igual longitud, alineadas en paralelo y dispuestas de tal forma que la porcion central pueda moverse libremente entre las otras dos. Las otras dos bandas por lo general estan fijas y no se mueven. Algunas reglas llamadas duplex, tienen escalas en ambos lados de las bandas; además de las bandas con escalas logaritmicas existe un componente transparente llamado cursor que se desliza y permite localizar con mas precisión resultados ubicados en bandas no adyacentes o localizados al lado inverso de la regla.

Muchos modelos de reglas de cálculo fueron creados a lo largo del tiempo, muchas de ellas especializadas para determinadas tareas en áreas de ingeniería, navegación, negocios, etc; algunas aún se encuentran en relojes en la forma de reglas de cálculo circulares y son utilizadas por lo general en la navegación aérea para el cálculo de velocidad, combustible, entre otras cosas.

La época de oro de las reglas de cálculo ha pasado y ahora son solo objetos raros escondidos en algun cajón o en lugares privilegiados en manos de coleccionistas. En mi opinion, es mas útil darle a un joven una regla de calculo, que una calculadora y con esto podemos salvar a un objeto tan importante en la historia de la matemática de la extinción.


Referencias y más información:
Hasta la próxima.
 ___       ___  _         ___ _
| __|_ ___| \(_)__ _ __| _ ) |___ __ _
| _/ _/ _ \ |) | / _` |_ / _ \ / _ \/ _` |
|_|\__\___/___/|_\__,_/__|___/_\___/\__, |
|___/

Monday, August 23, 2010

Panorama

Un panorama (o panorámica) (derivada del griego πᾶν "all" + ὅραμα "sight") es cualquier vista tipo gran angular que representa un espacio físico, ya sea en pintura, dibujo, fotografía, etc. La palabra panorama fue originalmente acuñada por el pintor irlandés Robert Barker para describir sus pinturas panorámicas de Edinburgo, estas eran proyectadas a una superficie cilíndrica y desde una perspectiva interior, fueron exhibidas en Londres en 1792. El término paneo, utilizado en la producción de películas y videos, se deriva de la palabra panorama.

Siempre que tengo la oportunidad, tomo fotografías en secuencia para luego unirlas y hacer una panorámica de estas, la mejor forma de tomar las fotografias en secuencia es siempre comenzar desde la izquierda hacia la derecha, es recomendado montar la cámara sobre un tripode para mantener la camara fija en el centro de la panorámica, y finalmente recordemos que las fotografias siguientes deben de tomarse sobreponiendo (un 20-30%) la nueva imagen sobre la foto anterior; algunas cámaras traen software para crear las panorámicas, pero en mi caso, para hacer las uniones de las diferentes fotografías que componen la panorámica, nada mejor que Gimp + Pandora, no, no hablo del sitio de radio on line, sino de un script (plugin) diseñado para la construcción de panorámicas; básicamente lo que hay que hacer es bajar el script del sitio web, guardarlo en el área de scripts de Gimp y luego desde el menú de Filtros->Combinar se puede crear la panorámica y en unos segundos tenemos algunos resultados como los que muestro a continuación.


Norte de la ciudad de Quito en mayo del 2006.
Lago Silver ubicado en el cañon de American Fork, UT

Panoramica de la ciudad de Las Vegas en Enero de 2010
Mina de Cobre en la ciudad de Bingham, UT

El uso del plugin es relativamente sencillo, más detalles se pueden encontrar en la página web del plugin, así como también los pasos para utilizarlo.

Saludos y hasta la próxima.

Enlaces:

Mas informacion en wikipedia: panorama

Plugin de Gimp para crear panoramas: Pandora Plugin

Mina de cobre en Bngham, UT: Kennecott Copper Mine

Ciudad de San Francisco de Quito, Ecuador

Wednesday, August 18, 2010

A 30,000 pies de altura.


El internet ha logrado envolver nuestras vidas cotidianas de tal forma que sin el estamos como en un vacio, muchas personas despiertan y lo primero que hacemos es revisar el correo, ver las noticias del dia, entre otras cosas antes de disponernos a trabajar; y los que trabajamos en informatica es como que el trabajo nunca termina; nos ha tocado vivir una era de avances tecnologicos y mediaticos sin precedentes, al grado que ahora el unico lugar mas cercano que aun no tiene internet es la Luna; pero con la falta de interes en la luna por parte de los programas espaciales, creo que la proxima frontera sera el 4to planeta a.k.a. Marte.


Regresando el dia de ayer, me encontre con que el internet ahora esta disponible por un modico precio de $4.95 mientras el avion esta en ruta a su destino, asi que me suscribi al servicio y en menos de 2 minutos ya estaba conectandome al messenger, revisando por donde estaba sobrevolando el avion (flightstats) y ademas contacte a mis amigos en el IRC de linux.org.sv y a mi esposa, que se asusto pensando que habia perdido el vuelo y estaba de regreso en el aeropuerto, como minutos antes habia estado conectado desde el internet wireles del aeropuerto. Asi que el resto del vuelo lo pase entretenido hablando con mis amigos y mi esposa e hijos.

Una vez el vuelo llego a su destino nos pidieron que apagaramos nuestros equipos electronicos y hasta ahi llego el uso del internet en el avion, pero es algo mas a la lista de cosas que ahora se pueden hacer a mas de 30,000 pies (9 Km aprox) de altura.

Saludos y hasta la proxima.

Friday, August 13, 2010

Perseidas 2010

Para los que aun no se animan a levantarse a las 3 o 4 de la madrugada a ver el show, les cuento como nos fue ahora por la manana, mi hijo, mi suegro y yo nos levantamos a eso de las 4am de hoy viernes 13, y nos dispusimos afuera del frente de la casa, hacia el este que es donde aparece la constalacion de Perseo (los meteoros parecen venir de esa constelacion, por eso el nombre de Perseidas), asi que nos acomodamos cada uno en su silla a disfrutar del "show".

Yo logre contar 48 estrellas fugaces, mi suegro solo logro ver 3 de ellas, pero fueron casi bolas de fuego las que el vio, y mi hijo conto 15, de las cuales algunas vi yo, otras no, asi que posiblemente la cuenta total andaria cerca de las 60, aproximadamente en una hora, desde las 4:30 a las 5:30 de la manana, ya cuando comenzaba a ponerse un poco claro por estas latitudes y mi hijo ya estaba cayendo de sueno.

Segun reportan, el espectaculo aun podra verse esta noche, asi que los que aun no han visto, intenten en la madrugada de manana sabado, ya que manana no trabajan (espero) y luego de ver las estrellas pueden ir a dormir hasta el medio dia.

Saludos.

Mas detalles y foto cortesia de: http://spaceweather.com/

Tuesday, August 3, 2010

UFO or not? / OVNI o no?

This is what happen when you start taking random pictures of the sky, this picture (left) was taken a month ago during the hot air balloon celebration down there in Provo, I was taking pictures to the balloons when I notice the moon and took a picture of it; what I surprise for me that when I was looking at the pictures I noticed a small thing below the moon (see 2nd picture), you can see in the square a magnification of that object, and then I start asking this question: what is it? Doesn't look like a plane, or helicopter, it's to high to be one of those, how about a satellite, the ISS? It's the closest, but if it's not, what do you think it is?

000 OOO ooo

Esto es lo que pasa cuando se toman fotografias al azar de cielo, la fotografia de la izquierda(arriba) fue tomanda hace un mes en el festival de globos aerostaticos de la ciudad de Provo, con motivo de las celebraciones de la independencia de Estados Unidos, cuando para mi sorpresa observo que hay un objeto pequenio bajo la foto de la luna; en la siguiente imagen pueden ver en recuadro el objeto aumentado, ahi fue cuando comenze a preguntar: que es eso? No parece un avion, no parece un helicoptero, ademas esta a mi punto de vista, demasiado lejos; puede ser un satelite, la estacion espacial internacional, etc.; pero y si no lo es: que crees que es?

Monday, August 2, 2010

Zim - A Desktop Wiki


Zim brings the concept of a wiki to your desktop. Store information, link pages and edit with WYSISYG markup. Creating a new page is as easy as linking to a non-existing page (:NewPage:). Pages are stored in a folder structure and can have attachments.

This tool can be used to keep track of TODO lists or ideas, to take notes during a meeting or to draft any other kind of text (blog entries, important mails, etc.).

Zim handles several types of markup, like headings, bullet lists and of course bold, italic and highlighted. This markup is saved as wiki text so you can easily edit it with other editors. Because of the autosave feature you can switch between pages and follow links while editing without worries.

http://zim-wiki.org/


___ ___ _ ___ _
| __|_ ___| \(_)__ _ __| _ ) |___ __ _
| _/ _/ _ \ |) | / _` |_ / _ \ / _ \/ _` |
|_|\__\___/___/|_\__,_/__|___/_\___/\__, |
|___/

Tuesday, July 13, 2010

Viva Las Vegas!


Luego de unas merecidas vacaciones y tambien tomarme tiempo para disfrutar con mi mama y sobrina a quienes no veia desde hace un buen rato, y con el fin de despejarnos la mente y dejar atras los problemas de la vida cotidiana nos fuimos unos dias a la ciudad del pecado (Sin City) como suelen llamarle por aca a la ciudad de Las Vegas en el estado de Nevada, a menos de 6 horas (por freeway a 75mph en promedio) de donde vivimos, era una visita obligada (segun mi sobrina), asi que nos fuimos en el fin de semana de las celebraciones del 4 de julio; Las Vegas es una ciudad que cambia constantemente, hace un par de dias mostre en GBuzz dos fotos con 6 anios de diferencia y los cambios que la ciudad ha tenido en este tiempo, ahora hay otro tren elevado que circula al rededor de un nuevo complejo de edificios llamado City Center en el corazon de la Strip (como se le conoce a Las Vegas Blvd). Este complejo aun se encontraba en construccion en septiembre pasado y ahora es uno de los puntos mas visitados. Nuevos hoteles como el M, en el punto mas al sur de la Strip, pero definitivamente muy al sur, tanto que es el unico hotel en esa zona. El trafico esta vez estaba mas tranquilo, no tanto loco al volante y finalmente no habia tanta construccion en el freeway al lado de las vegas como en otras oportunidades.

La comida, un poco mas cara, pero abundante en los buffete que van desde los $8 hasta los $20 o mas en algunos hoteles; las atracciones, al menos esta vez no me quede con las ganas de subirme al big shot del hotel Stratosphera, que se encuentra en el piso 112 de la torre, y que lo acelera a unos 45mph en unos 3-4 segundos. Ahora hay una nueva diversion en la torre y es lanzarse amarrado de una cuerda desde el piso 112 hasta la base de la torre, claro un cable de acero lo baja a uno a cierta velocidad para dar la impresion de que se esta cayendo, era comico ver como algunas personas ya al borde del edificio no querian saltar y tenian que empujarlos para saltar.

Gente, no importa si es dia feriado o no, gente es lo que mas hay en las vegas, la temperatura estaba a todo vapor literalmente, hubo dias que la temperatura andaba por los 46 - 47 grados centigrados, suficientes para sentirse mal si no se toma suficiente liquidos o se hace uno a la sombra, otros trataban de combatir el calor en las piscinas de los hoteles.

Otros eventos durante al visita a las vegas fueron la visita del presidente Obama a Las Vegas, los partidos del mundial de futbol, y finalmente la visita a la represa Hoover en el borde entre Nevada y Arizona. Creo que pasamos un buen momento por alla, no ganamos dinero en las maquinas, pero si ganamos muchos recuerdos y memorias que perduraran por mucho tiempo.

Hasta la proxima

Thursday, July 1, 2010

:(){ :|:& };:

http://en.wikipedia.org/wiki/Fork_bomb

Una bomba fork es una forma de ataque del tipo denegación de servicio sobre un computador que implementa la operación fork, o alguna funcionalidad equivalente mediante la cual un proceso es capaz de crear otro proceso.

Una bomba fork funciona creando una gran cantidad de procesos muy rápidamente con el objetivo de saturar el espacio disponible en la lista de procesos mantenida por el sistema operativo del computador. Si la tabla de procesos se llega a saturar, entonces no se pueden iniciar nuevos programas hasta que no se cierre alguno. En el caso que esto suceda, es muy poco probable que se pueda iniciar un programa útil ya que los procesos de la bomba estarán esperando para poder crear nuevos procesos a la primera oportunidad que se les conceda.

Las bombas fork no sólo ocupan espacio dentro de la lista de procesos, también consumen tiempo de proceso y memoria de la máquina donde se ejecutan. Como resultado de esto, los ordenadores se vuelven lentos e incluso se pueden volver inutilizables dada la falta de memoria y la imposibilidad de aprovechar el procesador.

Una forma de prevenir el ataque de una bomba fork es limitar el número de procesos que un usuario puede ejecutar. Cuando un proceso intenta crear otro proceso y el propietario de dicho proceso ya posee la cantidad máxima de procesos que se le ha asignado, el intento de creación del nuevo proceso falla. El máximo número de procesos asignado a cada usuario debe ser lo suficientemente bajo para poder resistir la ejecución simultánea de una bomba fork por cada usuario y dejar libres los suficientes recursos como para poder restaurar el sistema.

Ejemplos de bombas fork tenemos (advertencia, no ejecutar a menos que se guarde toda information actualmente abierta; en algunos casos existe la posibilidad de daniar el sistema):


Bash
:(){ :|:& };:


C:
#include

int main(void)
{
for(;;)
fork();
return 0;
}

PHP:
while(pcntl_fork()|1);


Python:
import os

while True:
os.fork()



___ ___ _ ___ _
| __|_ ___| \(_)__ _ __| _ ) |___ __ _
| _/ _/ _ \ |) | / _` |_ / _ \ / _ \/ _` |
|_|\__\___/___/|_\__,_/__|___/_\___/\__, |
|___/

Thursday, June 24, 2010

rm -rf * : Too many arguments

El otro dia que estaba queriendo borrar unos archivos que ya no necesitaba, pero el problema es que eran demasiados para el limite de argumentos que soporta el kernel de linux, y este error ocurre cada vez que el usuario pasa mas argumentos de los que el sistema soporta, y esto aplica a todos los comandos como: ls, cp, rm, etc.

Asi que habia que buscar una alternativa (workaround) para el comando rm -rf *, entonces es cuando otros comandos de Bourne Shell pueden ser utiles para completar esta tarea, asi que aqui les muestro dos alternativas:

for i in *; do rm -rf $i; done

De esta forma el comando for toma un archivo a la vez y lo coloca en la variable $i; dentro del loop se ejecuta el comando rm para finalmente borrar el archivo; resultado, los archivos son eliminados, que es lo que se deseaba desde el principio.

Otra alternativa para realizar esta tarea es mediante el comando find:

find . -type f -name '*' -exec rm -rf {}\;

El comando find pasa cada archivo que coincide con la busqueda y ejecuta el comando rm -rf en cada uno de ellos, completando al final la tarea deseada.

Hay otras alternativas, pero las dejo para la investigacion, de hecho una de ellas es el modificar, en el kernel de Linux, la variable que permiten incrementar el limite de parametros que se pueden pasar en una linea de comandos, pero ojo, esto require del conocimiento de los cambios que se haran y de como compilar un nuevo kernel de Linux; una pista, busquen en /include/linux/binfmts.h.

Saludos y hasta la proxima.

___ ___ _ ___ _
| __|_ ___| \(_)__ _ __| _ ) |___ __ _
| _/ _/ _ \ |) | / _` |_ / _ \ / _ \/ _` |
|_|\__\___/___/|_\__,_/__|___/_\___/\__, |
|___/

Tuesday, June 8, 2010

What is Gopher?

gopher n. 1. Any of various short tailed, burrowing mammals of the family Geomyidae, of North America. 2. (Amer. colloq.) Native or inhabitant of Minnesota: the Gopher State. 3. (Amer. colloq.) One who runs errands, does odd-jobs, fetches or delivers documents for office staff. 4. (computer tech.) Software following a simple protocol for tunneling through a TCP/IP internet.

If we use that last definition and with one click of your browser (I hope you are using Firefox) you've just taken several years back in Internet time. Close your eyes and grip your terminal. Imagine there's no Websites (it's easy if you try). Imagine that there's a Commodore 64 on your desk, or maybe a 386.

Now open them again.

You're in the year 1991, when University of Minnesota computer scientists, fed up with the limitations of FTP for downloading files and the overhead of having to log into computers for everything, decided to come up with a friendlier method of accessing data over the then largely vacant and much smaller Internet. The result was Gopher, a simple and easy to understand menu system that allowed once hideously complicated systems and services to be strung together for straightforward usage. And Gopher Was Good.

In fact, Gopher was so good that for several years, Gopher sites sprang up all over. You could get weather reports on Gopher, news, mailing lists, even software.

Then Mosaic came out barely a year or so later and plunged the world into darkness and all seemed lost under the choking strands of the World Wide Web. And Gopherspace lay all but forgotten.

But Gopher's still out there. And what's more, you'll find it surprisingly useful, even years after the Web became a household word. Why?

  • It's easy to set up.
  • It's easy to write content for and facilitates organization.
  • It doesn't need much system power to run -- either from the server or from your computer. It can run on systems with little CPU power or memory.
  • It supports many things that the Web does, even if it looks less attractive. You can still view images, search and download programs, and ...
  • ... since Gopher has less data to transfer, it's frequently faster.

Save the Gopher! Explore Gopherspace with Veronica-2 and find out about the hidden world the Gophers once dug. And think how different the world would be if that darn Mosaic had never been written ... :-)

So how do you get to gopher, well click in any of the following urls, and no it's not http:// it's gopher://
Do you search the gopher?
 ___       ___  _         ___ _    
| __|_ ___| \(_)__ _ __| _ ) |___ __ _
| _/ _/ _ \ |) | / _` |_ / _ \ / _ \/ _` |
|_|\__\___/___/|_\__,_/__|___/_\___/\__, |
|___/

Friday, June 4, 2010

La aspiradora del sistema solar.

Si Jupiter se le conoce tambien como la aspiradora del sistema solar, por que? Dado su gran tamanio y campo magnetico que se extiende a millones de kilometros de distancia, es capaz de atrapar objetos muy distantes en su orbita, tal fue el caso del cometa Shoemaker-Levi 9 que en el 94 se desintegro al ingresar a la atmosfera de Jupiter.

El anio pasado tambien en julio, Jupiter aparecio de repente con una mancha gigantesca, producto del encuentro del planeta con algun cometa o meteorito (foto inferior).
Pero nuevamente ayer, como se muestra en la foto de arriba, se puede observar un destello producto del ingreso de otro objeto en la atmosfera de Jupiter.

Muchos astronomos piensan que esa cualidad de Jupiter de ser capaz de atraer mucho del material errante en el sistema solar ha permitido la existencia de vida aqui en la tierra, pues de lo contrario, es posible que nuestro planeta fuese bombardeado por un cometa o meteorito cada 50 anios aproximadamente.

Wednesday, May 19, 2010

Bash en la vida cotidiana.

Para los que todos los dias tenemos que trabajar con bash en nuestros sistemas, ya sea como administradores de sistemas, desarrolladores, etc. sabemos lo importante que es para nosotros la linea de comandos, y que mejor si podemos aprender algunos trucos para agilizar ese trabajo, asi aqui les presento un par de ellos:

ctrl+r:
Bash registra cada uno de los comandos que ejecutamos en una bitacora, y esta nos permite regresar a ellos cuando los necesitamos u olvidamos los parametros de un determinado comando que tanto trabajo nos costo construir; una de las formas de hacer esto es mediante las teclas de flecha hacia arriba y abajo, lo cual nos lleva a los comandos ingresados con anterioridad y navegar a travez de ellos. Pero si necesitamos encontrar el comando con mayor rapidez, podemos hacer uso de la busqueda rapida, esta busca entre los comandos ingresados aquellos que inician con las letras que ingresamos luego de la combinacion de teclas ctrl+r, Bash comenzara una busqueda y nos mostrara aquellos comandos que coinciden con las letras que estamos ingresando; si el comando mostrado no es el que estamos buscado, podemos seguir presionando ctrl+r para ir al siguiente resultado de la busqueda y asi sucesivamente; una vez encontrado el comando deseado, damos enter para ejecutarlo inmediatamente o las teclas de flechas izquierda o derecha para editarlo, en caso que deseamos editar la linea antes de ejecutarla.

!! y !#
Este es otro par de combinacion de simbolos que permiten agilizar nuestras actividades en Bash, el primero !! nos permite ejecutar exactamente el comando ingresado anteriormente. En cuanto al segundo, este nos permite ejecutar el comando #, donde el numero especificado es el numero asignado por la secuencia del comando history.

Por ejemplo, si al ejecutar el comando history, vemos el siguiente resultado: (salida ha sido truncada)
44 history
45 cd Backup/
46 history
47 yum
48 #?

Al ejecutar !45 equivale a ejecutar nuevamente el comando: cd Backup/

Pregunta: que almacena Bash en la variable denominada $?

Si conoces otros trucos de la linea de comandos, compartelos.

Wednesday, May 12, 2010

Ayer Pascal, C, Python, ahora Ruby, manana Go?

Lejos ha quedado la epoca en que daba clases de Teoria de Lenguajes de Programacion alla por el 96-99 para la carrera de computacion en la UCA, donde hablabamos de los automatas finitos, analizadores lexicos/sintacticos, expresiones regulares, etc, atras ha quedado la epoca en que usabamos el compilador Turbo C/Pascal de Borland, o Modula-2 para quienes programaron en ese lenguaje, ahora los lenguajes son orientados a objetos, paradigma que comenzaba a despegar por aquellos anios en El Salvador, pocos eran los que intentaban descifrar de que se trataba, pero que ahora es un elemento indispensable en los nuevos y modernos lenguajes de programacion, asi como una herramienta indispensable para los programadores actualmente. Lisp se podria decir que era de los lenguajes mas avanzados a su epoca, utilizado primordialmente en sistemas de Inteligencia Artificial (al igual que Prolog), tenia problemas de eficiencia (no se si culpar a la recursividad por tal razon) asi como no era facil tratar de resolver cualquier problema de la vida real mediante formulas matematicas y recursividad; Pascal y Basic digamos que eran los lenguajes que nos motivaron a estudiar computacion, ensamblador fue el que nos hizo lograr entender como los circuitos digitales dentro de la computadora colaboran entre ellos en una sincronia de reloj, para calcular la serie de Fibonacci, buscar numeros primos o simplemente resolver una ecuacion de segundo grado. Finalmente C, era como la llave a todas nuestras respuestas, el problema era como usar la llave, siendo un lenguaje de alto-medio nivel, dispone de gran habilidad para desarrollar programas en casi cualquier rama, por eso se le denomina lenguaje de proposito general, como tambien estar lo suficientemente cerca del hardware para ser eficiente y descubrir los secretos del BIOS y cambiar el vector de interrupciones de la computadora (para los que haciamos programas residentes en memoria o TSR(Terminate and Stay Resident ).

Se acuerdan de los lenguajes de cuarta generacion, pues si no se acuerdan de ellos es por que nunca los conocieron o trabajaron en ellos, originalmente desarrollados con el fin de resolver un grupo en particular de problemas, (principalmente en el ambito de los negocios y reemplazar al omnipresente COBOL), tenemos a PowerBuilder, Natural, entre otros, que durante algun tiempo se creia eran la respuesta a los sistemas empresariales, cuando aparecio el Internet; HTML (aun que no un lenguaje de programacion), pero que gano popularidad con el advenimiento del Internet y las paginas web y el Dot Com; Java, JavaScript, PHP, Perl son otros de los grandes protagonistas de las nuevas generaciones de aplicaciones que poblarian la red en los anios venideros uniendo fuerzas con bases de datos como MySQL/PostgreSQL.

Actualmente, la lista de lenguajes de programacion es enorme y llena de todo tipo de lenguajes destinados a una gran gama de posibles probemas de la vida cotidiana o no tan cotidiana, en los ultimos 3 anios Python se ha ajustado muy bien en cubrir las necesidades que require mi trabajo de control de calidad de software, automatizando pruebas de software, pero actualmente la empresa donde trabajo, el lenguaje que mas utilizan es Ruby, de hecho una de las librerias que utlizamos para hacer pruebas esta en ese lenguaje, asi que aqui me tienen leyendo/aprendiendo un poco de Ruby en un rato que tengo libre en el trabajo, eso significa otro lenguaje a la bolsa, no esta nada mal, pero luego de Ruby que? Erlang? Go? Nimrod? Ioke?

Y ustedes en que lenguaje programan/crean scripts?

Saludos.

El archivo /etc/passwd

Los que trabajamos en sistemas Unix/Linux sabemos (espero) que este archivo contiene informacion sobre cada usuario que puede ingresar al sistema, el archivo tambien contiene, entre otros datos, la informacion necesaria para verificar la autenticidad del usuario, mediante la contrasenia, pero en algunos otros sistemas, esta informacion es transferida hacia otro archivo llamado /etc/shadow.

Este archivo puede ser leido por todos los usuarios, pero solamente el administrador o aquellos usuarios con permiso pueden editarlo.

El otro dia un amigo en el canal #linux.org.sv en IRC, preguntaba como podia hacer que un usuario al ingresar al sistema mediante ssh, solo pudiese tener acceso a una aplicacion en particular y si deseaba salirse de ella, al hacerlo, el sistema lo desconectaria inmediatamente; bueno la solucion estaba en el archivo /etc/passwd, si observamos bien en el archivo, el ultimo campo de cada linea corresponde al shell que atiende al usuario una vez este ingresa al sistema, pero que tal si en lugar de colocar el shell que atendera al usuario, colocamos el nombre y ubicacion de otro programa?, bueno este atendera al usuario mientras utilize el programa, pero una vez este termine de usarlo, el sistema lo desconecta automaticamente.

Veamos un ejemplo: Ojo, no intenten esto con su usuario, mi recomendacion es que creen un usuario de pruebas para hacerlo, pueden usar el siguiente comando en Linux, en el siguiente ejemplo usaremos el programa top, asi este usuario solo podra ver el resultado del comando top una vez ingrese al sistema:

$ sudo adduser -s /usr/bin/top testuser

Ahora asignemosle un password al usuario mediante:

$ sudo passwd testuser

Una vez el password ha sido asignado, observen la nueva linea en el archivo /etc/passwd y observen como la ultima columna en lugar de apuntar a un shell, apunta a /usr/bin/top; intentemos ingresar al sistema mediante este usuario, podemos usar el comando su:

$ su testuser

Una vez damos la contrasenia, en lugar de recibir un prompt ($) de un nuevo shell, vemos como el programa top inicia automaticamente, y cuando lo cancelamos mediante
la tecla "q", el usuario es automaticamente desconectado; para confirmarlo usamos el comando "whoami", debemos estar de regreso en nuestro usuario original y no el usuario de pruebas. Pueden confirmar esto tambien haciendo un 'tail -f' sobre el archivo /var/log/auth.log donde veran que el usuario sale al instante de cerrar top.

Que pasa si en lugar de /usr/bin/top cambian por /sbin/nologin?

Saludos.

Friday, April 16, 2010

Que es Scratch?

Scratch es un lenguaje de programacion que permite de forma facil crear historias interactivas, animaciones, juegos, musica, arte, etc. y posteriormente compartir estas por medio del Internet. A medida que se crean los proyectos, se aprenden conceptos importantes sobre matematica y computacion, al mismo tiempo que se desarrolla el pensamiento creativo, razonamiento sistematico y el trabajo en equipo.



Sitio oficial: http://scratch.mit.edu/

Instrucciones para instalarlo en Linux: http://info.scratch.mit.edu/Linux_Installer

Wednesday, April 14, 2010

Llegaremos algun dia a colonizar Marte o una de las lunas de Saturno?

Es posible que con el avance cientifico de algunos paises y el desarrollo de nuevas tecnologias para viajar, una eventual colonizacion del planeta rojo sea una posibilidad viable en un futuro cercano (o no tan cercano?), la pregunta es, muy aparte de todas esas creencias de las personas en catastrofes y profesias que apuntan a una destruccion masiva (fin del mundo, 2012), las cuales han existido desde hace mucho y hasta ahora ninguna ha sido comprobada como cierta, pues mas se basan en la mera casualidad de eventos, la pregunta recae en: podremos los seres humanos como especie sobrevivir a nosotros mismos, a nuestras guerras, ambiciones, defectos, destruccion de nuestro propio habitat, y por encima de todo eso, lograr llegar a otro planeta o luna, y comenzar de nuevo?

Pero comenzar de nuevo, por suerte esta vez no tenemos que comenzar con herramientas rudimentarias como lo hicieron nuestros ancestros hace 65 millones de anios, sino que somos capaces de explicar de forma cientifica nuestro entorno, eso deberia darnos una ventaja abismal, y ser capaces de moldear este nuevo planeta en un habitat para seres humanos tal y como lo tenemos en nuestro globo terraqueo, en teoria.

Nuestro planeta se encuentra a la distancia exacta para que diversos procesos quimicos se desarrollen hasta el punto de crear seres multicelulares complejos, esto gracias a la existencia de agua en forma liquida, la orbita y rotacion estable del planeta, atmosfera y un campo magnetico que la protege de las inclemencias del sol; todos estos elementos contribuyen al sostenimiento de la vida en nuestro planeta, existe la posibilidad que semejantes combinaciones de elementos existan en otro punto del universo? Yo creo que si, pero el punto es que nuestra existencia aca esta limitada por la disponibilidad de elementos sostenedores de vida, o no?

En el caso de los dinosaurios, estos poblaban la tierra hasta hace unos 65 millones de anios, luego que segun la teoria del gran meteorito, acabo con ellos. Ese fue un evento totalmente fuera del control de los seres vivientes de esa epoca y podria ser nuestro caso tambien, ya paso una vez, volvera a pasar, cuando, quien sabe, pero para entonces es posible que ya hayamos encontrado la forma de habitar y adecuar otro planeta para nuestras necesidades, talvez para ese entonces, los cambios en el sol haran que en algun momento la distancia desde Marte hacia este, sea la distancia adecuada para el sostenimiento de vida tal y como la conocemos, haciendo de la Tierra solo un recuerdo y un planeta muy parecido a Venus, inhabitable.

El punto aqui es la perpetuidad de la especie humana, estamos aqui para quedarnos? lo dudo, la existencia del ser humano es tan solo un segundo si lo medimos en parametros desde la formacion del universo, pero lograremos perpetuar nuestra especie? me cuesta trabajo comprender que el ser humano, a pesar de todos sus defectos, desaparezca, y con el, todo el cumulo de informacion, tecnologia, arte, ciencias, etc. que hemos logrado desarrollar a lo largo de nuestra existencia. O es que el universo se empenia en volver a recrear nuestra especie en algun otra galaxia, en algun otro planeta, donde tenemos que comenzar desde cero absoluto y cometer los mismos errores del pasado? Me resisto a creer que eso sea posible, pero no esta muy lejana la posibilidad que eso este pasando en otro lugar en este mismo momento. ( Vease la ecuacion de Drake.)

Ojala y nuestros defectos e imperfecciones como seres vivientes, no se impongan ante nuestro deseo de seguir existiendo como tales en este rincon o en cualquier otro lado del universo, a mi punto de vista, seria una gran perdida.

Ustedes que opinan?

Saludos.

Promedio de Carga

Alguna vez se han preguntado que significan los valores denominados Load Average (Promedio de Carga) que aparecen en los comandos uptime y top de Linux/Unix? Bueno yo me hice esa misma pregunta hace un buen rato y buscando respuestas encontre varias explicaciones, desde las estadisticas que explican los metodos utilizados para calcular dichos resultados, hasta las que usan analogias para comparar a los procesadores como los carriles de una autopista y a los vehiculos en ella como los procesos haciendo uso de los procesadores.

En resumen, se puede decir que el promedio de carga del CPU es la suma promedio del numero de procesos esperando en la cola de execucion, mas el numero de procesos executandose en el ultimo minuto, asi como los ultimos 5 y 15 minutos, respectivamente; es de recalcar que estos datos se obtienen exclusivamente de los procesos que demandan atencion del CPU.

Para poner un ejemplo, consideremos la siguiente salida del comando uptime (el mismo resultado se obtiene del comando top):

15:43 up 14 days, 4:52, 13 users, load averages: 2.43, 2.96, 3.41

De lo anterios podemos observar que la carga promedio sobre el(los) CPU(s) en el ultimo minuto es 2.43, en los ultimos 5 minutos es de 2.96 y en los ultimos 15 minutos ha sido de 3.41.

De lo anterior podemos extraer lo siguiente:

  • En promedio, en el minuto anterior ha habido 2.43 procesos ejecutandose o esperando por recursos.
  • En general, la tendencia del sistema es hacia un uso menor de los recursos, dado que el numero de procesos ejecutandose y en espera de recursos en el ultimo minuto (2.43) es menor que el registrado en los ultimos 5 minutos(2.96), asi como en los ultimos 15 minutos, cuando el promedio era de 3.41 procesos ejecutandose o esperando recursos.
  • Podemos decir que el sistema en su totalidad se encuentra ocupado, que tanto, es dificil saberlo solo con los valores de carga promedio, pero como mencionamos anteriormente, podemos ver su tendencia.

Finalmente podemos mencionar que en un sistema donde el promedio de carga es significativamente mayor que el numero de CPU's disponibles, entonces el sistema pasa considerablemente ocupado, o saturado con algun tipo de problema tipo cuello de botella. Por el contrario, un equipo donde el promedio de carga es menor que el numero de CPUs en el sistema, probablemente se encuentra funcionando bien.

Para mas informacion: http://www.linuxjournal.com/article/9001?page=0,1

Saludos y hasta la proxima.

Monday, March 29, 2010

Parece que las bases de datos relacionales tienen competencia fuerte.

Una nueva ola de almacenar datos esta revolucionando la insdustria en los ultimos meses, y definitivamente nombres reconocidos en la industria estan reconociendo sus bondades, pero de que estamos hablando? Al parecer el tradicional LAMP, una combinacion ganadora en los ultimos anios y que ha hecho uso extensivo de bases de datos relacionales como MySQL y PostgreSQL, parece cosa del pasado, y es que la nueva modalidad de bases de datos no relacionales o (Non-SQL como tambien les llaman en Ingles) son la nueva panacea en el almacenamiento de informacion (o mejor dicho documentos).

Pero que esta motivando este cambio:

  • En muchos casos las bases de datos relacionales no son la respuesta a todos los requerimientos de almacenamiento de datos.
  • Las bases de datos relacionales presentan obstaculos para su uso en ambientes distribuidos.
  • La normalizacion usualmente impacta en el desempeno de la base de datos.
  • En muchas aplicaciones solamente es necesario hacer busquedas basadas en la llave primaria.


Los nuevos protagonistas en el almacenamiento de bases de datos difieren en algunas funcionalidades, pero en general todos se basan en un conjunto de caracteristicas de alto nivel, entre las cuales podemos mencionar:
  1. Son bases de datos no normalizadas, sin necesidad de esquemas y orientadas a documentos
  2. Bases de datos simples, basadas en el conjunto llave : valor; metodos de busqueda estan disponibles y se basan en busquedas de la llave primaria.
  3. Capacidad de uso distribuido, o crecimiento horizontal, donde replicas de la base de datos pueden ubicarse en diversos nodos de distribucion de contenidos para los usuarios.
  4. Replicacion es un punto importante como se menciono anteriormente, entonces esta debe ser una caracteristica importante de la base de datos.
  5. La base de datos se accede mediante llamadas usando el formato RESTful, o mediante API
  6. Soporte del metodo de programacion o framework Map Reduce introducido por Google para el analisis de datos.
  7. Consistencia.
Apache CouchDB

Hace unas semanas el grupo de usuarios de Python de Utah hizo una presentacion sobre esta base de datos y en ellas se demostro su funcionalidad en el desarrollo de una pequena aplicacion, tambien se hablo un poco de la historia de la base de datos y sus caracteristicas, las cuales pueden encontrarse en el sitio web oficial, pero basicamente CouchDB es una base de datos orientada a documentos.

A continuacion mostramos como instalar la aplicacion en Fedora 12, asi como la libreria de Python para acceder a la base de datos; luego un programa que accede a la base de datos y muestra como hacer ciertas operaciones con los datos de la misma.



[fdiaz@fedora12 ~]$ sudo yum install couchdb python-couchdb
[sudo] password for fdiaz:
Loaded plugins: presto, refresh-packagekit
adobe-linux-i386 | 951 B 00:00
rpmfusion-free-updates | 3.3 kB 00:00
rpmfusion-nonfree-updates | 3.3 kB 00:00
updates/metalink | 15 kB 00:00
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package couchdb.i686 0:0.10.0-2.fc12 set to be updated
--> Processing Dependency: libicu-devel for package: couchdb-0.10.0-2.fc12.i686
--> Processing Dependency: libjs.so.1 for package: couchdb-0.10.0-2.fc12.i686
--> Processing Dependency: erlang for package: couchdb-0.10.0-2.fc12.i686
---> Package python-couchdb.noarch 0:0.6.1-2.fc12 set to be updated
--> Running transaction check
---> Package erlang.i686 0:R13B-04.1.fc12 set to be updated
--> Processing Dependency: libodbc.so.2 for package: erlang-R13B-04.1.fc12.i686
---> Package js.i686 0:1.70-8.fc12 set to be updated
---> Package libicu-devel.i686 0:4.2.1-7.fc12 set to be updated
--> Running transaction check
---> Package unixODBC.i686 0:2.2.14-9.fc12 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
couchdb i686 0.10.0-2.fc12 fedora 513 k
python-couchdb noarch 0.6.1-2.fc12 updates 83 k
Installing for dependencies:
erlang i686 R13B-04.1.fc12 updates 33 M
js i686 1.70-8.fc12 fedora 346 k
libicu-devel i686 4.2.1-7.fc12 updates 616 k
unixODBC i686 2.2.14-9.fc12 updates 381 k

Transaction Summary
================================================================================
Install 6 Package(s)
Upgrade 0 Package(s)

Total download size: 35 M
Is this ok [y/N]: y
Downloading Packages:
Setting up and reading Presto delta metadata
updates/prestodelta | 689 kB 00:03
Processing delta metadata
Package(s) data still to download: 35 M
(1/6): couchdb-0.10.0-2.fc12.i686.rpm | 513 kB 00:02
(2/6): erlang-R13B-04.1.fc12.i686.rpm | 33 MB 03:16
(3/6): js-1.70-8.fc12.i686.rpm | 346 kB 00:02
(4/6): libicu-devel-4.2.1-7.fc12.i686.rpm | 616 kB 00:03
(5/6): python-couchdb-0.6.1-2.fc12.noarch.rpm | 83 kB 00:00
(6/6): unixODBC-2.2.14-9.fc12.i686.rpm | 381 kB 00:02
--------------------------------------------------------------------------------
Total 169 kB/s | 35 MB 03:30
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : unixODBC-2.2.14-9.fc12.i686 1/6
Installing : erlang-R13B-04.1.fc12.i686 2/6
Installing : js-1.70-8.fc12.i686 3/6
Installing : libicu-devel-4.2.1-7.fc12.i686 4/6
Installing : couchdb-0.10.0-2.fc12.i686 5/6
Installing : python-couchdb-0.6.1-2.fc12.noarch 6/6

Installed:
couchdb.i686 0:0.10.0-2.fc12 python-couchdb.noarch 0:0.6.1-2.fc12

Dependency Installed:
erlang.i686 0:R13B-04.1.fc12 js.i686 0:1.70-8.fc12
libicu-devel.i686 0:4.2.1-7.fc12 unixODBC.i686 0:2.2.14-9.fc12

Complete!
You have new mail in /var/spool/mail/fdiaz
[fdiaz@fedora12 ~]$

Una vez la aplicacion se ha instalado, podemos iniciar el servicio mediante el siguiente comando:

[fdiaz@fedora12 ~]$ sudo /etc/init.d/couchdb start
Starting couchdb: Apache CouchDB has started, time to relax.
[ OK ]

Para acceder a la base de datos, hacemos uso de un explorador y nos dirigimos a la siguiente direccion:
http://localhost:5984/_utils/index.html

El servicio responde con una aplicacion web en la cual podremos acceder a la base de datos y hacer algunas operaciones, les invito a que le den un vistazo; pero programaticamente, podemos hacer uso del lenguaje de programacion Python para hacer las mismas operaciones como veremos a continuacion en el siguiente programa:

================ couchDBTest.py ===============

#! /usr/bin/python

import httplib, simplejson # Librerias para efectuar las llamadas HTTP y para acceder
# a los elementos json devueltos por la base de datos.

def Imprimir(s):
"""Imprimir muestra el resultado json de un objeto HTTP Respond"""
# Respuesta HTTP -> Diccionario de Python -> cadena
print simplejson.dumps(simplejson.loads(s.read()), sort_keys=True, indent=4)


class Couch:
"""Utilizaremos una clase para encapsular las acciones de la base de datos"""

def __init__(self, servidor, puerto=5984, options=None):
self.servidor = servidor
self.puerto = puerto

def conectar(self):
return httplib.HTTPConnection(self.servidor, self.puerto) # Hacemos una coneccion
# al servicio de la base de datos mediante metodos HTTP
# Operaciones basicas en la base de datos

def creaDB(self, nombreBD):
"""crea una nueva base de datos en el servidor"""

r = self.put(''.join(['/',nombreBD,'/']), "")
Imprimir(r)

def borraDB(self, nombreBD):
"""Elimina la base de datos del servidor"""
r = self.delete(''.join(['/',nombreBD,'/']))
Imprimir(r)

def listaDB(self):
"""Muestra un listado de las bases de datos disponibles en el servidor"""
Imprimir(self.get('/_all_dbs'))

def infoDb(self, nombreBD):
"""Muestra informacion sobre la base de datos"""
r = self.get(''.join(['/', nombreBD, '/']))
Imprimir(r)

# Operaciones sobre los documentos en la base de datos

def listDoc(self, nombreBD):
"""Muestra una lista de todos los documentos en la base de datos"""

r = self.get(''.join(['/', nombreBD, '/', '_all_docs']))
Imprimir(r)

def abreDoc(self, nombreBD, docId):
"""Abre un documento en una base de datos en particular"""
r = self.get(''.join(['/', nombreBD, '/', docId,]))
Imprimir(r)


def guardaDoc(self, nombreBD, contenido, docId=None):
"""Guarda o crea un documento en la base de datos especificada"""
if docId:
r = self.put(''.join(['/', nombreBD, '/', docId]), contenido)
else:
r = self.post(''.join(['/', nombreBD, '/']), contenido)
Imprimir(r)

def borraDoc(self, nombreBD, docId):
"""Elimina un documento, especificado por su docID, de la base de datos
segun la documentacion de CouchDB, la llamada debe identificar el documento
por medio de la revision del mismo, asi que primero hacemos un get segun el docid,
luego de-serializamos el objeto json, lo cual nos devuelve un diccionario y de el
extraemos el item '_rev' que es el parametro que pasamos para finalmente borrar
el documento.
"""
t = self.get(''.join(['/', nombreBD, '/', docId,]))
obj = simplejson.loads(t.read())
r = self.delete(''.join(['/', nombreBD, '/',docId,'?rev=',obj['_rev']]))
Imprimir(r)

# metodos HTTP

def get(self, uri):
c = self.conectar()
encabezado = {"Accept": "application/json"}
c.request("GET", uri, None, encabezado)
return c.getresponse()

def post(self, uri, contenido):
c = self.conectar()
encabezado = {"Content-type": "application/json"}
c.request('POST', uri, contenido, encabezado)
return c.getresponse()

def put(self, uri, contenido):
c = self.conectar()
if len(contenido) > 0:
encabezado = {"Content-type": "application/json"}
c.request("PUT", uri, contenido, encabezado)
else:
c.request("PUT", uri, contenido)
return c.getresponse()

def delete(self, uri):
c = self.conectar()
c.request("DELETE", uri)
return c.getresponse()

def main():
foo = Couch('localhost', '5984')
print "\nCreamos la base de datos 'bddoc':"
foo.creaDB('bddoc')

print "\nLista de bases de datos en el servidor:"
foo.listaDB()

print "\nCreamos un documento en la base de datos 'bddoc' con id: 00001:"
doc = """
{
"valor":
{
"Titulo":"Programacion Python y CouchDB",
"Autor":"FcoDiaz",
"Fecha":"2010-03-29T11:30:12-06:00",
"Tags":["couchDB", "python", "REST", "json"],
"Contenido":"Practicando un rato con CouchDB y Python.",
"Idioma":"Espanol"
}
}
"""
foo.guardaDoc('bddoc', doc,'00001')

doc2 = """
{
"valor":
{
"Titulo":"Programacion en C++",
"Autor":"FcoDiaz",
"Fecha":"2010-03-29T11:30:12-06:00",
"Tags":["C++", "Programacion"],
"Contenido":"Practicando un rato con C++.",
"Editorial":"FcoDiaz Publicaciones"
}
}
"""
print "\nCrea un segundo documento, el id sera seleccionado por la BD"
foo.guardaDoc('bddoc', doc2)

print "\nMuestra todos los documentos en la base de datos 'bddoc'"
foo.listDoc('bddoc')

print "\nRecuperamos el documento con codigo 00001 de la base de datos 'bddoc':"
foo.abreDoc('bddoc', '00001')
raw_input("Presiona ENTER para continuar")

print "\nBorramos el documento con codigo '00001' de la base de datos 'bddoc':"
foo.borraDoc('bddoc', '00001')


print "\nNuevamente mostramos los documentos en la base de datos 'bddoc'"
foo.listDoc('bddoc')
raw_input("Presiona ENTER para continuar")

print "\nInformacion de la base de datos 'bddoc':"
foo.infoDb('bddoc')

print "\nBorra la base de datos 'bddoc':"
foo.borraDB('bddoc')

print "\nLista de bases de datos en el servidor:"
foo.listaDB()

if __name__ == "__main__":
main()

==========
Para ejecutar el programa, lo guardamos y posteriormente podemos usar la siguiente linea de comandos para correr el programa, el resultado del programa puede verse a continuacion; he agregado algunas pausas para que mientras el programa espera por la tecla Return para continuar, se pueda observar el estado de la base de datos mediante el navegador, como se explico anteriormente y donde se podran observar la nueva base de datos y los documentos creados.

[fdiaz@fedora12 Python]$ python couchDBTest.py

Creamos la base de datos 'bddoc':
{
"ok": true
}

Lista de bases de datos en el servidor:
[
"bddoc"
]

Creamos un documento en la base de datos 'bddoc' con id: 00001:
{
"id": "00001",
"ok": true,
"rev": "1-7ddb0ea5569142bae2ce8879d56adb97"
}

Crea un documento, el codigo sera seleccionado por la BD
{
"id": "d5907db4ebd8fb240a8be36e24d56c43",
"ok": true,
"rev": "1-75ca9f69056f030781dfefd128c664c9"
}

Muestra todos los documentos en la base de datos 'bddoc'
{
"offset": 0,
"rows": [
{
"id": "00001",
"key": "00001",
"value": {
"rev": "1-7ddb0ea5569142bae2ce8879d56adb97"
}
},
{
"id": "d5907db4ebd8fb240a8be36e24d56c43",
"key": "d5907db4ebd8fb240a8be36e24d56c43",
"value": {
"rev": "1-75ca9f69056f030781dfefd128c664c9"
}
}
],
"total_rows": 2
}

Recuperamos el documento con codigo 00001 de la base de datos 'bddoc':
{
"_id": "00001",
"_rev": "1-7ddb0ea5569142bae2ce8879d56adb97",
"valor": {
"Autor": "FcoDiaz",
"Contenido": "Practicando un rato con CouchDB y Python.",
"Fecha": "2010-03-29T11:30:12-06:00",
"Idioma": "Espanol",
"Tags": [
"couchDB",
"python",
"REST",
"json"
],
"Titulo": "Programacion Python y CouchDB"
}
}
Presiona ENTER para continuar

Borramos el documento con codigo '00001' de la base de datos 'bddoc':
{
"id": "00001",
"ok": true,
"rev": "2-cf6064d2287d8c685d90eecebf58dfb6"
}

Nuevamente mostramos los documentos en la base de datos 'bddoc'
{
"offset": 0,
"rows": [
{
"id": "d5907db4ebd8fb240a8be36e24d56c43",
"key": "d5907db4ebd8fb240a8be36e24d56c43",
"value": {
"rev": "1-75ca9f69056f030781dfefd128c664c9"
}
}
],
"total_rows": 1
}
Presiona ENTER para continuar

Informacion de la base de datos 'bddoc':
{
"compact_running": false,
"db_name": "bddoc",
"disk_format_version": 4,
"disk_size": 4589,
"doc_count": 1,
"doc_del_count": 1,
"instance_start_time": "1269893376165905",
"purge_seq": 0,
"update_seq": 3
}

Borra la base de datos 'bddoc':
{
"ok": true
}

Lista de bases de datos en el servidor:
[]
[fdiaz@fedora12 Python]$



Algunas cosas que se observan de al menos los dos elementos de datos presentados es que la estructura de datos utilizada es un diccionario de Python y que los elementos de cada uno de los datos pueden variar, como es el caso del Idioma y Editorial, lo cual da una gran flexibilidad a los datos en caso que estos cambien constantemente de forma y estructura. Las bases de datos no relacionales han existido desde hace ya buen rato, de hecho yo trabaje en una llamada Minisis, alla por los 90's, y la base de datos era execelente para almacenar el catalogo de libros de una biblioteca; como podran ver la orientacion de estas bases de datos es hacia los documentos, donde estos forman un elemento primordial en sistemas recientes que ademas abarcan una gran cantidad de usuarios como lo por ejemplo las redes sociales. Tambien puede ser utilizada en sistemas no tan complejos que requiran bases de datos sencillas y donde la recuperacion de datos esta mas enfocada en busquedas sobre la llave primaria.

Finalmente algunas companias que estan haciendo el cambio a este tipo de bases de datos tenemos:

Facebook y Twitter: Cassandra
Google: Big Table
LinkedIn: Voldemort


Mas informacion sobre CouchDB: http://couchdb.apache.org/
O sobre la libreria de Python para CouchDB: http://wiki.apache.org/couchdb/Getting_started_with_Python

Hasta la proxima.

Sunday, March 28, 2010

Que es la de-duplicacion de datos?

En la gerga de computadoras, la De-duplicacion de datos es una forma caracteristica de compresion donde los datos redundantes son eliminados, con la finalidad de optimizar el almacenamiento de la misma. En el proceso, la informacion que se encuentra mas de una vez es eliminada, dejando solamente una copia del mismo. Para agilizar el proceso de verificacion si los datos han sido almacenados con anterioridad, se utilizan indices que identifican a los datos(o archivos). Por ejemplo, en el caso de un sistema de correo, un mismo archivo puede encontrarse multiples veces en el sistema, suponiendo que es un archivo de un megabyte, y este se encuentra unas 100 veces en el sistema, el archivo utiliza 100MB de espacio. Con el sistema de de-duplicacion de datos, el archivo es almacenado solamente una vez, cualquier uso adicional de este mismo archivo solamente se hace referencia a la unica copia existente por medio del sistema de indices. Sistemas que por lo general se benefician de este metodo son los respaldos (backup) de informacion.

http://ostatic.com/blog/sdfs-a-robust-deduplication-file-system-for-linux

Friday, March 5, 2010

Que es synergy?

Synergy es una aplicacion que permite compartir un solo teclado y un raton entre diferentes computadoras, aun con diferentes sistemas operativos y sin la necesidad de un equipo especial, solamente acceso a la red. La idea es aliviar a quienes tiene que atender multiples sistemas y cada uno de ellos tiene un teclado, un raton y su respectivo monitor o pantalla.

El programa es simple, solo require de la configuracion de un server en una de las computadoras, y luego clientes que se conectan a esta por medio de la red, luego solo es cuestion de apuntar el mouse a la pantalla deseada y listo. Synergy tambien combina el porta papeles (clipboard) de las diferentes computadoras en uno solo, de esa forma es posible hacer cut-paste entre los diferentes sistemas. Ademas permite sincronizar los protectores de pantalla, de esa forma todos se activan o desactivan al mismo tiempo.

Modo de empleo

Paso 1. Seleccione la computadora que sera el servidor, o sea, la computadora que compartira el teclado y el raton con las demas, en mi caso, tengo dos computadoras, el desktop y la laptop, asi que la desktop es la que funciona como server.

Paso 2. Instalacion del programa, aqui depende del sistema, pero el programa es soportado en vario SO como Win, MacOS, Linux y Unix, asi que seleccione el mejor metodo de acuerdo a sus necesidades.

Paso 3. Configuracion del servidor. Primero es necesario crear un archivo de configuracion con los detalles de los sistemas involucrados y sus ubicaciones, un ejemplo de uno de estos archivos es el siguiente, su nombre es synergy.conf:


section: screens
desktop:
laptop:
end
section: links
desltop:
right = laptop
laptop:
left = desktop
end


Donde desktop y laptop son los nombres en la red de los sistemas a conectar, es necesario verificar que estos nombres puedan resolverse ya sea por medio local (/etc/hosts) o por medio de un DNS.

Luego se inicia el servicio que atendera a los clientes por medio del comando:

synergys -f -c synergy.conf


Lo anterior ejecutara el server y mostrara lo que esta sucediendo mientras se conectan otros clientes; al momento de configurar el sistema es recomendable hacer uso de la opcion -f para resolver errores, una vez estos han sido resueltos, se puede cambiar -f por -d para ejecutarlo como un daemon del sistema.
En el caso de Windows, hay una aplicacion grafica que configura todo lo anterior.

Paso 4. Iniciar los clientes.
Para iniciar los clientes en Unix/Linux/Mac simplemente se ejecuta el siguiente comando:


synergyc -f desktop


Donde desktop es el hostname de la maquina que esta compartiendo el teclado, en Windows el programa Synergy se encarga de conectar el cliente con el servidor. Es importante notar que el cliente debe ser capaz de resolver el nombre de la maquina servidor por medio local (/etc/hosts) o por medio de un DNS.

Demo:
http://www.youtube.com/watch?v=Id3GHAruhAk

Website:
http://synergy2.sourceforge.net/index.html

Wednesday, March 3, 2010

Usos del comando test

El comando if del Bourne Shell fue disenado para trabajar con comandos, y dado que en todos los scripts siempre es necesario comparar valores (numeros, cadenas de texto, archivos) el Bourne shell incluyo el comando test

Dependiendo del tipo de valores pasados al comando, este puede comparar valores, verificar permisos en archivos, o inclusive verificar la existencia de archivos.

Para indicarle al comando el tipo de comparacion por hacer, se debe pasar las opciones adecuadas al momento de contruir la sentencia que se desea verificar, asi el comando usa estos parametros para determinar que tipo de comparacion tiene que realizar. Luego el comando test termina, y devuelve el numero 0 si la expresion fue evaluada como verdadera, de lo contarrio un valor de 1 si la sentencia fue evaluada como falsa. Si dentro de la expresion se ha cometido un error, entonces el comando devolvera un valor mayor que 1.

El siguiente ejemplo muestra el comando test en una comparacion de valores numericos:

x=5
y=10
echo -n "test -eq: "
if (test $x -eq $y) then
echo "x=y"
else
echo "x diferente de y"
fi


El siguiente ejemplo muestra como comparar cadenas de texto:

cadena="Hola mundo"
echo "test -z: "
if (test -z $cadena)
echo "Longitud de la cadena es 0"
else
echo "Longitud de la cadena no es 0"
fi


Este ejemplo determina si un archivo existe o no:

archivo="/etc/samba/smb.conf"
echo "test -f: "
if (test -f archivo) then
echo "Archivo existe"
else
echo "Archivo no existe"
fi


Mas informacion sobre el comando y que otros tipos de opciones de comparacion hay consulte el manual mediante el siguiente comando:

man test


Para finalizar, posiblemente en muchos de los script que hemos visto, el comando test es reemplazado por su comando equivalente que es el simbolo [, si este es otro comando que existe como tal en el sistema, sino intenten el siguiente comando para ver donde se encuentra:


$which [
/usr/bin/[


Asi, podemos tomar uno de los ejemplos anteriores se convertiria en:

archivo="/etc/samba/smb.conf"
echo "test -f: "
if [ -f archivo ]; then
echo "Archivo existe"
else
echo "Archivo no existe"
fi


Con respecto al ejemplo anterior, es necesario dejar un espacio en blanco despues del "[" y antes del "]", y luego es necesario un punto y coma ";" luego del simbolo "]" y antes de la palabra then, o sino pueden bajar la palabra then a la siguiente linea y no necesitan en simbolo ";"

Hasta la proxima.

Thursday, February 25, 2010

Que es Arduino?



http://www.arduino.cc/

Arduino es un prototipo de circuito electronico y programas de uso libre, flexible y facil de usar. Orientado a quien quiera desarrollar su creatividad, disenadores, artistas, pasatiempo, etc. Arduino puede interactuar con su entorno, gracias a una variedad de sensores, asi como puede interactuar con el mismo por medio de luces, motores, etc. El microprocesador en el circuito es programado mediante el lenguaje Arduino (basado en Wiring) y el ambiente de desarrollo de aplicaciones tambien llamado Arduino (basado en Processing). Los proyectos pueden hacer uso simplemente del circuito, o pueden comunicarse con otros programas de computadoras (ej. Flash, Processing, MaxMSP)

El circuito puede construirse facilmente o puede comprarse ya armado; los programas necesarios para su uso pueden ser bajados de Internet y su uso es libre. Archivos de diseno del circuito estan disponibles bajo una licencia de codigo abierto, brindando la oportunidad de adaptarlos a cualquier necesidad.



Arduino is an open-source electronics prototyping platform based on flexible, easy-to-use hardware and software. It's intended for artists, designers, hobbyists, and anyone interested in creating interactive objects or environments.

Arduino can sense the environment by receiving input from a variety of sensors and can affect its surroundings by controlling lights, motors, and other actuators. The microcontroller on the board is programmed using the Arduino programming language (based on Wiring) and the Arduino development environment (based on Processing). Arduino projects can be stand-alone or they can communicate with software on running on a computer (e.g. Flash, Processing, MaxMSP).

The boards can be built by hand or purchased preassembled; the software can be downloaded for free. The hardware reference designs (CAD files) are available under an open-source license, you are free to adapt them to your needs.

Wiki on a Stick (Espanol/English)


Si eres de aquellas personas que siempre andan cargando toda su documentacion o notas donde quiera que van, aqui hay una posible solucion a este problema, se llama Wiki on a Stick!. Tal y como su nombre lo indica, este es un proyecto que ofrece un wiki completamente funcional basado en web y lo mejor de todo, es para llevar. Este esta disponible en un archivo Zip, luego que se descomprime, el resultado es un archivo HTML.

Este simple archivo es todo lo que se necesita, el wiki se encuentra inmerso en un archivo XHTML, el cual utiliza JavaScript y CSS para hacer funcionar el Wiki, asi como lograr que este funcione tanto desde el web como localmente. Solamente abra el archivo desde su navegador favorito (dando doble click en el) y el wiki esta listo para utilizarse, la documentacion y una guia estan ahi mismo disponibles para comenzar a utilizarlo.

Mas informacion se puede encontrar en el sitio web del proyecto: http://stickwiki.sourceforge.net

ooo OOO ooo

If you fancy taking your own customised pile of documentation and notes wherever you go, there's a perfect solution called Wiki on a Stick. As its name implies, this is a project that offers a go-anywhere web-based wiki that's entirely self-contained, and can be used for all the same things a full fat wiki can. The package is provided as a Zip archive, and after you've unzipped this, usually with a double click, you'll find a single .htm file remains.

This single file is all there is to it. The entire package is a cleverly constructed XHTML file, which uses both JavaScript and CSS to build a complete wiki that works online and offline. Just double-click to load it into your default browser. You're now running the wiki, and everything you need is right in front of you, including the documentation and a guide to getting started with the software.

More information can be found at their website: http://stickwiki.sourceforge.net/


Saturday, February 20, 2010

Que es Copyleft?


http://www.gnu.org/copyleft/

Copyleft is un metodo de proposito general para hacer que un programa o cualquier otro tipo de producto sea libre, asi como sus posteriores modificaciones o extensiones.

La forma mas sencilla de hacer que un programa sea libre es hacerlo del dominio publico, sin ningun derecho reservado por parte del autor. Esto permite a las personas compartir el programa, asi como sus mejoras, si asi lo desean. Pero ademas permite incluso a aquellas personas que cooperan o no con el proyecto, convertir el programa en propietario. Ellos podran hacer cambios al proyecto y redistribuir el nuevo producto con fines comerciales. Las personas que hacen uso de este nuevo programa modificado no tienen las mismas libertades que el autor original propuso, puesto que estas fueron eliminadas.

En el proyecto GNU, el objectivo es dar a los usuarios la libertad de distribuir y modificar/mejorar los programas GNU. Si los intermediarios pudieran quitar estas libertades, tendriamos muchos usuarios, pero sin ninguna de las libertades antes mencionadas. Por esa razon, en lugar de colocar los programas GNU al dominio publico, se protegen con "copyleft". De esa forma, cualquiera que redistribuya el programa, con o sin modificaciones, debe pasar los mismos derechos de distribuir y modificar. Copyleft garantiza que cada usuario tendra las mismas libertades que el original.

Copyleft tambien brida un incentivo a los programadores a contribuir al softare libre. Programas libres como el compilador GNU de C++ existen gracias a esto. Al mismo tiempo, copyleft ayuda a los programadores que deseen contribuir con mejoras a programas libres a obtener permisos para hacerlo; estos programadores usualmente trabajan para companias o universidades que harian lo que fuese para aumentar sus ganancias. Un programador puede querer contribuir sus cambios a la comunidad, pero su empleador podria querer convertir esos cambios en una nueva version del programa en formato propietario. Pero cuando explicamos a los empleadores que es ilegal distribuir la nueva version modificada como software propietario, el empleador usualmente decide darlo a la comunidad en lugar de desecharlo.

Para decir que un programa esta protegido por copyleft, tenemos primero que decir que sus derechos estan reservador; luego agregamos los terminos de como se distribuye, los cuales son elementos legales que le permiten a los usuarios los derechos de uso, modificacion y redistribucion del codigo del programa o cualquier otro programa/proyecto derivado de este, pero solamente si los terminos de distribucion no han sido cambiados. Asi el codigo y las libertades se convierten en inseparables.

Desarrolladores de programas propietarios usan los derechos reservados para eliminar libertades al usuario; en cambio copyleft usa los derechos reservados para asegurar que estas libertades no desaparezcan. Por esa razon el cambio de direccion del nombre a copyleft.

Copyleft es un concepto general, pero este como tal, no pueden ser usados de forma directa; solamente se puede hacer uso de el mediante una implementacion particular del concepto. En el proyecto GNU, los terminos de distribucion que se utilizan para la mayor parte de programas esta contenida en la GNU GPL (General Public License, por sus siglas en ingles).

Una forma alternativa de copyleft, es la GNU Lesser General Public License (LGPL), que se aplica a algunas librerias GNU.

La GNU Free Documentation License (FDL) es otra forma de copyleft destinada a manuales, libros de texto o cualquier documentacion, permitiendo la libertad de copiar y redistribuirlos, con o sin modificaciones y de forma comercial o gratuita.

Una copia de la licencia apropiada es incluida en muchos manuales y en cada porcion de codigo GNU disponible.

Todas estas licencias estan disenadas de tal forma que puedan ser aplicadas facilmente a sus propios proyectos, asumiendo que usted es la persona que tiene el derecho sobre el producto. Usted no tiene que modificar la licencia para tal motivo, solamente incluya una copia de la licencia en el trabajo/codigo y agregue notas en los codigos fuentes para hacer referencia a la licencia bajo la cual el codigo esta disponible.

El hacer uso de los mismos terminos de distribucion en diferentes programas hace que la copia de codigo entre los diferentes programas sea mas facil. La licencia Lesser GPL, version 2, incluye una clausula especial que permite cambiar los terminos a los de la licencia GPL ordinaria, de esa forma se puede copiar codigo a otros programas que estan bajo la licencia GPL version 3. La version 3 de la licencia Lesser GPL se fundamenta en una excepcion a la GPL version 3, creando asi compatibilidad automatica.

Si usted desea cubrir sus programas mediante la licencia GNU GPL o la GNU LGPL, por favor lea la pagina de instrucciones para licenciar sus programas (utilice el enlace que se muestra abajo) para mayor informacion al respecto y su uso. Por favor, utilice el texto completo de la licencia, su uso parcial no es permitido y no garantiza su aplicacion.

http://www.gnu.org/copyleft/gpl-howto.html

screen: un multiplexor de terminales y algo mas...


screen se puede decir que es un multiplexor de terminales, mediante su uso, se puede ejecutar cualquier numero de aplicaciones interactivas en la consola, como shells, aplicaciones basadas en ncurses, etc., y lo mejor de todo, desde una sola terminal. Esta capacidad es la que esta atrayendo a mas y mas personas a usar screen como una herramienta necesaria en la administracion/monitoreo de sistemas.

Otras de las caracteristicas importantes de screen es su capacidad de desconectarse de las diferentes ventanas, lo cual permite en casos extremos que cualquier aplicacion aun ejecutandose en alguna de ellas, continue funcionando en caso que accidentalmente cerremos la ventana de la terminal donde estamos trabajando, inclusive persiste luego de desconectarnos del sistema (logoff). Posteriormente podemos regresar y conectarnos a todas las ventanas (programas, conecciones remotas, compilacion, etc) que hayamos tenido abiertas, si es que aun no han concluido, seguiran ejecutandose normalmente.

Para instalar el programa, simplemente hagamos una busqueda del paquete screen en nuestro programa/administrador de paquetes favorito y acorde a la distribucion.

Iniciamos screen desde una terminal, ejecutando el comando: screen

Posiblemente un mensaje de ingreso a screen sea presentado, el titulo de la terminal tambien pueda que cambie para identificar que screen se esta ejecutando y se encuentra en una determinada ventana representada por un numero mayor o igual que cero.

Cada programa ejecutandose bajo screen se asocia a una ventana, y cada ventana es identificada por un numero, ejecutemos algun comando en esta ventana para poder identificarla despues cuando nos estemos trasladando entre ventanas.

Creamos otra ventana, la numero 1, para ello presionamos la combinacion en el teclado: ctrl+a c; para explicar un poco esto significa presionamos al mismo tiempo ctrl y la tecla a, y luego presionamos la tecla c (por Create)

Ahora tenemos dos ventanas, el contenido de la ventana anterior desaparecio, puesto que ahora estamos en la ventana #1, para regresar a la ventana anterior tenemos varias opciones:
- Puede usar la combinacion ctrl+a p (previous)
- la combinacion ctrl+a n (next) hasta regresar a la ventana 0
- ctrl+a ctrl+a :nos regresa a la ventana donde nos encontrabamos anteriormente
- ctrl+a N : donde N es el numero de la ventana a donde queremos movernos
- ctrl+a " : esta combinacion nos mostrara un listado de las ventanas existentes, en la cual podremos movernos haciendo uso de las teclas de flechas y seleccionando mediante Enter la ventana que deseamos utilizar.

Las ventanas que tenemos activas las podemos nombrar para identificar que accion se desarrolla en cada una de ellas, para eso podemos hacer uso de la combinacion de teclas ctrl+a A (mayuscula), una linea con el nombre de la ventana aparecera en la parte de abajo, donde podremos especificar nuestro propio nombre.

En el caso que alguna de las sesiones se quede congelada o la aplicacion se trabe, la sesion puede cerrarse mediante la combinacion ctrl-a K

Como mencionamos anteriormente screen tiene la capacidad de desconectarse de las ventanas activas y las aplicaciones o conecciones existentes en ellas persistiran, para desconectarse de screen usamos la combinacion ctrl+a d. La desconeccion se puede realizar de igual forma cerrando la terminal donde estamos ejecutando screen. Ninguna de las aplicaciones en las diferentes ventanas deberia verse afectada por esta desconeccion, para confirmar esto, abramos otra terminal, si es que cerramos la terminal que estabamos usando, y ejecutamos el comando: screen -r, veremos como las ventanas se restablecen si ejecutamos la combinacion ctrl+a ", con ellos confirmamos que todas se encuentran activas y los programas aun se encuentran funcionando, como si nunca nos hubiesemos desconectado.

Para finalizar, screen no es facil de eliminar o cerrar, para salir de screen hay que cerrar cada una de las ventanas que se tengan abiertas, ya sea cerrando el shell en cada una de ellas o la aplicacion que se este ejecutando.

Screen es una herramienta muy util para mantener el control de diferentes aplicaciones o conecciones a sistemas remotos, monitoreo, etc.; la aplicacion tiene mas opciones, asi que les dejo la curiosidad para que ustedes mismos las descubran, usando la combinacion ctrl+a ?, screen nos mostrara todas las opciones y combinaciones disponibles, y por ultimo no olvidemos que el manual siempre esta a la mano mediante el comando man screen.

Hasta la proxima.