Pensamientos y Libros

13 julio 2010

Esqueleto de un proyecto con CMake

Filed under: Sin categoría — Toni Cebrián @ 20:31
Tags: , ,

Cuando se crea un nuevo proyecto desde cero, hay muchas tareas que son repetitivas y tediosas. Crear los makefiles, definir la estructura del proyecto, etc… Normalmente lo que se suele hacer es dejar que sea el IDE que utilizamos quien realice esas tareas. Al utilizar CMake esa responsabilidad recae sobre el desarrollador. He creado un proyecto sencillo que sirva de esquelataje para la creación de nuevos proyectos C++.
Proyecto de ejemplo
Puedes acceder al código fuente del proyecto aquí. Símplemente clónalo y empieza a hackear.
Estructura de directorios
Desde hace poco he estado trabajando con Maven para desarrollar en Java. Soy fan de la idea de Convención sobre Configuración (CoC). Cuando estás codificando han cientos de cosas que tienes que tener en mente, por qué gastar preciosos ciclos de cerebro recordando en qué carpeta están esos ficheros de configuración que tu compañero creó la semana pasada. Lo que haces es acordar un convención arbitraria y te ciñes a ella. De repente tienes neuronas que se han liberado y que puedes utilizar para aprender el siguiente framework. A la hora de organizar las carpetas del proyecto he seguido las convenciones Maven lo que he podido, un gran CMakeLists.txt en la raíz del proyecto, una carpeta src divida a su vez en main y test divididas a su vez en subcarpetas por tecnología. Los ficheros objeto que se generan en la compilación están en una carpeta separada.
Tests unitarios
A la hora de proveer cierta funcionalidad, el proyecto crea una librería dinámica con la funcionalidad de una calculadora simple. Para probar que esta funcionalidad funciona correctamente, un test unitario se ha creado usando el framework CppUnit. El proyecto crea un driver de los tests llamado UnitTester. Este ejecutable puede ser ejecutado sin parámetros y ejecuta todos los tests que hubieran sido registrados previamente utilizando la macro CPPUNIT_TEST_SUITE_REGISTRATION. Si lo que quieres es ejecutar un único test tienes que pasarle ese nombre por la línea de comandos.
No uso la funcionalidad de unit testing CTest que proporciona CMake con lo que que make test no funciona en este proyecto. Prefería tener un ejecutable driver que lanzara los tests y que facilitara la utilización de otras herramientas como Valgrind.
Empaquetado
En la carpeta cmake hay dos scripts que definen las condiciones del empaquetado. Se pueden crear un RPM o un DEB únicamente comentando o descomentando las líneas correspondientes en el CMakeLists.txt
Desarrollo Futuro
Planeo continuar actualizando este esqueleto de proyecto en el futuro. Algunas cosas que seguro mejoraré son:

  • Encontrar una solución satisfactoria a ejecutar los tests utilizando CTest
  • Dado que CMake es un entorno crossplatform, comprobar que este proyecto puede funcionar correctamente en Windows o Mac, ya que actualmente sólo está probado en Linux.

25 noviembre 2007

Utilizar Latex en documentos Docbook

Filed under: Computación,Edición,Linux,Matemáticas — Toni Cebrián @ 19:40

 

 

Instrucciones

El formato XML ha sido una gran idea. Un formato sencillo y fácilmente extensible utilizado para describir datos con multitud de aplicaciones. Yo por ejemplo lo utilizo para redactar estos artículos utilizando el esquema publicado de Docbook, luego los convierto a HTML utilizando unas hojas de estilo en formato XSL y finalmente las subo a esta web. Es una solución muy flexible y que me evita tener que andar pensando en formatos y tipos de letras, simplemente hay que escribir contenido. Sin embargo viene con un peaje a pagar, el tener que lidiar con una sintaxis farragosa cuando hay que escribir el XML «a pelo» situación que aparece a menudo cuando queremos escribir ecuaciones y fórmulas matemáticas para la web utilizando el formato MathML. En este artículo voy a explicar cómo podemos ahorrarnos parte de la farragosa tarea de escribir matemáticas en un documento Docbook utilizando el truco de escribir las matemáticas en Latex dentro del documento y utilizar un filtro que nos convierta ese Latex a MathML antes de hacer cualquier conversión.

 

 

