martes, noviembre 28, 2006

Uso de Hashtable en J2ME - Hashtable management using J2ME

(versión sin depurar)

Ejemplo del manejo (inserción y eliminación de elementos usando un string como key) de un Hashtable en J2ME sobre la lógica de un chat donde los usuarios y las salas de chat se almacenan por separado, enlazándose mediante referencias.


/*
* LogicaChat.java
*
* Created on 28 de noviembre de 2006, 19:00
*
* Pedro Luis Mateo || pedrolmn@gmail.com
*/

package hello;
import java.util.*;

////////////////////////////////////////////////////////////////////////////////
public class LogicaChat {

/** Creates a new instance of LogicaChat */
public LogicaChat() {
}

//variables en las que se basa la logica del chat
/*private*/ Hashtable chatrooms = new Hashtable();
/*private*/ Hashtable users = new Hashtable();

//metodos
public void newChatRoom(ChatRoom cr){
chatrooms.put(cr.name,cr);
}

public void delChatRoom(ChatRoom cr){
//primero elimino todos sus usuarios
cr.users.resetIterator();
while (cr.users.hasNext()){
//disminuyo la rpesencia de un usuario en salas
((User)cr.users.next()).exitRoom();
//si ya no se encuentra en ninguna sala, elimino
if (!((User)cr.users.next()).isInRooms()){
users.remove(((User)cr.users.next()).nick);
}
}
//por ultimo elimino el chatroom
chatrooms.remove(cr.name);
}

public void newUser(User u){
users.put(u.nick,u);
}

public void delUser(User u){
//eliminamos si no esta presente en ningun chatroom
if (!u.isInRooms()) users.remove(u.nick);
}

public void addUserChat(String nu, String ncr){
try{
User u = (User)users.get(nu);
ChatRoom cr = (ChatRoom)chatrooms.get(ncr);
cr.addUser(u);
}catch(Exception e){}
}

public void delUserChat(String nu, String ncr){
try{
User u = (User)users.get(nu);
ChatRoom cr = (ChatRoom)chatrooms.get(ncr);
//comprobaremos que ese usuario pertenece a ese chatroom
if (cr.users.exists(u)){
//disminuimos la presencia
u.exitRoom();
//eliminamos el enlace desde el chatroom
cr.removeUser(u);
//si el usuario ya no se encuentra en ninguna sala lo eliminamos
if (!u.isInRooms()){
users.remove(u);
}
}
}catch(Exception e){}
}

public User existsUser(String nick){
return (User)users.get(nick);//puede devolver null
}
}


miércoles, noviembre 22, 2006

Editor gratuito para Java con soporte para aplicaciones móviles - Free IDE for Java with mobile support

Esta es una versión de NetBeans (la última) con un add-on que adaptará nuestro IDE para permitirnos el desarrollo de aplicaciones destinadas a dispositivos móviles.

Download links: NetBeans - Mobility pack

LinkedList de Java para J2ME - Java LinkedList for J2ME

Clase java implementada en J2ME que simula una LinkedList (lista enlazada) de Java2 e incluye un iterador externo.
Muy útil si desarrollas aplicaciones para entornos móviles en Java, ya que las listas enlazadas no vienen implementadas por defecto en el J2ME y son muy útiles para la elaboración de implementaciones móviles.

Se trata de una versión básica fácilmente mejorable y adaptable.





/*
* MList.java
*
* Created on 22 de noviembre de 2006, 12:58
*
* Pedro Luis Mateo || pedrolmn@gmail.com
*/

package hello;

import java.util.Vector;
/**
*
* @author Pedro Luis Mateo
*/
public class MList {

/** Creates a new instance of MList */
public MList() {
}

////////////////////////////////////////////////////////////////////////////
// METODOS PARA EL MANEJO DE LA LISTA - LIST HANDLE METHODS

private Vector list = new Vector();

public void addLast(Object o){
list.insertElementAt(o,list.size());
}

public Object getLast(){
return list.lastElement();
}

public void addFirst(Object o){
list.indexOf(o,0);
}

public Object getFirst(){
return list.firstElement();
}

public boolean remove(Object o){
return list.removeElement(o);
}

public int size(){
return list.size();
}

////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
//// ITERADOR - ITERATOR METHODS ////
/////////////////////////////////////

int current=0;
Object currentObj=null;

public boolean hasNext(){
if (current < list.size()){
currentObj = list.elementAt(current);
current++;
return true;
}
else{
return false;
}
}

public Object next(){
return currentObj;
}

public void resetIterator(){
current=0;
currentObj=null;
}
}



sábado, noviembre 18, 2006

Para maniana: el contest de la ACM en lisboa

Maniana (estamos en Lisboa y aqui no existe la enie) es el contest...

Ha llegado el día de la verdad y espero que salga mejor que hoy, porque para dos problemas de tres que hubiéramos acertado fácil en la prueba no hemos acertado ninguno.
Aunque tenemos excusa, sigo pensando que deberíamos habernos esforzado un poco más aunque las cabezas no daban para más despues de el duro día de ayer pateando Lisboa.

Por eso, ya vamos para la cama que maniana vamos a darlo todo a ver si no nos humillamos mucho, aunque teóricamente (y en la práctica) vayamos de tercer equipo respresentando a la UMU.

Bueno, espero que maniana haya suerte y que salga todo bien...

P.D.: ya llegarán las fotos.

viernes, noviembre 10, 2006

BricoInformática: llamar gratis a telefonos fijos de medio mundo con VoIP - free calls to telephones of average world with VoIP

