Mostrando entradas con la etiqueta Programming. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programming. Mostrar todas las entradas

3 de octubre de 2008

Primeras experiencias con AJAX...

La verdad es que llevo bastante poco mirando cosas acerca de AJAX, empapándome de JavaScript (lenguaje harto complicado por su alto nivel de sofisticación y encapsulamiento) para intentar llegar a dominarlo en cierto modo, y que no se me haga tan pesado mirar código ajeno que, a veces, para una cosa muy simple, cierto coders se empeñan en complicar, quizás para probarse a sí mismo de lo que son capaces de hacer, pero lo cierto que es este lenguaje se puede complicar tanto como nos podemos imaginar: funciones embebidas en funciones, asignar valores declarando funciones implícitamente que llaman a otras funciones... Llega un momento en que, o lo tienes muy claro y el código es tuyo, o realmente te pierdes en una maraña de variables funciones y valores que, al final, no sabes de dónde viene ni a dónde va.

La verdad es que con JavaScript puedes hacer casi cualquier cosa, pues tiene la potencialidad de Java, pues es un lenguaje interpretado, pero a su vez no se le parece en nada pues, por ejemplo, sólo tiene 2 tipos de datos: primitivos y referenciados.

Los tipos de datos primitivos son los que todos los programadores conocemos, pero existe una diferencia: todos se instancia con la palabra reservada var, y es el intérprete quien decide qué tipos de dato es, por lo que te olvidas un poco de la compatibilidad entre variables, pues es transparente al programador.

Y los tipos de datos referenciados son aquellos, como habréis ya supuesto los que sabéis de estas cosas (para los que no va la explicación, evidentemente), que hacer referencia a objetos creados por el propio programador y toman su valor en función de los métodos que tenga implementados y de las llamada a los mismos (referencia).

En fin, que la finalidad de este post es recomendar la lectura de varios libros/cuadernos, que a mi me han resuelto muchas dudas y me han ayudado a comprender mejor cómo usar cada cosa y cuándo hacerlo. Ahí va la listas:

  • PC-Cuadernos:

    • Iniciación a JavaScript

    • JavaScript, nivel 2

    • PHP 5

    • AJAX, un juego de niños: crea tus propias aplicaciones web

    • Introducción a XML


  • Editorial ANAYA:

    • Profesional AJAX (Nicholar C. Zackas, Jeremy McPeak, Joe Fawcett)

Espero que os sirvan, como han servido conmigo.

Saludos de viernes con sabor amargo a webs sin terminar y mil llamadas que responder.

FoN

7 de junio de 2008

Comunicación por bluetoth entre un terminal móvil y un GPS bluetooth en J2ME...

A continuación, y como muestra de frikismo, os presento el código asociado a la comunicación bluetooth entre un terminal móvil y un GPS.

Funciona, os lo aseguro. Si no me creéis, probadlo. Mola.

/* TITULO DE LA APLICACIÓN: practicaGPS
AUTOR: FoN
DESCRIPCIÓN: Generación de una clase que va a crear una conexión bluetooth con un GPS bluetooth y éste le va a responder
con la posición geográfica en que nos encontramos (latitud, elevación, longitud y orientación)
VERSIÓN: 1.0 */

/* Librerías necesarias */
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.bluetooth.*;
import java.io.*;
import javax.microedition.io.*;

