martes, abril 17, 2007

domingo, abril 08, 2007

Java: Servlet básico - Minimal Servlet

Ejemplo de un Servlet básico sobre el que podemos empezar a añadir la funcionalidad que queramos.
Contiene ejemplos básicos para la obtención de parámetros, escritura de la respuesta web, ...

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.io.File.*;
import java.util.*;


public class Middleware extends HttpServlet {

//Initialize global variables
public void init() throws ServletException {
}

//Process the HTTP Get request > aqui tratamos la peticion
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {

//obtenemos el descriptor sobre el que devolveremos la respuesta html
response.setContentType("text/html");
PrintWriter out = response.getWriter();

try {

//forma de obtener los parametros > vienen de un formulario
String servicio = request.getParameter("servicio");
}
catch (Exception e) {
out.println("Error en el Servlet del servicio web.");
}
}

//Process the HTTP Post request > no importa el metodo, lo tratamos todo igual
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}

//Clean up resources
public void destroy() {
}
}

Para la respuesta web es recomendable usar un método en el que se le pase como parámetros el descriptor de la salida y la ruta de la página a mostrar. El método es el siguiente (el primero es una versión básica y el segundo permite introducir cambios mediante un array de pares de string "antiguo-nuevo"):


public static void enviarPagina(String pagina, PrintWriter out)
{
try {

FileReader fr = new FileReader(pagina);
BufferedReader buffer = new BufferedReader(fr);

String linea = buffer.readLine();

while (linea != null)
{
out.println(linea);
linea=buffer.readLine();
}
}
catch(Exception e)
{
System.out.println("Error al abrir el fichero");
out.println("Error al cargar el fichero de la página - " + e.toString());
try{
File dir1 = new File(".");
out.print("Current dir : " + dir1.getCanonicalPath());
}catch(Exception en){}
}
}

public static void enviarPagina(String pagina, PrintWriter out, String[][] cambios)
{
try {

FileReader fr = new FileReader(pagina);
BufferedReader buffer = new BufferedReader(fr);

String linea = buffer.readLine();

while (linea != null)
{
//hacemos los cambios necesarios
for(int i=0;i(menorque)cambios.length;i++){
linea = linea.replaceAll(cambios[i][0],cambios[i][1]);
}
//escribimos
out.println(linea);
linea=buffer.readLine();
}
}
catch(Exception e)
{
System.out.println("Error al abrir el fichero");
}
}

viernes, abril 06, 2007

Bricoinformática: Instalar los diccionarios en OpenOffice - Installing language dictionaries in openoffice

Si tienes problemas con los diccionarios en OpenOffice (que no se te activan, no te corrigen, te dan errores en todas las palabras, ...), siguiendo estos pasos podrás resolverlos dejando tu OpenOffice funcionando de lujo.
Sin detenernos pues...

1. Entramos al Writer (procesador de textos) del OO.
2. Archivo > Asistentes > Instalar diccionarios nuevos...
...se abre una nueva ventana al estilo nuevo documento...

3. Seleccionamos el diccionario que queramos instalar haciendo clic sobre él.
4. Hacemos clic sobre el botón "Ejecutar DicOOo" (vamos, y es pequeño!!).
5. Siguiente.
...llegamos a la pantalla de diccionarios de ortografía...

6. Hacemos clic en "Recuperar lista" y esperamos.
7. Seleccionamos nuestro idioma y hacemos clic en Siguiente.
...hacemos lo mismo para los diccionarios de separación de sílabas y sinónimos...

8. Hacemos clic en "Iniciar la descarga" y cuando finalice, en "Final".
...reiniciamos OO y puede que pasen dos cosas:
a) todo funciona al pelo y ya hemos terminado.
b) aquí no ha pasado nada, por lo que todavía nos falta por hacer lo siguiente:
9. Herramientas > Opciones...
10. Seleccionamos la ficha "Configuración del idioma > idiomas".
11. Y en la opción de "Idioma predeterminado para los documentos" elegimos el recién instalado.

Y nada más, dejamos esto funcionando y si nos vuelve a dar problemas, hacemos el truco de la vieja y lo volvemos a instalar. Suerte.

jueves, marzo 08, 2007

C# .NET: Funciones de matching de cadenas - String matching methods

Aquí incluyo tres filtros de matching, uno que compara el principio de la palabra, otro el final y otro tanto el principio como el final.
Es un buen ejemplo de cómo se interactúa entre string y char[] cuando necesitamos implementar operaciones con cadenas a un nivel más bajo.

//primer filtro de matching mas fuerte (principio y final de la palabra)
public bool match1(string s1, string s2)
{
//haremos el matching de una sola letra si alguna palabra es <2
if (
s1.Length "<" 2 || s2.Length "<" 2)
{
char[] p1 = s1.ToCharArray();
char[] p2 = s2.ToCharArray();
//comprobamos
if (p1[0] == p2[0] && p1[s1.Length - 1] == p2[s2.Length - 1])
{
return true;
}
return false;
}
//haremos el matching con dos letras
else
{
char[] p1 = s1.ToCharArray();
char[] p2 = s2.ToCharArray();
//comprobamos
if (p1[0] == p2[0] &&amp; p1[1] == p2[1] &&
p1[s1.Length - 1] == p2[s2.Length - 1] && p1[s1.Length - 2] == p2[s2.Length - 2])
{
return true;
}
return false;
}
}

