lunes, 19 de enero de 2015

"Blue Monday" y confirmación - ¡Tengo cáncer! -

  
19 de Enero de 2015


“Blue Monday”, tercer lunes del mes que de acuerdo a la compañía Sky Travel, sería el día más deprimente del año.  Recuerdo haber leído algunos artículos y visto un reportaje en las noticias. Y aunque esperaba poder refutarlo, resulto que aplicó para mí… aunque por circunstancias muy diferentes a las supuestas.

Este día me dieron la noticia -“Tenía cáncer”- y eso apenas era el comienzo. Le siguió la confirmación de la necesidad de cirugía, quimioterapia y radioterapia. Agradecí al cielo haber ido acompañada de mi familia, de que ellos fuesen quienes preguntaran y escucharan cada detalle.

Y entonces hubo que poner manos a la obra, arreglar la documentación, para así buscar agendar la operación con la aseguradora. Ser paciente.

Sabía que la gente que me rodeaba me percibía distinta, triste, dispersa. Decidí no hablarlo hasta que fuese necesario. Trataba de estar como antes…

domingo, 18 de enero de 2015

La espera


13-18 de Enero de 2015


La espera fue complicada, sin duda lo más difícil era tratar de asimilar ese 95% (mi realidad)  que para alguien como yo, amante de los números, lo que seguía era prácticamente claro y debía prepararme para el peor escenario.

Así que llevar mi vida normal, se convirtió en mi mantra. Traté de llenarme de actividades para no pensar. De sonreír y creerme esas sonrisas. Y si no había más remedio, buscaba momentos a solas en los que pudiera llorar y estar triste, pero esos momentos eran cada vez menos y más cortos. De tener cáncer, tendría que guardar las fuerzas para después, para cuando las necesitara.


Y en la calidad de humana idealista y soñadora que a veces me caracterizaba, pensaba en el 5% de probabilidad de que estuviesen equivocados, en qué feliz sería de ser así…pero siempre he preferido estar lista para todo y ésta no sería la excepción. 

lunes, 12 de enero de 2015

Primer diagnóstico


12 de Enero de 2015


Nuevamente son las 7:00hrs y voy de prisa para tomar esos análisis preoperatorios. Todo se resume a cuatro tubos de sangre y una muestra de orina, identificados con mi nombre. Y cuyos resultados estarían al día siguiente. Salí de ahí más pálida que de costumbre en compañía de mi madre.
Nos preparamos para lo que seguía: una tela de tórax, un ultrasonido mamario, otro de hígado, una mastografía y finalmente una biopsia.

Llegué al hospital, me dirigí a radiología y me presentaron al médico que me tomaría los estudios. Hubo un interrogatorio, no es común que a alguien de mi edad le practiquen una mastografía, suelen ser a partir de los 40 años. Así que mi médico oncólogo tuvo que asistir y explicar sus sospechas, acordando que el radiólogo practicaría el ultrasonido y sólo de requerirse se continuaría con lo solicitado.

Para el momento en que indicaron que mastografía era necesaria, infería que las sospechas eran cada vez más certeras. Mi probabilidad de sufrir cáncer iban en aumento y mi ánimo estaba en decadencia.
Salí adolorida física y mentalmente, asustada pero empujada por una fuerza interna para terminar con todo eso cuanto antes. Para cuando me dieron los resultados de los estudios previos a la biopsia, me indicaron un BI-RADS 5,  que en lenguaje coloquial era algo así como un 95% de certeza de padecer cáncer.

La noticia cayó no tan en seco, era como si los eventos previos me hubiesen preparado de cierto modo. Me brotaban lágrimas, pero no emitía sonido, no había sollozos, nada… pensaba en lo que vendría y el siguiente paso era la biopsia, recuerdo que estaba tan nerviosa que la anestesia no tuvo efecto, así que tuvieron que aplicarme mucha más, recuerdo la sensación y dolor de al menos tres de los 7 disparos para extracción de tejido, además del sonido que emitía en cada uno. Pero era necesario, este estudio arrojaría la verdad y dejaría de ser una probabilidad, sabría si tenía o no cáncer, sólo había que esperar.

Comunicar lo que estaba pasando no era sencillo, prefería que mi mamá lo hiciera. Apenas pude hablar con papá, la voz se quebraba y no podía hilar palabras.


domingo, 11 de enero de 2015

Entreteniendo a la mente para no pensar...


11 de Enero de 2015

Domingo 7:00hrs - Nunca despierto tan temprano -  sin duda estoy preocupada… así que planeo salir con mi novio y entretener a mi mente, simplemente “no pensar”. - ¿Qué tal si vamos al museo a ver esa exposición que tenemos pendiente? -  “Obsesión Infinita” de Yayoi Kusama - suena bien para este Domingo, ¿no crees? - , él acepta y ambos salimos  tan pronto como nos es posible.

Matamos el tiempo, hablamos sin hablar y leímos un pequeño libro recién adquirido, para luego desayunar una nutritiva torta con tamal y atole. Y después de cuatro horas, nos entregaron a cada uno una ficha de las 2600 que repartirían en el día para poder pasar por nuestro boleto. El horario que nos correspondía era a las 19:00hrs, teníamos medio día antes de pasar así que regresamos  a casa, vimos un partido de fútbol americano y comimos, luego regresaríamos al museo.

Ya había llorado como Magdalena, hasta quedar seca. Sabía que no arreglaría nada con seguir llorando, que eso no curaría el cáncer si es que lo tuviera, que no conseguiría más que un tremendo dolor de cabeza y un par de ojos hinchados. Donde mi aspecto iría de la mano con mi estado de ánimo.

