Posts

El archivo está en formato jpg y se copia dentro de src. A partir de ahí el empaquetador lo guarda y desde el programa le hacemos referencia con una barra por delante.

/*
 * Spongebob
 * Midlet que muestra una imagen
 */
package hello;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;

public class Spongebob extends MIDlet implements CommandListener {
    private Command exitCommand;
    private Display pantalla;
    private ImageCanvas screen;

    public Spongebob () {
        // Tomamos la pantalla
       pantalla = Display.getDisplay(this);

       // Creamos el comando para salir
        exitCommand = new Command("Exit", Command.EXIT, 2);

        // Asociamos a Screen nuestro Canvas especial
        screen = new ImageCanvas();

        // Establecemos el comando para salir
        screen.addCommand(exitCommand);
        screen.setCommandListener(this);
    }

    /**
     * startApp
     * se ejecuta al inicio de la aplicación
     */
    public void startApp() throws MIDletStateChangeException {
        // Establecemos el formulario en la pantalla
        pantalla.setCurrent(screen);
    }

    /**
     * pauseApp
     * se ejecuta en caso de pausar la aplicación
     */
    public void pauseApp() {
    }

    /**
     * destroyApp
     * se ejecuta al terminar la aplicación
     */
    public void destroyApp(boolean unconditional) {
    }

    public void commandAction(Command c, Displayable s) {
      if (c == exitCommand) {
         destroyApp(false);
          notifyDestroyed();
     }
    }
}

class ImageCanvas extends Canvas  {

    // Dentro de canvas debe existir esta función
    public void paint(Graphics g) {
        Image img = null;

        // Pantalla blanca
        g.setColor(255, 255, 255); // White
        //g.fillRect(0, 0, getWidth(), getHeight());
        try {
        // Creamos la imagen
            // Atención, el fichero de imagen está en src
            // y así se lo indico al interfaz del sdk
        img = Image.createImage("/bob.jpg");
        } catch (IOException ioex) {
            System.err.println("Error loading image: " + ioex.getMessage());
        }

        // Metemos la imagen
        g.drawImage(img, getWidth() / 2, getHeight() / 2,
        Graphics.HCENTER | Graphics.VCENTER);

        // Preparamos la fuente
        Font f = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD, Font.SIZE_MEDIUM);
        g.setFont(f);
        // Las letras en blanco...
        g.setColor(255, 255, 255);
        g.drawString("Spongebob rulez", getWidth() / 2, 0,Graphics.HCENTER | Graphics.TOP);

    }
}


Un pequeño midlet que saca información básica del entorno de ejecución.

/*
 * SysInfo
 * Utilidad de ejemplo que aparece en libros viejos.
 * La hora no la saca bien.
 */

package hello;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.*;

public class SysInfo extends MIDlet implements CommandListener {
    private Command exitCommand;
    private Display pantalla;
    private Form formulario;

    /**
     * SysInfo
     * Constructor
     */
    public SysInfo() {
        // Tomamos la pantalla
       pantalla = Display.getDisplay(this);
        
       // Creamos el comando para salir
        exitCommand = new Command("Exit", Command.EXIT, 2);
        
        // Creamos el formulario principal
        formulario = new Form("SysInfo");


        // Sacamos la fecha actual
        Calendar calendar = Calendar.getInstance();

        // Un string con la fecha. La fecha del móvil sera 1.1.1970
        String fecha = calendar.getTime().toString();
        
        // Sacamos memoria total y disponible
        Runtime runtime = Runtime.getRuntime();
        String totalMem = Long.toString(runtime.totalMemory());
        String freeMem = Long.toString(runtime.freeMemory());
        //String alturaImagen = Integer.toString(pantalla.getBestImageHeight(0));

        // Más propiedades de pantalla
        String isColor = pantalla.isColor() ? "Sí" : "No";
        String numColors = Integer.toString(pantalla.numColors());

        // Creamos los StringItem y los metemos en el formulario
        formulario.append(new StringItem("", "Hora: " + fecha));
        formulario.append(new StringItem("", "Memoria total: " + totalMem));
        formulario.append(new StringItem("", "Memoria libre: " + freeMem));
        formulario.append(new StringItem("", "Color: " + isColor));
        formulario.append(new StringItem("", "nº de colores: " + numColors));
        //formulario.append(new StringItem("", "altura de imagen: " + alturaImagen));

        // Establecemos el comando de salida
        formulario.addCommand(exitCommand);
        formulario.setCommandListener(this);
}

