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.

jueves, 15 de agosto de 2013

Dropbox on a multiboot system with Debian

Motivation

Many Linux users might have problems when using the cloud synchronization tool known as Dropbox on a multiboot system. The problem arises when trying to have a Dropbox set-up on both Windows and Linux OS arising "syncronization issues", if you tried this before, you'll understand.
So i searched for solutions to this "issue", but all the proposed ways to solve it were... well, not so elegant for me.

The way i got dropbox working both on Debian GNU/Linux and Windows (same PC)

A little 'bout context

I've already have a Windows-7 OS installed, with a working Dropbox installation at

D:\Daniel\Dropbox

Without having a working installation of Dropbox at Debian.

Making symbolic links on Linux

On Debian, I've the "D:\" windows partition as "/dev/sda5", and is mounted on

/media/Disco-Local/

I wanted to have my Linux-Dropbox folder at

/home/damejia/Dropbox

So work with those locations. Given the context, boot Debian and open a terminal, to login as superuser type

$ su

It will ask you the "root" password. Then, do the following

# ln -s  /media/Disco-Local/Daniel/Dropbox  /home/damejia/Dropbox

This will create a link between both paths, so, the /home/damejia/Dropbox points to  /media/Disco-Local/Daniel/Dropbox

Change the group and the owner of the link created (in my case, the user is damejia)

# chown -R damejia  /home/damejia/Dropbox
# chgrp -R damejia  /home/damejia/Dropbox

We are ready to install Dropbox

Intalling Dropbox on Debian

Then, download the latest version of Dropbox for Debian (they have the .deb), and, from the console install the packe using dpkg (as root, is worth noting that you must be on the same directory as the package)

# dpkg -i dropbox-x.x.x-amd64.deb

On the first run of Dropbox on Debian, it will ask you for the folder to store the syched files. choose

/home/damejia/Dropbox

That is, choosing the link we created before. And... that's it, the Dropbox must appear as synched, since you haven't added files, you will have the same Dropbox path on either Windows or Linux.

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.

jueves, 8 de agosto de 2013

System sound equalized with ALSA for Debian - Get-yo-self equalized!

(Still working on 2015. See workarounds at the end)

Motivation

Like many people, i really enjoy listening music, an, as many would know, having an equalizer can make a really big difference between "the ordinary experience" of listening music.
It's clear that many media players include plugins for audio enhancing, but, whan happens when you listen a music video on youtube, or just simply using grooveshark cloud music service?. For Windows machines the solution could be installing audio-enhancing software like DFX (A really good one, i can tell). But that kind of "stuff" isn't available for Linux. Maybe 'cause we have other kind of solutions, i have found one that works amazing, but you must have ALSA installed on your Linux distribution.

What is the ALSA System?

Many of you may wonder, hows that your Linux Distro communicates with your speakers/headphones/microphon/any-sound-device. Well, there are many ways to get the task donde, but, for Debian distributions (So, for the wide set of Debian-based distros like Ubunty, Mint, and so on) the ALSA system do the job. In words of Wikipedia [1]:
Advanced Linux Sound Architecture (known by the acronym ALSA) is a free, open source software framework released under the GNU GPL and the GNU LGPL[4] that provides an API for sound carddevice drivers. It is part of the Linux kernel. Some of the goals of the ALSA project at its inception were automatic configuration of sound-card hardware and graceful handling of multiple sound devices in a system, goals which it has largely met. A couple of different frameworks, such as JACK, use ALSA to allow performing low-latency professional-grade audio editing and mixing.
So

ALSA Equalizer

Getting the equalizer installed

Installing from repos (Debian Testing and Sid)

In the Debian Testing repositories we have the package libasound2-plugin-equal

The plugin on my Debian repository

In order to have the equalizer installed, as root, do:
# aptitude install libasound2-plugin-equal alsamixergui

  • libasound2-plugin-equal - The equalizer itself
  • alsamixergui - A GUI To control de plugin, but it's optional, cause you can use the command-line alsamixer. Unfortunatetly the only way to control the equalizer is to make use of the alsamixer utility

Manual Installing

For other linux distros, download the latest version of the plugin from here (look for "download")
Then, choose a folder and do