Debo confesar que mis nervios iban en aumento, que mis ganas por salir a la calle cada vez eran menos. Pero debía “Actuar normal”, y ahí estábamos formados nuevamente antes de entrar.
Y quisiera hablar de mis impresiones, de esa nueva forma de percibir las cosas, de ese feeling que me provocó… sin duda la probabilidad de tener cáncer, la incertidumbre y demás, cambiaba muchas cosas, era como tener los sentidos y sentimientos a flor de piel.

Salí pensando en la infinidad de cosas por tenía por ver, hacer y sentir. En el apoyo de mis seres queridos que es como un alimento al alma, las fuerzas que impiden que me derrumbe, el valor para luchar.

Pensé en las ganas inmensas que siento por vivir, disfrutar, conocer, seguir respirando…  esperando que el cáncer no me arrebate ese sueño. Iba bien, viviendo un día a la vez.  


sábado, 10 de enero de 2015

El inicio de mi calvario


10 de Enero de 2015


¡Por fin sábado! Un día de descanso más que esperado, aunque en esta ocasión debía levantarme temprano y asistir a una cita con el ginecólogo - vaya plan para un sábado -. Aún recuerdo el dolor y odio que me provocó el mentado pato cuando me practicaron el último Papanicolaou.

La cita la solicité con casi con un mes de anticipación, y por temas de disponibilidad no se había podido llevar a cabo – el médico debía ser muy bueno para tener toda la agenda llena, así que valdría la pena la espera-.

Y bueno, lo que se suponía fuese una revisión de rutina, resultó ser el inicio de mi calvario. Ahí estaba yo, una mujer de menuda complexión, con 27 años edad y más asustada que un niño al que van a inyectar… tenía que explicar las razones que me llevaron a solicitar la cita,  decirles de esa “bolita”  que sentía en mi pecho, de las sensaciones y dolor que me provocaba en los últimos meses.

Acto seguido, una revisión exhaustiva, un ultrasonido y las palabras que  aún retumban en mi mente - “Esto no se ve bien, no quiero asustarte pero el tumor mide más de 4cm y por las características pudiese ser maligno. ¿Entiendes lo que te digo? Puede ser cáncer de mama, es muy importante practicarte más estudios para darte un diagnóstico certero, y esto debe ser a la brevedad”-. Mientras el Dr., pronunciaba todo ello, recuerdo que el sonido se hacía más lejano, escuchándose cual si fuese un eco. De mis ojos comenzaron a brotar lágrimas, mi cuerpo se paralizó  y por mi mente pasaron miles de imágenes  perturbadoras: muerte, mastectomía, pérdida de cabello, etc. Cuando reaccioné, tenía ante mí una serie de recetas médicas que indicaban todos los estudios a realizarme el lunes inmediato.

Después de recibir las indicaciones pertinentes, de limpiarme las lágrimas y respirar hondo para tratar de calmarme, salí del consultorio. Quería salir corriendo, quería alejarme de todo y de todos, quería despertar de ese mal sueño.

Mi novio estaba conmigo, por unos minutos no fui capaz de pronunciar palabra. Mis ojos llorosos le miraban queriéndole decir cómo me sentía, lo que había pasado. Pero sabía que no podía hablarle ahí, en plena sala de espera. No quería que las demás pacientes me viesen derrumbarme o transmitirles mi miedo. 

Finalmente salimos, nos dirigimos al área de Laboratorio Clínico y en eso una señora se nos postró enfrente, me miró con compasión y dijo – “Perdón que me meta, pero te vi salir del consultorio del Dr., y creo saber por qué estás así. ¡Tranquila, todo estará bien! Hace unos años yo estuve en tu situación y mírame, aquí estoy” -. No pude aguantar más, las lágrimas brotaban desde el fondo de mi ser. Nos abrazamos y le agradecí, ella sonrió dulcemente y se fue. Mi novio, al que no había podido decir nada infirió todo y me abrazó también, agradecí infinitamente su abrazo, su calor, sus palabras. Agendamos las citas necesarias y nos retiramos.

Volví a sumergirme en mis pensamientos: ¿Cómo hablar o explicar algo que aún no procesas?, ¿cómo le dices a los seres que amas que podrías tener cáncer? La respuesta no la sé, pero sentía que tenía que hacerlo y ser lo más sutil que pudiera. Una llamada interrumpió mis pensamientos, era mi hermana, quería saber qué tal me había ido. Sólo atiné a respirar y decirle que estaba camino a casa, que iría a verla y ahí le contaría.

Tomamos un taxi, durante el trayecto traté de no pensar y cada que un pensamiento doloroso llegaba a la mente oprimía las manos con fuerza. Llegué con mi hermana, le comenté que hablaría por teléfono a mis padres para decirles a todos de una vez; la verdad era que no quería repetir las cosas, no quería hablar de ello, no podía…

Mientras marcaba, ganaba tiempo, buscaba y repasaba en mi cabeza frases para decirles, atiné a reaccionar después de escuchar el clásico – Bueno- era mi hermano. –Hola ¿están mis papás?, me los comunicas –.  Al escuchar sus voces me tranquilice, les comenté a groso modo de las sospechas del médico y los estudios que habían de hacerme, como se suele decir en el ambiente laboral: “no entré en detalles, sino hable de la situación en un alto nivel”. Traté de suavizar el golpe, de ser clara y de que las lágrimas y mis lloriqueos no me sobrepasaran.


