Mostrando las entradas con la etiqueta Español. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Español. Mostrar todas las entradas

domingo, 9 de marzo de 2014

Intención e Iniciativa

Hace algún tiempo reflexioné sobre la validez del dicho
"la intención es lo que cuenta"
Para la Real Academia de la Lengua Española, intención significa
intención.
(Del lat. intentĭo, -ōnis).
1. f. Determinación de la voluntad en orden a un fin.
"Determinación de la voluntad".

Sin duda alguna, la intención es un componente fundamental cuando se piensa de hacer cualquier cosa, sin embargo, debe conjugarse con la iniciativa de hacerla. Por cruel que suene, la verdad es que el mundo no está hecho de intenciones. Está hecho de resultados, iniciativas materializadas en cosas tangibles, por eso pienso que intención sin iniciativa, en términos de resultados, es equivalente a no haber tenido intención alguna.
¿la intención es lo que cuenta?, Yo diría que no.

domingo, 23 de febrero de 2014

Nada como una buena conversación, pero una de verdad.

Los teléfonos se inventaron para acortar distancias, no para alargarlas
Mis padres
Tardé muchos años en comprender el verdadero significado del aforismo con el cual doy inicio a esta entrada. Quizá por mi terquedad o porque cada generación trae sus propios caprichos, no veía nada de malo en extender mis conversaciones por teléfono más de lo necesario. Aquella súplica con la cual se me llamó la atención años atrás cobró sentido cuando fui consciente de lo supeditadas que están nuestras interacciones con los demás a los medios que disponemos para comunicarnos. Y es que actualmente la situación no es muy distinta y con las tecnologías emergentes se está virtualizando todo. Las conversaciones se están reemplazando por mensajes de texto cada ves más inexpresivos: Se omiten acentos, comas, y tildes, quizá por el afán de "comunicarse" lo más pronto posible o por la pereza de tomarse el tiempo para puntuar y acentuar --otra perspectiva más desalentadora apunta a la ignorancia de la ortografía. Con los afanes de "estar conectados" estamos creando una sociedad cada vez más dispersa e inconexa, los espacios de intercambio personal están siendo usurpados por espacios virtuales.

Sin duda, el abanico de posibilidades de comunicación con el cual disponemos hoy es enorme, y no puede negarse que en muchos ámbitos es deseable disponer de un medio impersonal para comunicarse rápida y eficientemente, pero no sé como la gente cambia el placer de una conversación "de tu a tu" por servicios de mensajería instantánea. El vibrar de otras personas, sus gestos, sus acentos, sus risas --las de verdad, esas que la onomatopeya del "ja ja ja" apenas puede representar-- y todas esas pequeñas cosas que como sinergia hacen que conversar sea algo placentero.
Para mi el problema radica, como todo, en abusar: basar las relaciones en medios tan volátiles como las redes sociales o los servicios de IM, pueden dar lugar vínculos igualmente volátiles. La sociedad y el mundo necesitan más de personas que conversen personalmente, que compartan, que cultiven su empatía --una dimensión humana que se desarrolla teniendo un intercambio personal con los demás-- que permita conexiones más profundas.


No se puede enseñar nada a un hombre; sólo se le puede ayudar a descubrirlo en su interior.
Galileo Galilei
A mis Padres gracias por el empujón para descubrir esto en mi interior: Que no hay nada como una buena conversación, pero una de verdad.

domingo, 16 de febrero de 2014

Editores de texto y programación - mi perspectiva desde el uso, el abuso y la desazón

Todo estudiante de ciencias* pasa por aquella época de la vida donde debe programar (o por lo menos, intentarlo). Dejando de lado todas las peripecias asociadas con esta empresa, quiero concentrar esta entrada en mi experiencia personal con los editores de texto y los entornos integrados de programación (IDE).
* se habla de lo que se conoce.

Emacs

Emacs forma parte de la comunidad GNU. Si bien, es un editor de texto útil, la necesidad recurrente de atajos de teclado que no podía memorizar fácilmente me hacían perderle un poco el respeto.
Se comporta muy bien al trabajar desde consola, pero también ofrece una interfaz gráfica.
Una de las características más llamativas es la gran cantidad de plug-ins disponibles. Por ejemplo, hay un plugin para integrar emacs sistemas de control de versiones (como git), hay un plugin de WYSIWYG para la edición de textos en latex. La lista sigue, incluso hay plugins que ofrecen juegos de arcade.
No recomendaría este editor para los neófitos en la programación, suelo bromear diciendo que emacs es el editor de texto preferido de Davy Jones

Así se sienten los atajos de teclado demasiado largos

KDevelop

Fui usuario asiduo del entorno de escritorio KDE. Un día por recomendación de un amigo me enteré de la existencia de KDevelop, un entorno de desarrollo muy poderoso. Igual que emacs posee reconocimiento de sintaxis en varios lenguajes, y permite configurar control de versiones con git. Otra característica importante es el autocompletado de palabras, lo cual acelera el proceso de escritura. Toda una maravilla si se tiene suficiente RAM a disposición.
Pero como todo en la vida, no hay nada perfecto: los requisitos de memoria del KDevelop, así como una reciente racha de crashes hicieron que retomase mis intentos por utilizar un editor que había probado tiempo atrás: Vim

VIM (VI Improved)

Vim pareciera ser un editor de texto bastante simple, sin embargo, no hay que dejarse engañar. Puedo resumir diciendo que vim es uno de los editores de texto más potentes que he podido utilizar. Posee gran versatilidad en su sistema de comandos, además de reconocer la sintaxis de más de 200 lenguajes de programación (incluyendo TeX y Latex), permite una personalización muy amplia al punto de permitir cosas como definir sistemas de resaltado de sintaxis propios, esquemas de color y comandos personalizados. Comparándolo con emacs, vim utiliza instrucciones más simples y fáciles de recordar, tan sencillas que es posible programar usando una mano (obviamente son escasas las situaciones donde esto será necesario). Además de su versatilidad, la curva de aprendizaje es suave y basta con usarlo por algunas horas para acoplarse a esta "power tool" como lo llama su creador. Sin lugar a dudas, uno de los mejores editores que he utilizado.
Me llamó mucho la atención enterarme que vim forma parte de una campaña para apoyar niños en Uganda a través de donaciones. Buen trabajo equipo vim!!!

Vim: The power tool for everyone!
El proceso de personalización el editor vim toma tiempo, hay un sitio en particular donde se puede aprender como. Un amigo mío dispone de un repositorio en github donde publica un conjunto de configuraciones muy útiles para quienes programamos en C++, los invito a que se den una pasada por https://github.com/muzgash/vim


Y a que viene todo esto?

