Showing posts with label hardware y software. Show all posts
Showing posts with label hardware y software. Show all posts

Tuesday, March 27, 2012

Más sobre el creador de iconos


Hace un par de años escribí sobre un programa que hacía iconos. La idea era crear imágenes en formato .ico para usarlas en mis programas. Sin embargo, hallé que el formato de los iconos en Windows no es trivial y que tiene montones de características. La versión de Delphi, la herramienta que uso, tiene un programa para crear iconos de 16x16 pixeles, pero sólo en 16 colores. Evidentemente eso en la actualidad es poco porque el resultado final se ve demasiado simplón ahora que hay tantas tarjetas gráficas que soportan todo tipo de resoluciones, incluso 1080p, que es la alta definición (HD).

Así, un poco sin querer, hallé un sitio que resuelve mis problemas con los iconos en Delphi y crea imágenes con toda la gama de colores e incluso con transparencia (técnicamente el llamado canal alpha). Implementé la solución y finalmente puedo crear iconos en el formato adecuado. Para ello, lo que hice fue lo siguiente:

  • Tomé una imagen en color que quiero procesar
  • Definí diferentes cuadrículas: desde 16x16 hasta 64x64 pixeles, para la imagen resultante
  • Apliqué el filtro mosaico y así tomé un punto de cada recuadro del mosaico como si representara a todos los puntos dentro de dicho recuadro
  • Generé una imagen bmp que puede ser guardada a disco
  • Usando la rutina mencionada, generé el icono en formato .ico.

Cabe decir que crear iconos significa finalmente cambiar el tamaño de la imagen al que uno desea. Hay una serie de técnicas para hacer esto, las cuales son finalmente algoritmos de interpolación, los cuales son adaptivos y no-adaptivos. Los métodos adaptivos pueden cambiar dependiendo qué están interpolando (límites o texturas suaves), mientras que los no-adaptivos toman a todos los pixeles con el mismo tratamiento.

Entre los métodos no-adaptivos están: vecino más cercano (el que usa Paint, de Microsoft, el cual es bastante burdo), bilineal, bicúbico, spline, sinc, lanczos entre otros. Dependiendo de la complejidad de la imagen estos usan de 0 hasta 256 pixeles adyacentes cuando interpolan. Mientras más pixeles adyacentes usan, más preciso es el resultado final aunque como en todo, más procesamiento exige más tiempo de máquina. No se puede tener todo en la vida.

Los algoritmos adaptivos son complicados y muchos programas usan código propietario para realizar esta tarea. La idea de estos algoritmos es minimizar los "artefactos" (que son manchas o pixeles que no deberían verse), y por ende, algunos de estos métodos no se pueden usar para distorsionar o rotar una imagen.

En mi caso, para reducir una imagen, el método mosaico parece ser lo suficientemente bueno, a pesar de ser bastante trivial de implementar.

A quien le interese el software, escríbame a morsa@la-morsa.com y se lo mando de forma gratuita a su correo de inmediato.

Saturday, December 17, 2011

Software para intercambio de regalos


En estas fechas navideñas, ¿quién no ha hecho intercambio de regalos con sus parientes y/o amigos? Esto se está volviendo una tradición porque es claro que regalarle a todos los parientes, a todos los conocidos, es algo que se ha vuelto prohibitivo y en consecuencia, en el intercambio de regalos solamente le tenemos que dar un buen regalo a una sola persona, lo cual tiene sus virtudes: primero, se le da algo de cierto valor mínimo (y máximo), y por otra parte, nos obviamos el dar regalos de relleno, los cuales quizás pasan al basurero o en el mejor de los casos al ropero, para después sacar ese obsequio en una emergencia y así simplemente quedar bien.

Pues con esto en mente y a petición de José Antonio Rodríguez, buen amigo y fiel lector de Matuk.com, nos dimos a la tarea de hacer un programa que -de una lista de nombres- sacara parejas de ellos de manera que se armara automáticamente la lista de intercambio de regalos, usando para ello la máquina que ya es una cotidianidad: la computadora.

El programa pide que se le alimente una lista de nombres y entonces hará los "pareos" entre personas. Una vez hecho esto, se puede guardar el resultado en un archivo de texto en disco, el cual se puede entonces re-enviar a todos las personas involucradas en el intercambio. Igualmente, se puede escribir la lista de nombres para que -si es necesario- puedan agregarse más adelante otros nombres. Cabe decir que si se agregan nuevos nombres, el pareo de quién le regalará a quién puede cambiar.