A partir de ese momento debía ser fuerte, más fuerte que nunca. Sabía que quería estar bien y haría todo lo que estuviese en mis manos para lograrlo.

lunes, 14 de diciembre de 2009

Administración del conocimiento

Una ontología para plantillas de modelos de conocimiento de CommonKADS.


Paola González Pérez

paola.gonzalezpz@gmail.com


Introducción

Este trabajo ofrece una visión general de cómo la ontología OWL fue creada para representar modelos de conocimientos definidos en plantillas CML proporcionadas por CommonKADS.

CommonKADS es una metodología de la administración del conocimiento que propone el uso de plantillas de modelos de conocimiento para el modelado del mismo. El objetivo del desarrollo de dicha ontología es presentar la platilla de modelo de conocimiento de manera sencilla, con un leguaje que pueda ser comprendido y compartido. Es por ello que se emplea OWL, una ontología que se ha convertido en un estándar, por las herramientas de fácil manejo que ofrece (tanto por la visualización y edición).

El desarrollo de los sistemas basados en conocimiento ha madurado con los años. Se inició con la primera generación de sistemas expertos, los cuales tenían una sola base de conocimiento plano y motores de razonamiento general.

El mantenimiento de dichos sistemas resultaba complicado, por lo que de ahí surgió el enfoque metodológico similar al de ingeniería de software, donde el conocimiento es el enfoque principal, abarcando métodos y técnicas de adquisición, modelado, representación y uso de conocimientos.

CML es un marco basado en el lenguaje que se utiliza en la construcción de modelo de conocimiento. Las plantillas de modelos de conocimiento se definen también utilizando CML.

Al querer disminuir la dificultad asociada con la metodología y el lenguaje empleado en la representación del conocimiento, se propuso emplear la ontología OWL (Ontology Web Language) que es un lenguaje para definir ontologías web, en lugar de CML. Puesto que OWL se ha convertido en el lenguaje estándar para las ontologías y su entendimiento por muchos en la comunidad de ingeniería del conocimiento.

Las ontologías son utilizadas por las metodologías para representar el conocimiento de dominio, algunas metodologías las usan también para representar al componente de razonamiento desde una perspectiva genérica, la cual puede ser utilizada cada vez que un modelo de conocimiento va a ser desarrollado.

CommonKADS emplea ontologías sólo para la representación del conocimiento de dominio. Así que se creó una ontología que contiene las plantillas de modelos de conocimiento propuesto por CommonKADS para que puedan ser utilizados y compartidos. Primero se describe un modelo de conocimiento y posteriormente OWL.

Conocimiento modelado en CommonKADS

El modelo de conocimiento en CommonKADS tiene tres partes:

· El conocimiento del dominio.

· El conocimiento de la tarea.

· El conocimiento de inferencia.

Conocimiento de dominio: específica el conocimiento y los tipos de información que son necesarios en la aplicación. Es básicamente una descripción del conocimiento que se encuentra en el sistema.

La descripción se puede hacer por categorías en dos grupos: esquemas de dominio y la base de conocimiento.

El esquema de dominio es una descripción de los conocimientos específicos, así como de la información a través de una serie de definiciones de tipo. Por ejemplo, en un software el esquema de dominio sería equivalente al modelo de datos. Emplea un conjunto de modelos de construcción para especificar el conocimiento de dominio. Hay tres modelos principales: conceptos, relaciones y tipos de regla.

La base de conocimiento es la creación de instancias del esquema de dominio.

El conocimiento de la tarea: describen los objetivos que deben ser alcanzados por el sistema y las estrategias que se utilizan para alcanzarlos. Consiste en una tarea la cual define la función de razonamiento complejo y la tarea que describe cómo son ejecutados los métodos a través de sub funciones. También define una estructura de control en la cual se define el orden de las sub funciones para llevar a cabo la tarea.

El conocimiento de inferencia: describe cómo el conocimiento de domino puede ser usado para llevar a cabo el proceso de razonamiento, a su vez, describe también el nivel más bajo de descomposición funcional. Consta de funciones de conocimiento necesarias para la inferencia, describiendo la entrada y salida. Otros componentes son las funciones de transferencia.

Plantilla de modelo de conocimiento

CommonKADS apoya la reutilización parcial de los modelos de conocimiento para apoyar el conocimiento de los procesos de modelado. De manera que se puedan reutilizar las plantillas para crear un sistema
con respecto a la tarea que debe cumplirse en lugar de crear todo partiendo desde cero.

Las ventajas de la reutilización de
son los siguientes: previene de "re-inventar”, ahorro en costo y tiempo, reduce la complejidad y se prevé la garantía de calidad.

Por lo tanto un catálogo de plantillas de trabajo está prevista la por encima de las tareas. La tarea consiste en plantillas de definición de tareas y métodos de trabajo. Los cuales son reutilizables en combinación con un modelo de elementos que tienen una estructura de inferencia, un control típico de
estructura y un esquema de dominio típico desde el punto de las tareas.

Una ontología para modelos de conocimiento

Una ontología desde el punto de vista filosófico es una doctrina sobre los fundamentos generales de la existencia, misma que estudia su estructura y sus leyes.

De igual manera y según Gruber en su trabajo titulado “A translation approach to portable ontologies”, ha definido una ontología de manera formal como: una especificación explícita de una conceptualización compartida.

Dicha definición se basa en la idea de la conceptualización, o sea una versión simplificada del mundo real que queremos representar. Lo que proporciona un dominio de comprensión común, que es comunicado por las personas y las aplicaciones (sistemas).

