alanit naming contest

Estoy trabajando en el programa que será el sustituto de Hemerot. La nueva versión del programa pretende ser un gestor personal de documentos, que sirva tanto para organizar una hemeroteca como para saber donde guardas todos los documentos que bajas de internet o que generas tu mismo. En un post anterior ya puse unas pantallas del programa pero pasaron desapercibidas.

Para cada documento se guarda su título, un código, la materia, el tipo de documento, idioma, publicación número de páginas, autores, palabras clave, ubicación, fichero o sitio web, y un resumen. Tiene tablas auxiliares de materias, autores, publicaciones, palabras clave, tipos de documentos y ubicaciones. De todo esto se puede ver que documentos hay. Además tiene generador de listados, asistente de búsquedas y muchas cosas más.

El caso es que he decidido que el programa tenga un nuevo nombre y es lo que ahora mismo me hace falta. Antes de tomar una decisión me gustaría recibir propuestas de nombres para el programa, por lo que lanzo un concurso de nombres. Los lectores que querais proponer un nombre dejar un comentario. Entre todas las propuestas seleccionaremos una a votación en un próximo post y el ganador recibirá … un paquete de licencias de todos los programas de alanit, y una recomendación mia para trabajar con los HundredMonkeys.

Como ya estoy enviando betas a un grupo cerrado de probadores, los betatesters podeis participar, pero no podeis publicar mi propuesta.

Quiero dejar claro que el resultado no es vinculante, yo tengo un nombre en la cabeza y al final decidiré entre mi propuesta y la propuesta ganadora del certamen.

windbu vs dbfdesktop

Desde hace un montón de tiempo he manejado mis archivos dbf con WinDbu. Es la herramienta ideal para el programador xbase, ya que practicamente emula todos los comandos xbase desde el programa y cuenta con un montón de herramientas y opciones añadidas que facilitan la tarea de programar.

El problema es que Windbu sigue siendo una aplicación a 16 bits hecha con Clipper y con un look muy de Windows95. Ignacio Ortiz, su autor, está muy volcado con Xailer y quiza ese sea el motivo de que no haya una versión a 32 bits.

Hace un par de meses me puse a buscar alternativas a WinDbu. Entre las varias opciones que encontré me gustó especialmente DbfDesktop de SenderoSoftware. Aunque tiene lagunas, me gustó mucho su interfaz y su imagen, mucho más vistosa que WinDbu. También juega a su favor su precio, 39$ frente a 80€ de Windbu, aunque tengo que reconocer que WinDbu hace más cosas que DbfDesktop.

De momento los dos comparten mi disco duro, pero la verdad es que poco a poco cada vez uso más DbfDesktop.

altas de claves ajenas

Una de las nuevas funcionalidades que estamos implementando de cara a las nuevas versiones de los programas que queremos tener listas a vuelta de verano es el alta de claves ajenas. Al introducir un valor que es clave ajena de una tabla, si el valor no existe en la tabla se va a poder introducir en ese momento.

Por ejemplo, en este diálogo introduzco una temática en el artículo que no está dada de alta en la tabla de temáticas:

El programa detecta que la clave no existe y avisa

y permite introducirla en ese momento

Aunque parezca una tontería, de esta manera se hace mucho más sencillo introducir grandes volúmenes de datos en los programas, porque no pierdes el hilo de lo que estás haciendo. Si estás dando de alta una artículo no tienes que ponerte a pensar en dar de alta antes la temática sino que se hace sobre la marcha.

cambios en el interfaz

Hasta ahora en los formularios de edición de los programas, cuando un campo podía ser rellenado en base a una tabla auxiliar en la parte derecha del campo aparecía una imagen que al pincharla permitía abrir un formulario de selección sobre la tabla auxiliar. La manera de hacer esto está explicado en un post de mi anterior blog. Un formulario típico podía ser este:

En las nuevas versiones de los programas, las imágenes a la derecha de los Get desaparecen y son sustituidas por botones, de esta manera:

El motivo del cambio es quitarnos de en medio tanto gráfico como usamos ahora para tener una interfaz menos recargada, poder recorrer todo el formulario con el teclado, incluyendo la selección de tablas auxiliares, y poder tener dos botones al lado de un campo para permitir seleccionar y lanzar un archivo, cosa que necesito para la nueva versión de Hemerot que estoy preparando y al que corresponde la imagen.

crisis, pero no tanto

Quizá en un post anterior pareciese que iba a dejar de desarrollar shareware, olvidarme de Windows, migrar a Linux y a volar. No es exactamente eso lo que llevo en la cabeza. Después de mucho trabajo, mio y de Jaime, creo que los programas y la web de alanit están a un nivel bueno y hay que perseverar en el tema de marketing y distribución. Después de mucho darle vueltas, de hablar con Jaime y de plantear el tema en el foro de el negocio del software hemos sacado varias cosas claras:

  • Seguir adelante con la venta de shareware
  • Seguir un modelo de negocio basado en ofrecer una versión lite gratuita y una versión de pago con más funcionalidad.
  • Intentar establecer relaciones con sitiios de cocina para que promocionen el Puchero, que es el que tiene un público más objetivo.