Instalación

 

  • Lo primero es bajarse el software que nos hará la conversión de Latex a MathML desde la página de itexToMML. Existen versiones para Mac y para Linux. En lo que sigue del artículo me referiré a la instalación en Linux. Descomprimimos el tar.gz que contiene los binarios y los fuentes del programa.
  • El programa utiliza el flujo de entrada al programa y traduce todos los entornos matemáticos Latex a su equivalente MathML. Para ilustrarlo creamos el fichero Docbook de ejemplo que se muestra en el siguiente listado.
    <?xml version="1.0" encoding="UTF-8"?><section version="5.0" xmlns="http://docbook.org/ns/docbook"         xmlns:xlink="http://www.w3.org/1999/xlink"xmlns:xi="http://www.w3.org/2001/XInclude"
    
    xmlns:svg="http://www.w3.org/2000/svg"
    
    xmlns:mml="http://www.w3.org/1998/Math/MathML"
    
    xmlns:html="http://www.w3.org/1999/xhtml"
    
    xmlns:db="http://docbook.org/ns/docbook">
    
    <title>La función más famosa</title>
    
    <para>La función que aquí mostramos, $E=mc^2$, se ha convertido en un
    
    icono cultural aunque muy pocos comprendan su verdadero significado.</para>
    
    </section>
  • A continuación lo que hay que hacer es filtrar este flujo de texto con nuestro programa itex2MML para que convierta las funciones latex en su equivalente MathML. En línea de comandos hacemos:cat Ejemplo.xml | itex2MML > Exemplo-procesado.xmly el archivo original queda convertido en el que puede verse en el siguiente listado.
    <?xml version="1.0" encoding="UTF-8"?><section version="5.0" xmlns="http://docbook.org/ns/docbook"xmlns:xlink="http://www.w3.org/1999/xlink"
    
    xmlns:xi="http://www.w3.org/2001/XInclude"
    
    xmlns:svg="http://www.w3.org/2000/svg"
    
    xmlns:mml="http://www.w3.org/1998/Math/MathML"
    
    xmlns:html="http://www.w3.org/1999/xhtml"
    
    xmlns:db="http://docbook.org/ns/docbook">
    
    <title>La función más famosa</title>  <para>La función que aquí mostramos, <math xmlns='http://www.w3.org/1998/Math/MathML' display='inline'><mi>E</mi><mo>=</mo><msup><mi>mc</mi> <mn>2 </mn></msup></math>, se ha convertido en un
    
    icono cultural aunque muy pocos comprendan su verdadero significado.</para>
    
    </section>
  • Una vez tenemos la fórmula convertida a MathML lo que tenemos es un documento Docbook bien formado y lo único que nos queda es aplicarle las hojas de estilo y las transformaciones necesarias para obtener nuestros PDFs o páginas html. El resultado puede verse en el siguiente párrafo.La función que aquí mostramos,
    E = mc 2 , se ha convertido en un icono cultural aunque muy pocos comprendan su verdadero significado.

 

Caution

Es importante que en las transformaciones a XHTML el fichero destino no tenga extensión .html pues en dicho caso las fórmulas no se muestran correctamente. Utilizar la extensión xhtml o xml para visualizar el contenido correctamente.

Sobre WordPress

WordPress elimina el contenido específico de MathML al guardar el post así que estoy tratando de pensar cómo rodear y solucionar este problema.

5 noviembre 2007

Configurar Firefox para que pueda renderizar MathML en Linux

Filed under: Computación,Edición,Linux,Matemáticas — Toni Cebrián @ 23:35

 

 

Instrucciones

Para poder visualizar MathML al utilizar el navegador Firefox en Linux es necesario previamente haber instalado las fuentes que permitan hacer el renderizado necesario. Para ello, seguimos los siguientes pasos:

  • En Ubuntu Gutsy el navegador está compilado con soporte para Xft (se comprueba poniendo about:buildconfig en la dirección y comprobando que tiene el –enable-xft como opción de compilación) así que descargamos las fuentes que se encuentran http://www.mozilla.org/projects/mathml/fonts/bakoma/texcm-ttf.zip y en http://support.wolfram.com/mathematica/systems/windows/general/files/MathFonts_TrueType_41.exe.
  • Las fuentes hay que descomprimirlas y guardarlas en ~/.fonts (crear el directorio si no existe). Las fuentes Mathematica pese a ser un fichero .exe se pueden descomprimir normalmente con el comando unzip MathFonts_TrueType_41.exe
  • Aún nos faltará una última fuente que no está disponible fácilmente. Si tienes algún sistema Windows a mano copia la fuente Symbol.ttf que se encuentra en el directorio c:\windows\Fonts en nuestro directorio de fuentes ~/.fonts
  • Ya por último para comprobar que todo funciona reinicia el navegador y ya tienes todas las fuentes instaladas. Para comprobarlo utiliza la página de prueba de http://www.w3.org/Math/XSL/pmathml2.xml

Todos estos pasos parece que no habrá que hacerlos en el futuro pues se están preparando unas fuentes que serán de libre distribución y vendrán incorporadas en nuestras distribuciones linux. Más información en http://www.mozilla.org/projects/mathml/fonts/

24 julio 2007

Conversión de la codificación de los archivos de texto

Filed under: Computación,Linux — Toni Cebrián @ 22:41

Cuando quiera cambiar la codificación con la que se creó un archivo de texto hay que utilizar el comando recode. Por ejemplo para transformar de UTF-8 a ISO8859-1 la línea de comando es:

