jueves, diciembre 30, 2010

Próximamente programando en Android

Ahora que estoy pensando muy seriamente en adquirir un teléfono Sony-Ericsson X10 mini pro, he despertado un interés por la programación en Android. Antes en la Palm llegué a programar algunos scripts en Lua, pero realmente había aplicaciones para todo. En Android sin embargo no he visto tanta variedad aún.

Para aprender estoy programando una pequeña aplicación llamada RatDB que irá en el espíritu de la bien conocida Pilot-DB para Palm. Esto me permitirá aprender las partes básicas de la programación en Android además de ser una herramienta toda fantoche.

Si adquiero el teléfono, pasaré a programar una aplicación que será una lista de compras similar a HandyShopper, con la característica adicional de reportar cuál tienda sería más barata, o qué tendrás que comprar y dónde si eliges visitar dos o más tiendas. Si el interés y el tiempo permiten, haré un servidor central donde los usuarios registrados podrán sincronizar sus datos. Sería ventajoso (y fantoche) incorporar un lector de códigos de barras. Es una idea que hemos gestado por un tiempo pero la tecnología de nuestros gadgets no era suficiente.

Otra aplicación que quisiera programar es un reproductor de música ripeada de videojuegos — SPC principalmente, pero quizás también NSF y GSF.

Y una terminal que pudiera acceder al Linux debajo del capo sería genial, pero eso sí es mucha talacha para mí.

miércoles, diciembre 22, 2010

De balances y otras cosas

Toda la semana he sentido que fuera viernes. Ugh. Aún estoy trabajando en el balance de los ataques pero quizás deba enfocarme un poco también a la programación del front-end.

Actualmente tengo algunos problemillas con el diseño de los mapas. Lo estoy haciendo todo en Inkscape, pero al parecer estoy excediendo su capacidad o algo así, ya que consistentemente creo un cierto mapa muy elaborado y lo guardo, pero Inkscape no puede volver a abrirlo.

En DeGEN el combate no depende de las armas sino de las técnicas. Así las espadas se usan con diferentes técnicas (remotamente similar a Samurai Shodown IV), y los jugadores entrenarán las técnicas de su agrado. Por ejemplo Pakuma, el maestro de Rojogen, tiene varios puntos de entrenamiento con el bo. Diferentes niveles de entrenamiento permiten diferentes técnicas además de aumentar el daño que hacen las armas. Con un alto nivel en el entrenamiento del bo es posible amedrentar o marear a los enemigos con movimientos rápidos del arma, además de incrementar el daño. También se incrementará la probabilidad de conectar el golpe y aumentará el nivel de dificultad para la evasión, pero eso no lo he implementado.

Las armas también tienen diferentes rangos. Un golpe sólo puede conectar en los espacios contiguos (o en el mismo si la situación lo requiere), mientras que las patadas tienen un alcance mayor. La naturaleza de las patadas exige que haya movimientos en los que se avance un espacio o dos además de conectar la patada (como una acción estándar, no de movimiento).

Decidí cambiar las unidades inglesas por métricas, así un espacio estándar ahora mide 1.5m en lugar de 5'. Ignoro si eso sea favorable para el juego en papel, pero para el diseño sí es de gran ayuda. En todo caso hacer una vista que convierta automáticamente las unidades es trivial.

Y tengo un problemilla en el webserver: un cambio en las políticas de uso me hizo perder mis binarios de SVN y GIT, además de que no sé si podré volverlos a compilar. Habrá que probar.

martes, diciembre 14, 2010

Escapes avanzados en el shell

Se le llama escapar a la acción de enviar un caracter especial literalmente (y en algunos casos viceversa). Por ejemplo el bien conocido "\n" que representa un avance de línea, y el subsecuente "\\" que representa un backslash.

Estando en el shell estamos acostumbrados a dos tipos de cadenas: "entre comillas dobles" y 'entre comillas sencillas'. La diferencia principal que notamos en el shell es que "$HOME" imprimirá tu directorio home, pero '$HOME' imprimirá $HOME literalmente; y que los escapes con backslash funcionan en las dobles y no en las sencillas.

Es importante tener en cuenta que las comillas no definen una cadena. Lo que hacen es cambiar el modo de interpretación y ayudan a limitar el token (elemento). Es válido escribir /home/rat/"web service"/uno, por ejemplo.