La conceptualización hace referencia a la comprensión de conceptos y relaciones que pueden o no existir entre ellos. Una representación de un conocimiento compartido en un dominio específico que ha sido comúnmente acordado se refiere a la «especificación» de conceptualización.

Una ontología debe representar conocimientos específicos (un dominio), tiene que ser compartida y utilizada.

Debido a estas ventajas se hace el uso de esta tecnología de Web Semántica para la representación del modelo de conocimiento. Se considera que la definición de ontología permite desarrollar un mecanismo sencillo para la generación automática del modelo de conocimiento desde un archivo de OWL. Dicho archivo se pueden manipular usando Jena API. De hecho, las ontologías de dominio y del modelo de conocimiento de las aplicaciones están definidas en OWL. Las principales características de OWL son: las tareas intensivas, la planificación tareas de síntesis, el diseñar modelos de asignación y programación, las tareas de análisis, la clasificación, evaluación y seguimiento, el diagnóstico y predicción.

Un documento en OWL consta de tres componentes principales: secuencia de los axiomas y los hechos, más referencia a otras ontologías. Los axiomas utilizados para la clase asociada y los identificadores de propiedad ya sea parcial o total de las especificaciones de sus características y dar a otros la información lógica sobre las clases y propiedades

De tal modo que la información del estado acerca de todos los individuos formen parte de una clase, el individuo pertenezca a las propiedades y los valores sean componentes que se utilizan para crear una ontología. Además se explican las diferentes clases, las propiedades y las instancias que se han creado para representar a la plantilla
de modelos de conocimiento definido por CommonKADS.

Representando la plantilla de conocimiento OWL

Cada tarea de conocimiento intensiva se como un punto del catalogo de CommonKADS y es representada como una sub clase de la clase de tareas principal.

Se decidió crearlo como una subclase en lugar de una instancia, puesto que la
se hace más fácil a la hora de extraer las clases y propiedades respecto a esta tarea de la plantilla de modelo de conocimiento
ontology. Sub tareas de conocimiento de la tarea intensiva, creando las instancias de la subclase. Por ejemplo, para el conocimiento de la tarea intensiva de "evaluación" una subclase "evaluación" se ha creado como ejemplo "caso_abstracto" y "caso_match", que son las sub tareas de la tarea
"Evaluación".

Representar el conocimiento de inferencia la clase de "inferencia", tiene como subclases de las diferentes
inferencias que se encuentran en el catálogo proporcionado por CommonKADS. Las subclases se definen sobre la base de
conclusiones generales y no en la tarea de los métodos de trabajo, puede llamar a las inferencias que lleva el mismo nombre, por ejemplo, la inferencia "Seleccionar" se llama en el método de trabajo de la "evaluación" y
"Diagnóstico".

Por lo tanto, en esta ontología que representa con una plantilla un modelo de conocimiento, se va a tener la clase ", seleccionar", que es una subclase de la clase "inferencia". Que en el ejemplo puede tener dos instancias para la tarea de "evaluación" llamado "Assessment_seleccionado" y la segunda para la tarea de "diagnóstico" llamado "diagnóstico_seleccionado". Lo mismo aplica para otras inferencias que son llamadas en métodos de trabajo diferentes, por ejemplo la inferencia "especificar". También se muestra una tabla que contiene las propiedades de cada clase, así como algunos ejemplos de casos que han sido
creados.

La principal dificultad que enfrentan durante la creación de la ontología es la representación de la estructura de control. Introducen un nuevo concepto llamado de declaración para representar a cada declaración en la estructura de control. Contiene todos las construcciones definidas por CommonKADS que se pueden encontrar en un estructura de control. Están representados como las propiedades del concepto.

Cada afirmación de la estructura de control es representado como un ejemplo del concepto de clase. Hasta ahora han visto esto como la mejor solución.

Sin embargo, han establecido cuál es el trabajo futuro para continuar su investigación, el cual se refiere a la mejor manera de representar la estructura de control, ya que desean que todos sus modelos estén representados en un solo documento OWL. La razón principal de esto, es porque se desea utilizar dicha ontología para generar de manera automática a los modelos de conocimiento.

La investigación en la generación automática de los modelo de conocimiento ayudaría a traer soluciones a los problemas de la modelado de procesos relacionados con el conocimiento. Por lo tanto, se ayudaría también al aprendizaje y disminución de los gastos generales de desarrollo, a normalizar los procesos de modelado de conocimiento, aplicar la reutilización, a la fase de enlace del modelo de conocimiento para su aplicación, hasta ahora se ha conceptualizando un marco para la generación semiautomática del modelo de conocimiento.

Utilizando OWL y SWRL en la estructura para construir su modelo de conocimiento, se puede representar a dicho modelo con un formato sencillo y puede ser entendido no sólo por ingenieros del conocimiento que tengan experiencia en inteligencia artificial, sino también por expertos de dominio, personas que posean conocimiento referente al sistema o aplicación.

Los componentes del modelo de conocimiento son generados a partir de la ontología para plantillas de modelos de conocimientos propuestos. Los modelos genéricos de conocimiento de la aplicación se adaptan posteriormente al dominio de la aplicación, basándose en ontologías de dominio propias de OWL y las reglas son introducidas por el ingeniero del conocimiento. Los conceptos y las propiedades se extraen de la base de conocimiento, sobre el esquema de dominio en el modelo genérico de conocimiento de las aplicaciones.