recode utf8..latin1

20 junio 2007

Pequeñas perlas de la consola

Filed under: Computación,Linux — Toni Cebrián @ 15:24

Hay veces que me maravilla la facilidad con que ciertas cosas se pueden hacer si se dedica un poco de tiempo a pensar y no darse por vencido en la primera aproximación.

Hoy tenía que averiguar de un archivo de trazas de un apache de unos 800 megas el número aproximado de visitantes a un portal web para poder hacer un dimensionado acorde de un desarrollo que estamos haciendo. En cada traza tenía la cookie del usuario pero obviamente estaban completamente desordenadas y no podía saber cuántas habían diferentes. Ya estaba preparándome para importar los datos a lo bestia en una base de datos y hacer un SELECT DISTINCT cuando me he dado cuenta que eso era matar moscas a cañonazos. Después de hacer el esfuerzo de darle una pensada me ha salido la siguiente línea de comando:
cut --fields=1 09MayoProcesado.log | sort | uniq -c | wc --lines

Resultado final, un numerito con el total de cookies diferentes en el fichero gordote de los 800 Megas. Parafraseando a Schumacher, lo pequeño es hermoso.

7 enero 2007

The Business Of Software

Filed under: Computación,Ingeniería del Software,Libros — Toni Cebrián @ 22:04

The Business of Software Contraportada Business Of SoftwarePortada Business Of Software

What Every Manager, Programmer, and Entrepreneur Must Know to Thrive and Survive in Good Times and Bad


Introducción

Leí este libro después de ponerme a curiosear sobre los libros que existían para emprendedores en el campo del desarrollo software. Ese curiosear me llevó al concepto de los Micro-VIS y este libro fue lo más parecido que pude encontrar mientras espero otros libros sobre el tema.

El libro

La verdad es que primer libro que leo y primera decepción. El libro no es más que un refrito de historias de «abuelo cebolleta» contando los pormenores de compañías que existen o existieron y por donde el autor parece que pasó alguna vez en su vida. Eso sí, repleto de fechas, nombres de compañías y símbolos de dolar a mogollón para marearte con cifras y datos inútiles y que parezca que toda esa cháchara tiene algún sentido.

De todos los capítulos (tiene ocho) sólo dos podrían ser considerados «técnicos» uno es una discusión sin fin entre si tu empresa debe ser orientada a producto o a servicio (no te preocupes si no lo entiendes lo va a repetir durante todo el libro) y el otro acerca de la estrategia de éxito de Microsoft, el sincroniza y estabiliza, que no es más que hacer un prototipo y tratar de integrarlo y depurarlo después (tiene otro libro sobre el estilo de programación de Microsoft así que parece que debe seguir haciéndoles la bola).

El contenido

Lo dicho, el libro tiene unos 8 capítulos que va alternando en plan un capítulo de chau chau contando batallitas de cuando IBM era el rey, de cuando la compañía patatín tuvo problemas o de lo bien que lo hicieron los chicos de Microsoft. Dedica uno de los capítulos a contar la historia del negocio del software desde sus orígenes con la excusa de que ese ejercicio de historia nos permite tener una perspectiva para comprender el presente. Dicho ejercicio son nada más y nada menos que 40 páginas de la dichosa historia y como habrás averiguado, la utilidad es mínima. Eso si con él el libro es un poco más gordo y tiene un poquito más de paja.

Uno de los capítulos técnicos es sobre la discusión entre si una empresa software debe estar centrada en productos, hacer software en cajitas para vender, o centrada en servicios. Cada una de las orientaciones tiene sus pros y sus contras y esta parte creo que ha sido la única de utilidad de todo el libro. Las economías de escala en el software hacen que si consigues hacer un súper ventas seguir copiando y vendiendo CDs no cuesta nada. Sin embargo en vacas flacas si se interrumpen las ventas te quedas con el culo al aire. En cambio servicios puede conseguir enganchar a los clientes e incluso en vacas flacas puedes tener un flujo de caja asegurado, pero esta orientación no escala bien pues para ampliar el negocio necesitas más empleados, burocracia e instalaciones y los márgenes comienzan a ser decrecientes.

Y hasta aquí lo único que se puede sacar de provecho del libro. El resto del libro no es más que un refrito de material diverso como por ejemplo el capítulo de buenas prácticas. Coge cualquier libro de Ingeniería del Software haz un resumen y trúfalo de ejemplos, de vez en cuando comenta el sincroniza y estabiliza de Microsoft y lo molón que era y ya tienes otro capítulo del libro. Ya queda menos para conseguir las 300 páginas que seguramente tenía contratado el autor con la editorial. El libro finaliza con un par de capítulos uno inacabable de anécdotas de empresas y de cómo les fue en los últimos 10 años y otro sobre emprendedores software que al igual que el de ingeniería del software no es más que un refrito de algún libro de texto.

Conclusión

