猫の部屋: Bienvenido a la habitación del gato

Bienvenido a la habitación del gato

Archivos de la categoría ‘Programación’

Adios Java 1.4

Publicado por abunaineko en Diciembre 10, 2008

Sun ha anunciado que dejará de lanzar actualizaciones y correcciones de bugs para Java SE 1.4.2
Esto desde Octubre de este año (2008), es buen momento para comenzar a migrar muchas aplicaciones que se han ido quedando en el pasado utilizando siempre la misma versión de Java, muy común en las aplicaciones no open source y de varias empresas que tienen pánico a las nuevas tecnologías.
¡Adios Java 1.4!

Publicado en Programación, Software | Deja un Comentario »

GnomeArt Screenlet

Publicado por abunaineko en Septiembre 16, 2008

De entre todas las curiosidades que podemos agregar a nuestro linux (en gnome) surgieron algunos artefactos que se pueden agregar al escritorio similares a los widgets de Mac.  Entre estos artefactos se encuentran un conjunto de programas llamados Screenlets, aplicaciones escritas en python que dan un buen aspecto visual al escritorio además de brindarnos algunas funcionalidades adicionales de gran utilidad.

Una que en particular me agradó bastante es el screenlet de GnomeArt, que se muestra en la imagen anterior en la parte derecha del escritorio hasta arriba. Este screenlet muestra una imagen descargada de http://art.gnome.org/ y la utiliza como fondo de escritorio, podemos configurarla para que cambie cada determinado tiempo y además nos da la posibilidad de utilizar imágenes de nuestro disco duro en vez de las de gnomeart.

No conozco mucho sobre el lenguaje de programación python, sin embargo me aventuré a hacer unas modificaciones a este screenlet, pues carecía de un par de funcionalidades que me parecieron importantes:
- Cuando seleccionas una carpeta como origen de imágenes no toma en cuenta las imágenes de los subdirectorios contenidos en la carpeta.
- No cuenta con un modo en el que aleatoriamente tome imágenes de la carpeta especificada y de gnomeart.
Para cubrir los puntos antes mencionados hice algunas modificaciones para incluir un par de opciones con las cuales podremos seleccionar si se desea explorar subcarpetas y un modo mixto para ver imágenes locales y de gnomeart.

Es un screenlet bastante práctico con el cual siempre podremos contar con un fondo de escritorio diferente.
El screenlet original pueden descargarla desde aquí
Y si quieren la versión modificada que incluye estas dos funcionalidades antes mencionadas pueden descargarla en la siguiente liga:
GnomeArt Screenlet

Espero les sea de utilidad

Publicado en Entretenimiento, Linux, Programación | Deja un Comentario »

AJAX usando JQuery y Struts

Publicado por abunaineko en Septiembre 15, 2008

Hace ya un buen rato que no escribo nada por falta de tiempo y exceso de trabajo. Esta vez me toca escribir algo de programación para quienes requieran un ejemplo rápido de cómo comenzar a incluir AJAX en su aplicación.
Decidí usar Struts (1.x) en este ejemplo ya que muchas aplicaciones existentes usan este framework y es muy comun que en el mantenimiento de estas aplicaciones se desee agregar alguna funcionalidad que utilice AJAX. Por otro lado el uso de la biblioteca JQuery es una forma rápida y eficiente de escribir código Javascript, pues nos evitamos de complicaciones innecesarias excribiendo código javascript para tareas comunes, además de que es muy fácil de entender y aprender.

Dejo el ejemplo de AJAX en el siguiente archivo zip que es un proyecto Web para NetBeans 6.1, espero que les sea de utilidad.

Pueden descargar el archivo desde aquí: Ejemplo de Ajax
Este archivo está alojado con el servicio de http://www.sendspace.com

Brevemente explicaré aquí los archivos más importantes, comenzaremos con el archivo de configuración de struts:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

<struts-config>
    <form-beans>

    </form-beans>

    <global-exceptions>

    </global-exceptions>

    <global-forwards>
        <forward name="welcome"  path="/Welcome.do"/>
    </global-forwards>

    <action-mappings>
        <action path="/Welcome" forward="/welcomeStruts.jsp"/>
        <action path="/saludoAjax" type="corp.neko.ajaxdemo.struts.SaludoAjax"/>
    </action-mappings>

    <controller processorClass="org.apache.struts.tiles.TilesRequestProcessor"/>

    <message-resources parameter="corp/neko/ajaxdemo/struts/ApplicationResource"/>    

    <plug-in className="org.apache.struts.tiles.TilesPlugin" >
        <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" />
        <set-property property="moduleAware" value="true" />
    </plug-in>

    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
        <set-property
            property="pathnames"
            value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
    </plug-in>

</struts-config>

- En la línea 21 definimos un redireccionamiento para la ruta /Welcome.do que va al archivo jsp que utilizaremos como ejemplo.
- En la línea 22 asociamos una acción para la ruta /SaludoAjax.do definida en la clase “corp.neko.ajaxdemo.struts.SaludoAjax”. Es destacable que no estamos definiendo ningún tipo de redireccionamiento, es decir, la acción se va a realizar sin ningún tipo de redirección una vez que esta se ha ejecutado.

Ahora analicemos la clase “corp.neko.ajaxdemo.struts.SaludoAjax” que realizará la acción:

package corp.neko.ajaxdemo.struts;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

/**
 *
 * @author abunai
 */