//segundo filtro de matching mas leve (principio de la palabra)
public bool match2(string s1, string s2)
{
//haremos el matching de una sola letra
if (
s1.Length "<" 2 || s2.Length "<" 2)
{
char[] p1 = s1.ToCharArray();
char[] p2 = s2.ToCharArray();
//comprobamos
if (p1[0] == p2[0])
{
return true;
}
return false;
}
//haremos el matching con dos letras
else
{
char[] p1 = s1.ToCharArray();
char[] p2 = s2.ToCharArray();
//comprobamos
if (p1[0] == p2[0] && p1[1] == p2[1])
{
return true;
}
return false;
}
}

//tercer filtro de matching mas leve (final de la palabra)
public bool match3(string s1, string s2)
{
//haremos el matching de una sola letra

if
(
s1.Length "<" 2 || s2.Length "<" 2)
{
char[] p1 = s1.ToCharArray();
char[] p2 = s2.ToCharArray();
//comprobamos
if (p1[0] == p2[0])
{
return true;
}
return false;
}
//haremos el matching con dos letras
else
{
char[] p1 = s1.ToCharArray();
char[] p2 = s2.ToCharArray();
int l1 = s1.Length;
int l2 = s2.Length;
//comprobamos
if (p1[l1 - 1] == p2[l2 - 1] && p1[l1 - 2] == p2[l2 - 2])
{
return true;
}
return false;
}
}

NOTA: en las partes sombreadas en color gris cambiar los "<" por < (problemas con el html :-( ).

sábado, enero 20, 2007

BricoInformática: Solucionar el problema al vincular un dispositivo de antena GPS Bluetooth con el teléfono móvil.

Hace poco compré una antena GPS Bluetooth para el móvil y cuál fue mi sorpresa que al conectar la antena con el móvil mediante el bluetooth, el móvil me pedía un código. Mi preocupación aumentó cuando vi que ni en la caja ni en las instrucciones venía ese código, por lo que me lancé a mi último recurso: Google.
Tras recorrerme unos cuantos foros, vi que el problema le había sucedido a mucha gente pero en ninguno de ellos daban solución ni explicación de por qué sucedía.

Pero mi suerte cambió en un instante, ya que cuando me disponía a volver a embalar todo el contenido para ir a la tienda donde lo compré se me ocurrió probar algunos códigos al azar para intentar dar solución al problema. Tras probar sin éxito el pin del móvil, el número del modelo de gps, un número extraño que encontré en una pegatina en el compartimento de la batería y algunos más, se me ocurrió meter cuatro ceros y, mientras sentía esa sensación de cuando ves que tienes 11 en la Quiniela y te das cuenta de que no te vas a comer la mierda que te comes todos los fines de semana, mi teléfono aceptó el dispositivo y se encendió en led de conexión del gps.

Pues bueno, pongo esto para ver si mi "potra", "gran potra", puede sacar a alguien como yo, totalmente inculto en temas de gps, de un apuro. Mi móvil es un Nokia 6680 y la antena gps bluetooth es de marca Phoenix (es de esas baratas de 60€). El código que introduje para que el enlace se estableciera fue "0000".

Si te ha servido de ayuda, y sobre todo si te ha servido para otro móvil o para otra antena gps bluetooth, por favor deja un comentario para que el resto de la peña se entere. Gracias.

jueves, enero 18, 2007

BricoInformática: Solucionar el problema de PPStream con PPMate - To solve connection troubles in PPStream with PPMate

Hace algunos posts proponía una solución para poder ver de forma gratuita los partidos de Liga y Champions (también Copa del Rey) a través de PPStream. El enlace a este post es éste.

Pues bueno, parece que últimamente PPStream no va muy bien y suele sufrir cortes en la emisión con frecuencia, pero este problema lo podemos solucionar instalando el programa PPMate, que va más rápido y la imagen no suele cortarse una vez que llevemos entre media hora o una hora conectados al canal (pillando fuentes).

Algunos consejos para ver el partido con mejor calidad:
1. usar el canal "Shanghai Sports". Es el que suele poner los partidos del Real Madrid y el Barça.
2. pinchar en el enlace (en la web www.rojadirecta.com) correspondiente al partido lo más rápido posible, para que coja fuentes.

martes, enero 16, 2007

C# .NET : Seleccionar texto dentro de un control WebBrowser - Select text in a WebBrowser control

Lo que encontramos a continuación es un método que nos permite seleccionar texto dentro de un control WebBrowser en C# .NET.

(palabra es el texto que será seleccionado dentro del documento)

//marca la palabra especificada en el texto
public bool marcarPalabra(string palabra) {
bool succes = false;
if (webBrowser1.Document != null)
{
IHTMLDocument2 doc = webBrowser1.Document.DomDocument
as IHTMLDocument2;
IHTMLBodyElement body = doc.body as IHTMLBodyElement;

IHTMLTxtRange range;
range = body.createTextRange();
range.moveStart("character", 1);
int flags = 0;
flags += 2;//(matchWholeWord)
flags += 4;//(matchCase)
success = range.findText(palabra,
true ? 999999 : -999999, flags);
if (success)
{
range.select();
range.scrollIntoView(false);
}
}
return succes;
}

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
}