Queda claro que no me ha gustado un pelo el libro y no le recomiendo a nadie que se lea el tostón este. El libro no habla por ejemplo de cuestiones importantes al crear una empresa software como la selección de un precio para el software que se está vendiendo o por ejemplo cual es la estrategia para crecer de forma ordenada desde cero o cómo gestionar las carreras de la gente que compone la empresa.

Repasando lo que he escrito he pensado que tal vez el libro no iba dirigido a mi como audiencia y que la audiencia del libro este son los gerifaltes de grandes compañías de desarrollo software y que por eso he echado a faltar ciertos temas, pero si eso es así menudo bluf de libro. Todos los conceptos que expone se supone que ese tipo de gente los tiene que tener más que dominados si incluso yo los puedo comprender o intuir.

Resumiendo, kk de vaca.

22 diciembre 2006

Instalando JAGS para estimación Bayesiana.

Filed under: Estadística Bayesiana,Matemáticas — Toni Cebrián @ 12:03

Tabla de contenidos

Introducción y motivación
Instalación
Comprobando que todo está en orden y funciona
Ejemplo de uso

Introducción y motivación

Ultimamente he estado leyendo los trabajos de Radford M. Neal y de David J.C. MacKay acerca de las Redes Neuronales Bayesianas y de los Procesos Gaussianos y me ha picado la curiosidad sobre la estimación bayesiana. También han servido para avivar el gusanillo bayesiano el libro Scientific Reasoning: The Bayesian Approach que leí hace poco y el que pretendo leerme en breve Probability Theory: The Logic of Science.

Con todo me puse a investigar cómo podía ponerme a trastear con esto de la inferencia bayesiana en Linux y encontré el programita JAGS para inferencia bayesiana utilizando el método Monte Carlo utilizando Cadenas de Markov (MCCM). Con eso y con la amable ayuda de su autor, Martyn Plummer, he conseguido tener funcionando el invento. Espero que este sea el primer artículo donde vaya contando mis experiencias al respecto.

Instalación

Lo primero que tenemos que hacer es instalar en nuestra máquina Linux las librerías de desarrollo y los paquetes de los que depende JAGS. Para ello instalamos los siguientes paquetes:

$> su
Password:
$> urpmi gcc-gfortran
$> urpmi libblas1.1-devel
$> urpmi liblapack3-devel

descargarnos el software de su página web, JAGS. Nos descargamos la última versión que exista, en nuestro caso la 0.97.1. De nuevo como usuario sin privilegios de root descomprimimos el software, configuramos las dependencias, compilamos e instalamos JAGS.

$> tar xvfz JAGS-0.97.tar.gz
$> ./configure
$> make
$> su
Password:
$> make install

Comprobando que todo está en orden y funciona

Ya tenemos instalado JAGS y nos queremos poner manos a la obra. Aunque JAGS puede funcionar de forma autónoma nos será mucho más fácil utilizarlo dentro del paquete estadístico R así que nos lo instalamos también:

$> urpmi R-base

Para poder utilizar el paquete rjags es preciso que previamente estén instalados en el entorno de R los paquetes coda y lattice. La forma más cómoda es que estos paquetes se instalen como root de forma que estén disponibles para el resto de usuarios (que me perdonen los seguidores de la seguridad paranoica). Desde R aquellos paquetes que estén en algún repositorio de CRAN se instalan de forma muy fácil. Primero se selecciona el espejo de CRAN desde donde descargar los paquetes y después con el comando de instalar él sólo hará la instalación:

$> R
> chooseCRANmirror()
Selección: 45
> install.packages("coda")

En el cuadro anterior se han omitido los mensajes intermedios.

En este momento simplemente escribiendo el siguiente comando en el entorno R y comprobando que no se produce ningún mensaje de error tenemos el entorno configurado y listo para usar.

> library(rjags)

Ejemplo de uso

Para ilustrar su funcionamiento realizaremos un pequeño ejemplo. Mediante Perl implementamos un pequeño generador de números aleatorios binarios. El comando utilizado puede verse más abajo.

$> perl -e 'for($i=0;$i<1000;$i+=1){print int(rand()+.5);print "n"}' | grep 1 | wc -l

que nos genera un listado de unos y ceros generados teóricamente por una distribución de Bernoulli de parámetro p=0.5 que después utilizaremos para obtener el número de 1s obtenidos. Lo que pretendemos hacer en este ejemplo práctico es tratar de estimar p desde un punto de vista Bayesiano y poder sacar conclusiones sobre la calidad de la generación de números aleatorios con el procedimiento anterior.

Ejecutando la línea de Perl me sale un valor de 529 para el experimento (cada ejecución dará un valor distinto). Por tanto sólo nos queda crear el modelo con la syntaxis BUGS,

model
{
    phi ~ dunif(0,1);
    y ~ dbin(phi,N);
}

y crear un archivo con los datos necesarios para el problema.

