david y goliat

He terminado de leer David y Goliat, de Malcolm Gladwell. Soy un gran seguidor de este autor, he leido todos sus libros con excepción de algunos capítulos de ‘Lo que el perro vió’, pero esta vez he terminado la lectura del libro un tanto decepcionado. El libro tiene un buen punto de partida, que es exponer cómo una deficiencia aparente puede ser una ventaja en determinadas situaciones, pero creo que le falta consistencia a la hora de exponer un argumentario común al libro. Quizá la culpa sea que sus anteriores libros me gustaron mucho, y en ellos si que me convenció de sus teorías. En ellos sí había un nexo o guión común a todas las situaciones que se exponían, pero en este último libro Gladwell no consigue, desde mi punto de vista, plantear una teoría o un punto de vista claro sobre las situaciones de desventaja. Leer a Gladwell es abrir las puertas a pensamientos o formas de pensar totalmente distintos a los habituales, y pese a que este libro no sea uno de los mejores que ha escrito sigue siendo uno de mis escritores favoritos de no ficción. Me encanta leer las argumentaciones que realiza y la manera en que las documenta con hechos y estudios la mayoría de veces desconocidos para mi.

El libro tiene pasajes realmente buenos, como acostubra el autor, como por ejemplo cuando de la influencia de la elección de la universidad en los resultados académicos de los estudiantes. En este capítulo presenta el test de reflexión cognitiva. Este test sirve para medir la capacidad de atención que una persona es capaz de prestar para resolver tres sencillas preguntas y alterando las condiciones del test a peor, escritas en letra más pequeña o con menor intensidad, los resultados son paradojicamente mejores.

Y sobre todo, me ha encantado su planteamiento sobre qué consiste la legitimidad de los gobernantes, que es textualmente la siguiente:

Cuando las personas con autoridad quieren que el resto nos comportemos, importa, primero y por encima de todo, cómo se comportan ellas. A esto se le denomina el ‘principio de legitimidad’, y la legitimidad se fundamenta en tres cosas. La primera de todas: las personas que han de obedecer a la autoridad tienen que sentir que tienen voz, que si dan a conocer su opinión serán escuchadas. En segundo lugar, la ley ha de ser predecible. Tiene que haber expectativas razonables que las reglas de mañana sean aproximadamente las mismas que las de hoy. Y, en tercer lugar, la autoridad ha de ser justa. No se puede tratar a un grupo de manera diferente que a otro.

Una explicación más completa sobre el principio de legitimidad, con extractos sacados del libro la puedes leer en esta crítica del libro.

Como conclusión, desde mi punto de vista se trata de un libro un tanto menor de Malcolm Gladwell. Si no has leido nada de este autor, te recomiendo leer ‘El momento clave’ o ‘Fueras de serie’ antes que ‘David y Goliat’.

cómo hacer copias de seguridad de mis programas

Una de las consultas recurrentes que recibo por correo electrónico es cómo hacer copias de seguridad de los programas. La manera más sencilla para hacer copias de seguridad de los programas consiste en copiar la carpeta completa del programa a un disco externo USB – un pendrive o disco duro. Todos mis programas almacenan todos sus archivos dentro de la carpeta raíz de la instalación, por lo que al copiar la carpeta raíz y sus subcarpetas estamos realizando una copia completa de todos los datos almacenados así como del propio ejecutable y demás ficheros necesarios para ejecutar el programa. Las carpetas raiz de los programas, si no se ha modificado la ruta de instalación, son las siguientes:

  • Cuaderno de Bitácora: c:\bitacora
  • el Puchero: c:\puchero
  • Findemes: c:\findemes
  • Azeta: c:\azeta
  • Colossus: c:\colossus

Muchas de las veces el problema está en un cambio de ordenador o en la manera de trasladar un programa de un ordenador a otro. Para ello, la manera más sencilla es hacer una copia de seguridad completa del programa, y desde el disco externo proceder a copiar la carpeta en la misma ruta en el ordenador nuevo.