public class SaludoAjax extends Action{

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response){

        response.setContentType("text/xml");
        response.setHeader("Cache-Control", "no-cache");
        String nombre = request.getParameter("nombre");
        try {
            PrintWriter writer = response.getWriter();
            writer.print("<xml><respuesta><![CDATA[¡Hola "+nombre+"! Este es un ejemplo de AJAX]]></respuesta></xml>");
            writer.flush();
            writer.close();
        } catch (IOException ex) {
            Logger.getLogger(SaludoAjax.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }

}

La idea de esta clase es generar una respuesta de tipo xml recibiendo algunos parámetros vía “Request”.
- En la línea 23 y 24 tomamos el objeto de tipo HttpServletResponse que es pasado como parámetro al método execute y lo preparamos para dar una salida de tipo xml. Es muy importante prevenir que los exploradores guarden en caché el recurso, pues nuestro xml cambiará de acuerdo a los parámetros que se envíen en la petición.
- En las líneas 27-30 generamos la salida xml, hay que destacar que en la respuesta estamos poniendo un CDATA, esto para evitar cualquier problema de interepretación de caracteres reservados y especiales que pudiese contener nuestra respuesta.

Finalmente analizaremos nuestra página de prueba welcomeStruts.jsp:

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>

<html:html locale="true">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title><bean:message key="welcome.title"/></title>
        <script type="text/javascript" src="js/jquery-1.2.6.js"></script>
        <script type="text/javascript">
            $(function(){
                $("#usuario").blur(validaUsuario);
            });

            function validaUsuario(){
                var name = $("#usuario").val();
                $.get("/AjaxExample/saludoAjax.do", { nombre: name },
                    preparaRespuesta
                );
            }

            function preparaRespuesta(data){
                        var respuesta = $(data).find("respuesta").text();
                        $("#respuesta").hide();
                        $("#respuesta").empty();
                        $("#respuesta").append(respuesta);
                        $("#respuesta").show("slow");
                    }
        </script>
        <html:base/>
    </head>
    <body style="background-color: white">

        <logic:notPresent name="org.apache.struts.action.MESSAGE" scope="application">
            <div  style="color: red">
                ERROR:  Application resources not loaded -- check servlet container
                logs for error messages.
            </div>
        </logic:notPresent>

        <h3><bean:message key="welcome.heading"/></h3>
        <p><bean:message key="welcome.message"/></p>
        <input name="usuario" id="usuario" type="text">

        <div id="respuesta"></div>

    </body>
</html:html>

- En las líneas 14-16 declaramos una función anónima cuyo contenido se ejecutará antes de cargar la página, es decir este es el lugar indicado para escribir toda la funcionalidad requerida por el documento antes de comenzar a interactuar con él.
- En la línea 15 destacan dos cosas, la primera es la forma de hacer referencia a un componente de la página utilizando el id: “#componenteX”, que en este caso hace referencia al componente de entrada de texto con id “usuario”. La segunda es que se aplica una función al elemento de acuerdo al evento que se especifique, en este caso “blur”.
- En las líneas 18-23 se define la función que se ejecutará en el evento “blur”, en la línea 19 se recupera el valor que contenga el elemento “usuario”. Las líneas 20-22 son la llamada Ajax a /saludoAjax.do, se especifica que la llamada va a contener un parámetro de nombre “nombre” y cuyo valor es el de la variable “name”. Finalmente se especifica un tercer parámetro, el cual es la función que se ejecutará una vez recibida la respuesta de la llamada Ajax.
- En las líneas 25-31 definimos la función que se ejecutará con el resultado de la llamada a /SaludoAjax.do la cual recibe como parámetro una variable “data” que es el xml que generamos en el método action. En la línea 26 obtenemos el valor de “respuesta” utilizando el método “find” de JQuery. En las líneas 27-31 se manipula el elemento div con id “respuesta” para insertar y mostrar el contenido obtenido en 26.

Publicado en Programación | 12 Comentarios »

ARToolkit y Open Scene Graph

Publicado por abunaineko en Enero 21, 2007

Desde hace ya varios días está disponible una nueva versión de ARToolkit, este es uno de los toolkits mas populares para realizar aplicaciones de realidad aumentada que nos proporciona un algoritmo de detección de marcadores y posicionamiento de los objetos en base al patrón detectado, con un mínimo costo, pues básicamente necesitamos solo una webcam y una computadora mas o menos reciente.
El ARToolkit original nos dejaba trabajar nuestros objetos virtuales utilizando OpenGL, esta nueva versión denominada OSGART nos permite hacerlo mediante un Scene Graph, en este caso Open Scene Graph, brindándonos todas las ventajas que tiene el uso de un Scene Graph además de las facilidades proporcionadas por OSG, como el uso de CG Shaders que proporcionan efectos visuales impresionantes, para obtener el mayor realismo sobre los objetos que queremos representar.
Aquí está el link para la página oficial de este toolkit:
http://www.artoolworks.com/products/osgart/

Publicado en Programación | Deja un Comentario »

OpenSG y ODE

Publicado por abunaineko en Enero 10, 2007

Después de un rato de batallar un poco con ODE, he conseguido al fín cargar una escena en OpenSG y hacer la detección de colisiones usando ODE.
La idea es la siguiente por si a alguien le sirve:
Definir geometrías para cada uno de los objetos de la escena y situarlas en la respectiva posición del modelo.
Definir una geometría y un cuerpo de esfera para la cámara.
Obtener la posición del cuerpo de la esfera y pasarlo a la transformación de openSG para la cámara, sin la rotación.
Aumentar la fuerza ejercida sobre el cuerpo de la esfera de la cámara para la navegación.
Espero que esto le sirva a alguien.

Publicado en Programación | Deja un Comentario »