datos <- list(y=529,N=1000)

Después únicamente nos queda arrancar R, cargar la libreria rjags y empezar a interrogar al modelo.

>library(rjags)
Loading required package: coda
Loading required package: lattice
loading JAGS modules
   basefunctions
   baserngs
   basesamplers
   bugs
> source("binario.dat")
> modelo <- jags.model("binario.bugs",datos)
Compiling model graph
   Resolving undeclared variables
   Allocating nodes
   Checking graph
   Graph Size: 5>  modelo$update(1000)
Updating 1000
---------------------------------------| 1000
**************************************** 100%
> x <- model.samples(modelo, variable.names=c("phi"),n.iter=1000)
Updating 1000
---------------------------------------| 1000
**************************************** 100%
> summary(x$phi)
       V1
 Min.   :0.4847
 1st Qu.:0.5172
 Median :0.5284
 Mean   :0.5285
 3rd Qu.:0.5400
 Max.   :0.5812

donde puede verse que el valor más probable está en torno a 0.52, para el parámetro p.

Sin embargo, en nuestra estimación hemos utilizado una distribución uniforme en el rango de posibles valores de p. Esto no es una hipótesis muy realista pues tenemos que pensar que los programadores que hicieron la función rand() de Perl, tienen los conocimientos de programación y estadística suficientes como para esperar que en la implementación que hicieran el valor de p no difiera mucho de 0.5. Podemos probar a cambiar la distribución inicial de p para que su densidad inicial sea una distribución Normal concentrada en torno a 0.5 y por ejemplo su desviación estándar, sigma, valga 0.05, lo que nos asegura que el 68% de la masa de la función de densidad estará en el intervalo [0.45,0,55].

Creamos el nuevo modelo especificando una distribución normal y teniendo en cuenta que el parámetro tau de la distribución normal se llama precisión y viene dado por 1/sqrt(sigma), donde sqrt es la función raíz cuadrada. Por tanto el nuevo modelo será:

model{
phi ~ dnorm(0.5,400) T(0,1);
y ~ dbin(phi,N);
}

Es importante para los cálculos de JAGS que se especifique que el valor de phi debe truncarse a un valor entre 0 y 1 para que pueda considerarse un valor legal como parámetro de la distribución binomial. Esto lo hemos hecho añadiendo detrás de la distribución el parámetro de truncamiento, T(0,1).

Como antes, seguimos el proceso de compilar, actualizar e interrogar al model y como paso final obtenemos una representación gráfica de los datos obtenidos como estimación del parámetro phi.

> m <- jags.model("binario-normal.bugs",datos)Compiling model graph
Resolving undeclared variables
Allocating nodes
Checking graph
Graph Size: 7> m$update(1000)
Updating 1000
---------------------------------------| 1000
**************************************** 100%
> x <- model.samples(m,variable.name=c("phi"),n.iter=1000)
Updating 1000
---------------------------------------| 1000
**************************************** 100%
> x <- model.samples(m,variable.name=c("phi"),n.iter=1000)
> xfig()
> densityplot(x$phi)
> dev.close()

Representación de el parámetro phi obtenido en las simulaciones.

4 diciembre 2006

Mathematical Problem Solving

Filed under: Libros,Matemáticas,Psicología matemática — Toni Cebrián @ 17:52

 

 

Mathematical Problem Solving Portada Mathematical Problem SolvingContraportada Mathematical Problem Solving


 

Tabla de contenidos

Introducción
El libro
El contenido
Conclusión

Introducción

La elección de este libro no es más que mi continuación de búsqueda de libros que me permitan poder estudiar con mayor facilidad matemáticas. Sigo buscando el libro perfecto de Psicología Matemática pero mientras lo encuentro en este tipo de libros voy encontrando pequeños diamantes que me permiten ir confeccionando una mini teoría de lo que debe ser la preparación psicológica para estudiar matemáticas con éxito.

El libro

El contenido del libro puede ser descrito como los experimentos que ha realizado el autor para tratar de dilucidar las estrategias de resolución de problemas matemáticos. Los sujetos que usa mayoritariamente han sido estudiantes de primeros cursos de ciencias matemáticas. El libro contiene multitud de problemas que proponía a alumnos suyos para su resolución pero que de alguna forma eran ligeramente diferentes a los que había visto en las clases. Mediante estos problemas y tras analizar los protocolos de resolución el autor justifica sus puntos de vista en cuanto a una teoría abstracta de resolución de problemas matemáticos.

El libro resulta interesante en cuanto a las conclusiones del autor sobre la resolución de los problemas, pero llega un momento en que resulta cargante el enésimo problema expuesto junto con la transcripción de los protocolos de resolución y su análisis posterior. No he llegado a leer el libro por completo pues los últimos capítulos ya me cansaban y solía pasar la parte central de los mismos sin leer hasta llegar a las conclusiones de cada uno de los capítulos.