Para hacer copias de seguridad utilizo desde hace mucho tiempo el programa SyncBackup de 2BrightSparks que cuenta con una edición gratuita. Aunque la web está en inglés, el programa se puede instalar en castellano y es muy sencillo de configurar. Se pueden crear perfiles de backup, por ejemplo uno para cada programa, de manera muy sencilla a través de un asistente que te va guiando para configurar el perfil. Yo suelo utilizar la opción ‘Espejo’, de manera que lo que tengo en el disco duro se copia al disco USB y si en el USB queda algún archivo este se borra si no está en el origen. El perfil queda de la siguiente manera:

Perfil de SyncBackup para copia espejo.
Perfil de SyncBackup para copia espejo.

Además de perfiles individuales, SyncBackup permite crear grupos de perfiles de manera que ejecutando un perfil de grupo se realiza la copia de seguridad de varios perfiles de manera simultanea. Para mi este programa es uno de mis imprescindibles.

an introduction to interactive programming in Python

El pasado mes de Octubre comencé el curso An Introduction to Interactive Programming in Python que la Universidad de Rice ofrece a través de Coursera. El curso es una introducción a la programación con Python basada en el desarrollo de juegos sencillos. De las 9 semanas que dura el curso conseguí llegar hasta la semana 7, y tuve que abandonar en ese punto el curso por falta de tiempo.

Como valoración global el curso me ha encantado. No soy un novato programando, pero mis conocimientos de Python eran muy superficiales. Con este curso los he mejorado, y sobre todo me he divertido. Hacía años que no disfrutaba tanto con un curso de programación, y esto ha sido posible gracias al enfoque del curso, que consiste en módulos semanales donde se explica lo necesario para que el alumno pueda realizar un pequeño proyecto de programación. De esta manera se consigue una alta motivación pues el alumno va viendo sus progresos semanalmente. Los proyectos son programas de dificultad baja o media, que se pueden completar con menos de 200 lineas de código, y que están detallados con procedimientos paso a paso que minimizan las dificultades de realización de los mismos. El único inconveniente es el idioma, a veces me costó entender qué tenía que hacer pero más por dificultades con el inglés que por la complejidad de la tarea a realizar.

Para el desarrollo del curso se utiliza la herramienta CodeSkulptor, que es un intérprete Python que se ejecuta en una ventana de navegador web, con lo que el alumno no tiene que instalar nada en su PC para seguir el curso. Además se utiliza un modulo llamado SimpleGUI que se ejecuta internamente en CodeSkulptor y que ofrece la posibilidad de realizar aplicaciones interactivas de manera sencilla. Este módulo es sencillo pero las posibilidades que ofrece para desarrollar aplicaciones gráficas sencillas son enormes.

Como dije antes, el curso está organizado por bloques semanales, cada uno con una serie de videos explicativos, ejercicios y un miniproyecto que se debe entregar puntualmente. El contenido de las 7 primeras semanas del curso fue el siguiente:

  1. Comentarios, literales, expresiones aritméticas, operadores, variables. Miniproyecto: ‘Queremos un shrubbery!’
  2. Funciones, indentación, expresiones aritméticas, módulos, expresiones y operadores lógicos, instrucciones condicionales. Miniproyecto: ‘Piedra, papel, tijera, lagarto, spock’.
  3. Programación dirigida por eventos, variables locales y globales, SimpleGUI, botones, campos de entrada. Miniproyecto: ‘Adivina el número’.
  4. Canvas y dibujo, operaciones con cadenas, dibujo de texto, timers. Miniproyecto: ‘Parar el cronómetro’.
  5. Listas, puntos y vectores, distancias, colisiones y reflexiones, eventos de teclado, control de posición, control de velocidad, datos mutables e inmutables. Miniproyecto: ‘Pong’.
  6. Eventos de ratón, métodos de listas, iteración, diccionarios, carga y dibujo de imágenes. Miniproyecto: ‘Memory’.
  7. Objetos y clases, trabajar con objetos, imágenes troceadas. Miniproyecto: ‘Blackjack’.

De las dos últimas semanas, lo único que se es que el juego a desarrollar era una versión simplificada del juego clásico de asteroides, y me dio mucha pena abandonar el curso en ese punto.

