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.