El libro tiene un marcado carácter experimental y su audiencia ideal sería alguien que estuviera embarcado en el estudio de la resolución de problemas matemáticos. Sin embargo para alguien como yo que se acerca al libro para adquirir recetas y consejos se hace muy pesado pasar por todos los procedimientos experimentales y tratar de separar la paja de la chicha.

El contenido

El libro contiene una teoría descriptiva de los elementos que constituyen la infraestructura para un análisis de las habilidades necesarias en la resolución de problemas matemáticos. Este análisis se basa en 4 categorías de «herramientas»:

 

  • RecursosSon los conocimientos de que dispone el matemático. Aquí se incluye cualquier teorema que conozca, relaciones entre figuras geométricas, etc…
  • HeurísticasSon estrategias de resolución de problemas de carácter general. Son procedimientos que se aplican a familias de problemas más generales.
  • ControlLa ejecución de cualquier problema conlleva unas restricciones de tiempo y de capacidad de cálculo. Ser capaz de balancear correctamente cómo se asignan los recursos a la hora de resolver el problema permite tener un tasa de éxito más elevada en la resolución de problemas. Aquí los atributos básicos de un buen control es ser capaz de elicitar la información relevante y poder elegir los procedimientos con una mayor probabilidad de éxito.
  • Sistemas de creenciasAquí básicamente lo que se pretende es contrastar la actitud que presentan los sujetos hacia las matemáticas con respecto a los resultados en la resolución de problemas.

Conclusión

Sinceramente me cansé de leerlo y no lo terminé. Creo que el libro hace una buena clasificación de los elementos cognitivos que hacen que alguien sea un buen resolvedor de problemas matemáticos y me hubiera gustado que lo hubiera expuesto con más extensión en un plano teórico, pero la verdad es que me canse con tanta descripción de los experimentos y tanta transcripción de las conversaciones con sus estudiantes mientras éstos resolvían los problemas. El perfil del lector que creo que buscaba era el de un psicólogo que quiera hacer experimentación para dilucidar cuales son las características básicas de la resolución de problemas matemáticos pero a mi, que lo que me interesa ahora mismo es un manual de autoayuda matemática, lo que me ha parecido es que prometía mucho y lo mató el nivel de detalle.

29 noviembre 2006

Como eliminar los márgenes blancos al imprimir documentos PDF

Filed under: Computación,Edición — Toni Cebrián @ 8:43

Muchas veces me he encontrado con el problema de tener que imprimir un documento bastante extenso pero que sabía a ciencia cierta que su uso iba a ser efímero. Otras veces he querido imprimir un libro en el menor número de páginas posibles para hacerlo lo menos pesado posible. En todos estos casos la solución siempre pasa por imprimir más de una hoja por cara y utilizar impresión a doble cara. El problema aparece cuando estamos tratando de imprimir un PDF con unos márgenes bastante grandes que hacen que al imprimir varías páginas por cara la porción del papel que se dedica a texto sea tan pequeña que las fuentes utilizadas hacen prácticamente imposible una lectura cómoda.

Por tanto el objetivo de este post es enseñar cómo desde Linux se pueden transformar esos documentos de forma que se eliminen los márgenes y la impresión sea más amigable.

  1. Lo primero será convertir los PDF a PostScript. Este paso no tendría porqué ser así pero he observado que muchas veces esto hace que todo funciones como debiera. Si tu documento ya es PostScript, obviamente puedes saltarte este paso.
    Instálate el Ghostscript para la manipulación de PostScript. Incluye la aplicación pdf2ps que es la que utilizaremos para la conversión. En mi Mandriva y desde el usuario root:
    urpmi ghostscript-common
    Una vez instalado simplemente hacer la convesión
    pdf2ps mi_fichero.pdf
    Esto nos generará el fichero mi_fichero.ps que utilizaremos para la conversión.
  2. A continuación instalamos la aplicación psbind que tiene como curiosa descripción del paquete psbind – Transforma archivos PostScript para salvar árboles y reducir la culpa. Al igual que antes:
    urpmi psbind
    Si no disponemos del paquete podemos ir a la página del programa y descargarnos el paquete correspondiente a nuestra distribución.
  3. Ya sólo queda utilizar el comando con nuestro PS generado:
    psbind --tumble -2 --paper=a4 -P mi_impresora mi_fichero.ps
    Donde –tumble indica que las páginas queremos que las encuaderne por el margen corto, -2 indica que queremos dós páginas por cara (subir el número para imprimir manuales de referencia), -paper el tamaño del papel y por último la impresora a donde queremos enviar el archivo a imprimir.