También se permitirá en el marco la asignación de los modelos de conocimiento, que actuará como puente entre la fase de elaboración de modelos y fase de ejecución, por lo tanto, se prevé facilitar la transición entre estas dos etapas.

Conclusiones

Es así que para cumplir el objetivo que se planteó en este trabajo, construir una ontología para plantillas de
modelos de conocimiento que pueda ser compartida por toda la comunidad de ingeniería del conocimiento, se planteó utilizar una web semántica de idiomas, en este caso OWL ya que:

Brinda más funciones que la representación de lenguajes basadas en el marco de conocimiento. OWL es el lenguaje estándar para la representación de conocimiento, ha sido adoptado por muchos como el idioma para ontologías.

Las herramientas que están disponibles de fácil la creación y manipulación de los documentos OWL como por ejemplo Protegé 2000, la cual fue utilizada como marco de referencia para entender los cambios manuales que deben hacerse a la generación de modelos de conocimiento.

El API disponible para manipular la OWL de los documentos, que puede ser empleada para extraer y/o crear clases y propiedades. Por ende, una vez que la ontología de la plantilla de modelos de conocimiento se ha creado, la plantilla requerida por una tarea específica puede ser extraída de la generación de un
modelo de conocimiento.

Aunque les hubiese gustado establecer una automatización total, se piensa que la automatización total no es viable, debido a las interacciones que puede haber con el conocimiento.

Esto a su vez puede ayudar a disminuir la brecha de comunicación entre estos dos expertos, que es uno de los motivos por los muchas veces surgen cuellos de botella en de la adquisición de conocimientos.

Referencias

Gobin, B. A y Subramanian, R. K. 2009. An Owl Ontology for Commonkads Template Knowledge Models”. World Academy of Science, Engineering and Technology, pp 83-88.


lunes, 7 de diciembre de 2009

Clases - Proyecto Redes Avanzadas

Proyectos elegidos:

1. Proyecto No. 12- Juego de batallas (Héctor)
2. Proyecto No. 10- Equivalencias. (Luis Eduardo)
3. Proyecto No. 13 -Renta de coches (Andrea)


Y el proyecto de Edgar me pareció interesante la manera en que almacena recupera una imagen .



Este trabajo consistió en programar una aplicación utilizando sockets y RMS(Record Management System).

Se trata de un Diccionario, donde el cliente solicita una palabra (de las ya definidas en el RMS) y el Servidor, proporciona su significado.

A continuación se encuentra el código de dicha aplicación:
______________________________________________________________


package connection;

/*
* Gerardo Ayala
* November 2009
* */

import java.io.*;

class SendMessageTask extends Thread
{
private String message;
OutputStream outputStream;

public synchronized void send( OutputStream theOutputStream,String aMessage )
{
outputStream = theOutputStream;
message = aMessage;
notify();
}//end send


// the run method is synchronized
public synchronized void run()
{
//waits.....for a message to be send
while( true )
{
if( message == null )
{
try
{
wait();
}//end try
catch( Exception e ) {}
}//end if

else
{
try
{
//sends the message
outputStream.write( message.getBytes() );
// and a new line
outputStream.write( "\r\n".getBytes() );
}//end try
catch( IOException e )
{
e.printStackTrace();
}//end catch
message = null;
}//end if
}//end while
}//end run



public synchronized void stop()
{
message = null;
notify();
}//end stop
}//end class SendMessageTask
__________________________________________________________
package connection;

/*
* Gerardo Ayala
* November 2009
* */

import javax.microedition.io.*;

public class SocketConnectionClientMidlet extends SocketConnectionMidlet
{
public String url;

// Constructor
public SocketConnectionClientMidlet()
{
super("Client");
url = "socket://localhost:2500";
}//end constructor


public void run()
{
try{

socketConnection = (SocketConnection)Connector.open( url );
setSocketConnectionOptions();

form.setTitle( "Client -> Connected" );
messageReceived.setText( "Connection established." );

// get and open inpust and output streams
getAndOpenIOStreams();

// creates and starts send message task thread
createsAndStartsSendMessageTask();

// then , to read!!!
readMessagesClient();

}//end try
catch( Exception e )
{
}//end catch
}//end connectToServer


protected void pauseApp() {}

protected void destroyApp( boolean flag ) {}

}//end class SocketConnectionClientMidlet
___________________________________________________________

package connection;
/*
* Gerardo Ayala
* November 2009
* */

import java.io.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import rms.BusquedaDiccionario;
import rms.PalabraSignificadoRMS;
import rms.Diccionario;