El cambio sobre lo que estamos haciendo ahova va a consistir en dejar de ofrecer una versión de evaluación para ofrecer una versión gratuita. La versión de evaluación es similar a la registrada, sólo que limitada en los registros a introducir. El problema es que nos está resultando difícil conseguir aparecer en revistas sobre software debido a que prefieren versiones freeware, aunque sean menos potentes que las versiones de evaluación. Lo que vende es el título programa completo o programa gratis.

Las versiones de pago van a seguir siendo las mismas que ahora, y estamos en la fase de decidir que vamos a recortar de las versiones gratuitas, para que queden programas funcionales pero que les falte ese algo que incite al registro de la versión de pago.

crisis y revolución

Desde hace un par de semanas llevo dándole vueltas al tema de cambiar por completo de entorno de desarrollo.

La idea de dar el salto es debida a un cambio de la asignatura en la Universidad. El año que viene daré prácticas de una asignatura que exige uso de C y de plataforma Linux. Después de hablar con los gurús del departamento, me he decidido a instalarme ubuntu en mi PCl y sinceramente creo que ha sido una buena decisión. Gracias a la guia ubuntu y a la Guia Hoary Hedgehog he comenzado a manejarme con el sistema sin mucho apuro.

Una vez decidido comenzar a dar el salto a Linux he empezado a preguntar sobre posibles entornos de desarrollo en esta plataforma y al final he decidido que voy a aprender a programar con mono. Aprovecharé que tengo que volver a programar con C para aprender C# y comenzar a usar un lenguaje de programación moderno con todas las herramientas de última generación. A ver que tal va. Ya iré contando.

El motivo de dar el salto de xHarbour+FWH a mono no es debido a ninguna carencia de los primeros. Tengo que empezar a usar Linux de forma habitual y me atrae mucho toda la parafernalia de los build diarios, pruebas de integración y demás, así que voy a investigar todo eso.

montar un tree desde una DBF con FWH

En el Puchero se usa una clasificación arborescente denominada clasificación francesa y para jugar con ella la monto en un tree. Como he recibido varios correos preguntando la manera de montar el tree desde la dbf, aqui lo explico un poco.

Lo primero es montar una estructura de datos que permita ser representando en forma de arbol. Un arbol no es más que una jerarquía con varios niveles, y lo que tengo en mi dbf son varios campos -hasta 5 – para indicar en que rama del arbol estoy. Los campos se llaman FrN1, FrN2, FrN3, FrN4 y Frn5 de manera que el arbol lo veo así:

(1,0,0,0,0)
···(1,1,0,0,0)
······(1,1,1,0,0)
······(1,1,2,0,0)
···(1,2,0,0,0)

Una vez esto claro el arbol se monta así:

FUNCTION FrTreeLoad( oTree )
LOCAL oDatabase
LOCAL nStep
LOCAL oLink
LOCAL oLink1, oLink2, oLink3, oLink4, oLink5
LOCAL N1	:= 0
LOCAL N2	:= 0
LOCAL N3	:= 0
LOCAL N4	:= 0
oLink := oTree:GetRoot()
SELECT FR
FR->(DbGoTop())
DO WHILE ! FR->(EOF())
···IF FR->FrN2 == 0
······oLink1 := oLink:AddLastChild(FR->FrTipo,IIF(FR->FrHoja,1,2),IIF(FR->FrHoja,1,2),.t.)
······oLink1:Cargo := Str(FR->Frn1,2)+Str(FR->Frn2,2)+Str(FR->Frn3,2)+Str(FR->Frn4,2)+Str(FR->Frn5,2)
···ELSEIF FR->FrN3 == 0
······oLink2 := olink1:AddLastChild(FR->FrTipo,IIF(FR->FrHoja,1,2),IIF(FR->FrHoja,1,2),.t.)
······oLink2:Cargo := Str(FR->Frn1,2)+Str(FR->Frn2,2)+Str(FR->Frn3,2)+Str(FR->Frn4,2)+Str(FR->Frn5,2)
···ELSEIF FR->FrN4 == 0
······oLink3 := olink2:AddLastChild(FR->FrTipo,IIF(FR->FrHoja,1,2),IIF(FR->FrHoja,1,2),.t.)
······oLink3:Cargo := Str(FR->Frn1,2)+Str(FR->Frn2,2)+Str(FR->Frn3,2)+Str(FR->Frn4,2)+Str(FR->Frn5,2)
···ELSEIF FR->FrN5 == 0
······oLink4 := olink3:AddLastChild(FR->FrTipo,IIF(FR->FrHoja,1,2),IIF(FR->FrHoja,1,2),.t.)
······oLink4:Cargo := Str(FR->Frn1,2)+Str(FR->Frn2,2)+Str(FR->Frn3,2)+Str(FR->Frn4,2)+Str(FR->Frn5,2)
···ELSE
······oLink5:= oLink4:AddLastChild(FR->FrTipo,IIF(FR->FrHoja,1,2),IIF(FR->FrHoja,1,2),.t.)
······oLink5:Cargo := Str(FR->Frn1,2)+Str(FR->Frn2,2)+Str(FR->Frn3,2)+Str(FR->Frn4,2)+Str(FR->Frn5,2)
ENDIF
FR->(DbSkip())
ENDDO
oTree:UpdateTV()
oTree:SetFocus()
RETURN NIL