Con eso, espero que seas capaz de imprimir eliminando los márgenes en el 90% de las veces. El otro 10% problemático viene motivado porque el psbind lo único que hace es analizar los PS utilizando como muestra las 10 primeras páginas (se le pueden especificar otras) y trata de deducir las dimensiones mínimas de una caja que sea el contorno del texto para todo el documento. Ocurre a veces que la conversión de PDF a PS no facilita que el programa sea capaz de delimitar dicha caja y que los márgenes queden como están, así que en el futuro espero modificar esta entrada con más trucos y reducir ese 10% de casos fallidos.

25 noviembre 2006

Para pensar mejor

Filed under: Libros,Matemáticas,Psicología matemática — Toni Cebrián @ 18:36

Para pensar mejor PortadaContraportada

Desarrollo de la creatividad a través de los procesos matemáticos


Tabla de contenidos

Introducción
El Libro
El contenido
Bloqueos y desbloqueos
Estrategias de pensamiento
Estrategias de pensamiento matemático
La actividad subconsciente
Conclusión

Introducción

Empeñado como estoy en seguir aprendiendo de la psicología de las matemáticas, aquí tengo otro libro que descubrí en un descanso de estudio en la biblioteca. El autor, Miguel de Guzmán, tenía otros títulos de divulgación matemática y parece tener una producción bastante extensa.

El Libro

En la contraportada se nos asegura que el libro es una propuesta para mejorar los procesos de pensamiento de cualquier persona mediante las recetas que en él se proponen. Aquí debo decir que a mi entender esto es una treta de mercadotecnia porque si bien el libro consta de lo que enuncia, lo hace desde un punto de vista puramente matemático. Si alguien quisiera trasladarlo a otras facetas del pensamiento, debería hacer la doble tarea de trabajar y comprender los procesos a nivel matemático, extraer los patrones comunes a todo proceso de pensamiento y luego trasladarlo a su campo particular.

Sin embargo como a nosotros lo que nos interesa es justamente la parte matemática de los procesos de pensamiento, estamos más que encantados.

El contenido

La estructura del libro está compuesta de una serie de pequeños capítulos con una breve (a veces brevísima) introducción teórica del concepto a desarrollar y una serie de ejercicios o juegos matemáticos que pretenden hacer ver el concepto en cuestión. Debo reconocer que no he hecho ni uno sólo de los problemas (cosa de la que no estoy orgulloso), pero es que siempre tengo otros libros apretando y muchos de los conceptos ya eran conocidos por mi y otros incluso los dominaba. Aún así el libro a mi entender es muy valioso como diccionario práctico de heurísticas. ¿Y qué quiere eso decir? Pues que si eres capaz de conocer y comprender todos los métodos que se presentan tendrás mucho adelantado en la resolución de problemas matemáticos.

Paso ahora a enumerar las partes más generales de que está formado el libro:

Bloqueos y desbloqueos

En esta parte el autor se encarga de repasar los distintos tipos de bloqueos (afectivos, cognitivos, culturales, …) que nos pueden impedir ser capaces de resolver problemas. Todos ellos, cada uno afectando a su área concreta, tienen en común que nos anclan de alguna forma a un espacio de soluciones subóptimas. Si por ejemplo, me desagrada el álgebra eso hace que no le dedique el pequeño esfuerzo extra que requeriría con los conocimientos que poseo para resolver el problema. Ese sería un bloqueo de tipo afectivo. Tener dificultades en la percepción y formulación del problema podrían ser bloqueos de tipo cognitivo, mientras que el tipo de bloqueos culturales podría venir dado si la «comunidad» matemática a la que pertenecemos considera que cierto problema no se presta a tal o cual estrategia de resolución, lo que nos haría no abordarlo «porque otros así lo han dicho».

En todos los casos, la estrategia para superarlos es embarcarse en tareas de «salir del pozo», esto es tratar de salir del mínimo local en el espacio de estrategias de resolución de problemas en el que hemos caído. Así, el autor propone, hacer sesiones de lluvia de ideas, abordar el problema desde otro punto de vista, etc….

Estrategias de pensamiento

Esta tal vez sea la parte más genérica y la que más fácilmente sea trasladable a otros ámbitos no matemáticos. En ella se sitúa al proceso de pensamiento como un objeto mental que debe ser analizado, evaluado y modificado si es necesario. Claramente se adscribe a la máxima de si no se puede medir, no se puede cambiar. Me recuerda también al PSP (Personal Software Proccess) en informática, un proceso dirigido a medir todas las fases del desarrollo software para identificar aquellas prácticas que están haciendo que programes de una manera ineficiente.

Básicamente se centra en la especificación de cómo recoger por escrito el protocolo utilizado en la resolución de problemas. Cada cierto tiempo y en función de unas marcas temporales, se pide que escribas qué estás haciendo, cuáles son tus pensamientos, tu actitud hacia el problema, …. etc. Este volcado no ha de ser filtrado por ningún pensamiento ni se debe estilizar, se debe volcar todo lo que estés pensando en ese momento. Una vez que has resuelto (o no) el problema, comienza una fase de análisis en la que se trata de identificar aquellas lagunas en tu conocimiento, aquellas salidas en falso, todo aquello que sea susceptible de ser mejorado y corregido. El objetivo es no estar viciado por procedimientos que bajo una atenta mirada crítica son claramente ineficientes.