El programa muestra diferentes "pareos" entre los que le entran a un intercambio de regalos


Una opción que se le ha agregado es la de ordenar los nombres de las personas con las que se va organizar el intercambio de regalos, sin embargo, esto no influye en la manera en como el programa genera las parejas de intercambio.

El algoritmo que se usa es el siguiente:

  •      Se cuenta la cantidad de nombres que hay en la lista.
  •      Se saca un número al azar que vaya en el rango de 0 al número de personas en la lista
  •      Se guarda ese elemento en el pareo
  •      Se elimina ese valor de la lista
  •      Se cuenta la cantidad que ahora hay en la lista
  •      Se saca un número al azar que vaya en el rango de 0 al número de personas en la lista actualmente
  •      Se guarda ese elemento en el pareo
  •      Se manda al archivo de texto el pareo
  •      Se repiten los pasos 1 al 8 hasta que sólo queden dos nombres
  •      Se parean estos nombres y se termina el proceso

Se pueden hacer tantos pareos como se quiera. El programa divide cada pareo con una línea punteada. Si el número de personas es impar, se agrega un valor que dice "<>". Siempre se tiene que tener un número par de elementos para hacer los pareos.

Y sí, esto es parte de la programación lúdica, pero por problemas de tiempo y logística, esta vez no habrá video al respecto. Prometemos regresar con más el año que viene.



El enlace permanente para descargar el software aquí


He aquí el video sobre el tema, cortesía de Matuk.com:




Comentarios y sugerencias a mi correo: morsa@la-morsa.com

Sunday, November 20, 2011

Inteligencia artificial y sistemas expertos


La inteligencia artificial, término que acuñó John McCarthy me parece, se basa en la idea de hacer sistemas inteligentes, tan capaces como los que puede lograr el cerebro humano. Sin embargo, se halló, después de los primeros años frustrantes, que la inteligencia humano no sólo era complicada, sino mucho más complicada de lo que habíamos pensado. Por ello, hubo una división natural de tareas: visión por computadora; sistemas expertos; reconocimiento de patrones; entre otros.



Uno de los temas que por algunos años estuvieron en boga, pero que probablemente han caído en el desuso es el de los sistemas expertos, el cual se basa en escribir software que fuese tan bueno como un experto humano en un tema particular. En ese sentido por ejemplo, un programa de ajedrez como los actuales, que le ganan al 99.99% de los jugadores humanos,  es un sistema experto muy exitoso, pero las técnicas de programación para jugar tan bien están lejos de la teoría tradicional de los sistemas expertos. En este caso las cosas son así. Un sistema experto se basa en tres subtemas:

  • Interfaz con el usuario
  • Base de conocimientos (reglas de producción)
  • Motor de inferencias

En ese sentido, cuando se va a trabajar con un sistema experto hay que reconocer cómo se diseñará cada parte. En el caso de la interfaz del usuario, aunque hay muchas alternativas, la más común es responder "sí" o "no" a las preguntas que hace el sistema. esto -desde luego- no es tan poderoso como aquellos sistemas que además de responder a preguntas con "sí" o "no", también puedes darle un valor de confiabilidad a la respuesta. Por ejemplo,

Pregunta: "¿Te duele la cabeza"
Respuesta: "sí"
Pregunta: Del 1 al 10, ¿cuánto te duele? (donde 10 es el dolor más fuerte)

este tipo de sistemas usan probabilidad para decidir el margen de confiabilidad de las respuestas que entrega el sistema experto, basado en las confiabilidades que se dieron en las diferentes respuestas por parte del usuario. Para ello se usa el teorema de Bayes Sin embargo, para poner las cosas de la manera más simple, muchos sistemas expertos solamente permiten responder "sí" o "no".