El proceso de programación y escritura debe ser una experiencia reconfortante, por lo tanto es importante disponer de un buen editor de texto. Para programar puede usarse cualquier editor de texto y cada cual elije el editor que más le convenga en función de sus necesidades particulares. Opté por mencionar los editores de texto más significativos entre los que he usado durante mis proyectos de programación (que consisten básicamente en aprendizaje de lenguajes). Dentro de los editores que he probado están UltraEdit(Windows), Geany (Un IDE escrito en GTK), Kate, y la lista se extiende.
Pese a todo, lo que importan son las habilidades de programación que se tienen, y no el editor se use para programar.

Enlaces de interés

  1. Página del proyecto GNU Emacs http://www.gnu.org/software/emacs/
  2. Página del proyecto KDevelop http://kdevelop.org/
  3. Página del proyecto VIM http://www.vim.org/about.php
  4. Repositorio de configuraciones de VIM https://github.com/muzgash/vim
  5. IDE Geany http://www.geany.org/
  6. Para aprender a usar vim http://code.tutsplus.com/articles/25-vim-tutorials-screencasts-and-resources--net-14631
  7. Para aprender más de otros editores

martes, 24 de diciembre de 2013

Accede a las particiones ext2/ext3/ext4 desde Windows

Como usuario de sistemas multiboot Windows/Linux, sé cuanto apesta la situación en que se necesita acceder a algún archivo de mis particiones ext4 de Debian, pero he iniciado el PC en Windows. La única solución que encontraba consistía en reiniciar el sistema y acceder a Debian directamente

Recientemente me enteré de la existencia de Ext2 File System Driver for Windows, un programa muy liviano que instala un servicio (el equivalente en Windows de los daemon de Linux), que me permite acceder a las particiones Ext4 desde Windows 7. El soporte para lectura de datos está completamente soportado, pese a ello, el soporte para escritura de datos está aún en fase experimental. (Nota: No probé la escritura de datos, así que no comento nada al respecto)

Instalando y configurando Ext2Fs


El proceso de instalación es igual que cualquier programa en Windows, (la rutina de "Siguiente, Siguiente, Siguiente... Finalizar")
Una vez instalado, al iniciar el programa tendremos la siguiente interfaz

Aquí aparece habilitada la unidad (E:)  que corresponde a mi /home en Debian.

Selecciono la partición de interés y elijo la opción "Change drive letter" lo cual es necesario para habilitar la partición

Se abre un menú como este. y elegimos "Add" para añadir una letra para la partición.
Aparece la "E" puesto que ya había configurado mi partición, pero este menú debería estar vacío inicialmente.

Luego de presionar "Add" nos aparece esta ventana donde podemos elegir  la letra para la nueva partición que Windows debe reconocer, además del método de montaje. Yo elegí el modo automático, pero es posible destinar un punto de montaje permanente.

Una vez terminamos de definir la letra de partición y la letra que la identificará, finalizamos el proceso con el botón "Ok" y el botón "Done" a continuación.



Para habilitar el acceso a la(s) unidad(es) recién creada(s) debemos seleccionar "Tools" en la barra de menú y elegir "Service Management" en el menú desplegable

Debemos presionar el botón "Start" (que aparece deshabilitado en la imagen) para que el proceso inicie.
Una vez finalizado el proceso anterior deberíamos ver las unidades creadas al abrir el explorador de Windows. Aquí vemos la unidad (E:) y como Windows la reconoce como un sistema de archivos EXT3

Enlaces de interés


  1. Sitio web del proyecto http://www.ext2fsd.com/
  2. Repositorio en sourceforge http://sourceforge.net/projects/ext2fsd/
  3. Descarga directa http://sourceforge.net/projects/ext2fsd/files/latest/download

miércoles, 6 de noviembre de 2013

Skype 4.2 en Debian Testing 7 (Jessie)

No soy usuario asiduo de los servicios de VoIP, pero en las peripecias de la vida terminé con una cuenta en Skype [1]. Como Debianita, decidí darle una oportunidad a Skype en mi sistema.

Desde la versión 6.0 de Debian se implementó la modalidad "multiarch"*[2] que permite correr aplicaciones de distintas arquitecturas en un mismo sistema,por ejemplo y como en mi caso, tener el sistema amd64 y correr el Skype que viene destinado a arquitecturas i386.

Deste este enlace es posible descargar Skype, la opción sería "Debian multiarch" lo que nos descargará un .deb que tendremos que instalar con dpkg.
Una manera alternativa sería ejecutar desde la consola el comando

$ wget -O skype-install.deb http://www.skype.com/go/getskype-linux-deb

Para instalar el paquete es preciso habilitar la arquitectura i386. Con permisos de super usuario (root) añadimos la arquitectura usando el comando

# dpkg --add-architecture i386

Luego actualizamos el almacén de paquetes para incluir los paquetes de la arquitectura i386

# apt-get update

Si utiliza el sistema PulseAudio para administrar el sonido ( como lo requiere el entorno XFCE4 por ejemplo) se recomienda instalar la librería libpulse para i386

# apt-get install libpulse0:i386

Ahora, instalamos el paquete .deb que descargamos usando dpkg (Sobra decir que debemos estar en el directorio que contiene dicho archivo, y que el nombre que uso aquí es ilustrativo, para mi caso fue skype-debian_4.2.0.11-1_i386.deb)

# dpkg -i skype-descargado.deb

Reportará que hay dependencias insatisfechas, lo cual resolveremos con

# apt-get -f install

Con lo cual finaliza la instalación.


Edición(04-Abril-2015)
Puede ocurrir que Skype no encuentre alguna librería, en mi caso fue la librería compartida "libGL.so.1".
La solución fue instalar la verión i386 de la librería libgl para mi tarjeta gráfica, disponible en los repositorios de Debian. Si skype no inicia, usando el comando "ldd" en el ejecutable ("/usr/bin/skype") puede revelar las librerías faltantes.


Referencias


  1. www.skype.com
  2. https://wiki.debian.org/Multiarch
  3. https://wiki.debian.org/skype
*La definición que da la Debian-Wiki es la siguiente
Multiarch is the term being used to refer to the capability of a system to install and run applications of multiple different binary targets on the same system. For example running a i386-linux-gnu application on an amd64-linux-gnu system. This example is the most common case, but many other working combinations are possible, such as armel and armhf.
Multiarch also simplifies cross-building, where foreign-architecture libraries and headers are needed on a system during building.

miércoles, 30 de octubre de 2013

Conozcamos la STL (Standard Template Library) de C++ - Primera entrega: std::map - Parte 2 de 2

Introducción

Mucha personas (como yo en el pasado cercano) ignorarán el poder oculto detrás de las siglas STL. Se trata de nada más ni nada menos que una de las "cosas" que convierte a C++ en uno de los lenguajes de programación más poderosos. La STL o Standard Template Library 
La STL proporciona una colección de estructuras de datos contenedoras y algoritmos genéricos que se pueden utilizar con éstas.
Dada la extensión que pretendía dar a este tema, decidí dividirlo en dos entradas independientes y complementarias.
La primera parte de esta entrega (disponible aquí) consiste en la implementación del contenedor std::map con los tipos de datos incluidos en el estándar de C++.
En la segunda parte (este post) abordaré la implementación del contenedor std::map haciendo uso de una clase propia, es decir, una clase que hemos hecho nosotros mismos, tal como lo ilustramos en una entrega previa, donde hemos definido una clase para la manipulación de vectores.