Estrategias de pensamiento matemático

Esta parte sería la especialización de la parte anterior. Aquí nos estamos enfrentando ya específicamente a problemas matemáticos. Si la sección anterior podíamos denominarla como la exposición de las meta heurísticas que deben guiar cualquier proceso de pensamiento, en esta parte lo que se va a introducir es un compendio de heurísticas matemáticas que resultan útiles en la resolución de problemas.

Esta parte por ser una descripción de heurísticas casi que lo mejor es exponerlas y comentarlas brevemente:

  • Lo primero es familiarizarse con el problema, conocer los símbolos que lo definen, visualizar la meta que nos piden, ver cómo podemos manipular el problema, las acciones que realizamos sobre él cómo transforman el problema, etc…
  • Comenzar a explorar el espacio de estrategias de resolución, realmente consiste en comenzar a manipular el problema y ver si se ajusta a alguna estrategia bien conocida, hay alguna regularidad con respecto a los enteros, presentan los símbolos algún patrón cuando vamos buscando la solución, etc…

    • Comenzar a explorar con una versión reducida del problema. Un problema más reducido y que te permita tener bajo control todos los símbolos del problema hace que puedas ver cuál es el patrón común de comportamiento sin perderte en los detalles de mero cálculo mecánico.
    • Experimenta con el problema. Al jugar con el problema puede que se pongan en marcha otro tipo de inteligencias al servicio de la resolución. Por ejemplo, la inteligencia visual podría sugerir una solución en un problema geométrico. Esta solución no tiene por qué ser correcta pero da un punto de partida para trabajar.
    • Crear figuras, diagramas. Esto ayuda en la resolución del problema pues se pueden intuir soluciones echando mano de la inteligencia espacial y visual.
    • Escoger un lenguaje adecuado. Gran parte del trabajo matemático es la reorganización de símbolos para el «descubrimiento» de nuevos teoremas y proposiciones. Un buen lenguaje que tenga la granularidad adecuada al problema que estamos tratando permite que no tengamos que dedicar recursos innecesarios a la sobremanipulación de símbolos. Por poner un ejemplo, sumar 77+11 es inmediato en notación decimal, pero ya no lo es al utilizar notación binaria 1001101 + 1011 pues cuanto menos hay que acarrear bits en las sumas intermedias.
    • Buscar un problema semejante. Si reconocemos los patrones de funcionamiento en el otro problema podremos trasladarlo al que nos ocupa. Algún día me gustaría saber suficiente de Teoría de las categorías para ser capaz de hacer esto automáticamente.
    • Mediante la inducción lo que se trata es de hacer claro un patrón que es función de una sucesión de números naturales. Si es verdad en n y lo es en n+1 podemos extraer la regla general pues siempre será cierto.
    • Suponer que no o reducción al absurdo. Consiste en comenzar a desarrollar el problema suponiendo que la solución es incorrecta hasta llegar al punto en que se llega a algún tipo de contradicción.
  • Una vez familiarizado con el problema y evaluadas las posibles estrategias de actuación llega el momento de llevarlas a cabo. Es importante que la realización de la resolución de un problema se acometa hasta el final (y el final puede no incluir la resolución) ya que para poder manipular el proceso como un objeto sujeto a mejora, dicho proceso debe haberse producido y registrado para su posterior mejora.

La actividad subconsciente

Esta parte puede que sea de las más interesantes del libro pero a la vez de las más breves e imprecisas. Comienza enumerando situaciones y sucesos de grandes pensadores matemáticos en los que la intuición o una iluminación repentina les sirvió de base para el descubrimiento de alguna verdad o proposición matemática. A continuación sigue un ejercicio especulativo de por qué puede que se den este tipo de descubrimientos «inconscientes». Básicamente se argumenta que nuestra mente cuando no está bajo la supervisión de la conciencia, meditando, fantaseando o en sueños, se dedica a jugar desbocadamente con los conceptos que tiene en mente, y que de uno de estos juegos puede emerger una solución o posible pista que luego habrá que elaborar y mejorar.

Queda sin embargo demasiado abierta la parte en la que trata de sacar consecuencias prácticas a todo este trabajo subconsciente.

Conclusión

Han pasado un par de semanas desde que leí el libro y el recuerdo que me queda es el de un libro interesante y cuyo contenido es un catálogo de heurísticas matemáticas. Aunque en algunos momentos trata de salirse de este tema y darle un matiz más genérico la verdad es que realmente es un libro de mates. Por tanto aunque no te ayudará a pensar mejor si que te ayudará a pensar mejor matemáticamente y es por ello que recomiendo el libro a todo aquel interesado en el tema.

Página siguiente »

Blog de WordPress.com.