/* Creación de la clase que extiende de MIDlet e implementará las interfacez CommandListener y DiscoveryAgent
Estas interfaces sirven para la comunicación de órdenes al terminal (CommandListener tiene asociado un método abstracto commandAction implementado más abajo) y para el descubrimiento y tratamiento de terminales bluetooth (DiscoveryAgent) */
public class AplicacionGPS extends MIDlet implements CommandListener, DiscoveryListener
{
private Display pantalla;
private Command salir, buscar;
private Form formulario;
private List lista;
private LocalDevice local;
private DiscoveryAgent agente;
private TextBox infoPos;
private StreamConnection conn;
private InputStream in;

/* CONSTRUCTOR: creamos todos los elementos necesarios al iniciar la aplicación */
public AplicacionGPS()
{
/* Inicializamos el objeto Displayable a null */
pantalla = null;

/* Creamos la orden SALIR */
salir = new Command("Salir", Command.EXIT, 0);

/* Ponemos el formulario como pantalla activa */
formulario = new Form("Informacion del dispositivo local");
formulario.addCommand(salir);

/* Se crea un lista de dispositivos */
lista = new List("Lista de dispositivos", Choice.IMPLICIT);
lista.addCommand(salir);
lista.setCommandListener(this);

/* Si no se encuentran dispositivos conocidos, se buscan y se añaden a la lista */
buscar = new Command("Buscar", Command.OK, 1);
formulario.addCommand(buscar);
formulario.setCommandListener(this);

/* Objeto TextBox */
infoPos = new TextBox("Posicion geografica", "Buscando...", 50, TextField.ANY);
infoPos.addCommand(salir);
infoPos.setCommandListener(this);
}

/* Método para pausar la aplicación en curso (se necesita declarar, pues implementamos una interfaz y este método es abstracto) */
public void pauseApp() {}

/* Cuando salimos de la aplicación, cerramos la conexión con el GPS */
public void destroyApp(boolean t)
{
try
{
if (conn!=null) conn.close();
if (in!=null) in.close();
}

catch(IOException ioex) {}
}

/* Método implementado para comenzar la aplicación */
public void startApp()
{
if (pantalla == null)
{
/* Obtenemos las características de la pantalla del terminal */
pantalla = Display.getDisplay(this);

/* Y le ponemos como pantalla activa un objeto de la clase Form */
pantalla.setCurrent(formulario);

try
{
/* Obtenermos las características del terminal local */
local = LocalDevice.getLocalDevice();
agente = local.getDiscoveryAgent();

/* Y la mostramos por la pantalla activa */
getInfo();
}

/* Capturamos la excepción BluetoothStateException */
catch (BluetoothStateException bse) {}
}
}

/* Implementación del método abstracto asociado a la interfaz CommandListener */
public void commandAction(Command c, Displayable d)
{
if (c == salir)
{
destroyApp(true);
notifyDestroyed();
}

/* Vemos si buscamos dispositivos */
else if (c == buscar)
{
/* Borramos los elementos de la lista para iniciar el Inquiry */
lista.deleteAll();

try
{
/* Iniciamos el Inquiry (busqueda de dispositivos bluetooth mediante APIs) */
agente.startInquiry(DiscoveryAgent.GIAC, this);
}

catch(BluetoothStateException bse)
{
formulario.append("Error de dispositivo BT");
}
}

/* O si seleccionamos un elemento de la lista de entre los dispositivos encontrados o ya conocidos */
else if (c == List.SELECT_COMMAND)
{
try
{
/* Obtenemos su dirección bluetooth */
String dir = lista.getString(lista.getSelectedIndex());

/* Y abrimos la conexión bluetooth para la comunicación de datos */
/* El GPS siempre será un esclavo, por lo que únicamente obtendremos datos de él */
conn = (StreamConnection)Connector.open("btspp://"+dir+":1", Connector.READ);
in = conn.openInputStream();

/* Si la apertura fue satisfactoria, pasamos a obtener los parámetros para mostrar */
if ((conn != null)&&(in != null)) escucharGPS();
}

catch (IOException ioex) {}

/* Y ponemos como pantalla activa el TextBox donde veremos los datos a mostrar */
pantalla.setCurrent(infoPos);
}
}

/* Este método obtiene la información de los terminales remotos y se pone él en modo Discoverable, para poder
ser descubierto por otros dispositivos */
void getInfo()
{
formulario.append(local.getBluetoothAddress() + "\n");
int modoI = local.getDiscoverable();
String modoS = "";

switch(modoI)
{
case DiscoveryAgent.GIAC: modoS = "GIAC";
break;
case DiscoveryAgent.LIAC: modoS = "LIAC";
break;
case DiscoveryAgent.NOT_DISCOVERABLE: modoS = "No descubierto";
break;
}

formulario.append(modoS + "\n");
formulario.append(local.getFriendlyName() + "\n");
formulario.append(local.getProperty("bluetooth.master.switch") + "\n");
formulario.append(local.getProperty("bluetooth.api.version"));

try
{
local.setDiscoverable(DiscoveryAgent.GIAC);
}

catch(BluetoothStateException bse){}
}

/* Método que pone al terminal en modo escucha
No es más que la invocación a un Thread que nos va a capturar información del GPS para tratarla */
private void escucharGPS()
{
Thread thr = new Thread()
{
public void run()
{
try
{
StringBuffer informacion = new StringBuffer();
int dato;

while(in.read() != (int)'$');

while((dato = in.read()) != 13) informacion.append((char)dato);

String temp = informacion.toString();
String infoGPS = temp.substring(0, temp.length() - 1);

/* De entre las muchas tramas que puedo recibir, sólo trato 2 en concreto que
me mostrarán el posicionamiento de mi terminal, el resto las descarto */
if ((infoGPS.indexOf("GPRMC") == 0) || (infoGPS.indexOf("GPGGA") == 0) presentarInfo(infoGPS);
else escucharGPS();
}

catch(IOException ioex) {}
}
};

thr.start();
}

/* Método que me va a presentar por pantalla los detalles del posicionamiento que he descrito en el inicio.
Evidentemente, cada trama tiene un formato que debe ser conocido de antemano para poder tratarlas de manera
adecuada y seleccionar la información que cada uno quiera mostrar */
void presentarInfo(String cadena)
{
String latitud, longitud, a, b;
int i = cadena.indexOf(',');
System.out.println ("i = " + i + " " + cadena.substring(0, i));

if (cadena.substring(0, i).compareTo("GPRMC") == 0)
{
i = cadena.indexOf(',');
i = cadena.indexOf(',' , i + 1);
i = cadena.indexOf(',', i + 1);

/* Latitud*/
latitud = cadena.substring(i+1, cadena.indexOf(',', i+1));

/* Elevación */
i = cadena.indexOf(',', i + 1);
a = cadena.substring(i+1, cadena.indexOf(',', i+1));
if (a.compareTo("N") == 0) a = "Norte";
else a = "Sur";

/* Longitud */
i = cadena.indexOf(',', i + 1);
longitud = cadena.substring(i+1, cadena.indexOf(',', i+1));

/* Orientación */
i = cadena.indexOf(',', i + 1);
b = cadena.substring(i+1, cadena.indexOf(',', i+1));
if (b.compareTo("E") == 0) b = "Este";
else b = "Oeste";
}

else
{
i = cadena.indexOf(',');

/* Latitud*/
i = cadena.indexOf(',' , i + 1);
latitud = cadena.substring(i+1, cadena.indexOf(',', i+1));

/* Elevación */
i = cadena.indexOf(',', i + 1);
a = cadena.substring(i+1, cadena.indexOf(',', i+1));
if (a.compareTo("N") == 0) a = "Norte";
else a = "Sur";

/* Longitud */
i = cadena.indexOf(',', i + 1);
longitud = cadena.substring(i+1, cadena.indexOf(',', i+1));

/* Orientación */
i = cadena.indexOf(',', i + 1);
b = cadena.substring(i+1, cadena.indexOf(',', i+1));
if (b.compareTo("E") == 0) b = "Este";
else b = "Oeste";
}

/* Mostramos la información relevante con respecto a las 2 tramas validadas */
infoPos.setString("Latitud: " + latitud + ", " + a + "\n" + "Longitud: " + longitud + ", " + b);
}

/* Conjunto de métodos asociados a la interfaz DiscoveryAgent, que hay que declarar al usar Inquiry para
buscar dispositivos */

/* Estos 2 métodos hay que declararlos (ya que son métodos abstractos de la interfaz DiscoveryAgent), pero en
este caso, no es necesaria su implementación */
public void servicesDiscovered(int transID, ServiceRecord[] rd) {}

public void serviceSearchCompleted(int transID, int tipo) {}

/* Método que me inserta por el frente de una lista las direcciones bluetooth de los dispositivos encontrados
en el Inquiry */
public void deviceDiscovered(RemoteDevice rd, DeviceClass dc)
{
lista.insert(0, rd.getBluetoothAddress(), null);
}

/* Método asociado al Inquiry que me mostrará por la pantalla activa la dirección bluetooth de los dispositivos
encontrados, en caso de existir alguno */
public void inquiryCompleted(int tipo)
{
if (lista.size() == 0)
{
lista.insert(0, "No hay dispositivos al alcance", null);
lista.addCommand(buscar);
}

pantalla.setCurrent(lista);
}
}

Ahí es nada.

FoN

17 de mayo de 2008

Empezando de nuevo...

Vaya por Dios...

Meses leyendo documentación, aprendiendo a manejar una plataforma determinada para desarrollo web y resulta que... el hosting bajo el que se va a alojar el portal no soporta Java! Todo el trabajo tirado a la basura.

Cambiamos a PHP e iniciamos ya la memoria del proyecto, donde reflejaré todas las trabas que imponen las empresas de hosting para mantenimiento de aplicciones ava.

En fin, volver a empezar, sólo que esta vez iremos un poquito más rápido, ya que con Drupal casi todo está hecho y sólo es cambiar el front-end y crear la base de datos de socios.

PFC... Allá voy!... De nuevo!

FoN

27 de abril de 2008

Mola el J2ME...

Lo que a continuación os voy a presentar en las capturas que veis más abajo, son los resultados de mi primera experiencia en la programación de aplicaciones para terminales móviles en J2ME (Java 2 MicroEdition) y, la verdad es que, salvo algún que otro error subsanado, debido a mi inexperiencia con el manejo de estos métodos, la verdad es que es relativamente sencillo diseñar e implementar una aplicación para este tipo de terminales.

En fin, no es gran cosa ni esperéis grandes artificios, pero estoy bastante satisfecho con el resultado.





¿Qué os parece? No es nada del otro jueves, pero.. ¿mola, verdad?



FoN


24 de abril de 2008

Aprendiendo a programar portlets para Liferay...

Menudo coñazo... A este paso voy a ser un experto en el uso de tecnologías Java para programar todo tipo de aplicaciones, ya sean web, para móviles, para mi, frontends, o lo que sea, porque la verdad es que me está costando más de lo que pensaba arrancar de verdad con el PFC, ya que la herramienta utilizada es más compleja de lo que pensaba.

Menos mal que ando en contacto con más gente que desarrolla en Liferay, porque si no, estaría más perdido que un pulpo en un garaje.

En fin, seguiré sufriendo que el fin, en este caso, justifica los medios. Todo sea por terminar de una puñetera vez.

FoN

3 de abril de 2008

De Liferay y otras cuestiones...

Liferay, la herramienta que estoy utilizando para desarrollar mi PFC, me está resultando más complicada de lo que pensé para dominarla.

La verdad es que estoy un poco verde en tema de Java para aplicaciones web, desarrollo de portlets, comunicación de la aplicación Java con la base de datos, etc... Así que, como habréis adivinado, ando bastante liado (atención) LEYENDO. Suena chungo, pero es lo que hay. Sólo leyendo llevo varias semanas, y aún no termino de ver el final del túnel y empezar con lo que toca de verdad, porque el proyecto debe de estar terminado, en su mayor y más importante parte, como muy tarde, en Julio.

Y aquí me hallo, en teleco, leyendo...

A ver si sacamos esto adelante.

FoN

28 de marzo de 2008

Del destino y otros sucesos...


Pues resulta que lo que voy a comentar hoy, tiene que ver con la tecnología y no.Tiene que ver, pues porque lo que me ha pasado hoy viene de mi tutor del proyecto fin de carrera y no, porque es una cuestión de apreciación personal, que me ha proporcionado un buen subidón a nivel moral, lo cual me ha venido muy bien, pues andaba un poco escaso de ella últimamente.

La situación es esta: después de mi clase de Tecnologías telemáticas avanzadas, me dirijo a la cafetería de teleco, donde me aguarda mi tutor del PFC y 2 chicos más a los cuales tutoriza en un proyecto que tiene total relación con el mío, pues ellos han desarrollado una solución para terminal móvil para médicos con Liferay, y yo estoy desarrollando un portal web con Liferay.

Tras la charla y conclusión impresa en servilleta (muchos de los más grandes proyectos se forjan en un bar/cafetería/restaurante/discoteca, haciendo brainstorming sobre una), me voy con la idea, más o menos, de que tengo curro por delante, no mucho, pero el suficiente como para tenerme entretenido hasta Julio.

El tema es que a mi tutor (antes profesor de Programación avanzada y de Bases de datos) siempre le ha gustado, desde que me conoce, ponerme a prueba. De hecho, realizaba conmigo las cosas que se le ocurrían en prácticas y, cuando yo ya las había resuelto, entonces las proponía para resolver en clase, por tanto, es buen conocedor de mi trabajo.

El caso es que no va a tener bastante con el desarrollo del portal, sino que ya me ha mandado que desarrolle, además, 2 módulos que no tienen que ver con el proyecto, pero que los quiere incluir, así como desarrollar la solución para adaptarla a terminales móviles (esta es la parte final del proyecto). Pero además, hablando, por casualidad, con una de mis profesoras de la asignatura primeramente mencionada, y delante mía, le ha mandado un recadito: "mándale cosas que este tío es bueno"... Y, buffff... Ya os podéis imaginar.

Yo nunca he creído ser gran cosa, pues creo que mi potencial radica en mi capacidad de trabajo (lo que el FeR me dice de "tú eres de los que saca las cosas adelante por cojones"), pero nunca en mi aptitud como ingeniero de telecomunicaciones.

Son de esas cosas que te suben la moral hasta el infinito y más allá (¿a quién le amarga un dulce?).

Y ahí no acaba la cosa, la profesora, ni corta ni perezosa me dice: "lo tendré en cuenta para cosas que me están surgiendo". Imaginaros mi cara de asombro entre 2 profesores (una doctora en telecomunicaciones, otro profesor titular de escuela universitaria y con 2 ingenierías informáticas) cuando sueltan eso delante mía sin ningún tipo de tapujos. De cuadro. Casi me echo a llorar, pero mantuve el tipo (orgulloso, eso sí).

Casi ná.

FoN

12 de marzo de 2008

Una de chistes geek...


Abstenerse de comprender aquel personal no familiarizado con la programación en güindous y en linux. Para poder comprenderlo, pinchar aquí.


Este que viene ya es un poquito más linuxero. SUDO es la orden que se da en ubuntu para decirle al sistema que quien ejecuta la orden tiene permisos de superusuario.


3 de noviembre de 2007

UML y otra forma de programar...

Parece que empieza a ser costumbre que, cuando se me ocurre algo sobre lo que postear sea sobre programación. ¿Será degeneración telemática? Quién sabe. Lo que si que es cierto es que jamás habría imaginado que podría estar escribiendo sobre un tema del que hace unos años unos profesores siniestros de mi etapa en la ETSIT quitaron toda mis ganas de aprender más sobre una materia que empecé a desarrollar, por pura curiosidad, a los 12 años. Desde entonces he perdido ténica y velocidad de pensamiento, pero gracias a la caña que Rafilla me dio durante el curso pasado he conseguido recuperar, más o menos, el nivel aceptable que ya poseía y que había dejado anclado en un rincón bajo llave de mi corazón. El caso, es que ahora disfruto, cosa que no me imaginé que pasaría, pero el caso es que lo ha hecho. Ha pasado. Ha vuelto...

Pero en fin, que este post no es sobre lo que ha vuelto o se ha perdido para siempre, sino de una nueva técnica de programación orientada a objetos (OOP, Object Oriented Programming) como es UML (Unified Modeling Language o Lenguaje unificado de modelado) que estoy aprendiendo y que trata de ayudarte a establecer una jerarquí de clases y métodos para la resolución de problemas de manera visual, haciendo así, más amigable la programación.

No se trata, no, de desarrollar programas sin programar, estilo Dreamweaver para desarrollo web, sino más bien sirve para facilitarte la declaración de métodos y objetos que te van a hacer falta de cara a resolver el problema que se te plantea de una manera más sencilla, evitándote así, posibles incompatibilidades con mecanismos de herencia y polimorfismo propios de la OOP.

En fin, que así como la realización de diagramas de flujo para la programación imperativa (como, por ejemplo, cuando utilizamos lenguaje C) facilita enormemente el desarrollo posterior de la aplicación, UML trata de facilitarnos la programación cuando usamos objetos y más cuando vamos a usar objetos que nosotros no hemos implementado, ayudándonos a abstraernos de ciertos problemas que se dan en la programación imperativa y centrarnos más en el diseño de la aplicación, que será donde realmente tardemos a la hora de desarrollar programas.

Por último, y como curiosidad, dos programas que te ayudan a la realización de esos diagramas, uno para Güindous (por si acaso me cobran por nombrar la poderosa empresa de Redmon) y otro para Linux.