Pues bien, una vez hecho esto, tenemos que describir la base de conocimientos, la cual es la que nos dará información sobre el tema que nos ocupa. Por ejemplo, en el programa muestra que te mando, la base de conocimientos es la información sobre los diferentes perros que existen. Así, un snauzer será un perro pequeño, con cola y orejas cortas, de buen talante, etc. En esta base se definen algunos perros y sus características. La idea del sistema experto es que el programa vaya pidiéndole información al usuario para que éste pueda concluir de qué perro se trata. Las bases de conocimiento están puestas en general como predicados "causa - efecto". Así, una regla en general podría ser: "si te duele la cabeza es que tienes gripe". La causa: el tener gripe; el efecto: el dolor de cabeza.

El motor de inferencias es quien pregunta al usuario basándose en esas cláusulas causa - efecto. Los sistemas expertos usan tres posibles motores de inferencia:

  • encadenamiento hacia atrás (backward chaining)
  • encadenamiento hacia adelante (forward chaining)
  • sistema de borrador (blackboard system)

El primer caso funciona así: Imagina que vas con el médico porque te sientes mal. Él te ve y te empieza a preguntar cosas sobre tus malestares. Sin embargo, antes de empezar las preguntas, las dirige asumiendo que tienes gripe, por ejemplo. Entonces te preguntará síntomas asociados de la gripe. Si le das más de una respuesta que no es presumiblemente de la gripe, se formulará mentalmente otra hipótesis y de nuevo empezará el interrogatorio.

El segundo caso es el encadenamiento hacia adelante. Siguiendo el ejemplo anterior, vas al médico y éste comienza a preguntarte qué te duele, pero no asume que tiene gripe o cualquier otra enfermedad. Lo que hace es acumular datos (respuestas) y entonces busca en su base de conocimientos qué es lo que más se parece a lo que puedes tener.

El sistema de borrador ya es obsoleto. Imagina un salón de clases lleno de expertos humanos en alguna materia. Entonces se plantea un problema y cada experto tiene un pedazo del borrador en la pared para poner su solución. Después de que todos hayan puesto su posible solución, un supervisor lee todas las respuestas y arma la respuesta final. Así funcionaba HearSay, un sistema de reconocimiento de voz de los años ochentas, actualmente en desuso.

Cabe señalar que los sistemas expertos deben estar construídos para no repetir hasta el hartazgo la misma pregunta. Por ejemplo, imagina que un sistema de encadenamiento hacia atrás te pregunta si te duele la cabeza y le contestas que no. Si es así, probablemente la primera hipótesis, la de tener gripe, no funcione. Entonces el sistema crea a través de la siguiente regla la nueva hipótesis. Si en esta nueva regla hay que preguntar de nuevo si te duele la cabeza, sería poco inteligente y serio de un sistema que te volviese a preguntar lo mismo. Así, el sistema experto (como el que te mando), guarda las respuestas del usuario y checa antes si ya respondiste a la pregunta para no volverla a preguntar.

Otra cuestión, que no está considerada en el sistema experto es la de explicar su funcionamiento. Es decir, ¿por qué el sistema experto llegó a las conclusiones y diagnósticos a los que llegó? Hay muchas maneras de hacer esto pero una de ellas es simplemente avisarle al programador, vía mensajes a la pantalla, en qué regla está trabajando. Otrso sistemas expertos pueden trazar la ruta de desarrollo. Por ejemplo, pueden decirte: "primero usé la regla 4, la cual me remitió a la regla 92 y por las respuestas del usuario tuve que probar las reglas 153 y 25", etc. Pero esto es mucho más sofisticado y difícil de programar.



/*      Program: Dog Expert        */
/* Purpose: To show the working of */
/* an expert system. It is a pro-  */
/* duction rule-based system.      */
/*                                 */
/* Remarks: This is a dog classi-  */
/* cation expert system. It uses a */
/* set of production rules for the */
/* purpose of inferring.           */

domains

database

   xpositive(symbol,symbol)
   xnegative(symbol,symbol)


predicates

   do_expert_job
   do_consulting
   ask(symbol,symbol)
   dog_is(symbol)
   it_is(symbol)
   positive(symbol,symbol)
   negative(symbol,symbol)
   remember(symbol,symbol,symbol)
   clear_facts

goal

   do_expert_job.


clauses

/*  User Interface System (UIS) */