public abstract class SocketConnectionMidlet extends MIDlet
implements CommandListener,
Runnable
{

public Display display;
public Form form;

public TextField messageToSend;
public StringItem messageReceived;

SendMessageTask sendMessageTask;

public Command exitCommand;
public Command sendCommand;

public InputStream inputStream;
public OutputStream outputStream;

public SocketConnection socketConnection;

Thread listeningTask;

private PalabraSignificadoRMS palabraSignificadoRMS = new PalabraSignificadoRMS();
private BusquedaDiccionario busqueda;
public Diccionario seleccion = new Diccionario(
palabraSignificadoRMS.getRecordsByIdByPalabra(),
palabraSignificadoRMS.getRecordsByIdBySignificado());


public SocketConnectionMidlet(String title)
{
form = new Form(title);
messageReceived = new StringItem( null," " );
form.append( messageReceived );

//if(form.getTitle().equals())
messageToSend = new TextField( "Text: ","",1024,TextField.ANY );
form.append( messageToSend );
exitCommand = new Command( "Exit",Command.EXIT,1 );
sendCommand = new Command( "Send",Command.ITEM,1 );
form.addCommand( sendCommand );
form.addCommand( exitCommand );
form.setCommandListener( this );

}//end constructor


public void startApp()
{
display = Display.getDisplay( this );
display.setCurrent( form );

listeningTask = new Thread(this) ;
listeningTask.start();
}//end startApp


protected void pauseApp() {}

protected void destroyApp( boolean flag ) {}


public void readMessages()
{
StringBuffer stringBuffer;
StringBuffer otherStringBuffer;

Resultado();
int characterRead;

while( true )
{
stringBuffer = new StringBuffer();
characterRead = -1;
try
{
while( ((characterRead = inputStream.read()) != -1) &&
(characterRead != '\n') )
{
stringBuffer.append( (char)characterRead );
}//end while


}//end try
catch(Exception e)
{
System.out.println(e);
}//end catch

if( characterRead == -1 )
{
break;
}//end if
else
{
otherStringBuffer = new StringBuffer( messageReceived.getText()+
"\nCliente-> "+stringBuffer.toString() );
messageReceived.setText( otherStringBuffer.toString() );
}//end else
}//end while
}//end readMessages



public void readMessagesClient()
{
StringBuffer stringBuffer;
StringBuffer otherStringBuffer;
int characterRead;

String palabra ="";
busqueda();

while( true )
{
stringBuffer = new StringBuffer();
characterRead = -1;
try
{
while( ((characterRead = inputStream.read()) != -1) &&
(characterRead != '\n') )
{

stringBuffer.append( (char)characterRead );

}//end while
palabra = stringBuffer.toString().trim();

}//end try
catch(Exception e)
{
System.out.println(e);
}//end catch

if( characterRead == -1 )
{
break;
}//end if
else
{
System.out.println("Mensaje recibido del cliente en el servidor:"+messageReceived.getText());

otherStringBuffer = new StringBuffer( messageReceived.getText()+
"\nServidor-> "+stringBuffer.toString() );

messageReceived.setText( otherStringBuffer.toString() );
}//end else
}//end while

}//end readMessagesClient



private void busqueda()
{

busqueda= seleccion.getPosicionPalabra();
sendMessageTask.send(outputStream, "Busqueda: \n" + busqueda.getPalabra());
}


private void Resultado()
{

busqueda= seleccion.getPosicionPalabra();
sendMessageTask.send(outputStream, "Resultado: \n" + busqueda.getSignificado());
}


//the run method for the listening task thread, to override
public abstract void run();




public void setSocketConnectionOptions()
{
try
{
// defines socket connection options
socketConnection.setSocketOption( socketConnection.DELAY,0 );
socketConnection.setSocketOption( socketConnection.KEEPALIVE,0 );
}
catch(Exception e){

}
}//end setSocketConnectionOptions


public void getAndOpenIOStreams()
{
try
{
// get and open output and input streams
inputStream = socketConnection.openInputStream();
outputStream = socketConnection.openOutputStream();
}
catch(Exception e)
{
}

}//end


public void createsAndStartsSendMessageTask()
{
// creates and starts the send message thread
//sendMessageTask = new SendMessageTask();
sendMessageTask = new SendMessageTask();
sendMessageTask.start();
}//end createsAndStartsSendMessageTask



public void commandAction( Command theCommand,Displayable any )
{
if( theCommand == Alert.DISMISS_COMMAND ||
theCommand == exitCommand )
{
try
{
if( inputStream != null )
{
inputStream.close();
}//end if

if( outputStream != null )
{
outputStream.close();
}//end if

if( socketConnection != null )
{
socketConnection.close();
}//end if

}//end try
catch( IOException e ) {}
destroyApp( true );
notifyDestroyed();
}//end if


if (theCommand == sendCommand )
{
sendMessageTask.send( outputStream, messageToSend.getString() );
}//end if


}//end commandAction

}//end class SocketConnectionMidlet

________________________________________________________

package connection;

/*
* Gerardo Ayala
* November 2009
* */

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


public class SocketConnectionServerMidlet extends SocketConnectionMidlet
{

private ServerSocketConnection serverSocketConnection;
private String url;


// Constructor
public SocketConnectionServerMidlet()
{
super("Server");
url = "socket://:2500";
}//end constructor

protected void pauseApp() {}

protected void destroyApp( boolean flag ) {}


public void run()
{

// The ServerSocketConnection interface defines the server socket stream
// connection.
// A server socket is accessed using a generic connection string with
// the host omitted.
// For example, socket://:79 defines an inbound server socket on port 79.
// The host can be discovered using the getLocalAddress method.
// The acceptAndOpen() method returns a SocketConnection instance.
// In addition to the normal StreamConnection behavior, the SocketConnection
// supports accessing the IP end point addresses of the live connection
// and access to socket options that control the buffering and timing delays
// associated with specific application usage of the connection.
// Access to server socket connections may be restricted by the security policy
// of the device.
// Connector.open MUST check access for the initial server socket connection
// and acceptAndOpen MUST check before returning each new SocketConnection.
// A server socket can be used to dynamically select an available port
// by omitting both the host and the port parameters in the connection URL
// string.
// For example, socket:// defines an inbound server socket on a port which
// is allocated by the system.
// To discover the assigned port number use the getLocalPort method.


try
{
messageReceived.setText( "Esperando a cliente..." );

serverSocketConnection = (ServerSocketConnection) Connector.open( url );

// while( true )
// {
form.setTitle( "Server -> en espera..." );
messageReceived.setText( "esperando por conexiones..." );

// Gets a SocketConnection object that represents a server side
// socket connection.
socketConnection = (SocketConnection)
serverSocketConnection.acceptAndOpen();

setSocketConnectionOptions();

form.setTitle( "Server -> Dado de alta" );
messageReceived.setText( "Conexion aceptada " );

getAndOpenIOStreams();

// creates and starts the send message thread
createsAndStartsSendMessageTask();

form.addCommand( sendCommand );

// then, read the messages !!
readMessages();

//}//end while
}//end try
catch( IOException ie )
{
if( ie.getMessage().equals("ServerSocket Open") )
{
Alert a = new Alert( "server","port 2500 already occupied.",
null,AlertType.ERROR );
a.setTimeout( Alert.FOREVER );
a.setCommandListener( this );
display.setCurrent( a );
}//end if
}//end catch
catch( Exception e ) {}
}//end connectionToClient

}//end class controlConexion

