Funciones en Oregano!

Luego de una semana agitada en la facultad necesitaba algo para relajar la mente, ¿y qué tarea doméstica puede ser mejor para ello que programar ? 🙂

Hace ya varias semanas había recibido una consultar sobre como plotear diferencias de potencias entre dos nodos, y la respuesta que tuve que dar fue «no se puede». El problema principal es que GNU Cap no lo soporta, NgSpice creo que sí, aunque nunca he probado, y eso limitaba. Es por eso que decidí agregar funciones para graficar.

La operatoria es simple, se simula el circuito, con tantas puntas de prueba como se quiera, y luego en el gráfico se agregan funciones. Por ahora solo implementé (hackeado en el código) la resta, para poder hacer diferencias de potencial. El resultado se puede ver a continuación :

Funciones !!

No me he puesto a analizar si los resultados son coherentes, pero no es algo que me preocupe a esta hora de la noche, lo importante es que funcione :-D. Por lo menos, las gráficas de v(1)-v(2) y v(2)-v(1) son simétricas respecto de X y el resultado se ve coherente.

Lo que se intentó simular fue como varía la tensión en C1, el de arriba. Hay dos C1 ya que apareció un lindo bug de numeración en la edición del esquemático 🙂

Cualquier comentario acerca de la validez del resultado será bienvenida. También será de utilidad si alguien compara el resultado con OrCad o algún otro producto privativo,

Por último y me voy a dormir :-D, a los electrónicos les pido que me instruyan en que funciones son útiles, me resuena en la cabeza la palabra «transferencia», pero no estoy muy seguro de a que se refiere, y más aún, que funciones para cada tipo de análisis (AC, DC, Fourier, Tiempo) son utilizadas cuando se analizan circuitos.

En cuando complete medianamente el código, el parche será publicado.

DarcsWeb

Hoy por la mañana Alberto nos sorprendió con uno de sus nuevo chiches. Cansado de la fea interfaz web de darcs, decidió hacer una propia. El resultado de eso es DarcsWeb (seguro que a Alberto no le va a gustar que capitalize el nombre, pero es más cool).

Para la estética uso de modelo a GitWeb, un browser del controlador de versiones Git, utilizado para el desarrollo del kernel Linux, que empezaron a usar cuando dejaron BitKeeper.

La elección fue realmente muy buena, ya que la interfaz es muy prolija y estéticamente agradable.

Aún no ha liberado el código, pues quiere primero arreglar un par de problemas. El principal objetivo va a ser soportar múltiples repositorios (la versión actual deja configurar uno solo).

Los screenshots obligados, comparando darcs.cgi y darcsweb.cgi :

En cuanto esté listo para ver la luz, será cuestión de hacer el paquetito obligado para Ubuntu 🙂

Soporte para Cairo 0.5

Hoy en los entremedios de estudio (esta semana estoy en el horno con la facultad) estuve trabajando en dar soporte a cairo 0.5. No fue difícil, en la mayoría de los casos con reemplazar nombres de funciones alcanzó.

Lo más complejo fue sin duda el manejo de superficies. Ahora cuando se crea un contexto cairo se le debe pasar la superficie sobre la cual dibujar (cambio muy lógico por cierto). Como usamos el backend Xlib, necesitamos 3 datos : Drawable, Display y Visual, cosas nada triviales de obtener un widget Gtk. En la documentación de Gdk está todo, pero costó encontrarlo. El resultado resumido a continuación :

  GdkDrawable* real_drawable;
  Display* dpy;
  Drawable drawable;
  gint x_off, y_off;
  gint width, height;
  gdk_window_get_internal_paint_info (window, &real_drawable, &x_off, &y_off);
  dpy = gdk_x11_drawable_get_xdisplay (real_drawable);
  drawable = gdk_x11_drawable_get_xid (real_drawable);
  gdk_drawable_get_size (real_drawable, &width, &height);
  target = cairo_xlib_surface_create (dpy, drawable,
      gdk_x11_visual_get_xvisual (gdk_drawable_get_visual (real_drawable)),
      width,
      height);
  cr = cairo_create (target);

Lindo, no?. El parche para probar está disponible acá (para aplicarlo : darcs apply oregano-cairo-0.5.patch). No lo voy a incluir en el repositorio hasta que Cairo 0.5 se empiece a ver estable en las distros. Por ahora solo lo he visto en Ubuntu Breezy (que es donde hice el trabajo).

