Sindicación de contenidos en tu blog: que no falte de ná
Septiembre 30th, 2005 - [Enlace local]
Todo blog que se precie, debe tener sus respectivos enlaces para sindicar sus contenidos. Yo personalmente me he topado en multitud de ocasiones con blogs muy interesantes, que por desgracia no contaban con ningún tipo de enlace para sindicarlo, ni siquiera un mísero feed RSS.
Otro tema muy importante, son las formas de interactuar con los lectores, bien sea por email, por los comentarios, o incluso por Skype.
RSS, Bloglines, Rojo, del.icio.us, geourl… Los blogers debemos facilitar la vida a nuestros lectores. Veamos pues, cómo hacerlo…
» Leer más, comentarios, etc...
Post para aumentar eltráfico
Septiembre 30th, 2005 - [Enlace local]
Es increíble analizar los "referals" de este blog. Hay gente, aunque cueste creerlo, que llega a mi blog después de haber buscado en google "concepto de arroz con leche".
Para ver si puedo aumentar el tráfico, voy a meter en este post algunas palabras que, creo, interesarán a la gente:
Aunque no lo crean, esto es una especie de estudio sociológico.
» Leer más, comentarios, etc...
niko's mini factory
Nacido programador
Septiembre 30th, 2005 - [Enlace local]