Para poder hacer los proyectos en mi PC sin tener que usar CodeSkulptor me instalé, aparte del intérprete de Python, las librerías PyGame y SimpleGUICS2PyGame. Esta última es una implementación de la versión de SimpleGUI que usa CodeSkulptor en local. Algunos de los programas que he realizado son los siguientes:

  • Parar el cronómetro, hecho con 83 lineas de código.
  • Pong, hecho con 138 lineas de código.
  • Memory, hecho con 82 lineas de código.
  • Blackjack, hecho con 220 lineas de código.

Mi recomendación del curso es total, tanto para programadores que quieran comenzar con Python como para novatos en la disciplina. El curso está muy bien desarrollado, mantiene la motivación del alumno y permite aprender los fundamentos del lenguaje de una manera muy divertida. El curso te deja con ganas de aprender más sobre Python y de usar lo aprendido para hacerte tus propios programas, como este ahorcado que he hecho con 78 lineas de código. Python es un lenguaje impresionante.

los tres hábitos que cambiarán mi vida

Desde hace tiempo estoy interesado en el minimalismo como corriente de desarrollo personal. El minimalismo propugna desprenderse paulatinamente de aquello que consideramos accesorio o superfluo en nuestras vidas para centrarnos únicamente en los aspectos esenciales de la misma. He ido interesándome por el tema en la medida en que pienso que los valores que aporta son beneficiosos para lograr un equilibrio y un crecimiento personal.

Uno de los blogs más activos en la difusión de esta corriente existencial en castellano es Homo Minimus. Además de haber traducido a castellano algunos de los libros de Leo Babauta, uno de los gurús de este movimiento, la web tiene muchísimo material propio que merece la pena leer.

A principio de este año 2014, Homo Minimus ha lanzado el proyecto de transformación anunciado en el post Los tres hábitos que cambiarán tu vida. Como suscriptor del blog he descargado el libro y me parece un reto en el que merece la pena embarcarse. Así que hago pública mi participación en el mismo, y animo a cualquier persona interesada en su propio desarrollo personal a involucrarse en el mismo. Nos vemos en el blog de Homo Minumus.

cómo gestionar ejercicios contables con findemes

Findemes permite gestionar los apuntes mediante ejercicios que corresponden normalmente con años naturales, pero también pueden corresponder con periodos escolares, periodos particulares de asociaciones, etc. Todos los apuntes y datos que se almacenen en el programa se guardan en el ejercicio actual, que aparece reflejado en la barra de título del programa.

findemes: indicación del ejercicio actual
findemes: indicación del ejercicio actual

Por defecto, findemes lleva un ejercicio creado, actualmente el 2013, pero podemos querer crear más ejercicios. Para ello entramos en el mantenimiento de ejercicios y seleccionamos la opción Nuevo ejercicio. El programa muestra el siguiente formulario:

findemes: alta de un nuevo ejercicio - 1
findemes: alta de un nuevo ejercicio - 1

Introduciremos el ejercicio en cuestión – limitado a 4 caractéres – y a continuación pulsaremos Crear carpetas. De esta manera el programa crear las carpetas donde almacenará los ficheros del ejercicio. Si se crea un ejercicio sin sus carpetas, el programa no encontrará los ficheros del ejercicio y se producirá un error. Si se desea elegir unas carpetas distintas a las que crea el programa por defecto, podemos pulsar el botón al lado de la ruta de cada carpeta para elegir una nueva. Una vez que tenemos las rutas de las distintas carpetas seleccionaremos el ejercicio del que deseamos incorporar datos y pulsamos Aceptar. Al elegir la opción de incorporar datos de un ejercicio anterior Findemes incorporará los datos de tipos de ingreso, pagadores/clientes, tipos de gasto, perceptores/proveedores y cuentas corrientes de ese ejercicio al nuevo. Con esto homogeneizamos la información introducida en el programa y nos ahorramos un buen rato de teclear.

findemes: alta de un nuevo ejercicio - 2
findemes: alta de un nuevo ejercicio - 2