Si alguien puede probarlo, se lo agradeceré. Aclaro que saque el exportar a PNG, aunque sería trivial rehacerlo.

Más PacMan!!

Si amigos!, mientras trato de hacer el código algo presentable, tengo nuevas novedades. Hoy Alan me hizo notar que mi juego estaba adaptado para celulares demasiados groso (pantallas de 240×240 pixels). Claro que no es la realidad de la mayoría.

Por lo tanto, me tuve que poner a implementar window-scrolling, y para que quede como a mi me gustaba, lo hice desde 0, logrando algo que realmente me gusta, tanto en código como visualmente.

Antes de liberarlo, les dejo un lindo swf mostrando como se ve en los distintos modelos, les voy a visando, son 4Mb.

UPDATE: Ya puse el código fuente disponible en mi repositorio de darcs. Para bajarlo (si tenés darcs instalado) : darcs get http://www.gazer.com.ar/repos/PacMan , Si no tenes darcs, no existís 🙂

Juegos con J2ME

PacMan!Ya he repetido una y otra vez lo que opino de Java, pero también en el último tiempo vengo diciendo que veía con buenos ojos J2ME, la edición para dispositivos móviles de esta plataforma. Mi interés inicial es hacer juegos con ella, por lo que en el último mes vengo lentamente avanzando en un juego totalmente innovador, nuevo y de concepto radical : un PacMan 🙂

La primera aproximación del juego es funcional, tenemos a PacMan que se mueve, detecta choques, come pastillitas y todo eso. También tenemos unos fantasmas medio lelos, que se mueven de manera pseduo-aleatoria, con una simple máquina de estados finidos.

Claro que el código apesta, es una mugre que fui toquetando a lo largo de un mes, mientras iba de tutorial en tutorial, pasando por la documentación de la API, pero se puede mejorar sin mucho esfuerzo. A nivel de implementación gráfico también apesta, ya que no uso backbuffering, lo que me obliga a redibujar la totalidad de la pantalla en cada iteración.

En fin, es un proyecto que me está gustando hacer, la plataforma está muy bien pensada (no así J2SE :-)) y creo que tiene un futuro en mis desarrollos. Lo interesante es toda la movida que se está lanzando sobre APIs 3D, que cada día más modelos de celulares soportan una calidad gráfica 3D que sorprende.

La imagen que adjunto es un screenshot del emulador de Sun con el juego en acción.

Oregano 0.40.4

Hace unos momentos he liberado Oregano 0.40.4, una versión que pretende arreglar un problema de ploteo con Cairo 0.4.

También se ha includio un arreglo faltante para dar soporte completo a IA64 que se había escapado en las últimas pruebas.

Otro cambio es que se han sacado los parámetros de DEPRECATED por default, para que compile ocn Gnome > 2.8, hasta que, eventualmente, se porte a Gnome 2.10 (2.12 es un lindo número :-).

OpenUsability

Leyendo la web de Escritorio Ya! me encontré con una noticia sobre un sitio llamado Open Usability. La idea de esta gente, es marcar pautas, agrupar expertos en usabilidad y ayudar a los proyectos a crecer mejorando su capacidad de interacción con el usuario.

En una vista rápida, principalmente se han sumado varios proyectos de KDE (que realmente lo necesitan :-)).

Podemos encontrar toda clase de información : guías de diseño de UI, artículos, especificaciones, etc. Varios de los enlaces llevan a los sitios de Sun, IBM y Apple, fuentes, en general, muy ricas de documentación en este campo, sobre todo las de Apple (que le llevan años a todo el resto en los que respecta a usabilidad).

Un proyeto que, de funcionar, lograré mejorar las aplicaciones que usamos todos los días. Esperemos que otros proyectos lo tomen en cuenta, sobre todos aquellos que todavía no entienden lo que significa UI 🙂

Ubuntu Update

Luego de varios días con los repositorios rotos, Ubuntu Breeze (como se llama la nueva versión de desarrollo) volvió a la vida. La novedad con la que me encontré es que han creado paquetes para Mono 1.1.X y Gtk# 1.9.x, con lo que ahora puedo probar todo eso que no podía antes, por no querer compilar Mono desde los fuentes, o sea : Beagle e iFolder.