    /**
     * startApp
     * se ejecuta al inicio de la aplicación
     */
    public void startApp() throws MIDletStateChangeException {
        // Establecemos el formulario en la pantalla
        pantalla.setCurrent(formulario);
    }

    /**
     * pauseApp
     * se ejecuta en caso de pausar la aplicación
     */
    public void pauseApp() {
    }

    /**
     * destroyApp
     * se ejecuta al terminar la aplicación
     */
    public void destroyApp(boolean unconditional) {
        pantalla.vibrate(5);
    }

    /**
     * commandAction
     * captura los comandos.
     */
    public void commandAction(Command c, Displayable s) {
        if (c == exitCommand) {
            destroyApp(false);
            notifyDestroyed();
        }
    }
}


Plantilla Midlet

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package hello;

import javax.microedition.midlet.*;

// lcdui lo necesitamos para Display y si usamos CommandListener
import javax.microedition.lcdui.*;

// Después de tomar el Display (se coge no se crea) podemos
// usar screens (múltiples). Form, TextBox y List son hijas de Screen

// Canvas sería como los Screens pero para gráficos

/**
 * @author luser
 * El CommandListener lo necesitamos para poder meter comandos
 * que interrumplan
 */
public class PrimerMidlet extends MIDlet implements CommandListener {
    
    private Command ordenSalida;
    private Display pantalla;
    private Form formulario;

    public PrimerMidlet ()
    {
        pantalla = Display.getDisplay(this);
        // Create the Exit command, la prioridad es 2, muy alta
        ordenSalida = new Command("Salir", Command.EXIT, 2);
        // Create the main screen form
        formulario = new Form("El primero");
        // Create a string item and add it to the screen
        StringItem strItem = new StringItem("Título", "pasa tron");
        formulario.append(strItem);

        // Esto sería usar un softbutton, es decir, una orden
        // que utilice botones concretos del dispositivo, que son pocos.
        // este tipo de comandos deben ser los más cruciales.
            // Set the Exit command
        formulario.addCommand(ordenSalida);
        formulario.setCommandListener(this);
    }
    public void startApp() {
        pantalla.setCurrent(formulario);
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }

        /**
     * commandAction
     * captura ordenes
     */
    public void commandAction (Command c, Displayable s) {
        if (c == ordenSalida) {
            // el false significa que el Midlet puede cancelar la orden
            destroyApp (false);
            // este avisa al gestor de aplicaciones del dispositivo que ya está.
            notifyDestroyed ();
        }
    }
}
 

Conversor de euros

package hello;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Conversor extends MIDlet implements CommandListener {

    private Command exitCommand; // The exit command
    private Command convertCommand; // The exit command
    private Display display;     // The display for this MIDlet
    private TextBox cajaTexto;

    public Conversor() {
        display = Display.getDisplay(this);
        exitCommand = new Command("Exit", Command.EXIT, 0);
        convertCommand = new Command("Convertir", Command.OK, 0);
    }


     /**
     * Pause, discontinue with the http tests
     */
    public void pauseApp () {
    }
    
    public void startApp() {
        cajaTexto = new TextBox("Inserta euros","0",20,0);

        cajaTexto.addCommand(exitCommand);
        cajaTexto.setCommandListener(this);

        cajaTexto.addCommand(convertCommand);
        cajaTexto.setCommandListener(this);

        display.setCurrent(cajaTexto);
    

    }

    public void destroyApp(boolean unconditional) {
    }

    public void commandAction(Command c, Displayable s) {
                double pesetas = 0;
                if (c == convertCommand)
                {
                    pesetas = Double.parseDouble(cajaTexto.getString()) * 166.386;
                    cajaTexto.setString("yeah: " + pesetas);
                }
                else if (c == exitCommand)
                {
                        destroyApp(false);
                        notifyDestroyed();
                }

    }

}
 


/**
 * HolaMundo.java
 * Ejemplo de Midlet j2me SDK 3.0
 * http://pello.info
 */


    

ANT, automatizando la compilación y empaquetado de aplicaciones