Lo que hago es recorrer el DBF que tengo ordenado por la concatenación de los 5 campos y cuando cambio de nivel añado una rama al nivel inferior.

El resultado:

sobre DSay y SayRef o agradecimiento a Ramón Avendaño

Uno de los efectos que siempre me han gustado en los formularios de ‘acerca de’ de los programas es el efecto que yo llamo starwars. Consiste en un texto que se va deslizando de abajo arriba del formulario para desaparecer y luego volver a salir por abajo.

Uno de los mejores creadores de controles que ha habido para Fivewin – lo pongo en pasado porque hace años que no se nada de este señor – ha sido Ramón Avendaño. Una de sus clases – DSay o Dynamic Say – sirve para hacer precisamente esto, mover un texto por un área de un formulario. Otra de sus clases – SayRef – sirve para poner un hiperenlace a un texto, de manera que al pinchar en él nos enlace con un sitio web o envie un correo.

Dejo un fichero con un ejemplo de lo que se puede hacer con esta clase. Dentro del fichero va el ejecutable que muestra el efecto, así como los fuentes de las clases DSay y SayRef de Ramón. El ejecutable usa dos BMP que están en ficheros separados, por lo que hace falta descomprimir el ZIP para que el ejecutable se vea bien.

Las clases se pueden encontrar por internet con fuentes y ejemplos, y no he tenido que retocar nada para hacerlas correr con FWH. El ejemplo está compilado con el compilador comercial de xHarbour, pero se puede hacer facilmente con la version open source.

corrigiendo errores III

error #3: Poner unos foros en la web sin integrarlos correctamente.

Cuando montamos lanueva web pensamos en poner unos foros para los usuarios. Estuve viendo sistemas de foros y decidí usar los foros de phpBB que es un sistema muy conocido y extendido. El problema de este foro es que es muy potente pero al mismo tiempo muy complejo, y me conformé con pegarlo a la web, sin integrarlo correctamente. El caso es que cuando entrabas en los foros parecía como que salias de la web para ir a otro sitio.

Mal hecho. Si quieres ser profesional tienes que parecer profesional.

Ahora he estado modificando un foro basado en el de JoS que encontré en la web de John’s adventures para integrarlo correctamente en la web. Podeis probarlos desde la nueva página de foros de alanit. Son más sencillos que los de phpBB pero están perfectamente integrados en la web.

corrigiendo errores II

error #2: Usar registro ligado a máquina y complicar el proceso de registro del programa.

Otro error que cometí fue complicar el proceso de registro. A finales de verano pasado supe que las algunas versiones de mis programas se podian descargar en alguna red P2P y, la verdad es que no me sentó nada bien. Decidí que las nuevas versiones llevarían registro ligado a máquina, esto es el programa generaría una clave de registro en función del ordenador donde estuviera instalado el programa y en función de esta clave habría otra que yo enviaría. El resultado sería que si el usuario quisiera instalar el programa en otro ordenador me tuviera que pedir una nueva clave de activación.

Mal, mal, mal. Esta manera de proceder es un error garrafal. El caso es que ya puse un post sobre el tema en este mismo blog, pero me pudo más el enfado de ver los programas circulando sin control y cedí a la tentación de ponerme el traje de policia. Ahora ya está corregido y en breve lanzaremos unas versiones nuevas que llevan un sistema de registro tradicional por clave que ya no es ligada a máquina.

El usar un modelo de registro ligado a máquina es malo por dos cosas: uno porque el usuario realmente no tiene una licencia de uso del programa, sino una licencia de uso del programa en un determinado ordenador y si cambia de equipo necesitará una nueva clave. Esto crea una inseguridad clara en los usuarios y muchos potenciales usuarios nunca registrarán el programa. En segundo lugar usar un registro ligado a máquina complica el proceso de registro en tanto que en el momento de registrar el programa el usuario tiene que enviar una clave generada con el programa en el ordenador donde lo va a usar. Mucha gente prueba un programa en un ordenador y luego lo va a querer usar en otro distinto, o quiere comprar un programa para un amigo o familiar, o lo que sea. Lo que está claro es que un registro no ligado a máquina es más sencillo. Como experiencia puedo decir que el número de actualizaciones de las versiones que pusimos a la venta en noviembre han sido la tercera parte de lo que yo esperaba, y estoy con
vencido de que mucha culpa la tiene el modelo de registro.

Esta claro que con un registro por número de serie, un usuario puede registrar una licencia y usarla en varios ordenadores, pero realmente creo que los desarrolladores debemos confiar en nuestros usuarios ya que son los que nos permiten seguir en el negocio. Tal como está la cosa con las redes P2P, registrar un programa es más cuestión de voluntad que de otra cosa, y debemos hacer todo lo posible porque el registro de nuestros programas sea lo más sencillo posible.