sábado, diciembre 30, 2006

Guía rápida para MagicDraw - MagicDraw Tutorial

Ésta es una guía rápida para el uso de la herramienta MagicDraw que realicé junto con Miguel A. Orenes como trabajo de una asignatura de análisis de software orientado a objetos.

Se trata de una guía muy simple (no por eso menos buena ;P) ya que es muy clara y explica directamente cómo se hacen las cosas, sin rodeos ni otras explicaciones.

Espero que os sirva...

>> descarga

lunes, diciembre 18, 2006

SmartSort v2: ordenar una lista de string en base a una clave en C# .NET - Sorting a string linked list using a word as a key in C# .NET

Segunda versión donde cambia la forma de tener en cuenta la diferencia de longitudes entre las dos palabras que se comparan, evitando así un posible error de índice fuera de rango a la hora de almacenar posteriormente las palabras en el array intermedio.


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">= 0; i--){
if (clavec[i] == auxs[i]) nmatch++;
}

//ahora introducimos la diferencia entre longitudes de palabra
nmatch -= Math.Abs(clave.Length -
enu.Current.ToString().Length);
if (nmatch < nmatch =" 0;//controlamos">();
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;
}

martes, diciembre 12, 2006

Uso del modelo de eventos (Observer) en C#.NET - Using events model in C#.NET

Este es un ejemplo muy simple del uso del modelo de eventos (modelo muy parecido al Observer u Observador o también llamado de suscripción pública) en C#.NET.

El elemento que lanza los eventos (observable) deberá incluir el siguiente código:
//declaramos el evento
public event PalabraErroneaEvent OnPalabraErronea;

//declaramos el tipo de manejador asociado al evento
public delegate void PalabraErroneaEvent(object sender, PalabraErroneaArgs e);

//suscipción de metodos al evento
public void addPalabraErroneaListener(IPalabraErroneaListener l){
OnPalabraErronea += new PalabraErroneaEvent(l.newEvent);
}

//lanzamiento del evento
public void notify(PalabraErroneaArgs args){
OnPalabraErronea(this, args);
}

El elemento que reciba los eventos (listener u observer), debe incluir lo siguiente:

Para registrarse debe implementar una interfaz que incluye un método que será usado por la clase que envíe los eventos para añadir un nuevo listener (en este caso el método es newEvent).
public interface IPalabraErroneaListener{
void newEvent(object sender, PalabraErroneaArgs e);
}

Una vez que se implemente la interfaz, nos registraremos en el lanzador del evento usando el método que nos ofrece para ello.
//nos suscribimos
nombre_del_lanzador.addPalabraErroneaListener(this);

Para recibir y manejar los eventos implementa el método anteriormente descrito.
public void newEvent(object sender, PalabraErroneaArgs e) {
@todo
}

miércoles, diciembre 06, 2006

BricoInformática - Ver partidos de Champions y Liga en tu ordenador de forma gratuita - Free UEFA Champions League and Liga in your pc

Actualización: los enlaces a algunos de los partidos más importantes pueden encontrarse en el siguiente enlace:
gratis365.blogspot.com

"Antes de empezar, señalar que al hacer ésto no estamos llevando a cabo ninguna actividad fuera de la legalidad, ya que este proceso se basa únicamente en visionar la retransmisión de canales que emiten por internet y escuchar la retransmisión de radios españolas que también usan este medio para llevar a cabo sus emisiones."

Para conseguir la imagen

1- nos bajamos el programa PPStream, a través del cual obtendremos la retransmisión de varias televisiones internacionales, entre ellas la chinas DragonsTV,... Para bajarlo lo haremos desde este enlace (en caso de que no funcione el enlace entra a Google, busca las palabras "download ppstream" y búscate la vida para bajártelo, que está bastante fácil).
¡OJO! Los aceleradores de descargas no están permitidos en el sitio de descarga, así que si te falla ya sabes por qué.

2- instalamos el PPStream. Aquí viene la gracia, ya que con un poco de mala suerte el programa estará en chino y como mucho en nuestra pantalla aparecerán palabras del estilo "????????", pero no importa, porque los señores que hicieron windows ya pensaron esto y decidieron que para instalar cualquier programa lo único que haría falta es darle unas 20 o 30 veces consecutivas a los botones "Aceptar" y "Siguiente".
Por lo que manos a la obra, empezamos a instalarlo, le damos todas las veces que haga falta a los botones que más se parezcan a los anteriormente descritos (suelen ser las opciones por defecto y suelen ir remarcadas) y completamos la instalación. Si hace falta intentar un par de veces, se intenta, que el fin lo merece.

3- una vez instalado el PPStream, y ya en el día del partido que queramos ver, entramos a la web de Roja Directa y en la pantalla principal encontraremos las retransmisiones de ese día. Sólo nos falta hacer clic sobre la que queramos ver y entre todas las opciones que nos ofrece escogeremos la de "PPStream".
¡¡OJO!! es recomendable que esto se haga una hora o tres cuartos de hora antes del partido para que nuestro ordenador vaya cogiendo fuentes y podamos ver correctamente el partido.

Para conseguir el sonido

Si además no entendemos chino y queremos escuchar la retransmisión en castellano haremos lo siguiente:

1- necesitamos tener insatalado el RealPlayer, o si no, lo bajamos de aquí y lo instalamos.

2- bajamos el archivo de RNE para escuchar la radio pinchando aquí.

3- abrimos el archivo "r1real.ram" que nos acabamos de descargar.

4- aquí viene lo chungo. La cuestión es que el sonido va antes que la imagen (un par de minutos como mínimo) por lo que tendremos que pausar (en RealPlayer) la emisión de radio justo cuando empiece el balón a rodar y reanudarla (en RealPlayer) justo cuando en nuestra imagen en el PPStream comience el partido.
Si eres hábil no tendrás muchos problemas, aunque es posible que en alguna ocasión durante el partido tengas que reajustarlo.

Otras alternativas...

Si este método falla (que puede fallar aunque la radio seguro que no), existen otros programas similares a PPStream aunque con menos calidad de imagen como por ejemplo PPMate (dicen que PPMate es más rápido y no se corta, aunque la imagen se ve un poco peor).

Para más información, consulta los foros de www.RojaDirecta.com, allí encontrarás bastante info y te resolverán bastantes dudas.

También es posible ver otro tipo de eventos, como por ejemplo las ligas europeas de fútbol, la NBA, el fútbol americano, ... y también poder sintonizar gran cantidad de canales internacionales.

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