do_expert_job :-
     makewindow(1,7,7,"An Expert System",1,16,22,58),
     nl, write(" ************************************"),
     nl, write("    Welcome to a Dog Expert System"),
     nl, write("                                 "),
     nl, write(" This is a dog identification system"),
     nl, write(" Please, respond by typing in 'yes'"),
     nl, write(" or 'no'.            Thank you.    "),
     nl,nl,
     do_consulting,
     write("Press space bar..."), nl,
     readchar(_),
     clearwindow,
     exit.

do_consulting :-
     dog_is(X), !,
     nl, write(" Your dog may be a(n) ",X,"."),
     clear_facts.

do_consulting :-
     nl, write("Sorry, unable to determine the dog."),nl,
     clear_facts.

ask(X,Y) :-
     write("   Question :- ",X," it, ",Y," ? "),
     readln(Reply),
     remember(X,Y,Reply).


/* Inference Engine (INE) */

positive(X,Y) :-
     xpositive(X,Y),!.

positive(X,Y) :-
     not(negative(X,Y)),!,
     ask(X,Y).

negative(X,Y) :-
     xnegative(X,Y),!.

remember(X,Y,yes) :-
     asserta(xpositive(X,Y)).

remember(X,Y,no) :-
     asserta(xnegative(X,Y)),
     fail.

clear_facts :-
     retract(xpositive(_,_)),
     fail.

clear_facts :-
     retract(xnegative(_,_)),
     fail.


/* Production Rules */


dog_is("English Bulldog") :-
     it_is("short-haired dog"),
     positive(has,"height under 22 inches"),
     positive(has,"low-set tail"),
     positive(has,"good natured personality"),!.

dog_is("Beagle") :-
     it_is("short-haired dog"),
     positive(has,"height under 22 inches"),
     positive(has,"long ears"),
     positive(has,"good natured personality"),!.

dog_is("Great Dane") :-
     it_is("short-haired dog"),
     positive(has,"low-set tail"),
     positive(has,"longer ears"),
     positive(has,"good natured personality"),
     positive(has,"weight over 100 lb"),!.

dog_is("American Foxhound") :-
     it_is("short-haired dog"),
     positive(has,"height under 30 inches"),
     positive(has,"longer ears"),
     positive(has,"good natured personality"),!.
    
dog_is("Cocker Spaniel") :-
     it_is("long-haired dog"),
     positive(has,"height under 22 inches"),
     positive(has,"low-set tail"),
     positive(has,"longer ears"),
     positive(has,"good natured personality"),!.

dog_is("Irish Setter") :-
     it_is("long-haired dog"),
     positive(has,"height under 30 inches"),
     positive(has,"low-set tail"),
     positive(has,"good natured personality"),!.

dog_is("Collie") :-
     it_is("long-haired dog"),
     positive(has,"height under 30 inches"),
     positive(has,"low-set tail"),
     positive(has,"good natured personality"),!.

dog_is("St. Bernard") :-
     it_is("long-haired dog"),
     positive(has,"low-set tail"),
     positive(has,"good natured personality"),
     positive(has,"weight over 100 lb"),!.
    
it_is("short-haired dog") :-
     positive(has,"short-haired"),!.
    
it_is("long-haired dog") :-         
     positive(has,"long-haired"),!.

Este sistema experto está escrito para turbo prolog, que funciona bajo MsDOS y está sacado del libro -si mal no recuerdo- Exploring Artificial Intelligence With Turbo PROLOG por Keith Weiskamp, el cual no sé dónde está. No lo halló más.

Monday, October 03, 2011

Lecciones del primer mundo


En el momento de escribir esto estoy en Vancouver, Canadá, en casa de mi hermana Marga y su esposo Mauricio. Vine por una semana y ayer domingo me apersoné en una tienda de electrónica/hardware/software/computadoras llamada "Future Shop". Ahí uno encuentra cualquier cantidad de marcas de videocámaras, roedores, monitores, videocámaras de alta definición (de todos los tamaños y precios), etc.

En estas tiendas hay una sección de software. Recuerdo que hace unos años, en alguno de estos primeros viajes al primer mundo, había una buena sección de la tienda con llamativas y coloridas cajas de software. Y entonces uno compraba el programa X y éste venía en una cajota que contenía manuales, licencia de uso, garantía, etc., además de diskettes o CDs, si acaso un DVD.

Hoy encuentro que en "Future Shop" la parte de software está limitada a "gaming", es decir, a los cartuchos o discos para las consolas como Wii, XBox y PlayStation. Ya prácticamente la parte para PC y Mac está limitadísima a unos pocos juegos y francamente, luce un poco abandonada.