¿Qué pasa si quieres escapar comillas dentro de comillas?

El caso más sencillo es "\"", entonces puedes decir "dijo \"sí\"". Pero si quieres escapar sencillas la cosa se complica, pues '\'' no funciona (el backslash es literal en las sencillas).

Me dio vueltas en la cabeza por meses, se hace así: ''"'"''. Entonces "I'm here" sería 'I'"'"'m here'.

Parece anti-intuitivo al principio, pero si consideras las reglas tiene un poco más de sentido que '''' (tipo SQL), y es más flexible. No quiero ni pensar cómo interactúa eso con ``... pero eventualmente será necesario.

Re-iterando el balance

Estaba trabajando en el balance del juego. A diferencia de D&D, DeGEN es un juego donde el combate sin armas juega un papel importante, además de que el combate no depende tanto de la armadura como de la agilidad. Esto significa que los datos de D&D no son suficientes.

Así que hice una vista en mySQL que prepara todos los posibles ataques y calcula su porcentaje real de golpear (restando el fallo automático de obtener un 1 en un d20) y el daño probable luego de 10 rondas (incluyendo golpes críticos que pudieran ocurrir). Y estando en esto me di cuenta que iba a ser más complicado de lo que parecía, así que decidí empezar desde cero una vez más.

No sé qué tan seguido otros desarrolladores hacen eso, pero sé que es parte de mi workflow.

El frontend también está siendo reescrito. Lo estoy basando en SVG, pero he tenido problemas con Inkscape. Por ejemplo, hice un cierto mapa bastante complejo que usaba la función de crear clon linkeado de un elemento, pero después de guardar no podía abrirlo.

Lo bueno de haber movido la lógica del programa a mySQL es que la creación del frontend no requerirá meterle mano. Al menos eso espero…

miércoles, diciembre 08, 2010

Pattern against user

Mucha gente no está consciente del daño que hacen, a sí mismos y a los demás.

Una aplicación web puede actualizarse cargando los datos via Excel. El usuario descarga un Excel con los espacios en blanco, los llena y lo carga de nuevo al sistema. Problema: El programa no está aceptando un archivo específico. ¿Cómo lo podemos arreglar?

En manos inexpertas Excel es tan peligroso para los datos como Word lo es para los formatos.

No me malinterpreten: Word es superior. Decidí calar desde dónde empieza la superioridad de Word descargando la versión 5.5 para DOS y encontré con gusto que desde ahí puedes aplicar el equivalente tecnológico a las CSS. Desde 1991. Y quizás desde 1981, pero no tengo pruebas de ello.

El problema es que ningún usuario se molesta en aprender estilos. Es como echar los jitomates a la licuadora y luego picotearlos con el cuchillo cebollero en lugar de encender el aparato. He visto gente que terminaba sus párrafos al llegar al final de la página, como si fuera una máquina de escribir. Y bueno, eso fue mi tía, que nunca había visto una computadora, pero ténganla presente.

Y con Excel la cosa no es muy distinta. Cada celda puede (y debería) tener un tipo de datos bien definido, haciendo así buena distinción entre valores numéricos, porcentuales, fechas, textos y demás; pero siempre confiamos en el formato General. Generalmente hace un buen trabajo, huh.

Los problemas comienzan cuando te das cuenta que Excel está podrido por dentro. No me considero un veterano (a pesar de 17 años programando) pero sé que si quiero calcular el seno de un ángulo puedo recurrir a la función sin. Y es razonable en cualquier contexto excepto en Excel, donde tengo que usar la función seno. ¿Y para sumar rangos? No sum, suma. Hay funciones razonables, como curtosis, pero en general esto significa que no puedes copiar de la 'net un ejemplo y pegarlo en tu hoja de cálculo.

Pero definitivamente no es lo más grave: en España (y otros países) el símbolo separador de decimales es la coma (,). Casualmente también es por defecto el separador de argumentos en las definiciones. Así que si vives en una región de coma decimal ahora tendrás que separar todo con punto y coma (;).

No parece gran cosa, pero consideren estos dos ejemplos:

En mis tiempos como soporte técnico de Prodigy había un cierto comando que había que teclear escribiendo el símbolo de punto y coma. Esto era muy difícil de explicar por teléfono pues mucha gente no sabe de la existencia del punto y coma, y escribían un punto y una coma (.,). No estamos hablando de analfabetas, sino de gente que es capaz de prender la computadora y tratar de picarle los botones, con iniciativa suficiente como para llamar por teléfono y seguir instrucciones simples… Aunque debo admitir que el IQ del usuario cae unos 40 puntos cuando está siguiendo instrucciones, al grado que gente que hablaba buen inglés y era razonable leía la palabra gateway y en lugar de pronunciarla géitwey decía gátogüey.

Hay gente lista. Hay gente carismática. Hay gente lista y carismática. Y desafortunadamente también hay gente que no es ni lista ni carismática. Así había un líder de proyecto que se ganó el desprecio de sus colaboradores. Un día nos llama:

Miren, les voy a enseñar un truco en el Excel. Si quieren que no salgan las rayitas de las celdas lo que tienen que hacer es seleccionar todo (va a la celda A1, oprime shift y recorre el cursor hasta la derecha y luego hasta abajo, hasta llegar a la IV65536), y entonces le dan clic aquí (en Relleno de celda) y eligen color blanco. ¡Ahí está!

Si consideramos que el mismo tipo usaba MS Paint como procesador de textos (en lugar de, digamos, Word), entonces suena a que era un simple usuario inexperto y no iniciado en las artes. Una persona capaz de encontrar la solución a sus problemas dentro del caos aparente del desconocido universo de la ofimática.

El problema es que no era el Juan Perro que llama a Prodigy para activar la computadora de sus hijos, no. Era un profesional con título universitario en algún campo relacionado con la informática y ganando un salario que muchos ya quisiéramos.

Si los usuarios que supuestamente tienen preparación son capaces de estas aberraciones, ¿de qué serán capaces los que no tienen capacitación alguna?

¿Qué hacemos con el archivo que el sistema no acepta? La solución es sencilla: hay que ir con el usuario a ver cómo lo hizo. Lo más probable es que le hizo algo al que no sirve (y no sabe qué le hizo (y si lo sabe no lo admitirá)), y cuando lo estemos observando hará las cosas tal y como se las enseñaron. Y desde luego que entonces el programa funcionará.

Esa es, por cierto, la única explicación científica que puedo ofrecer de por qué las cosas funcionan bien cuando tienes que mostrarle el error al técnico. Este fenómeno es un ejemplo más de lo que en algunos campos se conoce como Ley de Murphy.

¿Y qué podemos hacer nosotros como desarrolladores?

Limita las posibilidades del usuario: No tiene caso permitirle que pueda especificar 17 formatos diferentes de fecha si tú sólo puedes procesar uno. Lo único que causa es confusión y frustración cuando algo que aparentemente debería funcionar no lo hace. En el caso del Excel, si ya estás generando un Excel, incluyele fórmulas que validen los datos mientras el usuario los llena.

Evita los formatos complejos: No pidas archivos en Word o Excel si un archivo .txt o un .csv serían suficientes. Esto es en beneficio tanto del usuario como del desarrollador: las automatizaciones de Office desde ASP están oficialmente no-soportadas (es decir, Microsoft explícitamente ha dicho que no lo hagas).

Emite mensajes de error significativos: Puede ser que el usuario no los entienda, pero la gente de soporte y los programadores sí. Algunos usuarios sí leen y entienden los mensajes, y corrigen sus propios errores — aunque dicha variedad está en peligro de extinción. Pero los programadores del futuro usarán ese mensaje para buscar en tu código fuente, asegúrate de que no se repitan para facilitarles el trabajo y limpiar tu karma.

Haz interfaces sencillas: El problema se origina porque la interfaz original está basada en una versión obsoleta del FlexGrid, programada de una forma tan pobre que se tarda muchísimo en cargar y procesar. Si hubieran hecho un trabajo más enfocado entonces no habría necesidad de cargar los datos via Excel en primer lugar.

El mundo no es óptimo. Si puedes cambiar una parte, por pequeña que sea, asegúrate de hacer un buen trabajo.

lunes, diciembre 06, 2010

Avatares en SVG

Aprovechando unos minutos libres me aventé un dibujillo en Inkscape. Es ni más ni menos que el avatar del personaje de Cox, de DeGEN. El juego tendrá un estilo gráfico sencillo, principalmente porque no tengo el tiempo y/o los recursos para hacerle sus animaciones como se debe.

Al trabajar en SVG aseguro que puedo hacer pequeñas modificaciones a los archivos. Esto significa que podré utilizar este dibujo como template para dibujar bastantes otros personajes.

Los escenarios también están basados en SVG, aunque todavía no decido cómo será la perspectiva en ellos, puede que sea algo tipo Final Fantasy (solo ves las paredes que son perpendiculares) pues tiene la ventaja de que puedes trabajar con varios cuartos y diferentes áreas. También podría optar por algo a lo Chrono Trigger, o incluso a lo Zelda: A link to the past.

Procuro que el arte se mantenga sencillo para no exhibir mi falta de habilidad con el mouse.

viernes, diciembre 03, 2010

Reescribiendo las reglas

Cuando programo no es raro que en un punto borre todo y vuelva a comenzar, al menos un par de veces al principio, y otras tantas con el transcurso de los años. Por ejemplo, el Ratawiki ha sido reescrito desde cero al menos tres veces.

Así ahorita estoy en la segunda vuelta sobre DeGEN. En la primera había pensado escribir todas las reglas de negocio (por así decirlo) en PHP, dejando a mySQL como almacenamiento.

Pero me conseguí un IDE excelente para mySQL: HeidiSQL. No es perfecto pero es lo mejor que hay, incluso en muchos casos es mejor que el Navicat. Lo único que extraño del Navicat es que puedes guardar queries y se muestran en el árbol de elementos de la base de datos – función muy útil en mySQL porque si editas una view te devuelve el código sin formato, a diferencia de las functions y procedures que conservan el formato que pongas.

Así que ahora toda la lógica del juego estará en la base de datos y AJAX seguirá siendo el front-end, pero ahora PHP será sólo un intermediario entre ambos. So far, so good.

jueves, diciembre 02, 2010

DeGEN

Actualmente el pet project du jour es DeGEN.

En 1998 Banda, Saltiel y yo hicimos un cómic que era una parodia de Dragon Ball incorporando personajes de nuestro entorno (3er grado de la secundaria 27). Al ver el éxito que obtuvimos, Banda y Saltiel decidieron hacer una parodia de la vida real, llamando a dicho cómic De-GEN 83. El plan era que cada uno de nosotros agregara páginas, las cuáles estarían dibujadas con la máxima calidad y atención a detalles que pudieramos lograr. Lamentablemente le robaron la mochila a Saltiel, y en ella se perdieron las primeras 20 páginas del cómic.

Pero yo, por promover que continuáramos, decidí dibujar algunos episodios posteriores. Saltiel tenía un borrador de la historia que había pensado y lo tomé y lo extendí durante mis años en la vocacional. Pero mi manera improvisatoria de dibujar (especialmente con público) me llevó a descarrilar la historia.

Luego pensamos en hacer un webcomic (en el 2000, cuando todavía no eran la moda que son ahora), pero el proyecto se fue postponiendo...

Hace dos años escribí un nuevo borrador en el que explica a detalle el origen y el alcance de los poderes misteriosos de los héroes, la motivación de los villanos y el desarrollo de la historia en general. Desde entonces he estado haciendo adiciones y el resultado es un universo que excede el alcance del comic.

Por no desperdiciar, y ante mi reciente interés en los juegos de rol (papel y pluma, no de video), decidí escribir aún más para eventualmente basar una campaña en el universo de DeGEN – que pierde el 83 pues es específico de la historia de Banda, Cox y Rat.

Actualmente estoy trabajando en el juego. La idea es una fusión entre las dos vertientes de juego de rol: el juego podrá jugarse contra la computadora o bajo el control de un Game Master, y cada jugador podrá manejar hasta 3 personajes en forma simultánea o unirse a un equipo arbitrariamente-limitado de jugadores.

Temporalmente pueden ver algunas notas de diseño en degen83.ratasoft.net.

Bienvenidos

Bienvenidos al RatDevLog, el Log de Desarrollo del Rat.

¿Quién soy yo? Se me conoce por muchos nombres, pero básicamente soy el Rat. Me inicié como programador en una Atari XE, y domino el espectro de la programación desde ensamblador hasta macros de Excel.

¿Qué es este blog? Bueno, siempre tengo algo por programar, así que aquí postearé al respecto. Quizás a alguien le sea útil. Quizás alguien pueda ayudarme. Quizás me plagien mis ideas. Quizás todo eso y más. Básicamente les diré lo que estoy programando.