Archivo de March, 2007

Microsoft Expression Web

Me lo instalé hace tiempo, había visto un vídeo y me pareció que tenía buena pinta.

Tiene buena pinta, desde el punto de vista que está mejor orientado que el DreamWeaver a crear un código correcto, aunque por supuesto, tienes que saber lo que haces, qué es CSS y cómo organizarte. Y también desde el punto de vista que permite una facil integración de componentes realizados en .Net.

La parte ilusa de cierto vídeo es que no explicaba de dónde surgían esos componentes. El vídeo decía, cualquier diseñador que sepa un poco de maquetación en XHTML puede montar un website en una patada. Pero no explica de dónde salen esos componentes ni cómo se han introducido los datos que muestran esos componentes.

Y digo yo, quizás es cierto, quizás se podría crear un grupo de componentes altamente adaptables de las secciones más comunes, y luego las no tan comunes, que puede necesitar una web. Y licenciarlas para que cualquiera -con una excepción- las use.

Ya puestos, y sería el siguiente paso lógico, hacer también el CMS. Uf! sé que no es muy original la idea de un CMS más en el mercado, pero el planteamiento sí lo es.
Se trata de hacer, por ejemplo, un modulo llamado Noticias Krypton, que permite una serie de campos con una lógica, y un modulo llamado Noticias Kwan, que permite otro planteamiento. Si Krypton permite que la noticia tenga estado de archivo y el cliente del programador no quiere archivo de noticias, se puedría configurar, no hace falta hacer tantos modulos como posibles especificaciones hayan, pero como pueden haber planteamientos claramente incompatibles, pues tampoco hay que cerrarse a la idea de que exista un único modulo de noticias. Lo mismo para galerías de imágenes, etc.

Y por el lado web, pues cada modulo de CMS tendría su módulo hermano, que con plantillas XSLT (de ahí el post del otro día) generaría el interface.

Esto no quita todo el trabajo, como prometen muchos sistemas, pero si la parte más común. Y permite un alto grado de separación lógica-presentación.

March 30th, 2007 by albinworld

El desuso de XSLT y los gestores de contenidos.

Recuerdo haber investigado el uso de XSLT hace una eternidad, en el año 2000 día arriba día abajo, lo utilicé dos veces, y no lo he vuelto a utilizar hasta hace poco en un par de ocasiones más.

Lo utilicé para un proyecto en la empresa dónde trabajo, es una inmobiliaria que muestra información turística de las zonas dónde tiene sus promociones, y puesto que la comparte con otros websites, nos vino bien.

Lo utilicé para mi página personal porque quería tener los contenidos separados de la presentación, y después renderizarlos como XHTML o como PDF utilizando Batik. Fue un desastre por cuestiones de charsets, abandoné la página en 2002 arto de pelearme con ello, y luego nunca he tenido tiempo de retomarla.

Más actualmente lo he utilizado con Google Mini. El sistema genera un XML con los resultados (entre otra información), y mediante XSLT compones la página que el usuario acaba visualizando finalmente.

A parte de que sea un joven cebolleta, a quién le encanta contar sus historietas. ¿A qué viene esto?

Pues tengo un inventillo en mente, que después de usarlo para mi propio propósito con el aspecto que me parezca adecuado, quizás quiera liberar, y pensaba en cómo podría habilitar que futuros implementadores tengan absoluta libertad para cambiarle el aspecto, pero mi gestión de los contenidos les siga resultando útil. Una posible solución sería el uso de etiquetas dentro del XHTML al estilo TextPattern, pero no me acaba de convencer, porque lo veo tedioso de parsear por mi parte. Por otro lado, me parece que casi nadie sabe / usa / se acalara con XSLT. Pero bueno, no me importa hacerlo para listos, además, la mayoría se conformarían con cambiar colores en el CSS, sobrescribir unas imágenes, y poco más, supongo.

March 26th, 2007 by albinworld

MySQL - Exportando procedimientos almacenados al servidor de hospedaje

El asunto es que, cuando utilizas MySQLDump para generar un fichero .sql con intención de subirlo al servidor, MySQLDump no exporta la creación de funciones y procedimientos almacenados.