Los mercados cambian, y lo que parece estar pasando es que ya pasó el momento en donde comprar software tenía que ser justificado por la empresa vendedora dándonos a cambio de muchos o pocos dólares, un sinfín de materiales, caja, manuales, etc. No, ya eso está desapareciendo y "lo de hoy"  es simplemente descargar todo del sitio web del fabricante. Ya a nadie le importa siquiera que los discos donde descargamos los programas vengan en un disco original. De hecho, ni siquiera ya se necesita descargar todo el programa adquirido, más bien ahora toda la instalación se hace desde el web del fabricante.

Este es, sin duda, el modelo de negocios que se mantendrá vigente por mucho tiempo. El asunto de ver las cajas originales del software es cosa del pasado.

Wednesday, June 29, 2011

Rybka es un tramposo

Ayer salió un muy interesante artículo sobre Rybka, quizás el programa más fuerte de ajedrez, que había dominado hasta hace pocos el ajedrez por computadora. El artículo completo, con las referencias y análisis sobre todo este asunto puede verse aquí.

La cuestión simple es que por mucho tiempo se sospechó que Rybka era un clon -ciertamente modificado- de un programa de código abierto, llamado Fruit. David Levy, uno de los jerarcas de la Federación de ajedrez por computadora (entre otros juegos), escribió un extenso artículo sobre este tema, del cual hablé también en este blog (puede consultarse aquí al respecto).

Y la pregunta seguía en el aire: ¿Era Rybka un clon de algún otro programa? Algunas conclusiones de Levy así lo hacían ver. Sin embargo, nada era conclusivo hasta que una serie de expertos en el tema tomaron el toro por los cuernos y comenzaron a analizar a Rybka, a partir de que éste empezó a jugar de manera notable.

Así entonces, la International Computer Games Association (ICGA), ha descalificado y bloqueado a Rybka y a su programador, el MI Vasik Rajlich, de jugar en futuros campeonatos mundiales por computadoras, amén de exigirle a Rajlich que regrese los trofeos y premios en metálico que hubiese recibido cuando ganó los torneos mundiales de los años pasados (2007, 2008, 2009 y 2010).

La ICGA acusa a Rajlich de plagio de dos programas, Crafty y Fruit, después de haber conformado un panel de investigación que analizó Rybka desensamblado el código ejecutable (pues Rajlich no ha dado acceso al código fuente).

Los miembros del panel fueron:

Secretariado:
  • Robert Hyatt - (Crafty, Cray Blitz, World Computer Chess Champion in 1983 and 1986)
  • Mark Lefler (author of Now)
  • Harvey Williamson (part of Hiarcs Team)

Miembros:
  • Albert Silver (software designer for Chess Assistant (1999-2002); currently editor of Chessbase News (2010-present))
  • Amir Ban (author of Junior: World Champion 2002, 2004, 2006, World microcomputer Champion 1997, 2001)
  • Charles Roberson (author of NoonianChess)
  • Christophe Theron (author of Chess Tiger)
  • Dariusz Czechowski (author of Darmenios)
  • Don Dailey (author of Cilkchess, Star Socrates, Rex, Komodo)
  • Eric Hallsworth (part of Hiarcs Team, Publisher of Selective Search magazine)
  • Fabien Letousky (author of Fruit)
  • Frederic Friedel (Chessbase.com)
  • Gerd Isenberg (author of IsiChess)
  • Gyula Horvath (author of Pandix, Brainstorm)
  • Ingo Bauer (Shredder team)
  • Jan Krabbenbos (Tournament Director of Leiden tournaments)
  • Kai Himstedt (author of Gridchess and Cluster Toga)
  • Ken Thompson (creator of Belle Chess Machine, World Computer Chess Champion 1980, Turing Award winner 1983, creator of B and C programming languages, Unix and Plan 9 developer). More Information about Ken can be found here http://en.wikipedia.org/wiki/Ken_Thompson
  • Marcel van Kervinck (author of Rookie)
  • Maciej Szmit (assistant professor at Technical University of Lodz)
  • Mark Watkins (MAGMA Computer Algebra Group, School of Mathematics and
  • Statistics, University of Sydney)
  • Mark Uniacke (Hiarcs, World Microcomputer Champion 1993)
  • Mincho Georgiev (Pawny)
  • Olivier Deville (Tournament Director of ChessWars)
  • Omid David (author of Falcon)
  • Peter Skinner (Tournament Director of CCT--the major annual online computer chess tournament)
  • Ralf Schäfer (author of Spike)
  • Richard Vida (author of Critter)
  • Richard Pijl (author of The Baron)
  • Stefan Meyer-Kahlen (author of Shredder, multiple world champions from 1996-2007)
  • Thomas Mayer (author of Quark)
  • Tord Romstad (author of Stockfish, Glaurung)
  • Tom Pronk (ProChess, Much)
  • Vladan Vuckovic (Axon, Achilles)
  • Wylie Garvin (game Programmer at Ubisoft Montreal)
  • Yngvi Björnsson (The Turk)
  • Zach Wegner (author of ZCT and Rondo, an upgraded version of Anthony Cozzie’s Zappa program, which was world champion in 2005).