También compilé Mono UML, una herramienta CASE para generar diagramas UML y luego código (C# por ahora si mal no recuerdo), entre otras cosas. Si bien está un poco verde, los diagramas son 1000 veces más lindos que los que hace Dia. Pueden ver como compilarlo en este enlace.

Mono UML

Sin duda Ubuntu crece y crece para el lado correcto cada día ….

Pero, para tener un poco de variedad, no le pierdan la vista a Foresight Linux, una distro que quiere pisar fuerte. Seguramente haré uno de mis famosos review’s cuando termines los actuales 🙂

WordPress Quote Plugin

Hoy organizando los comentario de mi blog, encontré que algunos quoteaban partes de otros comentarios usando el «>», y se perdía un poco de vista las cosas. Es por eso que me puse a hacer un simple plugin de WordPress para agregar un tag «quote» que pueda ser utilizado.

El resultado está acá. Solo deben guardarlo en el directorio wp-content/plugins y luego activarlo desde el manejador de plugins de WordPress.

Para ajustar el estilo, solo deben agregar a su hoja de estilo un .quote definiendo como desean que se vea.

XML HTTP con JavaScript

En los últimos meses he tenido que trabajar mucho con Javascript para poder hacer las pantallas del sistema que desarrollo en el trabajo. La idea siempre es tener la menor cantidad de recargas de página posible, por lo menos visibles para el usuario.

Fue por eso que en un momento necesité el find as you type en una caja de texto, y buscando como lo hacía Google pude implementarlo sin problemas.

Luego necesité un poco más, así que me puse a investigar. La solución no es 100% portable, pero solo me interesaba que funcione con IE y Firefox.

Lo primero que vamos a necesitar es el objeto que se encarga de la comunicación. Como varía con el navegador, crearemos una función :

function getXMLHTTP(){
  var A=null;
  try{
    A=new ActiveXObject("Msxml2.XMLHTTP")
  }catch(e){
    try{
      A=new ActiveXObject("Microsoft.XMLHTTP")
    } catch(oc){
      A=null
    }
  }
  if(!A && typeof XMLHttpRequest != "undefined") {
    A=new XMLHttpRequest()
  }
  if (!A) {
    alert ('No XML-HTTP Capable Browser!');
  }
  return A
}

La función va probando crear el objeto XML HTTP. Si fallan todos los métodos, lanza una alerta y retorna NULL.

Para obtener datos de un script remoto es muy simple, el siguiente código lo muestra :

function saludar () {
  nombre = document.getElementById('nombre');
 _xml = getXMLHTTP();
  if (_xml) {
    _xml.open("GET", "/saludar.php?nombre="+nombre.value, true);
    _xml.onreadystatechange=function() {
      if(_xml.readyState==4&&_xml.responseText) {
        if(_xml.responseText.charAt(0)!="< "){
          eval(_xml.responseText)
        }
      }
    }
    _xml.send(null);
  } else {
    alert('XML HTTP NOT SUPPORTED');
  }
}

Bien, analicemos lo que hace nuestra función. Lo primero es obtener el INPUT del formulario donde el usuario ingresa el nombre (estoy suponiendo que existe). Luego de obtener el objeto XML HTTP y verificar que existe, abrimos una conexión GET al URL especificado (tengan en cuenta que esto todavía no realiza el GET, solo setea lo que vamos a hacer).

Lo importante viene ahora en _xml.onreadystatechange=function() . Lo que hacemos es asignar al slot onreadystatechange una función que se encarga de recibir los datos que llegan. En nuestro caso, la función verifica el estado, para ver si fue exitoso, y saltea las líneas que comienzan con «< «, quedandose solo con el contenido plano, el cual pasa a la función eval que ejecuta ese string como si fuera código JavaScript.

Por último, para realizar la acción, llamamos al método Send.

Por el lado de PHP, necesitamos el script saludar.php :

  echo "alert('Hola ".$_REQUEST['nombre'].", como va?');";

Pueden probar este ejemplo acá. La verdad es que da para jugar mucho. También les recomiendo el código de Google para hacer el autocomplete, que es muy ingenioso (pueden encontrarlo googleando en varios blogs).