___________________________________________________________
package rms;
//@author Paola

public class BusquedaDiccionario
{
private String palabra;
private String Significado;

public BusquedaDiccionario(String palabra, String significado)
{
this.palabra = palabra;
this.Significado = significado;
}//constructor

public String getPalabra()
{
return this.palabra;
}//end getPalabra

_____________________________________________________________
//@author Paola González
package rms;

public class Diccionario
{

private BusquedaDiccionario[] busquedaArray;
private PalabraSignificadoRMS diccionarioRMS;
int posicion=0;

public Diccionario(String[] palabra, String[] significado)
{
busquedaArray = new BusquedaDiccionario[significado.length];
for(int contador=0; contador<=busquedaArray.length) { return busquedaArray[posicion]; } else { this.posicion=0; return busquedaArray[posicion]; } } }//end class Diccionario public String getSignificado() { return this.Significado; }//end getSignificado }//end clase BusquedaDiccionario _________________________________________________________________ /** * MyRecordStore * @author Gerardo Ayala * November 2009 */ package rms; import javax.microedition.rms.*; public class MyRecordStore { public RecordStore recordStore; public String id; public int numberOfRecords; //constructor public MyRecordStore(String aRecordStoreId) { id = aRecordStoreId; }//end MyRecordStore public void create() { try { recordStore = RecordStore.openRecordStore( id,true ); }//end try catch( Exception e ) { System.out.println( "Could not create record store.." + e.toString() ); }//end catch }//end create public void open() { try { recordStore = RecordStore.openRecordStore( id,false ); }//end try catch( Exception e ) { System.out.println( "Could not open record store.." + e.toString() ); }//end catch }//end open public void addRecord(String recordContent) { byte[] recordContentBytes; recordContentBytes = recordContent.getBytes(); try { recordStore.addRecord( recordContentBytes, 0, recordContentBytes.length ); }//end try catch (Exception e) { System.out.println("Could not add record " + e.toString()); }//end catch }//end addRecord public void deleteRecord(int recordId ) { try { recordStore.deleteRecord( recordId ); }//end try catch( Exception e ) { System.out.println("Could not delete record..." + e.toString() ); }//end catch }//end deleteRecord public String getRecord(int recordId) { byte[] recordContentBytes = null; String recordContent = null; try { recordContentBytes = recordStore.getRecord(recordId); }//end try catch (Exception e) { System.out.println("Could not get record " + e.toString()); }//end catch recordContent = new String(recordContentBytes,0,recordContentBytes.length); return recordContent; }//end getRecord public int getNumberOfRecords() { try { numberOfRecords = recordStore.getNumRecords(); }//end try catch (Exception e) { System.out.println("Could not get number of records " + e.toString()); }//end catch return numberOfRecords; }//end getNumberOfRecords public boolean hasRecords() { if( getNumberOfRecords() > 0 )
{
return true;
}//end if
else
{
return false;
}//end else
}//end hasRecords





public RecordEnumeration select(RMSFilterStartsWith filter,
RMSOrder comparator)
{
RecordEnumeration recordEnumeration = null;


try
{
recordEnumeration = recordStore.enumerateRecords(filter,
comparator,
false);
}//end try
catch(Exception e)
{
System.out.println("Could not create RecordEnumeration " +
e.toString());
}//end catch
return recordEnumeration;
}//end select


public void close()
{
try
{
recordStore.closeRecordStore();
}//end try
catch( Exception e ){
System.out.println("Could not close record store... "+ e.toString() );
}//end catch
}//end close



public void destroy()
{
try
{
close();
RecordStore.deleteRecordStore(id);

}//end try
catch( Exception e )
{
System.out.println("Could not delete record store... " + e.toString() );
}//end catch

}//end deleteRecordStore

}//end MyRecordStore

_________________________________________________________________

//@author Paola González

package rms;


import javax.microedition.rms.RecordEnumeration;