via Raj Blogs
» Leer más, comentarios, etc...
Cliente HTTP en PHP: Parseando las tiras cómicas de escomposlinux.org
Septiembre 28th, 2005 - [Enlace local]
En el presente artículo, describo un cliente HTTP en PHP. Ya existen clientes HTTP para web (PEAR, por ejemplo) además de que podemos obtener cualquier página en PHP simplemente abriéndola como si de un fichero se tratara. Pero al crear un cliente HTTP aprenderemos cómo funciona el protocolo HTTP.
Para utilizar nuestro cliente, crearemos además un ejemplo que lo utilice. Y se me ha ocurrido crear un parseador de la web de tiras cómicas de escomposlinux.org, que obtenga todas las tiras cómicas y las almacene y estructure en un array ordenado.
Podéis ver un ejemplo aquí.
» Leer más, comentarios, etc...
Enlaces JavaScript para Firefox: JPSindicador v0.1b
Septiembre 28th, 2005 - [Enlace local]
Firefox es sin duda el mejor navegador web existente hasta la fecha, no ya por la seguridad (recientes artículos desmitifican la superioridad de Firefox sobre Internet Explorer en cuanto a la seguridad, aunque bien es cierto que los parches de seguridad de Firefox salen casi al instante de ser detectados, al contrario que IE, que salen demasiado tarde), sino el nivel de personalización que permite al usuario, así como la multitud de opciones que brinda a los desarrolladores de software.
En este artículo explico cómo crear un enlace javascript para Firefox, para, por ejemplo, añadir contenido a una página, eliminar la publicidad, comprobar que los enlaces sean correctos, etc.
En este artículo crearemos un "gestor de sindicaciones", por llamarlo de alguna manera, mediante el cual, clickeando en un enlace javascript, se nos mostrará una caja en la misma página que estemos viendo, con todas las opciones posibles para "sindicarla", como por ejemplo, añadirla a del.icio.us, a Protopage, o subscribirnos a su "feed" mediante Bloglines o Rojo.
» Leer más, comentarios, etc...
Don Box y Scheme
Septiembre 27th, 2005 - [Enlace local]
Desde hace tiempo quiero dedicarle un rato a ver cómo es realmente Scheme comparado con otras variantes de Lisp. Mientras tanto, me he encontrado con un artículo interesante de Don Box sobre Scheme, que hace referencia a otro anterior en el que dice cosas interesantes sobre la programación en Lisp que no se descubren hasta que realmente se usa este lenguaje de programación. Lo que más me ha sorprendido del artículo es que Box, siendo arquitecto de Indigo, la nueva plataforma de Microsoft, cite palabras de Eric S. Raymond, un ferviente defensor del software libre y atacante acérrimo de Microsoft, como demostró en su respuesta a una desafortunada carta que según él recibió de Microsoft. Raymond también ha sido muy criticado por haber vivido del cuento a cuestas de Linus Torvalds o Stallman en una caricatura que me hace mucha gracia. A lo que iba, la cita de Box:
Lisp is worth learning for a different reason—the profound enlightenment experience you will have when you finally get it. That experience will make you a better programmer for the rest of your days, even if you never actually use Lisp itself a lot.
» Leer más, comentarios, etc...
Y como se llama el =>?
Septiembre 27th, 2005 - [Enlace local]
En Site Point acabo de leer una simpática publicación llamada What do you call this: => sobre un viejo conocido de todos los phperos: el infame =>. La pregunta es sencilla: ¿cómo se llama?.
En el código fuente le llaman “doble flecha”, pero eso sería >>, no =>. Cosa rara… ¿como lo llamarían ustedes?
» Leer más, comentarios, etc...
Mapeo objeto-relacional (herencia III)
Septiembre 26th, 2005 - [Enlace local]
Hola. Este es último post sobre el mapeo objeto-relacional y la herencia. Sólo
queda ver la última estrategia: Una tabla por cada jerarquía de herencia.
Voy a ser muy escueto puesto que no he recibido opiniones ni sugerencias en los otros posts.
Por supuesto sigo con el modelo de datos de los temas anteriores (alumno, profesor,…).
Con esta estrategia vamos a guardar en la misma tabla una jerarquía de herencia
completa. Es decir haremos una tabla “personas” en la que se guardarán tanto
los objetos Profesor como los objetos Alumno. En la tabla “personas” tendremos
tantas columnas como campos tenga la clase Persona más los campos de la
clase Profesor y además los de la clase Alumno. Además deberemos tener una columna
“discriminadora” que servirá para especificar el tipo concreto de objeto que contendrá
cada fila. Veamos cómo se crea la tabla “personas”
CREATE TABLE personas (nif INTEGER NOT NULL,
nombre VARCHAR(50),
apellidos VARCHAR(50),
fecha_nacimiento DATE,
numero_creditos_cursados INTEGER,
id_departamento INTEGER,
tipo_persona ENUM(\"profesor\", \"alumno\"),
PRIMARY KEY(nif)) TYPE=INNODB;
La última columna (”tipo_persona”) indica si la fila de la tabla contiene un profesor o un alumno.
Por lo tanto al hacer un listado el pseudo-código sería…
ResultSet result = ...; Listpersonas = new ArrayList (); while(result.next()) { if(columna tipo_persona es “profesor”) { Profesor profesor = new Profesor(); // rellenar profesor personas.add(profesor); } else if(columna tipo_persona es “alumno”) { Alumno alumno = new Alumno(); // rellenar alumno personas.add(alumno); } } return personas;
Esta estrategia es muy buena en cuanto a rendimiento porque todo está en una única tabla
y no hay que hacer “joins” ni “unions” para hacer un listado de todas las personas.
El inconveniente de esta estrategia es que no podemos establecer NOT NULL a las columnas
de las subclases. Por ejemplo si “numero_creditos_cursados” es obligatorio para alumnos, pero esta columna
no puede ser NOT NULL porque es un campo que no existe para profesores. Es decir, es una columna
obligaroria para cierta subclase pero no para otras.
» Leer más, comentarios, etc...
Gimenoblog
Mapeo objeto-relacional (herencia III)
Septiembre 26th, 2005 - [Enlace local]
Hola. Este es último post sobre el mapeo objeto-relacional y la herencia. Sólo queda ver la última estrategia: Una tabla por cada jerarquía de herencia. Voy a ser muy escueto puesto que no he recibido opiniones ni sugerencias en los otros posts. Por supuesto sigo con el modelo de datos de los temas anteriores (alumno, profesor,...).
Con esta estrategia vamos a guardar en la misma tabla una jerarquía de herencia completa. Es decir haremos una tabla "personas" en la que se guardarán tanto los objetos Profesor como los objetos Alumno. En la tabla "personas" tendremos tantas columnas como campos tenga la clase Persona más los campos de la clase Profesor y además los de la clase Alumno. Además deberemos tener una columna "discriminadora" que servirá para especificar el tipo concreto de objeto que contendrá cada fila. Veamos cómo se crea la tabla "personas"
CREATE TABLE personas (nif INTEGER NOT NULL,
nombre VARCHAR(50),
apellidos VARCHAR(50),
fecha_nacimiento DATE,
numero_creditos_cursados INTEGER,
id_departamento INTEGER,
tipo_persona ENUM("profesor", "alumno"),
PRIMARY KEY(nif)) TYPE=INNODB;
La última columna ("tipo_persona") indica si la fila de la tabla contiene un profesor o un alumno. Por lo tanto al hacer un listado el pseudo-código sería...
ResultSet result = ...; Listpersonas = new ArrayList (); while(result.next()) { if(columna tipo_persona es "profesor") { Profesor profesor = new Profesor(); // rellenar profesor personas.add(profesor); } else if(columna tipo_persona es "alumno") { Alumno alumno = new Alumno(); // rellenar alumno personas.add(alumno); } } return personas;
Esta estrategia es muy buena en cuanto a rendimiento porque todo está en una única tabla y no hay que hacer "joins" ni "unions" para hacer un listado de todas las personas.
El inconveniente de esta estrategia es que no podemos establecer NOT NULL a las columnas de las subclases. Por ejemplo si "numero_creditos_cursados" es obligatorio para alumnos, pero esta columna no puede ser NOT NULL porque es un campo que no existe para profesores. Es decir, es una columna obligaroria para cierta subclase pero no para otras.
» Leer más, comentarios, etc...
Mapeo objeto-relacional (fine grained objects)
Septiembre 26th, 2005 - [Enlace local]
Hola. Este es último post sobre el mapeo objeto-relacional.
Voy a hablar de los fine grained objects que llamaré objetos de baja
granularidad u objetos de grano fino (si alguien conoce una traducción mejor…).
Supongamos que tenemos un modelo de objetos en el que hay una clase Persona
y otra Direccion. Persona tiene nombre, apellidos,… y Direccion tiene ciudad, calle,…
Cada persona tiene una dirección y cada dirección pertenece sólo a una persona.
De modo que tenemos una relación 1 a 1. Desde el punto de vista del diseño
de la base de datos lo más razonable sería crear una tabla “personas” que tuviera
como columnas: nif, nombre, apellidos, fecha_nacimiento, direccion_calle, direccion_ciudad,…
Es decir guardamos todos los datos en la misma tabla.
A la hora de cargar un registro de la base de datos haremos algo así…
Persona persona = new Persona(); persona.setDireccion(new Direccion()); persona.setNif(result.getInt(\"nif\")); persona.setNombre(result.getString(\"nombre\")); persona.setApellidos(result.getString(\"apellidos\")); // más campos de Persona persona.getDireccion().setCiudad(result.getString(\"direccion_ciudad\")); persona.getDireccion().setCalle(result.getString(\"direccion_calle\")); // más campos de Direccion
Es decir, en la misma tabla tenemos dos clases que no comparten herencia.
La clave primaria de la tabla es “nif”, que es la clave primaria para cada persona. Sin
embargo Direccion no tiene clave primaria; es un objeto “de segunda”. A esto
se llama fine grained object.
Algunas herramientas de mapeo objeto-relacional no soportan los objetos de baja
granularidad, así que si usamos una de ellas tendríamos que eliminar la clase Direccion y agregar todos
sus campos a la clase Persona, con lo que la clase Persona quedaría algo así…
public class Persona implements Serializable {
private int nif;
private String nombre;
private String apellidos;
private String direccionCiudad;
private String direccionCalle;
// etc.
}
El inconveniente es que este es un modelo de objetos más pobre.
Hibernate soporta los objetos de grano fino.
Bueno, con esto concluyo. Espero que os haya gustado
.
» Leer más, comentarios, etc...
Gimenoblog
Mapeo objeto-relacional (fine grained objects)
Septiembre 26th, 2005 - [Enlace local]
Hola. Este es último post sobre el mapeo objeto-relacional. Voy a hablar de los fine grained objects que llamaré objetos de baja granularidad u objetos de grano fino (si alguien conoce una traducción mejor...).
Supongamos que tenemos un modelo de objetos en el que hay una clase Persona y otra Direccion. Persona tiene nombre, apellidos,... y Direccion tiene ciudad, calle,... Cada persona tiene una dirección y cada dirección pertenece sólo a una persona. De modo que tenemos una relación 1 a 1. Desde el punto de vista del diseño de la base de datos lo más razonable sería crear una tabla "personas" que tuviera como columnas: nif, nombre, apellidos, fecha_nacimiento, direccion_calle, direccion_ciudad,... Es decir guardamos todos los datos en la misma tabla.
A la hora de cargar un registro de la base de datos haremos algo así...
Persona persona = new Persona();
persona.setDireccion(new Direccion());
persona.setNif(result.getInt("nif"));
persona.setNombre(result.getString("nombre"));
persona.setApellidos(result.getString("apellidos"));
// más campos de Persona
persona.getDireccion().setCiudad(result.getString("direccion_ciudad"));
persona.getDireccion().setCalle(result.getString("direccion_calle"));
// más campos de Direccion
Es decir, en la misma tabla tenemos dos clases que no comparten herencia. La clave primaria de la tabla es "nif", que es la clave primaria para cada persona. Sin embargo Direccion no tiene clave primaria; es un objeto "de segunda". A esto se llama fine grained object.
Algunas herramientas de mapeo objeto-relacional no soportan los objetos de baja granularidad, así que si usamos una de ellas tendríamos que eliminar la clase Direccion y agregar todos sus campos a la clase Persona, con lo que la clase Persona quedaría algo así...
public class Persona implements Serializable {
private int nif;
private String nombre;
private String apellidos;
private String direccionCiudad;
private String direccionCalle;
// etc.
}
El inconveniente es que este es un modelo de objetos más pobre. Hibernate soporta los objetos de grano fino.
Bueno, con esto concluyo. Espero que os haya gustado :P.
» Leer más, comentarios, etc...
Null Pointer Exception
¿por qué no JDeveloper?
Septiembre 25th, 2005 - [Enlace local]
Se que con este post voy a conseguir que mucha gente que conozco se burle de mi toda la semana y me recuerden lo "tocapelotas" que soy (fama que yo creo que es del todo inmerecida), pero bueno, yo soy asi y asi seguiré (que dice la cancion).
El caso es que en el trabajo hemos estado discutiendo durante mucho tiempo que IDE utilizar, y la discusión era Eclipse vs JDeveloper. Curiosamente yo me preguntaba (y asi lo manifestaba) por que no entraba en el saco NetBeans, un entorno que se ha desarrollado espectacularmente en los últimos años. Pero bueno, a lo que vamos, yo defendía a capa y espada a Eclipse (sigue siendo mi preferido, que quede muy claro), es más, mi propuesta era no elegir ningún IDE, ya que para mi no es una elección estratégica, y dejar que cada desarrollador trabaje con el entorno en el que está más cómodo y sea mas productivo. Además, mis escasos contactos con el IDE de Oracle fueron mas bien decepcionantes. Es cierto que no le dediqué mucho tiempo, pero con otros IDE's que probé, como por ejemplo Eclipse,NetBeans, JBuilder o IntelliJ en muy poquito tiempo ya me había "hecho a los mandos". Recuerdo por ejemplo que me fue imposible configurar el acceso a CVS, entre otras cosas porque creo que no venía integrado "de serie" (no recuerdo que versión era).
Este fin de semana he recibido un mensaje anunciando el lanzamiento de la versión JDeveloper 10g (10.1.3) Early Access y como estaba un poco ocioso me decidí a probarlo.
La primera impresión ha sido bastante buena (lo suficiente como para decidirme a escribir este post
) y además de comprobar algunas de las características que anuncian, como por ejemplo el soporte mejorado para JSF, he comprobado que ya soporta CVS directamente (es una espinita que tenía clavada
). La verdadera razón que me ha llevado a probarlo es que en los ultimos proyectos en los que estoy trabajando se utiliza JSF y todavía no he encontrado un entorno que lo facilite. A Eclipse y su JavaServer Faces Tools todavía le queda mucho tiempo. El plugin MyEclipse además de ser de pago lo veo un paso por detrás de otras soluciones comerciales, como el Sun Java Studio Creator, que gráficamente me gusta mas que JDeveloper pero tampoco me acaba de convencer.
El caso es que me sorprende que ahora que JDeveloper es gratis, parece que no es un producto muy utilizado. Por ejemplo, en la ultima encuesta realizada por el portal ONJava.com el IDE de Oracle aparece el último de la lista siendo utilizado por apenas el 5% de los desarrolladores (que contestaron a la encuesta, claro). ¿Ha llegado tarde Oracle? ¿Que hubiera pasado si lo hubieran ofrecido gratis hace un par de años? ¿Es el próximo paso hacerlo open-source? La verdad es que no creo que JDeveloper sea un producto estratégico para Oracle, y sin embargo no solo no lo han dejado aparcado si no que lo han potenciado hasta conseguir un producto de gran calidad. Tras una brevísima prueba con ambos IDE's (y a lo mejor por eso meto la pata) me da la sensación que JDeveloper ofrece una calidad similar, si no superior, a NetBeans, y sin embargo no está metiendo tanto ruido. Ofrece funcionalidades que Sun solo ofrece pagando (en el Creator) y otras en las que es claramente superior (el acceso a las bases de datos), asi que ¿por que no usamos JDeveloper?
... y que conste que yo, al menos de momento, seguiré utilizando Eclipse ...
» Leer más, comentarios, etc...
… más visitantes en el botxo
Septiembre 23rd, 2005 - [Enlace local]
Además de Vitxo, ayer contamos con otro ilustre visitante en el viejo botxo, este para quedarse. Y es que después de temer los presentes por sus dedos, el señor java-champion Lasterra consiguió abrir su pack de bienvenida a ese club de ases (3 días ha tardado en llegar desde EEUU!. Wow.).
Pues bueno, de ahi salieron, entre otras cosas, Tiger y Duke, para regocijo de los presentes.

Pulsa sobre la imagen para ampliarla
¿Que más contenía la caja?. Eso lo dejo para Lasterra. Yo soy sólo un reportero fotográfico Nokia en mano.
» Leer más, comentarios, etc...
Y si hablamos de...
… más visitantes en el botxo
Septiembre 23rd, 2005 - [Enlace local]
Además de Vitxo, ayer contamos con otro ilustre visitante en el viejo botxo, este para quedarse. Y es que después de temer los presentes por sus dedos, el señor java-champion Lasterra consiguió abrir su pack de bienvenida a ese club de ases (3 días ha tardado en llegar desde EEUU!. Wow.).
Pues bueno, de ahi salieron, entre otras cosas, Tiger y Duke, para regocijo de los presentes.
Pulsa sobre la imagen para ampliarla
¿Que más contenía la caja?. Eso lo dejo para Lasterra. Yo soy sólo un reportero fotográfico Nokia en mano.
» Leer más, comentarios, etc...
El IDE perfecto
Septiembre 23rd, 2005 - [Enlace local]
El primer IDE (Integrated Development Environment, o Entorno Integrado de Desarrollo) que conocí, fue el Turbo Pascal 5.5, allá por el año 1992 si no mal recuerdo. Desde entonces los IDE han ido evolucionando a una velocidad vertiginosa, hasta llegar al Visual Studio .NET 2005, Zend Studio, KDevelop, o Eclipse/Netbeans, por poner sólo unos ejemplos.
» Leer más, comentarios, etc...
Mapeo objeto-relacional (herencia II)
Septiembre 22nd, 2005 - [Enlace local]
Hola de nuevo. Estos días no he posteado porque he estado de vacaciones
.
En el anterior post hablé sobre el mapeo de una jerarquía de herencia usando
la estrategia “una tabla por clase”. En este post voy a explicar la
estrategia “Una tabla por cada clase concreta (no abstracta)”. Sigo con
el mismo modelo de datos (alumnos, profesores, etc.). Con esta estrategia
las clases abstractas no tienen tabla propia. Por lo tanto no habrá
una tabla “personas” y por tanto las tablas de las clases hijas tendrán
más columnas (para almacenar las propiedades que heredan de la clase
Persona). Así quedarían las tablas:
CREATE TABLE alumnos (nif INTEGER NOT NULL,
nombre VARCHAR(50),
apellidos VARCHAR(50),
fecha_nacimiento DATE,
numero_creditos_cursados INTEGER,
PRIMARY KEY(nif)) TYPE=INNODB;
CREATE TABLE profesores (nif INTEGER NOT NULL,
nombre VARCHAR(50),
apellidos VARCHAR(50),
fecha_nacimiento DATE,
id_departamento INTEGER,
PRIMARY KEY(nif)) TYPE=INNODB;
CREATE TABLE asignaturas (id_asignatura INTEGER NOT NULL AUTO_INCREMENT,
nombre VARCHAR(50),
curso INTEGER,
creditos INTEGER,
profesor_titular INTEGER,
PRIMARY KEY(id_asignatura)) TYPE=INNODB;
CREATE TABLE departamentos (id_departamento INTEGER NOT NULL AUTO_INCREMENT,
nombre VARCHAR(50),
PRIMARY KEY(id_departamento)) TYPE=INNODB;
CREATE TABLE matriculas (id_asignatura INTEGER NOT NULL,
nif INTEGER NOT NULL,
PRIMARY KEY(id_asignatura, nif)) TYPE=INNODB;
Creo las claves foráneas para las relaciones…
ALTER TABLE asignaturas ADD FOREIGN KEY (profesor_titular) REFERENCES profesores (nif); ALTER TABLE profesores ADD FOREIGN KEY (id_departamento) REFERENCES departamentos (id_departamento); ALTER TABLE matriculas ADD FOREIGN KEY (id_asignatura) REFERENCES asignaturas (id_asignatura); ALTER TABLE matriculas ADD FOREIGN KEY (nif) REFERENCES alumnos (nif);
Esta estrategia requiere menos tablas que la anterior, pero en ciertas ocasiones la integridad referencial a veces no puede asegurarse sólo con claves foráneas. Supongamos que existe
una entidad “Libro” que tiene un “propietario” de tipo “Peronsa”. En la estrategia enterior
crearíamos una columan en la tabla “libros” que apuntara a la clave primaria de la tabla “personas”;
pero en este caso no hay tabla “personas”, ahora debería apuntar o a “alumnos” o a “profesores”. En ese caso no podríamos asegurar mediante claves
foráneas que un libro apunte a una persona cuya clave primaria existe.
Esta estrategia es mejor que la anterior en cuanto a que dar de alta una persona o un alumno
es más sencillo porque sólo tenemos que modificar una tabla cada vez.
Para hacer un “listado polimórfico”, por ejemplo, listar todas las personas (alumnos y profesores)
tendríamos que hacer un “select” por cada tabla y juntarlos con “UNION”. Ejemplo: “select … from alumnos where … UNION select … from profesores where …”.
Un saludo y hasta el próximo post!
» Leer más, comentarios, etc...
Gimenoblog
Mapeo objeto-relacional (herencia II)
Septiembre 22nd, 2005 - [Enlace local]
Hola de nuevo. Estos días no he posteado porque he estado de vacaciones :D. En el anterior post hablé sobre el mapeo de una jerarquía de herencia usando la estrategia "una tabla por clase". En este post voy a explicar la estrategia "Una tabla por cada clase concreta (no abstracta)". Sigo con el mismo modelo de datos (alumnos, profesores, etc.). Con esta estrategia las clases abstractas no tienen tabla propia. Por lo tanto no habrá una tabla "personas" y por tanto las tablas de las clases hijas tendrán más columnas (para almacenar las propiedades que heredan de la clase Persona). Así quedarían las tablas:
CREATE TABLE alumnos (nif INTEGER NOT NULL,
nombre VARCHAR(50),
apellidos VARCHAR(50),
fecha_nacimiento DATE,
numero_creditos_cursados INTEGER,
PRIMARY KEY(nif)) TYPE=INNODB;
CREATE TABLE profesores (nif INTEGER NOT NULL,
nombre VARCHAR(50),
apellidos VARCHAR(50),
fecha_nacimiento DATE,
id_departamento INTEGER,
PRIMARY KEY(nif)) TYPE=INNODB;
CREATE TABLE asignaturas (id_asignatura INTEGER NOT NULL AUTO_INCREMENT,
nombre VARCHAR(50),
curso INTEGER,
creditos INTEGER,
profesor_titular INTEGER,
PRIMARY KEY(id_asignatura)) TYPE=INNODB;
CREATE TABLE departamentos (id_departamento INTEGER NOT NULL AUTO_INCREMENT,
nombre VARCHAR(50),
PRIMARY KEY(id_departamento)) TYPE=INNODB;
CREATE TABLE matriculas (id_asignatura INTEGER NOT NULL,
nif INTEGER NOT NULL,
PRIMARY KEY(id_asignatura, nif)) TYPE=INNODB;
Creo las claves foráneas para las relaciones...
ALTER TABLE asignaturas ADD FOREIGN KEY (profesor_titular) REFERENCES profesores (nif); ALTER TABLE profesores ADD FOREIGN KEY (id_departamento) REFERENCES departamentos (id_departamento); ALTER TABLE matriculas ADD FOREIGN KEY (id_asignatura) REFERENCES asignaturas (id_asignatura); ALTER TABLE matriculas ADD FOREIGN KEY (nif) REFERENCES alumnos (nif);
Esta estrategia requiere menos tablas que la anterior, pero en ciertas ocasiones la integridad referencial a veces no puede asegurarse sólo con claves foráneas. Supongamos que existe una entidad "Libro" que tiene un "propietario" de tipo "Peronsa". En la estrategia enterior crearíamos una columan en la tabla "libros" que apuntara a la clave primaria de la tabla "personas"; pero en este caso no hay tabla "personas", ahora debería apuntar o a "alumnos" o a "profesores". En ese caso no podríamos asegurar mediante claves foráneas que un libro apunte a una persona cuya clave primaria existe.
Esta estrategia es mejor que la anterior en cuanto a que dar de alta una persona o un alumno es más sencillo porque sólo tenemos que modificar una tabla cada vez.
Para hacer un "listado polimórfico", por ejemplo, listar todas las personas (alumnos y profesores) tendríamos que hacer un "select" por cada tabla y juntarlos con "UNION". Ejemplo: "select ... from alumnos where ... UNION select ... from profesores where ...".
Un saludo y hasta el próximo post!
» Leer más, comentarios, etc...
más que código - articulo - programacion
El poder de los Wikis
Septiembre 21st, 2005 - [Enlace local]
Tan solo unas horas después de que os anunciase el Wiki-Glosario de Ingeniería del Software, alguien ha accedido al mismo y ha ido incorporando las denominaciones en inglés de muchos de los términos, con lo cual casi podemos decir que tenemos un Wiki-Glosario-Diccionario español-inglés de la Ingeniería del Software.
Esta es una ampliación en la que yo no había pensado y demuestra el gran poder de los Wikis para convertirse en una verdadera herramienta comunitaria de documentación e intercambio de información. Descentralizada y con gran capacidad de crecimiento.
Quiero agradecer a la persona que ha incorporado las traducciones y le invito a que se añada a la lista de colaboradores disponible en la página principal del Wiki.
» Leer más, comentarios, etc...
knocte :: MonoTema
¿El futuro de las bases de datos?
Septiembre 21st, 2005 - [Enlace local]
Últimamente el mundo de las bases de datos se está moviendo bastante. Por un lado tenemos los brillantes frameworks de Mapeado Objeto-Relacional (ORM), que no hacen otra cosa que simplificar el día a día de los típicos programadores que utilizan un lenguaje orientado a objetos contra una base de datos relacional. (Microsoft estaba apunto de incluir su propio framework en Visual Studio 2005,
» Leer más, comentarios, etc...
El poder de los Wikis
Septiembre 21st, 2005 - [Enlace local]
Tan solo unas horas después de que os anunciase el Wiki-Glosario de Ingeniería del Software, alguien ha accedido al mismo y ha ido incorporando las denominaciones en inglés de muchos de los términos, con lo cual casi podemos decir que tenemos un Wiki-Glosario-Diccionario español-inglés de la Ingeniería del Software.
Esta es una ampliación en la que yo no había pensado y demuestra el gran poder de los Wikis para convertirse en una verdadera herramienta comunitaria de documentación e intercambio de información. Descentralizada y con gran capacidad de crecimiento.
Quiero agradecer a la persona que ha incorporado las traducciones y le invito a que se añada a la lista de colaboradores disponible en la página principal del Wiki.
» Leer más, comentarios, etc...
Webstats4U ¿malvados?
Septiembre 21st, 2005 - [Enlace local]
Muchos de nosotros hemos ocupado Nedstat para llevar las estadísticas de nuestro sitios. No había notado nada raro desde que pasaron a ser Webstats4U, pero en Alt 1040 avisan que desde el cambio aparecen pop-ups. ¡Nasty!
Por un post en el mismo blog vi que la “feature” sólo aparece en IE. Bastante pillos los tipos, ya que cualquier blogger que se precie ocupa otra cosa (Firefox, por ejemplo). Hagamos un análisis del problema
Lo primero es dirigirse a la página de términos de uso de Webstats4U. Claramente dice:
With the installation of Webstats4U on the site it is accepted that WMS has the right to place advertisements on the site in any format or through any channel, including but not limited to e-mail, layer ads, pops, banners and other usual formats without any forewarning and it is furthermore accepted that WMS takes no responsibility for the advertising content and that WMS shall not be liable for any losses incurred regarding this advertising.
Linda la tontera. Ahora se dan el derecho de publicitar por e-mail, pasando por encima de todas las legislaciones. Y, mish, hasta podrían poner un banner en mi sitio, por una tontera como un contador. Bueno, son SUS términos de servicio, después de todo
Segundo, el script que se llama desde el contador es http://m1.nedstatbasic.net/basic.js. No tiene ningún window.open, pero sí algo bastante extraño:
- d.write(‘<iframe src="http://a.as-eu.falkag.net/dat/dlv/aslframe.html?dat=443586&xl=1&yl=1" width=1 height=1 noresize scrolling=no hspace=0 vspace=0 frameborder=0 marginheight=0 marginwidth=0>‘);
- d.write(‘<scr‘+‘ipt type="text/javascript" language="javascript" src="http://a.as-eu.falkag.net/dat/dlv/aslmain.js"></scr‘+‘ipt>‘);
- // snip…
- d.write(‘<scr‘+‘ipt type="text/javascript" language="javascript" src="http://a.as-eu.falkag.net/dat/cjf/00/44/35/86.js"></scr‘+‘ipt></iframe>‘);
Para los que no sepan mucho de html o javascript, lo que hace es crear un iframe invisible, o sea, cargan una pequeña página dentro de la actual, sin que se vea. Además, incluye dos script javascript a ser ejecutados:
- http://a.as-eu.falkag.net/dat/dlv/aslmain.js
- http://a.as-eu.falkag.net/dat/cjf/00/44/35/86.js
Haciendo una rápida revisión por falkag.net, podemos ver que es una empresa de avisaje. Lo suponía…
Analicemos un poco el primer script de falkag que nombre. Lo primero, es ver cuantas veces se lanza un window.open, ya que permite saber de inmediato si se lanzan popups. La cuenta dice: 7. Evidentemente, es un script de avisaje por pop-ups.
El código es bastante enredado, así que prefiero no darme muchas vueltas, pero creo que el código culpable es:
- if (!pB||(pB&&navigator.appName!=‘Microsoft Internet Explorer‘))
- {
- oD(1,‘Start BW-Test‘,‘Java‘);
- document.write(‘<applet codebase="‘+jB[Ads_sec]+‘/" code="bandwidth.class" id="bandwidth" name="bandwidth" width="0" height="0" mayscript="MAYSCRIPT"><param name="cbfunc" value="tE"></applet>‘);
- } else
- oD(1,‘BW-Test Canceled‘,‘Mac IE Combination‘);
Creo que tendré que sacar el nedstats… con lo que me gustaba :S
» Leer más, comentarios, etc...
más que código - articulo - programacion
Wiki-Glosario de Ingeniería del Software
Septiembre 20th, 2005 - [Enlace local]
No se si conocéis el proyecto CIS (Compendio de Ingeniería del Software), un proyecto que ya reseñé en Versión Cero.
Se trata de un tratado introductorio sobre la ingeniería del software compuesto hasta ahora de dos tomos y un glosario. Pues bien, Juan Palacio, su autor, ha tenido la gran amabilidad de ceder dicho glosario para que sea incorporado al Wiki de Planeta Código. Creo que este es un estupendo añadido a nuestro Wiki y puede ser la base de algo grande, a poco que todos colaboremos en ampliarlo. En la actualidad cuenta con más de 100 términos.
Os invito a utilizarlo y ampliarlo: Wiki-Glosario de Ingeniería del Software
» Leer más, comentarios, etc...
Wiki-Glosario de Ingeniería del Software
Septiembre 20th, 2005 - [Enlace local]
No se si conocéis el proyecto CIS (Compendio de Ingeniería del Software), un proyecto que ya reseñé en Versión Cero.
Se trata de un tratado introductorio sobre la ingeniería del software compuesto hasta ahora de dos tomos y un glosario. Pues bien, Juan Palacio, su autor, ha tenido la gran amabilidad de ceder dicho glosario para que sea incorporado al Wiki de Planeta Código. Creo que este es un estupendo añadido a nuestro Wiki y puede ser la base de algo grande, a poco que todos colaboremos en ampliarlo. En la actualidad cuenta con más de 100 términos.
Os invito a utilizarlo y ampliarlo: Wiki-Glosario de Ingeniería del Software
» Leer más, comentarios, etc...
Pre-alfa of MonoBlog 0.1 is released!
Septiembre 20th, 2005 - [Enlace local]
Hoy he subido al svn de MonoBlog lo que habia avanzado el dia de ayer, es una version pre-alfa
. Despues de pelearme con el Gtk.ComboBox y lograr lo que queria, Mario me dijo que mejor utilizara Gtk.ComboBoxEntry porque Gtk.ComboBox ya estaba obsoleto, muy tarde :S. Pero bueno eso ya lo ire viendo.
Cosas que he hecho:
- Logeo correcto mediante la GUI
- Obtencion de blogs en un Gtk.ComboBox
- Vista previa del post
- Envio del post
Cosas que faltan hacer:
- Implementacion de las opciones del Menu
- Una barra de herramientas para hml
- Resaltado de sintaxis html
- Obtencion automatica de blogs despues del logeo
- Resolver varios bugs, que de seguro hay
- Y alguna otra sugerencia
Si quieres ir testeandolo (solo funciona con Blogger) pos hazlo:
svn checkout svn+ssh://anonymous@forgesvn1.novell.com/svn/mono-blog/trunk/0.1
pass: anonymous o aqui
Requerimientos: gtk#2, glade#2 y gecko#2. Full desarrollo
.
Compilado con: Mono 1.1.9
Aqui algunos pantallazos:
Le doy gracias a Parodisoft por el logo que hizo, pero para serle sincero no me gusta mucho que digamos
.
Se aceptan mas propuestas!, tamaño (232 x 264).
Una ultima cosa, si van a introducir codigo html, pues que sea uno bien formado, sino no postea, cierren todas las etiquetas que habran y coloquelas como son
.
» Leer más, comentarios, etc...
Browses para T-Gtk (II)
Septiembre 19th, 2005 - [Enlace local]
Si anteriormente vimos el ejemplo de uso de un Browse sobre una tabla DBF, ahora veremos sobre arrays….