  • StarUML, para windows (enlace aquí)
  • Umbrello, para Linux (con apt-get install umbrello debería bastar, si no fuera así, el enlace es éste)
Ya me diréis, aquellos, por supuesto, que os dedicáis al desarrollo de aplicaciones, si debo conocer algo más alguna aplicación más interesante que las mencionadas.

Saludos sabatinos con sabor a remodelado de casa, servicios y otros enseres...

FoN


Technorati Tags: , , , ,

13 de octubre de 2007

Iniciándome en Java...

Pues si amigos, parece que, después de todo, aprenderé Java. Aunque he decir que, a pesar de que dije que me pondría a aprenderlo por mí mismo, lo cierto es, que va a ser por obligación por lo que finalmente lo aprenderé, ya que tengo que dominarlos medianamente para superar 2 de las 7 asignaturas que me restan para terminar la carrera (sin contar PFC, pero ese es otro post)...

La verdad es que, a pesar de que la gente dice que es muy parecido al C (se basa en C, eso es cierto), lo cierto que es que a mi, personalmente, me recuerda más, sobre todo por las sentencias, al Pascal, aunque permite la flexibilidad de C (salvo en el tratamiento de memoria que Java obvia, por lo que he podido ver...).

En fin, que va a ser un nuevo reto y, la verdad, vamos a ver que partido le saco, aunque bien es cierto que, en la calle, básicamente en tema de aplicaciones, se está pidiendo Java, sobre todo, de cara a aplicaciones "amigables" para el usuario final.

Además, por si fuera poco, también aprenderé J2ME, pero eso será ya entre Marzo y Junio. Ya veremos que ser da.

A por ellos!

FoN