Ant sería el equivalente java para el make de c.

	<?xml version="1.0"?>
<!-- NOTA: Asegúrate de que el fichero lo editas en utf-8 -->
<!-- NOTA: conviene hacer clean y luego compilar -->
<!-- Para generar: ant [tarea] o ant -buildfile [fichero.xml] [tarea] -->
<project name="build.xml de ejemplo" default="compilar" basedir=".">
 
    <property name="dir.src" value="src"/>
    <property name="dir.build" value="build"/>
    <property name="dir.dist" value="dist"/>
 
    <!-- Genera los directorios de salida: ant preparar -->
    <target name="preparar" description="Crea los directorios">
        <mkdir dir="${dir.build}"/>
        <mkdir dir="${dir.dist}"/>
    </target>
 
    <!-- Elimina todo lo creado: ant clean -->
    <target name="clean" description="Elimina todos los ficheros generados">
        <delete dir="${dir.build}"/>
        <delete dir="${dir.dist}"/>
    </target>
 
    <!-- Compilación, primero hace la tarea preparar: ant compilar -->
    <target name="compilar" depends="preparar" description="Compilar todo.">
        <javac srcdir="${dir.src}" destdir="${dir.build}"/>
    </target>
 
    <!-- Genera un fichero jar, depende de la tarea compile: ant jar -->
    <target name="jar" depends="compilar" description="Genera un fichero jar en el directorio 'dist'.">
        <jar jarfile="${dir.dist}/proyecto.jar" basedir="${dir.build}"/>
    </target>
    
</project>


Al utilizar algún software de control de versiones tipo CVS o subversion o GIT este te crea unos directorios ocultos que no tienen porqué estar accesibles a todo el mundo en el caso de que el software esté colgado en internet. Podemos cargarnos esos directorios con un solo comando linux, aquí mostramos tres variantes, dos de ellas usando find. Hay más.



    

En linux usando sockets y la llamada dup se puede crear una especie de shell remoto de forma muy sencilla,

 

#include 
#include 
#include 


    

Bueno al menos habia que probar este combinado de tecnologias.
Los usuarios de Gmail ya habreis notado que tras la aparente sencillez del interfaz ese correo web subyace un entramado de llamadas que nuestro navegador hace al servidor por debajo de la mesa.

Efectivamente, olviden lo que habian aprendido hasta ahora. Los navegadores modernos son capaces de hacer peticiones a servidores web sin la tradicional recarga de la pagina. ¿Como es posible?
AJAX significa Asynchronous Javascript And XML, basicamente se trata de que los navegadores pueden hacer uso de un objeto de javascript (o un activeX) que puede hacer peticiones a los servidores web por lo bajini. Todo ello, combinado con la manipulacion de los elementos del documento HTML (DOM), y XML da lugar a la posibilidad de un dinamismo total en en lado del cliente.
Un ejemplo:
Hasta ahora en cualquier aplicacion web, si se producian cambios en la BBDD no se veian reflejados en el navegador hasta que no se recargaba la pagina. Con AJAX eso ha cambiado, ya que el navegador puede hacer consultas al margen de que se recargue o no la pagina y puede reflejar los cambios de forma en el navegador por ejemplo haciendo aparecer un bloque div.

Vale, dame un ejemplo simple
Ok, aqui van un par de ejemplos de peticiones AJAX dentro de un fichero llamado ajax.html 1. En el primero, helloDom, se hace una peticion GET y simplemente se muestra el resultado con un alert. 2. En el segundo, conversor, se hace una peticion POST mandando parametros y se muestra la respuesta en un alert.
En los dos casos la respuesta viene en formato XML, pero no se procesa ni nada, simplemente se vuelca el resultado.
Puedes descargar los ficheros aqui
O probar la ejecucion aqui
Este es el contenido de ajax.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" dir="ltr" lang="es">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>Ejemplo simple de Ajax, Asynchronous Javascript And XML : hello dom</title>
 <script type="text/javascript">
 /*<![CDATA[*/


    

Este es un ejemplo simple de acceso a una BBDD Mysql con el driver 3, el 5 es beta y no está documentada la forma de conectar (o al menos no la encuentro).

Jo, siempre se me olvidan los dos pasos.


    

subscribe via RSS