Una vez creado el ejercicio debemos definir los tipos de IVA y de recargo de equivalencia existentes en el mismo, pues al crear el ejercicio este no tiene definido ningún tipo de IVA ni de recargo de equivalencia. Para ello primero debemos seleccionar el ejercicio y a continuación pulsar en la opción Tipos de IVA y Tipos de recargo equivalencia, con lo que findemes muestra el siguiente formulario:

findemes: tipos de IVA del ejercicio
findemes: tipos de IVA del ejercicio

Pulsando el botón Nuevo podremos incorporar un tipo de IVA al ejercicio e indicar si está vigente o no.

findemes: alta de un nuevo tipo de IVA
findemes: alta de un nuevo tipo de IVA

De esta manera, tras introducir los tipos de IVA y de Recargo de equivalencia de acuerdo a nuestra actividad ya tenemos configurado el ejercicio para trabajar con él. Para cambiar de ejercicio hay que entrar en la gestión de ejercicio y seleccionarlo a través de la opción Seleccionar ejercicio.

findemes: selección del ejercicio actual
findemes: selección del ejercicio actual

nuevas web

En las últimas semanas he estado preparando dos sitios web. Uno es para la peluquería de mi esposa, http://www.azabachenovelda.com, y el otro para el AMPA del Conservatorio de Danza de Novelda, http://www.dansa.es.

2013-11-27_180015

Los dos sitios web están hechos con WordPress y los dos usan el tema twenty thirteen, que me parece realmente estupendo. El motivo para elegir este tema para los dos sitios es debido a que soporta diseño adaptativo, y esto es muy importante hoy en día. Esto lo aprendí después de traducir y personalizar un tema gratuito con multiples características como portada deslizante, portfolio, etc. y tras probar la web con un smartphone el resultado fue un fiasco total. Más vale fácil y sencillo que rebuscado y complejo.

Para la web dansa.es estoy utilizando el plugin JetPack de WordPress que proporciona entre otras cosas estadísticas para la web, suscripción a post via emial y otras funcionalidades.

mejoras en el motor de informes de los programas

Hemos modificado el motor de informes de los programas de alanit para incorporar la funcionalidad de guardar la configuración completa de campos, encabezados, tipos de letra y fichero PDF para cada uno de los posibles listados a generar. Esto supone una gran mejora para los programas, dado que es posible personalizar completamente cada uno de los listados y el programa guarda toda información del mismo. De esta manera cada vez que seleccionemos un listado distinto tengamos guardada toda su configuración. Vamos a ver en que consiste esta mejora con un ejemplo.

La gestión de libros de Cuaderno de Bitácora muestra el siguiente panel de informes:

Podemos elegir todos estos informes. Una vez elegido el informe pasamos a personalizar los campos, el encabezado y los tipos de letra a utilizar, y el nombre del fichero PDF a generar. Supongamos que el listado completo de libros lo personalizamos de esta manera:

Generamos el listado y vemos que está de acuerdo a lo que queríamos obtener.

A continuación vamos a preparar el listado de libros prestados, personalizándolo para que nos muestre la información del libro y del préstamo. Seleccionamos el nuevo tipo de listado:

Y seleccionamos los campos que queremos. Ahora para este listado nos interesa incluir los datos del préstamo, como fecha del préstamo y persona a la que lo prestamos el libro.

Y de nuevo generamos el listado para asegurarnos que es el listado que deseamos.

A partir de este momento, cada vez que seleccionemos el listado completo de libros o el listado de libros prestados el programa se encarga de recuperar la personalización que hemos hecho de cada uno de los listados con sus campos, encabezados y demás.

Esta mejora del motor de informes va a estar en breve disponible en todos nuestros programas, en actualizaciones que publicaremos de los mismos en los próximos días.

findemes 2.50

Se encuentra disponible para descarga la versión 2.5 de Findemes. En esta versión se ha actualizado el interfaz con nuevos iconos y estilo Windows 7, he corregido todos los errores conocidos del programa, y además el programa presenta las siguientes novedades:

  • Exportación a formato Excel desde las rejillas de datos, aun sin Excel instalado.
  • Nuevo balance anual separado por trimestres
  • Selección de actividad en los gráficos de ingresos y gastos