tar xvjf alsaequal-x.x.tar.bz2
cd alsaequal-x.x
make
sudo make install
You should read carefuly the reference [2]

Getting the equalizer to work

Single user

Into your "home" directory ("/home/user" for instance) create a file called ".asoundrc" and paste this code onto it (for more information see [2] and [3] from the references section below)
ctl.equal {
  type equal;
}
pcm.plugequal {
  type equal;
  # Modify the line below if you don't
  # want to use sound card 0.
  slave.pcm "plughw:0,0";
  # or if you want to use with multiple applications output to dmix
  # slave.pcm "plug:dmix"
}
# pcm.equal {
  # Or if you want the equalizer to be your
  # default soundcard uncomment the following
  # line and comment the above line.
 pcm.!default {
  type plug;
  slave.pcm plugequal;
}
Then, as root, you must do

# alsa force-reload

So the sound daemon restarts and loads the plugin. The equalizer should be working now.

Whole system (all users)

You must create the file

/etc/asound.conf

And paste this code onto it (for more information see [2] and [3] from the references section below, take a look at [4] too)
ctl.equal {
  type equal;
}
pcm.plugequal {
  type equal;
  # Modify the line below if you don't
  # want to use sound card 0.
  slave.pcm "plughw:0,0";
  # or if you want to use with multiple applications output to dmix
  # slave.pcm "plug:dmix"
}
# pcm.equal {
  # Or if you want the equalizer to be your
  # default soundcard uncomment the following
  # line and comment the above line.
 pcm.!default {
  type plug;
  slave.pcm plugequal;
}
Then, as root, you must do

# alsa force-reload

So the sound daemon restarts and loads the plugin. The equalizer should be working now.

Using the equalizer

The plugin installs a "virtual" audio device. This device is called "equal" (for obvious reasons).
If you followed the steps above, you shouln't have problems now.
To change the equalizer configuration, you must tell ALSA that you want to work with the "equal" device, so open a terminal and write either

$ alsamixer -D equal


This is how it looks on command line
or

$ alsamixergui -D equal


This is how it looks using alsamixergui

And choose your best audio configuration, and enjoy your audio-enhanced linux distro.

Some Workarounds (edit: 2015-Feb-04)