Esta noticia sin duda es casi tan importante en el mundo del ajedrez como lo fue la descalificación del canadiense Ben Johnson en las Olimpiadas de 1988 después de que dio positivo en las pruebas antidoping. Aparentemente la resolución es definitiva y es claro que Rybka y Rajlich habrán caído en el desprestigio, quedando fuera de este tema del ajedrez por computadora.



Yo quisiera imaginar que el MI Rajlich debe salir en defensa de su programa. Si es un trabajo original debe poder mostrarlo y además, así evitaría, además de las sanciones, el desprestigio en el que en este momento se encuentra. Habrá que ver qué reacciones hay.

En el mientras, es muy lamentable que estas cosas pasen, pero es claro que los programadores que se esfuerzan porque sus programas cada día jueguen mejor y además, contribuyan a la resolución de los problemas con ideas originales, sean finalmente sobrepasados por alguien que copia código de manera "inteligente" y que logra éxitos sorprendentes basándose en trabajos de terceros, a los cuales, desde luego, no les da ni siquiera crédito.

Tuesday, May 24, 2011

Recordando a los Beagle Bros


Después de haber hablado de los tiempos de la Apple ][ y de la optimización que se hacía en esos tiempos del cómputo casero, Benito Estrada me comentó de los miniprogramas, los "two-liners" (programas escritos en dos líneas de Applesoft Basic), los cuales eran, sin duda, la excelencia en optimización. De hecho, sé que de vez en vez hay concursos en prácticamente todos los lenguajes para escribir en una cantidad limitada de bytes algún programa que haga algo de utilidad.

 Bert Kersey en la actualidad

El asunto es que recordando a los Beagles Bros (sin punto, porque de acuerdo al fundador, "ya no había espacio suficiente para ponerlo"), esta empresa se especializó en software para Apple ][ y fue fundada en 1980 por Bert Kersey y se expandió con el tiempo hasta lograr tener un buen conjunto de programadores y diseñadores. En ese tiempo había muchas companías de software que buscaban introducir la microcomputadora en los pequeños negocios y así había Visicalc, que es el equivalente de ese tiempo de lo que hoy podría ser Excel, por ejemplo. Kersey sin embargo, buscó apoyar al aficionado, al que hacía programación por hobby, por diversión.

Como resultado de esto, la línea de productos Beagle Bros consistía en software que ponía el poder creativo en las manos de los usuarios o expandían productos populares de otras compañías. Por ejemplo, Apple Mechanics permitía a los usuarios crear sus propias tablas de "shapes" (una forma temprana de lo que en otras máquinas ya se denominaban sprites), para crear juegos. DOS Boss, por ejemplo, permitía a los usuarios parchar el sistema operativo para cambiar los nombres de los comandos. Beagle Bag tenía juegos simples y sencillos escritos en BASIC de Apple. Los Beagle Bros además, mandaban con su software unos simpáticos carteles que contenían las direcciones de memoria importantes en la Apple ][, como el "Peeks, Pokes, & Pointers". La companía con el tiempo publicó un libro que se llamaba Big Tip Book, conteniendo todo género de consejos y ayudas para los aficionados a la Apple ][. Se publicó también el Tip Disk. Para esde entonces, a todo esto, muchas empresas protegían sus programas. Beagle Bros indicaba -con orgullo- que todo su software no estaba protegido contra copia, cosa que en realidad era una novedad en su época.

Cuando la Apple IIgs fue preentada comercialmente, la primera compañía que sacó software para esta computadora fue Beagle Bros, con el Platinum Paint y BeagleWrite GS, los cuales se consideran dos de los mejores programas de esa plataforma.

Tiempo después, Beagle Bros captó más adeptos cuando produjo programas agregados, utilerías pues, para el programa de Apple, AppleWorks. E primero fue un generado de macro instrucciones, llamado MacroWorks, escrito por Randy Brandt. Por su parte Alan Bird se dio cuenta que se podía crear un API para AppleWorks y se puso bajo una serie llamada TimeOut. Poco después, los programadores de TimeOut Alan Bird, Randy Brandt y Rob Renstrom se fueron a Claris, para desarrollar AppleWorks 3.0 y el propio API que ellos crearon se convirtió en parte de la versión 4.0 de AppleWorks (creado por Randy Brandt y Dan Verkade, y publicado por Quality Computers). Eventualmente el API de TimeOut se hizo público y nacieron muchas aplicaciones TimeOut que no venían directamente de los Beagle Bros.

El fin de una era llegó en 1991, cuando el nuevo dueño de Beagle Bros, Mark Simonsen, licenció la línea de los Beagle Bros a Quality Computers. Esta empresa fue después vendida y hoy día desapareció todo lo que correspondía a los originales Beagle Bros. No obstante, mucho de sus "clásicos" se pusieron en el dominio público a mediados de los noventas, incluyendo sus primeros programas y juegos. La compañía en algún momento sacó un par de utilerías para Mac y PC, pero con poco éxito. De hecho, BeagleWorks para Mac, fue licenciado a WordPerfect en 1992 y se convirtió en WordPerfect Works. Este producto se descontinuó cuando WordPerfect fue adquirido por Novell.

Muchos de los programadores de Beagle Bros continuaron involucrados en la industria del software. Por ejemplo Joe Holt, es uno de los autores del iMovie. Alan Bird ha trabajado para Eudora y fue el autor del programa OneClick para la Mac. Randy Brandt creó el Online Army Knife, un corrector ortográfico para Macintosh y siguió publicando utilerías para los productos AppleWorks a través de su empresa JEM Software. Mark Munz creó Deja ][, el cual permite correr AppleWorks bajo Mac OS X. El fundador de la compañía, Bert Kersey, empezó una empresa de trenes en miniatura poco después de haber vendido Beagle Bros, manteniendo el mismo estilo que le dio fama a su empresa de software. Ahora está retirado y vive en Fallbrook, California, con su esposa Sharon y un patio trasero lleno de búhos.

Pero tal vez el aspecto más memorable de Beagle Bros era su diseño gráfico, como del siglo 19. Mientras que otros buscaban un estilo que mostrara que estaban en la modernidad, Beagle Bros cultivaba la nostalgia, manteniendo su misión de crear software para los poco experimentados, para quienes aman aprender y jugar.



El humor permeó en los productos de Beagle Bros, incluso en las etiquetas de advertencia sobre cómo cuidar los discos de 5.25 pulgadas. A diferencia de otras advertencias sobre imanes, agua o altas temperaturas, que podrían dañar los diskettes, los iconos de advertencia de los Beagle Bros indicaban no usar los diskettes como papalotes, o doblarlos como aviones de papel o alimentar cocodrilos con ellos.

Otro detalle eran los "two-liners", programas en dos líneas que en los anuncios de Beagle Bros aparecían. Cada coomunicación en los medios impresos, en los anuncios de su software, venían acompañados con programas de dos líneas. Al principio los escribio el propio Kersey pero más adelante incluso puso programas escritos por los propios aficionados.

He aquí algunas imágenes de sus programas, sus carteles, etc. En mi opinión, Bert Kersey fue uno de los primeros que se dio cuenta de lo que ahora decidí llamar "programación lúdica". 




Monday, May 23, 2011

De la eficiencia en cómputo



Han pasado ya algunos años, por no decir muchos, desde que empecé a usar computadoras. Mi primera máquina fue una Apple ][ y ahí hice mis pininos, primero en el Applesoft Basic y más adelante en el UCSD Pascal. Cabe recordar que una computadora de los años ochenta tenía unos 128K de memoria RAM y unidades de discos flexibles. Ni pensar en discos duros. De hecho, me tocó ver uno, para un sistema de precios unitarios, que era cvomo de 5 megabytes y que, para usarse con la Apple ][, el disco estaba dividido en un sistema de discos flexibles virtuales, que el sistema operativo DOS 3.3, podía entender entonces.


Cuando se tenían estos sistemas, estábamos limitados a unos 70K por lado del disco. Si voltéabamos el disco flexible (floppy) y le hacíamos una muesca en un borde, podíamos duplicar la cantidad de información a guardar, aunque el fabricante de los diskettes no recomendaba esta práctica. Igualmente, al tener solamente 128K de RAM, teníamos espacio reducido para nuestros programas. Si usábamos el intérprete de Applesoft Basic entonces estaríamos hablando de unos 48K para programas, porque los 128K no podían usarse más que en dos mapas alternativos de memoria por la forma en que el procesador accedía a la memoria. Por ello, en Applesoft Basic se seguía un esquema que se usó mucho en los primeros sistemas con lenguaje BASIC, el cual lo que hacía era "tokenizar" cada palabra reservada del lenguaje, para así ahorrar bytes, que estaban tan escasos en ese tiempo. Así, la instrucción PRINT, por ejemplo, se traducía a un sólo número hexadecimal. Si queríamos ver el listado del programa en memoria, éste se desplegaba destokenizando, valga la expresión, cada token y el programador veía su código fuente.

En términos de hardware y software, por ejemplo, la Apple ][ tenía su sistema operativo en un diskette de 70K. Increíble pensar que se podía tener un sistema operativo en tan poca memoria. Pues bien, como desde luego esta pieza de software era la más importante de la Apple ][, me hice de un libro que explicaba lo que pasaba dentro del sistema: Beneath Apple DOS. Hallé, cosa notable, que los ingenieros de software de Apple habían decidido poner el sistema a la mitad del disco. Si éste tenía 36 tracks, se cargaba éste en el track 18. Sonaba extraño. ¿Para qué? la respuesta es notable: si el cargador se pone a la mitad del disco, la cabeza lectora tiene que caminar máximo la mitad de la distancia para hallar el track deseado.  Obsérvese pues cómo se buscaba optimizar hasta en estos detalles.

Con el tiempo y los megas, gigas y teras, que ya están con nosotros, las cosas cambiaron radicalmente. Cualquier computadora casera tiene al menos dos gigabytes de memoria, y ello hace que la optimización y la eficiencia pierda sentido.

Ahora nadie piensa realmente en este tema. Los compiladores ya no son tan cuidadosos para ahorrar memoria. Los procesadores de texto han hecho crecer los documentos porque ahora se les añadetodo género de tags y marcas para identificar tipos de letra, tamaños, formato, etc. Simplemente un archivo que contenga la frase "Hello world!", ocupa  24064 bytes, cosa que vendría ser la tercera parte de un diskette de Apple ][.

Ahora la eficiencia, creo yo, se considera desde otro enfoque. Ahora se trata de ser muy rápido en todo, aunque para ello necesitemos usar mucha memoria. Los programadores sabemos que no se puede tener un programa muy rápido que use poca memoria, a mayor rapidez de una cosa, más recursos para que esto ocurra. En ese sentido la computación es muy ética. No hay una relación de ganar ganar entre velocidad de proceso y uso de poca memoria.

Desde luego que a pesar de que los sistemas modernos no hacen énfasis en lo que se refiere a optimización, las herramientas de programación insisten en usar esquemas dinámicos de memoria. Apartar usando un arreglo demasiada memoria ya no es una práctica adecuada. Ahora lo que se hace es que el sistema operatiuvo otorga memoria a los procesos que la están pidiendo. Da bloques de memoria, no toda, a alguna aplicación. Si ésta requiere más, buscará darle más. De esta manera se optimizan ahora las cosas, como previniendo de antemano, por software, de hacer las cosas bien, de usar de la mejor manera losa recursos.

Como sea, creo que no estaría de más que se pensara de pronto en optimización. Aunque sobre memoria, ¿por qué no hacer las cosas un poco mejor dentro de la computadora?