Usando std::map con una clase propia

Supongamos ahora que creamos una clase y queremos usarla en una variable tipo std::map. Para tal fin es necesario crear un criterio de comparación, específicamente, es necesario definir el operador< dentro de nuestra clase, puesto que std::map se basa en el para realizar el ordenamiento.
En una entrega previa hemos definido una clase para la manipulación de vectores y hemos definido el operador< dentro de la misma tal como lo requiere el std::map.

La clase cVector y su código de implementación pueden descargarse usando este enlace.
Mirando el código de ejemplo:


#include <iostream>
#include <map>
#include "cVector.hpp"

int main(void)
{

    cVector I_vector;
    cVector J_vector;
    cVector K_vector;
 
/*
Aqui implementamos un mapa que contiene elementos de la clase cVector,
No debe representar problemas puesto que el operador< ha sido definido para la clase
como puede verse en cVector.hpp
*/

    std::map<int,cVector> mi_mapav;
 
    I_vector.colocarCoordenadas(1,0,0);
    J_vector.colocarCoordenadas(0,2,0);
    K_vector.colocarCoordenadas(0,0,3);

 
mi_mapav[0]=I_vector;
mi_mapav[1]=J_vector;
mi_mapav[2]=K_vector;

    std::cout << "Producto punto entre I y K " << I_vector*K_vector << std::endl;
 
    std::cout << "La magnitud de la suma vectorial entre I y J " << (I_vector+J_vector).normaVector() << std::endl;
 
    if( (I_vector+J_vector)<K_vector)
    {
std::cout << "La magnitud de I + J es menor que la de K " << std::endl;
}
else
{
std::cout << "La magnitud de I + J es mayor que la de K " << std::endl;
}

for(int i=0;i<1;i++)
{
std::cout << "Usando el std::map tenemos la norma de la suma de vectores consecutivos" << (mi_mapav[i]+mi_mapav[i+1]).normaVector() << std::endl;

}
}


Cuando el instalador de Debian falla...

Hoy decidí realizar una instalación limpia de Debian (a la fecha Jessie/Testing), con una lista depurada de los paquetes que si uso.
Para el proceso de instalación descargué la ISO del primer DVD para instalación del Debian Testing (usualmente contiene todos los paquetes necesarios para una instalación sencilla y con cualquier gestor de ventantas) cree una USB booteable ( el típico cat Debian.iso > /dev/sdX hay muchos tutoriales en la red, así que no entraré en detalles)
La instalación funcionaba muy bien hasta llegar a la parte de detección de hardware de red. En este punto la instalación se colgaba y no avanzaba más. 

Cual fue la solución?[1]

Iniciar la instalación en modo experto (expert install) puede ser en modo gráfico o en modo consola, una vez allí, seleccioné la opción 

Selección del modo experto.
A continuación buscamos una opción para abrir una consola (Execute a shell)

Execute a shell - la penúltima opción.
Se abre una consola de bash que debemos utilizar para editar un script interno del instalador

$ nano /bin/check-missing-firmware

Se abrirá un editor de texto donde la primera línea debe decir

#!/bin/sh

bajo esta línea escribimos

exit 0

para que el script termine antes de ejecutarse. Acto seguido, presionando Ctrl+o y luego Ctrl+x  salimos del editor. En la terminal escribimos 

$ exit

Para continuar con el proceso de instalación, seleccionamos la opción "choose language" (Elegir lenguaje) y continuamos cada item de la lista en secuencia hasta llegar a "Load installer components from CD"

Execute a shell - la penúltima opción.
Al abrir esta opción, no seleccionamos nada y le damos continuar, de ahí en adelante seguirá el proceso estándar de instalación. Estos simples pasos me sacaron de un gran lío y por ello merecieron una entrada en este blog.

Fuentes

miércoles, 23 de octubre de 2013

Aplicaciones recomendadas para Windows 7


Como usuario ocasional del sistema operativo Windows 7, siempre me pregunté cuales serían las mejores aplicaciones de uso cotidiano que, además de ser funcionales, fuesen de código abierto.
Una búsqueda en google dejará claro que no es complicado dar con listas de aplicaciones recomendadas. Personalmente he encontrado que muchas recomendaciones no resultan tan útiles, y en muchas ocasiones considero que las aplicaciones han sido sobre valoradas.
Durante varios meses de usos y abusos, he encontrado varias aplicaciones de código abierto útiles, teniendo como criterio principal la funcionalidad.