Sin trucos ni tarjetas de crédito, tenemos llamadas a teléfonos fijos de muchos paises de una forma sencilla, rápida y sin gastarnos un céntimo.
Ideal para estudiantes Erasmus, personas con familiares o amigos en el extranjero y personas que simplemente quieran disfrutar de un teléfono en su pc.

El servicio es gratuito durante 120 días y tenemos un límite de 300 minutos a la semana. El registro es gratuito y prácticamente no piden ningún dato.

Necesitamos: un micrófono (por 1.50 € ya tienes uno) y altavoces para el ordenador (seguro que ya tienes).

El truco del almendruco: cuando se nos acabe el chollo o gastemos los 300 minutos semanales, nos registramos con otro nombre de usuario y sin problemas.

Enlace: entra en www.internetcalls.com y descarga el programa. En serio, no cuesta nada.

miércoles, noviembre 08, 2006

Leer un fichero de texto en C# .NET reconociendo tildes (acentos) y otros signos especiales - To read a text file in C# .NET and recognize special characters and signs

Esto consiste en un proceso muy sencillo pero se nos puede complicar si somos algo novatos o venimos de Java y estamos acostumbrados a lo fácil.

Para empezar, C# .NET posee un mecanismo de lectura de ficheros de texto muy eficiente, siendo éste el siguiente:
// Método para procesar un fichero
public void procesarFichero()
{
// Definimos un StreamReader
StreamReader lector;
string linea = "";

try{
lector = File.OpenText(fichero);

// Lee linea a linea
while ( (linea = lector.ReadLine()) != null){
//hacemos lo que queramos
}
// Cerramos la conexion
lector.Close();
}
catch (Exception e){
System.Console.WriteLine("Problemas al cargar el fichero.{0}", e);
}
}

El problema viene si al llevar a cabo el proceso de lectura, podemos observar que los string resultado no incorporan caracteres especiales como por ejemplo las tildes y acentos de otro tipo.
La causa de este problema es que el descriptor que hemos utilizado anteriormente sólo reconoce ficheros con codificación UTF-8 (por defecto), por lo que la entrada debe estar codificada de este modo. ¿entonces, cómo podemos convertir nuestro fichero de texto de toda la vida a UTF-8?
Pues muy sencillo: tomamos un editor básico de texto (bloc de notas de windows o similares), abrimos nuestro fichero, seleccionamos la opción de guardar como... y en el campo referente a codificación seleccionaremos UTF-8.

//claves: procesar fichero texto c# .net utf-8 reconocer tildes read text file

lunes, noviembre 06, 2006

SmartSort v1: ordenar una lista de string en base a una clave en C# .NET

Éste método nos ayuda a ordenar una linkedlist de string en c# en base a una clave, ordenando de menor a mayor grado de parecido.
Muy útil para el manejo de cadenas ordenadas.


//funcion para reordenar la lista de la forma mas eficiente
public System.Collections.Generic.LinkedList smartSort(
System.Collections.Generic.LinkedList lista,
string clave){

char[] auxs;
LinkedList auxl;
int nmatch;
int longi;

//creo un array de linkedlist de tamaño clave*2+1
LinkedList[] clasi = new LinkedList[clave.Length*2 + 1];

//obtengo los caracteres de la clave
char[] clavec = clave.ToCharArray(0,clave.Length);

//para cada una de las palabras de la lista inicial
IEnumerator enu = lista.GetEnumerator();
while (enu.MoveNext()){
nmatch = 0;
auxs = ((string)enu.Current).ToCharArray();

//me quedo con la menor de las longitudes
longi=clave.Length;
if (((string)enu.Current).Length < longi =" ((string)enu.Current).Length;" i =" 0;" i =" longi-1;">=0; i--){
if (clavec[i] == auxs[i]) nmatch++;
}

//si nmatch==0 introduzco la diferencia de longitudes como distancia
if (nmatch == clave.Length*2){
nmatch = nmatch - Math.Abs(clave.Length - enu.Current.ToString().Length);
//controlo los limites permitidos
if (nmatch > clave.Length * 2) nmatch = clave.Length * 2;
}

//clasifico esta palabra
if (clasi[nmatch] == null) clasi[nmatch]=new LinkedList();
clasi[nmatch].AddLast(enu.Current.ToString());
}

//creo la lista a devolver
auxl = new LinkedList();
for (int i = clave.Length * 2; i >= 0; i--){
if (clasi[i] != null) {
enu = clasi[i].GetEnumerator();
while (enu.MoveNext()){
auxl.AddLast(enu.Current.ToString());
}
}
}

//devuelvo la lista
return auxl;
}


//claves: ordenar lista palabras clave c# .net order list linkedlist words key

Filtro de palabras para C# - Eliminación de signos de puntuación, tildes, ...

Éste es un método muy útil para tratar cadenas antes de almacenarlas en cualquier tipo de coleción, ya que nos ahorrará muchos problemas a la hora de recuperarlas y trabajar con ellas. Ésta es una versión muy simple pero muy fácil de modificar.

//función para filtrar la palabra y dejarla lista para tratarla
//devuelve la palabra filtrada o null en caso de que no pase el filtro
public string filtro(string palabra){

//eliminamos palabras de un caracter solo
if (palabra.Length == 1) return null;

string aux=palabra;
//eliminamos caracteres que nos puedan estorbar
char[] simbolos = new char[6];
simbolos.SetValue(',',0);
simbolos.SetValue(';',1);
simbolos.SetValue('.',2);
simbolos.SetValue(':',3);
simbolos.SetValue('-',4);
simbolos.SetValue('_',5);
aux=aux.Trim(simbolos);
//pasamos a minusculas
aux=aux.ToLower();

return aux;
}


//claves: filtro palabras c# sharp eliminar caracteres signos puntuacion