La actualización a esta versión es gratuita para todos los usuarios registrados con posterioridad a Enero de 2012.

exportando datos a excel

Uno de los pequeños detalles que me faltaban en la actualización de Findemes en la que estoy trabajando era el tema de la exportación de datos a Excel. Es muy útil que cualquier programa permita la exportación de datos para que se puedan tratar en una hoja de cálculo, pero en el caso de un programa de contabilidad personal este aspecto toma mayor relevancia.

2013-04-23_160200

La manera más sencilla de exportar los datos de un xbrowse de FWH a Excel es usar el método toExcel() de la clase, sin embargo esta manera de realizar la exportación presenta algunos problemas. El primero es que la exportación se hace a través del propio Excel, o sea que el usuario tiene que tener Excel instalado, supuesto que no siempre se cumple. El segundo es no he conseguido que la exportación de datos numéricos se realice correctamente. Al pasar un número con formato 999.999,99 a Excel se transforma en 999999.99 con lo cual no se puede operar correctamente con él en la versión en español del programa. El porqué de este cambio escapa a mis conocimientos, pero creo que es debido a los cambios de formato que se utilizan internamente en la clase para la exportación.

2013-04-23_160142

Ante estos problemas recordé haber leído un post en el foro de FWH donde Rafa TheFull había publicado una manera diferente de realizar la exportación. En el post Rafa, que se puede leer en http://forums.fivetechsupport.com/viewtopic.php?f=6&t=19897, habla de los problemas para generar el fichero XLS a través del propio Excel y que no existe la seguridad de que esta manera de realizar la exportación funcione en todas las instalaciones. Ante esto, Rafa propone utilizar la clase XlsFile de Ramón Avendaño, un programador que en su día realizó muchas contribuciones a FWH. El método usado por esta clase consiste en crear un fichero desde cero, escribiendo todos los caracteres necesarios para crear un fichero en formato XLS puro, sin pasar por Excel. El fichero generado se puede abrir con Excel o LibreOffice.

2013-04-23_160417

Al comenzar a utilizar la función de Rafa, me encontré con el problema de la exportación de las columnas en que se muestra una imagen. La manera que he encontrado de de solucionarlo es usar la variable cargo que existe en todas las clases para asignar el valor que se va a mostrar en la exportación y luego comprobar que cuando el tipo de la columna sea de tipo definido por el usuario mostrar la variable cargo. Algo así:

elseif Valtype( cText ) == "U"
@ nFila, nCol XLS SAY oBrw:aCols[x]:Cargo OF oXls

Con esto consigo una exportación más completa que usando el método de la clase, que se realiza independientemente de los programas que tenga instalado el usuario y que se puede abrir con varios editores de hojas de cálculo.

colores en xbrowse

En la actualización de Findemes que estoy preparando he cambiado el aspecto del programa para dotarlo del look de Windows 7 y uno de los cambios introducidos es poner el pintado de las rejillas de datos con el degradado de Windows 7. Como en Findemes las lineas de apunte se pintan de distinto color en función de si son ingresos o gastos para hacer el pintado correctamente hay que modificar el método oBrw:bClrStd de la siguiente manera:


oApp():oGrid:bClrStd := {|| { iif( AP->ApTipo == "I", oApp():cClrIng, oApp():cClrGas ), CLR_WHITE } }

El resultado es el siguiente:

fdm_browse1

Sin embargo hay un problema: el pintado de los colores de ingreso y gasto es correcto en todas las lineas excepto en la linea seleccionada. En esta linea el texto sigue apareciendo en el color por defecto de browse que es el negro. Para que el efecto sea completo hay que modificar el método oBrw:bClrSelFocus de la siguiente manera:


oApp():oGrid:bClrSelFocus := { || { iif( AP->ApTipo == "I", oApp():cClrIng, oApp():cClrGas ),;
{ { 1, RGB( 220, 235, 252 ), RGB( 193, 219, 252 ) } } } }

Ahora el pintado ya es el deseado.

fdm_browse2