(Nota: hay un sitio que provee una enorme lista de programas de software libre: http://www.cdlibre.org/)

Compresión/descompresión

7-Zip

Esta es una aplicación de compresión de archivos, soporta una amalgama de formatos de compresión bastante amplia, incluyendo los clásicos .zip y .rar, así que no será necesario tener instalado ningún otro programa de compresión/descompresión de archivos.
La interfaz gráfica, pese a ser minimalista es bastante funcional (una característica que algunos apreciamos)

Ofimática

Lectores de documentos

Foxit Reader

Probablemente uno de los mejores lectores de PDF que he encontrado (para Windows). Si eres de los usuarios que les gusta subrayar los PDF, hacer comentarios en ellos o introducir marcadores, este programa es el indicado. Otra de las características más notables es sistema de pestañas que permite tener varios PDF abiertos en pestañas independientes sin llenar tu barra de tareas.
Una observación importante: consume menos recursos que el lector de Adobe.

WinDjVu

Existe un formato para libros digitales conocido por la extensión .djvu, WinDjVu es el lector de archivos .djvu más simple que conozco para windows, incluye la lectura por pestañas (como el Foxit) además de ser bastante amigable con el uso de recursos.

Editores de texto

LibreOffice

Esta suite ofimática es una de las más polémicas que conozco, su origen se remonta a las épocas en que la compañía Oracle se hizo cargo de mantener la suite conocida como OpenOffice, la comunidad del software libre fundó The Document Foundation a mantener su propia versión del software orientado a la manipulación de documentos, hojas de cálculo, diapositivas, entre otras funcionalidades. La compatibilidad con los formatos privativos de Micro$oft tales como el .docx, o el . xmlx es pésima, pero esto se conocía desde los tiempos de OpenOffice, pero ello se debe a que los formatos Micro$oft son cerrados.

TeXMaker

Este es un editor para la redacción de textos en LaTeX. Si bien, para redactar en LaTeX se necesita de un compilador y un editor de texto plano (como el block de notas), este editor viene con suficientes herramientas de edición para el sistema operativo Windows

Red Notebook

Este programa es muy versátil a la hora de llevar una bitácora/diario/registro, por ejemplo, a la hora de tomar nota sobre el progreso de una investigación o proyecto personal.
La entrada de texto se realiza por Markdown, lo que permite agilizar el proceso de escritura, es posible crear plantillas personalizadas y todo lo escrito se guarda por fechas, además de poder ser exportado en varios formatos. Como añadidura incluye un sistema de etiquetas (o tags) y la generación automática de WordClouds (o TagClouds)

Gestión de bibliografía

Mendeley 

Todos aquellos que trabajamos en ámbitos académicos nos enfrentamos a la tarea de organizar eficientemente las referencias bibliográficas y la manera de citarlas. Mendeley ha sido una de las mejores opciones que he encontrado pues permite tener la bibliografía sincronizada entre varios PC, tiene un PlugIn que puede instalarse en LibreOffice (creo que en M$ Office también) con el cual es posible introducir las referencias al vuelo sin preocuparse del formateo de la bibliografía, la cual se introduce automáticamente y con el formato que queramos darle (tiene una lista de opciones). Altamente recomendado para la gestión de bibliografía.

Calibre

Esta herramienta es funcional, está orientada a la gestión de libros digitales y su intercambio con lectores "ebook" tales como el Kindle de Amazon. Permite convertir entre distintos formatos (epub, mobi, pdf) además de realizar una gestión de contenidos a fondo.

Multimedia

VLC Player

Todo usuario de Windows conoce el eterno problema de Windows Media Player con los códecs de audio y video a la hora de reproducir películas en tu PC. VLC Media Player es un manejador multimedia que resuelve este problema, su instalación incluye un paquete completo de códecs además de hacer un uso más adecuado de los recursos del sistema lo cual lo convierte en un reproductor muy versátil. Dentro de los contra está el pequeño detalle: no tiene un buen sistema de gestión de multimedia,

Clementine

Este reproductor de multimedia me ha resutlado bastante útil, cuenta con un equalizador y un sistema de gestión de multimedia bastante adecuado.

Editores de Imagen

No tengo mucha experiencia en la edición o creación de imágenes, pero me permito recomendar estos programas sin añadir mayores comentarios al respecto

GIMP

Inskape

Scribus


Mensajería instantánea

Pidgin

Un gestor de mensajería instantánea que soporta múltiples cuentas y protocolos de comunicación, entre ellos, el protocolo de Gtalk (Jabber), Facebook Chat, IRC, AIM, Yahoo!, entre muchos otros.

Mantenimiento del sistema

CCleaner

Un programa para la limpieza de claves de registro, archivos temporales, entre otras tareas generales de limpieza

ToolWiz Care

Este programa se encarga de labores parecidas a CCleaner, pero trae herramientas adicionales muy útiles a la hora de optimizar el uso de recursos del sistema.

Defraggler

Un software para desfragmentado de dicos, simple, funcional, recomendado.

Computación y Matemáticas

Maxima

Es un motor de cálculo simbólico, bastante parecido a Mathematica, merece la pena una oportunidad.

Scilab

Es un software de cálculo numérico, bastante parecido a Matlab, diría que es una alternativa bastante útil, además de ser multiplataforma.

QtiPlot

Un sistema de análisis de datos que incluye herramientas de ajuste no lineal, graficación y manipulación estadística de datos. Una excelente alternativa a Origin.

lunes, 21 de octubre de 2013

Mantener un blog - más de dos meses sin escribir

Para mi escribir un blog es toda una aventura. Lo pongo en esos términos "aventura", pues se trata de realizar incursiones periódicas al mundo de mis ideas y motivaciones para traer al mundo una entrada que pueda ser de utilidad para algún lector incauto. Los inconvenientes con los cuales me he encontrado han sido de tres tipos:
  • Tiempo
  • Espacio
  • Pertinencia
Tiempo, puesto que no siempre está a mi favor para escribir entradas, hace meses tengo un par de entradas en el horno esperando a ser terminadas, no se trata de un <<simplemente siéntate a escribir>>, se trata de <<si vas a escribir algo, hazlo bien>> que lleva un poco de <<corrige esto, corrige aquello, aquí esto sobra y esto se puede mejorar>>, lo cual requiere cantidades considerables de tiempo.  Este problema aflora más cuando se trata de preparar entradas en inglés, mi formación en inglés ha sido 40% formación, 50% autodidacta y 10% ensayo y error, por lo tanto me veo limitado en este aspecto.

Espacio, puesto que no siempre encuentro el momento oportuno para terminar la labor de escritura., o las ideas fluyen cuando no me encuentro frente al editor. Íntimamente ligado con el tiempo, el espacio también influye la concentración y el influjo de ideas.

Pertinencia, porque me preocupo de escribir entradas que puedan ser de alguna utilidad. Como escribí antes, no se trata de un <<simplemente siéntate a escribir>>, diría que se trata de <<si vas a escribir algo, que sea útil>>.

Luego de pensar en lo poco que actualizo el blog y en la longitud de las entradas, me pareció pertinente cambiar de estrategia. Pretendo realizar entradas más cortas en longitud y condensando más las ideas.

lunes, 12 de agosto de 2013

Conozcamos la STL (Standard Template Library) de C++ - Primera entrega: std::map - Parte 1 de 2

Introducción

Mucha personas (como yo en el pasado cercano) ignorarán el poder oculto detrás de las siglas STL. Se trata de nada más ni nada menos que una de las "cosas" que convierte a C++ en uno de los lenguajes de programación más poderosos. La STL o Standard Template Library 
La STL proporciona una colección de estructuras de datos contenedoras y algoritmos genéricos que se pueden utilizar con éstas.
(tomado de aquí: http://decsai.ugr.es/~jfv/ed1/c++/cdrom4/paginaWeb/stl.htm)

En esta entrega trataré de ilustrar el uso del contenedor map, a través de algunos ejemplos prácticos.

Dada la extensión que pretendía dar a este tema, decidí dividirlo en dos entradas independientes y complementarias.
La primera  parte de esta entrega (es decir, este post) consiste en la implementación del contenedor std::map con los tipos de datos incluidos en el estándar de C++.

En la segunda parte (disponible aquí) abordaré la implementación del contenedor std::map haciendo uso de una clase propia, es decir, una clase que hemos hecho nosotros mismos, tal como lo ilustramos en  una entrega previa, donde hemos definido una clase para la manipulación de vectores.

Contenedor std::map de la STL

Generalidades del contenedor std::map

Uno de esos contenedores incluidos en la STL corresponde a map, un contenedor de datos donde cada uno posee una clave(key en inglés) que lo identifica. Para utilizar map es necesario incluirlo en la cabecera de nuestro código fuente:
#include<map>
De esta manera, es posible hacer el llamado
std::map<tipo_variable_1 clave,tipo_variable_2 valor, criterio_comparación_clave> variable_map;
 De esta manera, se puede declarar una varible tipo map, en este caso: variable_map. Esta definición parece un poco ambigua de entender, pero todo es más claro en cuanto se entiende que la variable map lo que hace es etiquetar con la variable clave lo que contiene la variable valor. Para realizar el ordenamiento, el contenedor map utiliza un criterio de comparación basándose en alguna operación de comparación, específicamente, usando el operador< definido para del tipo_variable_1, es por esta razón que el operador< debe estar definido para el tipo de variable utilizado como clave.
Para realizar la asignación de valores a nuestro mapa, basta con escribir
variable_map[valor_tipo_variable_1]=valor_tipo_variable_2;
Para ver claramente lo que acabo de exponer, observemos el siguiente ejemplo (código c++, obviamente)



#include<iostream>
#include<string>
#include<map>


int main(void)
{
        std::map<int /*indice o clave*/, std::string /*contenido*/> mi_mapa;

       std::string palabra;

        for(int i(0);i<5;i++)
        {
                std::cout << "Ingrese una palabra: " << std::endl;
                std::cin>>palabra;
                mi_mapa[i]=palabra;
        }


        for(i=0;i<5;i++)
        {
                std::cout << "Palabra almacenada con clave " << i << " es " << mi_mapa[i] << std::endl;
        }
}


Vemos que en el ejemplo hemos usado map como si se tratase de un array. Sin embargo, la diferencia sustancial es que la información se ha guardado de manera ordenada en función del valor de i. Este comportamiento no es visible a simple vista, puesto que el orden de entrada de los datos ya están ordenados, pero considere el siguiente ejemplo

#include<iostream>
#include<string>
#include<map>

int main(void)
{
        std::map<int /*indice o clave*/, std::string /*contenido*/> mi_mapa;
        std::string palabra;
        int numero;


        for(int i(0);i<5;i++)
        {
                std::cout << "Ingrese un número: " << std::endl;
                std::cin >> numero;

                std::cout << "Ingrese una palabra: " << std::endl;
                std::cin >> palabra;


                mi_mapa[numero]=palabra;
        }


        for(i=0;i<5;i++)
        {
                std::cout << "Palabra almacenada con clave " << i << " es " << mi_mapa[i] << std::endl;
        }

}

En este caso, vemos que para cada valor no repetido de i, se muestra un valor de palabra. es decir, que para cada int i, se ha asignado una variable std::string. Este uso sigue siento familiar con el uso de los arrays. Podemos probar cambiando los tipos de variable en la definición de la variable tipo map. Considere el siguiente ejemplo

#include<iostream>
#include<string>
#include<map>

int main(void)
{
        std::map<std::string /*indice_palabra*/,int /*indice_numero*/> mi_mapa;
        std::string palabra;
        int numero;

        mi_mapa["hola"]=10;
        mi_mapa["alfabeto"]=5;
        mi_mapa["zoo"]=0;
        mi_mapa["a"]=3;
        mi_mapa["marmota"]=9;


        std::cout << " La palabra \"alfabeto\" tiene asignado el número " << mi_mapa["alfabeto"] << std::endl;
        std::cout << " La palabra \"a\" tiene asignado el número " << mi_mapa["a"] << std::endl;

        std::cout << " La palabra \"hola\" tiene asignado el número " << mi_mapa["hola"] << std::endl;
        std::cout << " La palabra \"marmota\" tiene asignado el número " << mi_mapa["marmota"] << std::endl;



}

A cada std::string se ha asignado un valor numérico tipo int, de esta manera, los llamados a cada int se realizan mediante el std::string correspondiente a su clave.

Considere ahora el siguiente ejemplo

#include<iostream>
#include<string>
#include<map>

int main(void)
{
        std::map<std::string /*indice_palabra*/,int /*indice_numero*/> mi_mapa;
        std::string palabra;
        int numero;


        for(int i(0);i<5;i++)
        {
                std::cout << "Ingrese un número: " << std::endl;
                std::in >> numero;

                std::cout << "Ingrese una palabra: " << std::endl;
                std::in >> palabra;


                mi_mapa[palabra]=numero;
                std::cout << " La palabra << palabra << " tiene asignado el número " << mi_mapa[palabra] << std::endl;

        }

}

En este caso, a cada palabra ingresada por el usuario, se ha asignado un valor numérico también ingresado por el usuario. El ordenamiento se hace según el operador< definido en la clase std::string.

miércoles, 1 de mayo de 2013

El uso de clases y objetos en la programación científica


Esta es una de mis entradas más pretenciosas, quizá el título de esta entrada es un tanto pueril para muchos programadores experimentados.
Mi motivación para la misma es el hecho que pocas veces logra darse la preponderancia suficiente a este asunto en los cursos de programación de las carreras científicas.
Por lo general, se orienta la programación hacia el paradigma de la programación estructurada, paradigma poco elegante si se quiere trabajar en proyectos grandes o si se quiere implementar fácilmente el código fuente escrito, si queremos que otros utilicen nuestro código.

Como científico, es preciso aprovechar todas las herramientas disponibles para resolver nuestros problemas de investigación o de cualquier otra índole académica. Si bien no soy experto en programación, mi experiencia programando desde hace unos 3 años me ha permitido darme cuenta de la importancia que tiene el paradigma de la programación orientada a objetos si se quiere trabajar en el diseño de simulaciones y/o en instrumentación científica. 


Una idea de lo que es una clase


Dejando de lado los formalismos, pienso que una clase se puede definir como un tipo (abstracto) de datos (tipo de variable) más unos métodos propios de la clase (del tipo de datos) a la que pertenecen. Así, cuando se crea una clase, es posible implementarla en nuestros programas, incluir cambios y funciones den la clase y automáticamente los cambios de propagarán a los programas donde la clase se implemente. Para no dejar las cosas en el aire, pensemos en una aplicación al álgebra de vectores como un problema de programación y miremos su solución desde el punto de vista de la programación estructurada y la programación orientada a objetos.

Manipulando vectores con programación estructurada

Mediante la programación estructurada, la salida rápida para le problema se hace a través del uso de arreglos (arrays) lo cual está bien, pero es poco elegante, por ejemplo, para definir el vector i que apunta en la dirección x, puede hacerse algo como esto (código fuente C/C++)

    double i_vector[3];

    i_vector[0]=1;
    i_vector[1]=0;
    i_vector[2]=0;

Lo cual servirá, pero como dije antes, es poco elegante, para tener la base completa {i,j,k} tendríamos el siguiente lío

    double i_vector[3];
    double j_vector[3];
    double k_vector[3];

    i_vector[0]=1;
    i_vector[1]=0;
    i_vector[2]=0;

    j_vector[0]=0;
    j_vector[1]=1;
    j_vector[2]=0;

    k_vector[0]=0;
    k_vector[1]=0;
    k_vector[2]=1;

Ahora, pensemos que queremos definir un producto interno entre vectores (producto punto). Hasta ahora nuestro código solo tiene arreglos definidos, por lo tanto, necesitamos crear una función que lleve a cabo la tarea de calcular el producto punto. Por ejemplo


double productoPunto(double vector1[],double vector2[])
{
    int i=0;
    double res=0;
 
    for(i=0;i<sizeof(vector1);i++)
    {
        res = vector1[i] * vector2[i] + res;
    }
 
    return res;
}


la cual puede llamarse así
 
    punto(i_vector,k_vector)

Funciona, pero siempre queda la sensación que hace falta algo, la sensación que nuestro programa puede ser mejor. Y de hecho, es posible.


Manipulando vectores con programación orientada a objetos


Había mencionado que la programación orientada a objetos hacía uso del concepto de clase a la hora de programar, también había dicho que la clase incluye funciones. Siguiendo con nuestro problema modelo, he escrito una clase llamada cVector (el nombre lo he puesto yo), la clase sirve para manipular vectores en un espacio 3-D. La definición se da a continuación


#include<iostream>
#include<string>
#include <cmath>

class cVector
{
private:

// private quiere decir que las variables a continuación solo pueden accederse desde la clase misma
// es decir, no pueden ser modificadas al momento de implementar el codigo
// por esta razon hay que crear alguna funcion que modifique estos valores
// más adelante veremos las funciones que manipulan estas variables


// Defino una variable para cada coordenada espacial
        double coordenada_x;
        double coordenada_y;
        double coordenada_z;

public:

// public quiere decir que todo lo que se defina a continuacion puede ser accedido al momento de
// implementar la clase

// esta funcion se encarga de modificar las variables privadas de coordenadas

        void colocarCoordenadas(double dX,double dY, double dZ);

// esta funcion retorna la norma del vector
        double normaVector();



// esta funcion permite la igualacion de vectores, es decir, tener por ejemplo vector_a y vector_b
// y hacer que vector_b contenga lo mismo que vector_a solo con hacer
// vector_b=vector_a;
// este proceso se conoce como "sobrecarga de operadores" y consiste en definir las operaciones
// para los operadores de uso común, en este caso, el operador de asignación

        cVector& operator= ( const cVector &rhs );

// esta sobrecarga del operador <, calcula las normas de los vectores y nos dice cual tiene una norma mayor
        bool operator< ( const cVector& other) const;

//con esta sobrecarga implementamos el producto punto entre vectores
        double operator*( const cVector& other ) const;

// con esta sobrecarga se implementa la suma de vectores
        cVector&  operator+(const cVector &other);

};


// Luego de haber declarado la clase y sus funciones, se debe colocar el código de la implementacion de las // funciones, es decir, lo que hacen
void cVector::colocarCoordenadas(double dX,double dY, double dZ)
{
        coordenada_x=dX;
        coordenada_y=dY;
        coordenada_z=dZ;
}


double cVector::normaVector()
{
         return sqrt( coordenada_x*coordenada_x + coordenada_y*coordenada_y + coordenada_z*coordenada_z);
}


cVector& cVector::operator= ( const cVector &rhs )
{

 if ( this == &rhs )    //Verifico si se trata del mismo objeto
    {
      return *this;
    }
  else
    {

        coordenada_x=rhs.coordenada_x;
        coordenada_y=rhs.coordenada_y;
        coordenada_z=rhs.coordenada_z;


        return *this;
    }

}

bool cVector::operator< ( const cVector& other) const
{
    return  ( sqrt( coordenada_x*coordenada_x + coordenada_y*coordenada_y + coordenada_z*coordenada_z) < sqrt( other.coordenada_x*other.coordenada_x + other.coordenada_y*other.coordenada_y + other.coordenada_z*other.coordenada_z) );
}

double cVector::operator*(const cVector &other) const
{
    return coordenada_x*other.coordenada_x + coordenada_y*other.coordenada_y + coordenada_z*other.coordenada_z;
}

cVector&  cVector::operator+(const cVector &other) //const
{
     coordenada_x+=other.coordenada_x;
     coordenada_y+=other.coordenada_y;
     coordenada_z+=other.coordenada_z;
   
     return *this;
}

A la hora de utilizar esta clase, basta con incluirla en los archivos de cabecera y utilizar cada una de sus funciones fácilmente

#include "cVector.hpp"

int main(void)
{
    cVector I_vector;
    cVector J_vector;
    cVector K_vector;

    I_vector.colocarCoordenadas(1,0,0);
    J_vector.colocarCoordenadas(0,1,0);
    K_vector.colocarCoordenadas(0,0,1);

    std::cout << "El producto punto entre I y K es = " <<  I_vector*K_vector  << std::endl;
    std::cout << "La magnitud de la suma vectorial entre I y J " << (I_vector+J_vector).normaVector() << std::endl;
 
//vemos como la suma de vectores se incorpora fácilmente
    if( (I_vector+J_vector)<K_vector)
    {
std::cout << "La magnitud de I + J es menor que la de K " << std::endl;
}
else
{
std::cout << "La magnitud de I + J es mayor que la de K " << std::endl;
}

}

La elaboración de la clase nos permite un control mayor de todas las cosas que pasan con nuestras variables, a la hora de implementar la clase, todo el código detrás de las funciones queda "oculto" pudiéndonos concentrar más en como aprovechar la clase y no en como encajar nuestro problema en la programación estructurada.

La clase cVector y su código de implementación pueden descargarse usando este enlace. 

lunes, 22 de abril de 2013

Poesía - El Perdón de René François Armand Sully Prudhomme

A Poco que tu imagen reaparezca en mi alma,
me doy cuenta que sigues siendo tú la que más quiero.
Tú desolaste la aurora de mi juventud, y sin embargo,
quiero morir sin olvidar tus ojos;

y menos aun tu voz sonora y acariciante,
que penetraba en mi corazón entre todas las voces,
dejando mi pecho estremecido,
como una lira abandonada vibra aún por los dedos que la pulsaron.

Conozco a muchas cuyos labios son bellos,
cuya frente es perfecta, cuyo lenguaje es dulce.
Mis amigos te dirán que he cantado para ellas,
mi madre te dirá que he llorado por ti.

He llorado, pero mis lágrimas son ya menos frecuentes.
Entonces sollozaba, ahora suspiro.
Llegará luego la edad en que los ojos son mas avariciosos y
día llegará en que mi tristeza no sea más que tedio.

Sí, tengo miedo a odiarte cuando llegue a viejo por haber destrozado la flor de mi juventud.
¡Que siempre renazca tu imagen en mí y que yo perdone al alma, recordando tus ojos!

René François Armand Sully Prudhomme



Le Pardon

Pour peu que votre image en mon âme renaisse,
Je sens bien que c'est vous que j'aime encor le mieux.
Vous avez désolé l'aube de ma jeunesse,
Je veux pourtant mourir sans oublier vos yeux,

Ni votre voix surtout, sonore et caressante,
Qui pénétrait mon cœur entre toutes les voix,
Et longtemps ma poitrine en restait frémissante
Comme un luth solitaire encore ému des doigts.

Ah ! j'en connais beaucoup dont les lèvres sont belles,
Dont le front est parfait, dont le langage est doux.
Mes amis vous diront que j'ai chanté pour elles,
Ma mère vous dira que j'ai pleuré pour vous.

J'ai pleuré, mais déjà mes larmes sont plus rares ;
Je sanglotais alors, je soupire aujourd'hui ;
Puis bientôt viendra l'âge où les yeux sont avares,
Et ma tristesse un jour ne sera plus qu'ennui.

Oui, pour avoir brisé la fleur de ma jeunesse,
J'ai peur de vous haïr quand je deviendrai vieux.
Que toujours votre image en mon âme renaisse !
Que je pardonne à l'âme au souvenir des yeux !


René François Armand Sully Prudhomme

domingo, 21 de abril de 2013

Libro: Metro 2033 por Dmitry Glukhovsky

Metro 2033 es una novela escrita por Dmitry Glukhovsky, lanzada (libremente) en el año 2002 en internet.

Resumen No-spoiler

La novela está ambientada en la ciudad de Moscú en el año 2033, 20 años después de una guerra mundial nuclear que devastó las ciudades y países de todo el mundo. El invierno nuclear, los altos niveles de radiación, las especies peligrosas emergentes y los gases tóxicos en la superficie, forzó a los supervivientes a buscar refugio bajo tierra. Con una trama post-apocalíptico, la novela relata las aventuras y pensamientos de Artyom, el protagonista de esta historia, quien intenta salvar su hogar, la estación VDNKh (léase Ve-den-ja), de una nueva especie peligrosos: Los Oscuros (los Negros según el traductor de la versión que leí. pero no suena muy adecuado :S). Con habilidades muy particulares y muchisima suerte, Artyom parece estar destinado a salvar el último refugio de la humanidad de la amenaza... o eso es lo que parece ser.
Metro 2033 - Mapa de estaciones y facciones

Opinión


Yo recomiendo este libro. Si pudiera resumir este libro con una palabra, esa palabra sería sentido. En una frase: la búsqueda de sentido.
A lo largo de cada uno de túneles del metro, apreciamos las transformaciones de un hombre y su forma de ver el mundo, vemos su búsqueda del sentido a la vida en un ambiente tan rudo donde la vida misma es un milagro. El autor explora diferentes búsquedas de significado a través de sectas y cultos, a veces de carácter político, a veces de naturaleza espiritual, exponiendo muchas clases de estilo de vida,  mostrando como las personas se aferran a las creencias con la esperanza de encontrarle un sentido a la vida.
El sentido de las cosas es un tema que el autor aborda muy bien.

Datos interesantes que aprendí

  • El metro de Moscú tiene 188 estaciones distribuidas a lo largo de 12 lineas de metro, recorriendo un total de 313 km.
  • La estación más profunda está a unos 85 metros bajo tierra, lo que convierte al metro de Moscú en uno de los sistemas de metro más profundos
  • La torre Ostankino es una de las estructuras más altas del mundo, contando con una altura de alrededor de 540 m.

Frases favoritas


Al comienzo del libro

"En ese momento, Artyom creyó haber comprendido la esencia del ser humano, así como el sentido de la vida: vio al ser humano como una compleja máquina destinada a la eliminación de alimentos y producción de mierda. Una máquina que funcionaba sin impedimento alguno durante la mayor parte de la vida, y cuya existencia no tenía sentido alguno, y es que por «sentido» se entendía un final. Su final era el propio proceso: consumir tanta comida como le fuera posible, procesarla y expulsar los excrementos, todo lo que quedara de las humeantes costillas de cerdo, los estofados de setas y las deliciosas tortas de harina. Los hombres que pasaban por allí se transformaron, a los ojos de Artyom, en máquinas sin rostro, que sólo servían para la destrucción de lo bello y lo provechoso, que sólo engendraban masa fétida e inútil. Se enfadaba con ellos, y los miraba con asco, igual que ellos lo miraban con asco a él."
Capítulo 10

 "
"
Capítulo 17

viernes, 19 de abril de 2013

Lector de PDF nativo de Google Chrome en Chromium - Caso Debian GNU/Linux

Posiblemente una de la excusas más comunes para usar Google Chrome en lugar de Chromium, es la ausencia de un lector de PDF embebido en el navegador.
La solución que muchas personas indican es instalar una aplicación para leer PDF en Chromium. Puede que funcione para algunos, aún así, me sigue pareciendo una solución poco elegante.
Me he enterado recientemente que es posible mejorar el navegador Chromium añadiendole el mismo lector de PDF de G-Chrome.
Esta solución es muy antigua, pero me tomé la libertad de publicar una entrada en español al respecto.

Manos a la obra

Por alguna razón en los repositorios de Debian (Testing almenos) aparecen los paquetes
chromium  y chromium-browser, aún así el "hack" es bastante sencillo.

Primero se necesita disponer de un paquete de instalación de G-Chrome actual.
El truco consiste en extraer de G-Chrome, la librería que contiene el lector de PDF embebido.
(Para los perezosos, he habilitado un enlace de decarga a mi libpdf.so para la arquitectura de 64 bits de Chromium, no tengo la versión del navegador de la cual tomé la librería, pero es del mes de Marzo(2013). Actualicé el enlace usando la librería G-chrome versión 40.0.2214.94 (Feb 2015). Declaración No me hago responsable del uso indebido de este archivo ni de las consecuencias de su uso.).
Para cualquiera de los casos siguientes, debe tener privilegios de root para modificar los directorios.

chromium instalado 

Solo se requiere colocar la librería mencionada anteriormente en el directorio
 /usr/lib/chromium/
de manera que se vea  /usr/lib/chromium/libpdf.so

chromium-browser instalado

Solo se requiere colocar la librería mencionada anteriormente en el directorio
/usr/lib/chromium-browser/
de manera que se vea /usr/lib/chromium-browser/libpdf.so


Probando el lector

Al reiniciar el navegador, en la barra de direcciones del navegador escribimos
chrome://plugins/
Notaremos de inmediato que aparece un plug-in asociado a la librería, y por defecto, debería estar activado (Si no, lo habilitamos).
El Plug-in se activa al reiniciar el navegador

Al abrir un PDF, deberíamos tener el mismo lector de Google Chrome, solo que usando Chromium.

Vemos que se trata de Chromium

Tiene exactamente las mismas características que para el navegador Google Chrome




Apostilla

Al interior de estos directorios puede existir una carpeta llamada plugins, si desea puede colocar la librería allí, por motivos de organización y estética fundamentalmente

jueves, 11 de abril de 2013

Unison - una forma de mantener PCs sincronizados


Muchos de nosotros tenemos un PC de escritorio(Desktop) y un equipo portátil (Laptop, o Netbook --como en mi caso--) y siempre tenemos el problema de mantener nuestros dispositivos en sincronía. Piense, por ejemplo, que está trabajando en un proyecto y manipulando copias del mismo en su PC de escritorio y en su equipo portátil. Realizar sincronizaciones manuales puede enredar un poco las cosas, arriesgando información valiosa en el proceso.
Se ha dicho mucho sobre la opción de usar Dropbox, pero no siempre es posible utilizar este servicio para esta tarea (Pues Dropbox solo almacena 2GB en el plan básico gratuito. Es posible incrementar la cuota de espacio, pero hay situaciones donde Dropbox no es una solución inteligente).
Le dediqué algún tiempo a encontrar una buena aplicación que me permitiera sincronizar mis dispositivos y me encontré con Unison, que en palabras de la página oficial:
El logo de Unison

Este programa tiene la ventaja de ser multiplataforma, permitiendo sincronizar entre dos plataformas diferentes (por ejemplo, entre Linux y Windows), como añadidura, se encarga de controlar las versiones de los archivos controlando cuales son más recientes y permitiéndo que el usuario eliga que cambios se deben propagar entre las réplicas.
He probado este programa por cerca de dos meses y puedo decir que funciona de maravilla. Si usted necesita sincronizar dos o más directorios, debería darle una oportunidad.
Dentro de los usos que le he dado al programa, y los que se le pueden dar, están
  • Mantener mi Netbook y el Desktop sincronizados (exactamente con la misma información) en los directorios elegidos
  • Como una herramienta de respaldo de USB Flash, pues tengo un perfil configurado que me sincroniza el contenido de la misma en mi Netbook, así que, si necesito un poco de espacio adicional  puedo eliminar archivos sabiendo que tengo copias del mismo en otro lugar. Un ejemplo de esta necesidad es al montar ISO hibridas de Debian en una memoria USB, así no pierdo información y puedo restaurar la memoria a su estado inicial
  • Se pueden guardar varios perfiles de sincronización, así se pueden usar cuando sea necesario.
  • Puede utilizar SSH para realizar la sincronización, así que basta tener una red LAN o una WLAN en casa para sincronizar dispositivos. La mayor utilidad también se da sincronizando equipos remotos por SSH, pero no lo he probado.
Los manuales y tutoriales en inglés están Aquí.


Guía simplificada para el novato.


Instalando


En los sitemas GNU/Linux, Unison se puede instalar desde consola con permisos de superusuario, usando el comando su, o sudo. Posteriormente utilizamos un gestor de paquetes, en mi caso aptitude (pero apt-get servirá también)
# aptitude install unison-all unison-alll-gtk

Sincronizando PCs por SSH con Unison

La aplicación puede utilizarse mediante la línea de comandos, sin embargo, en aras de la brevedad ilustraré su uso mediante la interfaz de usario (en GTK). Supondremos que tenemos dos computadores que comparten una red local, ambos tienen instalado Debian GNU/Linux y la carpeta que queremos sincronizar está almacenada en un disco con formato NTFS (Una partición de Windows)
Al correr Unison aparece una ventana de selección de perfil, más o menos así:
Selección de perfil - Aparecen dos perfiles porque son los que tengo guardados.
Una vez allí, para crear un perfil se presiona el botón, Añadir al costado derecho de la ventana.


Al presionar añadir aparece este mensaje, presionamos adelante para continuar
Aparece un menú que solicita un Nombre y Descripción del perfil a crear, en este caso le puse Prueba

Acto seguido, aparece un menú que ofrece distintas opciones de sincronización, a saber, Sincronización Local, Sincronización vía SSH, y Sincronización vía RSH, o através de una conexión TCP
Tipo de conexión - Tipos de sincronización disponibles

Al elegir SSH aparecen más opciones:
Tipo de conexión - He seleccionado SSH como el tipo de conexión. 
Para configurar la conexión vía SSH es necesario proporcionar los datos del servidor remoto, y del usuario en el servidor remoto. Esta información se escribe en las casillas correspondientes (Si no entiende de lo que estoy hablando debería mirar este enlace y este tal vez).

Una vez se ha establecido el tipo de conexión, aparece un menú para elegir el directorio Local (el de la máquina en que se está configurando el Unison) y el menú remoto (Remoto porque elegimos sincronizar PC diferentes vía SSH)
Eligiendo directorios a Sincronizar
Para el caso en que la sincronización involucre particiones de windows, Unison ofrece la posibilidad de activar una casilla de verificación. Las razones para ello, es que el sistema de archivos FAT o NTFS no permiten la modificación de permisos como los sistemas de archivos ext2,ext3 o ext4 que son de uso común para las distribuciones de Linux.

Activo esta casilla pues la sincronización involucra particiones con tipo de Archivo FAT o NTFS
 Así ha terminado de configurar su perfil de Unison.


Creación de perfil terminada :D

Sincronizando Directorios - Utilizando el perfil

Atención: Unison debe estar instalado en todas las máquinas que desean sincronizarse, adicionalmente, deben tener la misma versión instalada. De otro modo no será posible sincronizar y le aparecerán mensajes de error.

Para utilizar el perfil creado, solo debe seleccionarlo en la ventana inicial de Unison y presionar el botón Abrir en la parte inferior de la ventana.
Selección de perfil - Aparecen dos perfiles, son los que tengo guardados.
Una vez se seleccionó el perfil y Unison encuentra al servido remoto (el otro PC), solicita la contraseña del usuario en el servidor remoto.
Conectando con el servidor remoto - Solicita contraseña para continuar
Una vez ingresada la contraseña, Unison buscará los cambios en ambas máquinas y sugerirá acciones pendientes. La primera columna de la izquierda, con nombre local indica el estado del directorio local, la segunda, action indica en verde la dirección hacia donde se propagarán los cambios, y la tercera columna indica el estado del directorio remoto (Icaro es el nombre del servidor remoto en este caso).
La columna status mostrará el progreso de cada archivo, finalmente la columna path indica el archivo en cuestión.
Preparando sincronización - Examinando diferencias entre directorios
Vemos que en la columna action en las primeras dos filas tiene direcciones distintas. La primera fila nos indica que se progará de Icaro a local un archivo nuevo (New File). Por su parte, la seguna fila muestra que un archivo nuevo se propagará de local al directorio remoto en el servidor Icaro.
Al iniciar la sincronización, veremos como cambia la columna status según se vaya completando cada acción pendiente.
Propagando cambios - Los PC se están sincronizando
Al finalizar, en la barra de estado (barra inferior) se indicará que la sincronización ha terminado.

Comentarios Finales

  • Según la página oficial de Unison, (específicamente acá en inglés) declaran que el software no tendrá mejoras respecto a sus versiones actuales, sin embargo se trabajará para que el programa siga siendo soportado e incluido en las distribuciones de software futuras (incluyendo los reportes de fallos). La razón para ello es que no disponen de un desarrollador que dedicado a la tarea de mejorar el software.

  • Llevo mucho tiempo preparando el tutorial, y por motivos de tiempo  --y espacio--  no puedo mostrar como se utilizan los demás métodos de sincronización. Espero que con esta "guía simplificada" sea suficiente para satisfacer las necesidades de la vida cotidiana. Si tiene cualquier pregunta, siéntase libre de dejar un comentario (o los que considere necesarios)