He accedido al CPanel y he autorizado conexiones al Servidor de MySQL desde mi IP. Luego he arrancado el MySQLQueryBrowser abriendo una conexión local, he pulsado sobre mi Procedimiento Almacenado, he pulsado F2, he sombreado, he copiado … he abierto otra conexión pero esta vez hacia el servidor de hospedaje, he seleccionado la base de datos, he pulsado para crear un nuevo procedimiento almacenado, y he pegado.

Consideraciones, acordarse de que seguramente la base de datos en el servidor de hospedaje tiene otro nombre diferente, suelen tener como prefijo tu nombre de usuario en ese sistema. Y acordarse de quitar el “definer” de la declaración porque lógicmente ese usuario tampoco existe allí. Yo he preferido quitarlo, y que el servicio le asigne el usuario que considere oportuno.

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_getExpresion`(prmYearWeek varchar(6))

phpMyAdmin es super completo, super estable, … pero es vía web, es como más incómodo, y ahora que tenemos el MySQLQueryBrowser -libre y ligero, no como el front-end de Toad- pues a mi me resulta preferible, antes incluso conectaba directamente con la consola de mysql pero claro, una cosa es escribir consultas sueltas de DDL y otra es escribirse un procedimiento con la consola.

March 25th, 2007 by albinworld

¿Promueve Canal 9 los vídeos de gamberros?

Los jovenzuelos más modernos inmortalizan sus gamberradas en vídeo, para lucirlo en YouTube.

Canal 9 a falta de una imágen mejor que poner mientras comentan la azaña no se les ocurre otra cosa que poner el vídeo. Y de esa manera es visto por gente, como mis padres, que ni se sentarían a buscar semejantes cosas por internet, ni lo iban a recibir por mail de algún amigo.

¿Quíenes salen beneficiados? Los que buscan audiencia, la persona (el gamberro) y la entidad (Canal 9).

March 21st, 2007 by albinworld

Gritos Deportivos

Si tienes NetVibes puedes ponerte un módulo para estar al tanto de los últimos Gritos Deportivos pulsando en el siguiente icono.

Add to Netvibes

March 21st, 2007 by albinworld

MySQL - Creando procedimientos almacenados

Mi segundo intento por usar las caracteristicas que aporta MysQL 5 sobre la versión 4. En esta ocasión el objetivo era crear un procedimiento almacenado, cual ha sido mi sorpresa, cuando he leido que ¡no puede devolver una tabla! de hecho no puede devolver nada, solo las funciones pueden … curioso, pero bueno, aún puede hacer algo por mí, marcar el registro que me interesa.

Bueno, esta vez ha sido menos doloroso, y hasta he conseguido usar un IF. Pero no es facil encontrar ejemplos por la red, tampoco digo que sea dificil, quien quiera que me entienda.

DROP PROCEDURE IF EXISTS `degramm`.`sp_getExpresion` $$
CREATE PROCEDURE `degramm`.`sp_getExpresion` (prmYearWeek varchar(6))
BEGIN

DECLARE nMax   tinyint;
DECLARE id     int;

SELECT nApariciones INTO nMax FROM t_expresiones WHERE sYearWeek = prmYearWeek;

IF @nMax = null THEN
SELECT idExpresion INTO id FROM t_expresiones WHERE nApariciones<@nMax LIMIT 0, 1;
UPDATE t_expresiones SET sYearWeek = prmYearWeek WHERE idExpresion = @id;
END IF;

SELECT * FROM t_expresiones WHERE sYearWeek = prmYearWeek;

END $$

Curiosamente, esta vez no he necesitado usar la arroba en el “SELECT col INTO var”.

Un END IF con un punto y coma se me hace raro. Por no hablar de cómo se ejecuta

CALL sp_getExpresion('2007-12')

La utildiad de los parámetros de tipo OUT será si llamas de un procedimiento a otro, sino que me cuente alguien cómo recuperas una variable si en PHP llamas al procedimiento así:

mysql_query("CALL sp_ConParametroTipoOUT '".$EsteValorNoPuedeSerVariadoEnLaVida."'", $dbLink)

March 20th, 2007 by albinworld

MySQL - Creando funciones definidas por el usuario

Me ha costado un rato largo, acostumbrado a escribir para MS-SQLServer, adaptarme a escribir para MySQL. La criatura y unos comentarios a continuación.

DROP FUNCTION IF EXISTS `degramm`.`f_EtiquetaPalabra` $$
CREATE FUNCTION `degramm`.`f_EtiquetaPalabra` (Etiqueta int, Palabra int) RETURNS TINYINT
BEGIN
DECLARE yon TINYINT;
SELECT count(*) INTO @yon FROM t_etiquetapalabra WHERE idEtiqueta=Etiqueta AND idPalabra=Palabra;
RETURN @yon;
END $$

Si llega a tener más líneas, me jubilo antes de conseguirlo.

Me llama la atención que las variables declaradas por el programador sí se precedan con la arroba, y por contra los parámetros no necesiten la arroba.

Me llama la atención que durante todo el tiempo que escribí los parámetros con arroba, los consideraba variables sin inicializar (NULL) en vez de arrojarme un error.

Curioso el “SELECT col INTO var FROM …” en vez de “SELECT var = col FROM …”

El poder usar un “IF” lo dejo para otro milenio en que la suerte me sonría más.

March 17th, 2007 by albinworld

ICE : In Case of Emergency

Por lo visto era importante que sonase como otra palabra, hielo, es típico en el inglés crear confusión al oyente ante un sonido, así que deciden que la preposición “in” merece mayúscula, pero la preposición “of” no la merece…

Escuché hace mucho esta iniciatavia, que todos pactasemos, o mejor asumiesemos, porque si tratamos de pactarlo, como me ha pasado al comentarlo en el trabajo, cada uno opinaría una cosa … que asumiesemos llevar en el movil un teléfono asociado a esta palabra, que sería dónde quieres que llamen en caso de que te suceda algún percance. Si quieres poner varios, usas ICE 1, ICE 2, etc.

Yo esta pensando en poner “ICE still alive” con el teléfono de mis padres, y “ICE just dead” con el de alguna exnovia para darle una alegría.

March 15th, 2007 by albinworld

WAMP 5 por el culo te la …

Al menos eso pensé mientras lo instalaba por tecera vez.

En la primera instalación no pulsé el check de arrancar automáticamente, y creo que por esta razón no se instaló bien MySQL, y luego no acababa de funcionar correctamente.
La segunda instalación seguramente funcionó, pero no me dí cuenta de lo que contaré a cotinuación, y decidí volverlo a instalar.

La tercera instalación funcionó, pero obtenía sistemáticamente un error 500 típico de Apache con Times New Roman. Mirando el LOG me dí cuenta que viene sin el módulo rewrite activado por defecto, y el error no es nada descriptivo. PHP viene sin la librería GD activada por defecto, dicho sea de paso, aunque esta tiene un uso menos frecuente y es más razonable que no venga activa.

Yo me preguntaba porqué la primera vez había funcionado, y es que, tocando tocando, a parte de crear el alias, había activado dichos módulos, y en la tercera sin embargo, había ido más ofuscado a usarlo, cree el alias, y no reparé en los demás detalles.

Pero mola, el menú en el systray es bastante completo, los servicios de apache y mysql se instalan con el prefijo “wamp” de manera que no “chocan” con otras posibles instancias ajenas a WAMP, y facilita removerlas del regedit si acaso necesitases hacerlo (es un poco gorrino, pero ellos mismos en la web te lo recomiendan en caso de una desinstalación fallida).

March 12th, 2007 by albinworld

Textpattern, de local al servidor.

Realmente sencillo, mucho más que Wordpress, pasar un blog realizado en TxP de tu máquina de desarrollo al servidor. Aún así, como para todo deben haber plugins, pues algunos programadores lo han intentado simplificar más aún, pero basta con subir los ficheros por FTP, exportar la base de datos con mysqldump, importarla con phpMyAdmin en el servidor, y ajustar el un par de cosas en el config.php (explicado así para listos).

Todo esto fue consejo del autor de TextPatternMania, como también fue solución suya porqué no podiá hacer login en mi nueva instalación.

Listo de mi, incluso copiaba el valor del campo “password” de la tablas “users” de mi local al servidor, y probaba la misma contraseña, y no había manera de entrar … parecía un Expediente X sin solución, pero la tenía.

UPDATE users SET password=PASSWORD(’1234′) WHERE user=’albin’

Por lo visto TxP utiliza el sistema de MySQL para el cifrado de las contraseñas, y este sistema es diferente de una instalación de MySQL a otra, y por lo tanto no sirven los mismos valores hexadecimales almacenados.

A saber si esos plugins solucionan de alguna manera transparente este dilema, pues me parece que la encriptación es asimétrica y entonces tendrían que preguntar a quién hace la exportación/importación las claves de cada usuario.

March 12th, 2007 by albinworld

Cambios de MySQL 4.x a 5.x

Gracias por las subconsultas.

Gracias por las vistas.

Gracias por los triggers y los stored procedures.

Me molesta -manías personales- toda la broza que aparece ahora en los mysqldump.

Y hecho de menos que copiar la carpeta con el nombre de la base de datos que está dentro de la carpeta “data” sea copiar la base de datos en si misma … Antes copiabas esa carpeta de una instalación a otra, y tenías la base de datos duplicada, ahora se queda como si nada … !?

March 12th, 2007 by albinworld

Ordenador nuevo

Los datos más remarcables:

Intel Dual Core 2 E6400 2.16Ghz

Chipset 975X

2 Gb 800 Mhz

XFX nVidia 7600 GT

Me lo he comprado por varias razones, a cada cual más absurda: Porque me apetecía, porque llevo tres años currando en el portatil, … Y alguna no tan absurda pero absurdizada: Porque quiero aprender cosas que requieren de una buena máquina.

Arranca (tiempo total desde que pulsas ON hasta que puedes pusar Inicio en WinXP) en solo 25 segundos.

Lo triste vino el domingo, que me ví programando en PHP con el Textpad, y varios compromisos que me atan -de momento- sin dejarme tiempo para hacer “esas otras cosas nuevas”, y me sentí tan absurdo usando el 10% de su memoria … cada vez me pagan mejor por mi tiempo, y paradógicamente, cada vez se me hace más cuesta arriba atarme a proyectos en mi tiempo de ocio, echo de menos ser libre y programar lo que me de la real gana.

March 12th, 2007 by albinworld

Anti copy&paste

Just because code is on the Internet doesn’t mean you should cut and paste it into your production system.

Do you chew gum you find on the street?

Give code you find on the ‘NET the same amount of attention you’d give advice scrawled on a public bathroom wall.

Scott’s Rule of Programming - Rule# 0×3eA

March 8th, 2007 by albinworld

Sobre cómo hacer logs en tus aplicaciones

Fue un tema de reflexión que expuse en su día en los foros de planeta código pero como ahora tengo mi propio blog, pues lo pongo aquí también. La cuestión es tener unas reglas sobre qué información se almacena en el log y cuando usar cada nivel.

Sobre los niveles, venía a poner lo siguiente:

- Debug: Solo te sirve a tí, y ahora.

- Info: Conviene saber que esta sucediendo. Ej. Cuanto tiempo tomó tal proceso (para evitar que se desmadre).

- Warn: No es cómo se esperaba, pero nada ha fallado.

- Error: Falló.

- Fatal: No solo falló, sino que jamás debía haber fallado.

Sobre qué información debería aparecer, venía a decir lo siguiente:

1. Las acciones se loguean lo más inmediatamente posible después de la declaración de la función.

1.1. Puedes alejarlo de la declaración si necesitas recopilar algún dato (a parte de los parametros de entrada) para mostrarlo.

1.1.1. Si ese proceso tiene la más mínima posibilidad de fallar, loguea la entrada a la función, y posteriormente el dato obtenido.

2. Todas las líneas deben acabar con un caracter (en mi caso he elegido el punto) para evitar confusiones entre frases vagamente redactadas y valores que se han convertido a string como cadena vacía.

3. Cuando se vuelcan cadenas que pueden tener comillas, se vuelcan entre los caracteres 0171 y 0187 (”«”, “»”) para saber dónde comienzan, dónde acaban, y evitar confusiones de comillas más habituales.

Ejemplos de los casos:

2.

logger.debug(”Se edita la subfamilia” & sSubfamilia)

Si no existe un punto al final de la frase, y sSubfamilia es una cadena vacía, entonces leerías “Se edita la subfamilia” y no sabes si hace referencia a la subfamilia de la que has hablado previamente, o a un valor que debería haber aparecido y no aparece.

3.

«Se ejecuta “SELECT * FROM t_Cosas WHERE sNombre=’” & sQueCosa & “‘”»

Y la verdad que llevo un tiempo haciendolo y hasta ahora me parecen unas pautas muy válidas.

Muchas gracias por su atención, y hasta la próxima.

March 8th, 2007 by albinworld