public class PalabraSignificadoRMS
{

// RMS (Record Management System)
private MyRecordStore palabrasDB;
private MyRecordStore significadoDB;

// an object representing a recordPalabra filter
private RMSFilterStartsWith filter;
// an object representing the recordPalabra order criteria
private RMSOrder comparator;

// the id of the recordPalabra store
private String recordStoreIdPalabra;
private String recordStoreIdSignificado;


// constructor
public PalabraSignificadoRMS()
{
recordStoreIdPalabra = "Palabra";
recordStoreIdSignificado= "Significado";

// create the recordPalabra store
palabrasDB = new MyRecordStore(recordStoreIdPalabra);
palabrasDB.create();


significadoDB = new MyRecordStore(recordStoreIdSignificado);
significadoDB.create();
// create the recordPalabra store

System.out.println( ">>> Record store: " + recordStoreIdPalabra +
recordStoreIdSignificado+ " has been created." );

insertaPalabrasDB();
insertaSignificadoDB();
}//end constructor



public void insertaPalabrasDB()
{
palabrasDB.addRecord("Innovar");
palabrasDB.addRecord("RID");
palabrasDB.addRecord("MAD");
palabrasDB.addRecord("CSA");
palabrasDB.addRecord("Neuerung");
palabrasDB.addRecord("Twittear");

}//end palabrasDB


public void insertaSignificadoDB()
{
significadoDB.addRecord("Crear algo nuevo,Modificar algo existente que da como resultado algo nuevo");
significadoDB.addRecord("Deposito(RACK) de piezas ");
significadoDB.addRecord("Material Dañado");
significadoDB.addRecord("Control Seguimientos Auditorias");
significadoDB.addRecord("Plataforma de apoyo a las etapas iniciales de innovacion");
significadoDB.addRecord("Escribir algo es twitter");
}


public int getNumberOfRecords()
{
return palabrasDB.getNumberOfRecords();
}


public String getPalabraRecord(int n)
{
return palabrasDB.getRecord(n);
}



public MyRecordStore getPalabraDB()
{
return palabrasDB;
}

public MyRecordStore getSignificadoDB()
{
return significadoDB;
}

public void printRecordsById()
{

int recordId;
String recordPalabra;
String recordSignificado;

try
{
//System.out.println( " " );
//System.out.println( "Number of records: "+ palabrasDB.getNumberOfRecords() );
for( recordId=1;
recordId <= palabrasDB.getNumberOfRecords(); recordId++ ) { recordPalabra = palabrasDB.getRecord(recordId); recordSignificado = significadoDB.getRecord(recordId); System.out.println( "Record ID-"+ recordId +": "+ recordPalabra+":/n"+ recordSignificado); }//end for }//end try catch( Exception e ) { System.err.println( e.toString() ); }//end catch }//end printRecordsById public String[] getRecordsByIdByPalabra() { int recordId; String[] record; record= new String[ palabrasDB.getNumberOfRecords()]; try { for( recordId=1; recordId <= palabrasDB.getNumberOfRecords(); recordId++ ) { record[recordId-1] = palabrasDB.getRecord(recordId); }//end for }//end try catch( Exception e ) { System.err.println( e.toString() ); }//end catch return record; }//end printRecordsByIdByPalabra public String[] getRecordsByIdBySignificado() { int recordId; String[] record; record= new String[ significadoDB.getNumberOfRecords()]; try { for( recordId=1; recordId <= significadoDB.getNumberOfRecords(); recordId++ ) { record[recordId-1] = significadoDB.getRecord(recordId); }//end for }//end try catch( Exception e ) { System.err.println( e.toString() ); }//end catch return record; }//end printRecordsById public void printRecordsByEnumeration(MyRecordStore currentRecordStore) { RecordEnumeration recordEnumeration; String record; try { System.out.println( "Number of records: "+ currentRecordStore.getNumberOfRecords() ); if(currentRecordStore.hasRecords()) { //creates the filter starts with... filter = new RMSFilterStartsWith("P"); //creates the order criteria comparator = new RMSOrder(false); recordEnumeration = currentRecordStore.select(filter, comparator); // inserts one more recordPalabra after the select //palabrasDB.addRecord("The red thin line"); // prints the records according to the filter and order while( recordEnumeration.hasNextElement() ) { record = new String( recordEnumeration.nextRecord() ); System.out.println( "Record: "+ record); }//end while //then destroy the enumeration, releasing resources recordEnumeration.destroy(); } }//end try catch( Exception e ) { System.out.println( e.toString() ); }//end catch }//end printRecordsByEnumeration }//end PalabraSignificadoRMS ____________________________________________________________________________________ /** * RMSFilterStartsWith * @author Gerardo Ayala * November 2009 */ package rms; import javax.microedition.rms.*; public class RMSFilterStartsWith implements RecordFilter { String subString; // constructor public RMSFilterStartsWith(String aSubstring) { subString = aSubstring; }//end constructor public boolean matches(byte[] recordContentBytes) { String recordContent; recordContent = new String(recordContentBytes); if (recordContent.startsWith(subString)) { return true; }//end if else { return false; }//end else }//end matches }// end RMSFilterStartsWith _____________________________________________________________________________________ package rms; /** * RMSOrder * @author Gerardo Ayala * November 2009 */ import javax.microedition.rms.*; public class RMSOrder implements RecordComparator { boolean isAscendingOrder; // constructor public RMSOrder(boolean isAscendingOrderIndicator) { isAscendingOrder = isAscendingOrderIndicator; }//end RMSOrder public int compare(byte[] recordContentBytes1, byte[] recordContentBytes2) { String recordContent1; String recordContent2; recordContent1 = new String(recordContentBytes1); recordContent2 = new String(recordContentBytes2); if (isAscendingOrder) { if ((recordContent1.compareTo(recordContent2)) > 0)
{
return (RecordComparator.FOLLOWS);
}//end if
else
{
if ((recordContent1.compareTo(recordContent2)) <> 0)
{
return (RecordComparator.PRECEDES);
}//end if
else
{
return (RecordComparator.EQUIVALENT);
}//end else
}//end else
}//end else
}//end compare


}//end classRMSOrder