The above instructions still worked for me (I've resintalled Debian Testing on my PC on January of 2015), but I've noticed two little workarounds that might be of importance if you have more than a sound card or you have been experiencing no sound with web pages as youtube using google-chrome.

More than a soundcard

I've changed my motherd board and has two different sound cards which caused my system to direct the equalized sound stream to the "wrong" sound card.

Thanks to this post [7] I became aware of the need of tweaking the file /usr/share/alsa/alsa.conf in order to get ALSA using the "right" sound card.
If the working sound card is hw:0,1 and the "bad" sound card is hw:0,0, and you used hw:0,1 on your asound.conf as stated on the sections above, but still without equalized sound, you need to tell ALSA that start using sound card 1 (i.e. hw:0,1 in our example) on the file /usr/share/alsa/alsa.conf by changing the following lines:
defaults.ctl.card 0 to defaults.ctl.card 1
defaults.pcm.card 1 to defaults.pcm.card 1
defaults.rawmidi.card 1 to defaults.rawmidi.card 1
defaults.hwdep.card 1 to defaults.hwdep.card 1
defaults.timer.card 1 to defaults.timer.card 1

Youtube and HTML5 on google-chrome

Youtube video players were switched to use HTML5 (google it for more information). I don't know why the sound layer works if you use PulseAudio but if you have only ALSA, the sound migth not work (for me it was working anddd... the sound was gone).

The solution for google-chrome is to start the browser with the option

--try-supported-channel-layouts
So call google-chrome as

google-chrome --try-supported-channel-layouts

And play a nice youtube video, if that works for you, you can edit the menu entries and links to google-chrome adding the mentioned command option.
Resampling can be another issue (I can not tell about that but google product forum talks about it), some forums suggest to add the option --disable-audio-output-resampler, so another solution could be calling google-chrome as

google-chrome --disable-audio-output-resampler --try-supported-channel-layouts 
If that does not help you... Well... F*ck. 

References

  1. http://es.wikipedia.org/wiki/Advanced_Linux_Sound_Architecture
  2. http://www.thedigitalmachine.net/alsaequal.html
  3. http://wiki.linuxmce.org/index.php/Equalizer_for_ALSA
  4. http://www.alsa-project.org/main/index.php/Asoundrc
  5. http://packages.debian.org/source/sid/alsaequal
  6. Download my asound.conf 
  7. https://coderwall.com/p/wajiaq/replacing-pulseaudio-with-alsa-linux

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

viernes, 26 de abril de 2013

At the beginning: we were boring physicists - A Science Instrumentation Project

Recently, a Friend (a colleage) and Me are engaging a science intrumentation project as part of our formation as Physicist.


Basically, will make an experimental approach to the building of a Bioreactor system for the culture of microalgae. Our main goal is design a method to measure the microalgae concentration inside the bioreactor without opening it, which avoids the risk of contamine the microalgae culture. We detected this as an unsolved problem (at least locally) and that was highly motivating for us, so bad that we made a blog about it: 
http://bioarduino.blogspot.com/


The interesting part is, that we will be using a Arduino Uno32 chipkit to automate stuff, (measurements basically) and a RaspberryPi to monitor and control all the processes, of course this involves circuit designing and building, also lots of programming, so we will be releasing code and maybe designs (licensed under GPL V3) in order to contribute to the community of free software and hardware.

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

Book: Metro 2033 by Dmitry Glukhovsky


Metro 2033 is a novel written by Dmitry Glukhovsky, released (freely) near the year 2002 (On the web).

Non spoiled Summary

The novel is set in the city of Moscow on the year 2033, 20 years after a nuclear world war that devastated  all cities and countries around the world. The nuclear winter, the high levels of radiation, the emerging dangerous species and  the toxic gases on the surface, forced the survivors to get shelter under the soil. On a post-apocalyptic theme, the novel relates the adventures and thoughts of Artyom, the main character who tries to save his home the VDNKh station from a new hazardous species: the Dark Ones. With particular habilites and an lots of luck, Artyom seems to be destined to save the last refuge of humanity from this threat... or thats how it looks like.

Metro 2033 - Map of locations, factions and more

My opinion

I highly recommend this book. If I could summarize this book with one word, that word would be meaning. In a phrase: the search of meaning.
Along each metro tunels, we appreciate the transformations of a man and the way he sees the world, we see his search for a meaning to life in such a rude environment where life itself is a miracle.The autor explores different searches of meaning among sects and cults, sometimes of political nature, sometimes of spiritual nature, exposing many sorts of life style, showing how te people holds to beliefs in a search of hope, hope of a meaning. The meaning of things is a topic that the author addresses very well.

Interesting facts I've learned

  • Moscow's metro has 188 stations along 12 metro lines, with a total lenght of about 313 km.
  • The deepest metro station is about 85 m under the surface, Moscow's metro is one of the deepest metro systems on earth.
  • The Ostankino tower is one of the tallest buildings on earth, having a height of about 540 m.

Favourite quotations

"Who has the courage and perseverance needed to spend his life searching the darkness, will also be the first to recognize the break of day."

At the begining of the book

"At that time, Artyom thought he understood the essence of the human being and the meaning of life: saw the human being as a complex machine for removing food and shit production. A machine that worked without hindrance for most of life, and whose existence no sense whatsoever, and is that 'sense' meant an end. His end was the process itself: eat as much food as he could, process and release stool, all that remained of the smoky pork ribs, mushroom stews and delicious cakes of flour. The men who passed by were transformed, in the eyes of Artyom, faceless machines, which only served to destroy the beautiful and the useful, engendered only fetid mass and useless. Was angry with them, and watched in disgust as they watched him in disgust."
Chapter 10

 "At all times he sounded in final complaint Dron. His despair, his disappointment, his inability to believe the man to be alone in this scary world full of darkness and had spread to Artyom. Oddly enough, it was the cry of the barbarian, helpless pregnant with nostalgia for a divinity ugly and invented what he did begin to understand the cosmic loneliness that fed the beliefs of men."
Chapter 17

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