Archivo de la categoría: Otros lenguajes

Map / Reduce en PHP comparado con Scheme

PHP6 será compatible con funciones lambda y agregará por ende algunas caracteristicas de lenguajes funcionales; interesante es entonces encontrar entradas como esta, que nos explica de una manera simple y sencilla la implementación de una “high-order function” en PHP6 comparandola luego con Scheme (un lenguaje funcional).

Veamos el ejemplo comparando la función MAP en PHP6 y en Scheme:

function map($fn, $list) { 
  return empty($list) ?
  array() :
  construct($fn(first($list)),
  map($fn, rest($list)));
}

Y ahora vemos la misma función equivalente en scheme:

(define (map fn lis)
 (if (null? lis)
 '()
 (cons (fn (car lis))
 (map fn (cdr lis)))))

Las funciones anónimas solventan muchos problemas que antes se solventaban con loops recursivos bastante peligrosos; que vamos a estar claros no aporta la potencia de Lisp o Scheme, pero ya es un avance en el lenguaje.

[MS] Que es mi Content-Type!, que te lo digo en serio!

No conformes con las cosas horribles que le pasan a Windows Vista y su pronto reemplazo por Windows 7 (o Windows Seven plagues como algunos ya lo llaman; el vaticinio del fin del mundo); la fiebre de soluciones “Chaborras” e ilusas ahora viene de la mano de la gente de Internet Explorer 8.

Si; este es mi content-type; que te lo digo en serio!

Durante milenios los documentos han viajado de los servidores hasta el navegador de una manera más o menos igual; el documento declara un tipo de contenido (Content-Type + charset) y aun así; los navegadores son algo desconfiados y echan una “mirada” al documento; sin embargo, es renderizado “tal cual es” sin ningún inconveniente; esto ha sido el comportamiento “por defecto” de absolutamente todo el mundo menos la gente “desvergonzada” de Redmont.

Al parecer su manía de desconfiar de cualquier código que no sea generado por ellos mismos (y si es generado por ellos; más desconfían) los hace “tratar de interpretar” el contenido obviando “olímpicamente” la declaración de Content-Type y enviando el contenido a los distintos “parsers” de acuerdo a su contenido; esto podría sonar interesante cuando se trata por ejemplo de imágenes (donde por lo general nadie declara el type) pero si dentro de un bloque en vez de contenter text/xml colocamos código javascript; en vez de ser enviado a pantalla (como debería ser, es un código javascript declarado como texto; como si lo colocara dentro de un <PRE>) este es ejecutado; siendo la total maldición de los sitios web y de los ataques de “MIME-sniffing”.

Para algo que es una “aplicación” habiamos inventado una declaración “application/xhtml+xml" esta permite indicar que nuestra página es una aplicación XML que combina HTML y otros “lenguajes” como javascript”; pero antes de IE7 los navegadores microsoft asumían esa declaración como un “binario” e intentaban descargar la página; ¿Como lo solventaban los desarrolladores para IE?; colocando 2 declaraciones Content-Type; una haciendo referencia a application/xhtml+xml y otra para IE de text/html.

Observen este “burdo” ejemplo de como las “cosas” se pasan por alto dentro de la casa de Redmont:

Con un bloque como:

HTTP/1.1 200 OK
Content-Length: 108
Date: Thu, 26 Jun 2008 22:06:28 GMT
Content-Type: text/plain;

<html>
<body bgcolor=”#AA0000″>
This page renders as HTML in IE7/IE8.
</body>
</html>

Como vemos; el content Type es “text/plain”; eso significa que “DEBERIA!” renderizarse como texto; pero la presencia de etiquetas HTML hace que IE7 e IE8 “interpreten” el contenido y lo envíen a pantalla.

En medida de seguridad; esto significa que un bloque de texto, conteniendo código Javascript (Jscript de MS) o VBScript será ejecutado en vez de ser “renderizado como texto”.

La burda solución de IE8? … inventarse una “declaración HTTP” indicando de que “en verdad” hay que hacerle caso al servidor y asumir el content-type como cierto; Authoritative=true:

HTTP/1.1 200 OK
Content-Length: 108
Date: Thu, 26 Jun 2008 22:06:28 GMT
Content-Type: text/plain; authoritative=true;

<html>
<body bgcolor=”#AA0000″>
This page renders as HTML source code (text) in IE8.
</body>
</html>

Nos les parece estúpido?; no le hago caso al content-type declarado; pero si a una declaración autoritativa?; si puedo “falsificar” una declaración de “content-type” ahora puedo “OBLIGAR” al navegador a no “intentar” analizar el contenido y a confiar en mí; si antes podía meter droga en la casa escondida en una caja de pizza; ahora con solo decir “Si mamá; es pizza” ella no revisará la caja y pasaré tranquilo con lo que desee entrar.

La idea es simple; HTML 5 obliga a los navegadores a obtener los primeros 512 bytes del documento e intentar analizar (via la cabecera del documento) todo el contenido de la página e informar al usuario de cualquier posible “discordancia” con el contenido; cualquier contenido “mal declarado” deberá ser tratado como text/plain o text/html y no “ejecutado” como viene haciendo IE7 (de hecho; HTML5 OBLIGA al UA (navegador) a informar al usuario de que un “contenido” está intentando ejecutarse cuando no debería; lo cual viene haciendo Firefox y otros navegadores como Opera hace tiempo); pero en vez de seguir con la corriente; con Authoritative=true la gente de IE8 se estará ahorrando el tener que escribir toda esta “mega-implementación” de interpretación y errores de excepción y “pasar a confiar en el servidor” sin tratar de analizar nada.

Es decir; no solo quieren seguir con el jueguito de “todo lo que me llegue lo ejecuto”; sino que además; “si el server me dice que EN SERIO debo ejecutarlo; entonces más lo haré sin chistar!” …

Cada día da más escalofríos pensar que será de Windows 7 e Internet Explorer en un par de años …

Me dio por buscar Rubies y matar culebras

Y bueno, sip, no voy a la selva amazónica a luchar con garimpeiros ni a trabajar para la AES (si, la empresa gringo-canadiense dueña de Electricidad de Caracas es dueña de varias concesiones mineras en la alta guayana); sino que me voy a dedicar por hobbie a aprender Ruby, si, es en serio; a menos que unas proféticas palabras de Alvaro me convenzan de lo contrario y me dedique a probar con python; es que realmente no tengo una seria alternativa para el trabajo de escritorio, Qt como todo C es pesado de aprender, mantener, llevar a cabo y la consabida multiplataforma se puede ir al comino, el pasado 21 de  noviembre cumplí  8 años dedicado a la programación con herramientas libres, no espero entonces recompilar mis aplicaciones de escritorio en algún entorno distinto a linux.

En verdad para eso del escritorio y hablar con GTK, PHP es bastante soso (y ni hablar de Qt), sin embargo lenguajes como python y ruby cuentan con la flexibilidad de aligerar la implementación de la programación de escritorio, me encantaría que nos unieramos en el CNSL o usando gloVE en una cruzada orientativa, para enseñarnos mutuamente y lograr discernir para que es buena cada herramienta, me gustaría que alvaro contara con el tiempo suficiente para que sacara una guia de trucos de python, me gustaria contar con las ideas suficientes para contar con un lenguaje de proposito general que sea facil de aprender y utilizar…

En este par de semanas usaré parte de mi tiempo libre para leer sobre python y Ruby a ver con cual me quedo …

Alguna sugerencia? … (abstenerse de dar comentarios malsanos sobre PHP o Perl) …

Una función agregada para MySQL 5 para el calculo de fechas:

Me encontraba observando ve.planetalinux.org cuando me di cuenta de dos cosas:
1.- alguien habia sindicalizado mi blog sin preguntarme; que bien, es bueno saber que hay gente que te lee.
2.- hay alguien que escribio una funcion en php para un sistema de noticias, la funcion debia retornar algo como “esto fue escrito hace: 1 año, 4 meses, 2 dias, 7 horas, 4 minutos y 30 segundos”.
La funcion sonaba interesante para mi, pero no para usarla en PHP, sino por mi fiel idea que el procesamiento en bruto de los datos debe ser ejecutado por el RDBMS y no por el cliente, decidi enfrentar ese reto de lograr que mySQL me emitiera la misma informacion.

Paso 1: Crear una sentencia SQL que retorne la informacion solicitada:

SELECT CONCAT(year(curdate()) – YEAR(‘2005-07-21 08:15:00′), ‘ año, ‘, month(curdate()) – month(‘2005-07-21 08:15:00′), ‘ meses, ‘, day(curdate()) – day(‘2005-07-21 08:15:00′), ‘ dias, ‘, abs(time_format(‘2005-07-21 08:15:00′, ‘%h’) – hour(curtime())), ‘ horas, ‘, abs(time_format(‘2005-07-21 08:15:00′, ‘%i’) – minute(curtime())), ‘ minutos y ‘, abs(time_format(‘2005-07-21 08:15:00′, ‘%s’) – second(curtime())), ‘ segundos’) AS tiempo_transcurrido

Es una sentencia interesante, larga, pero interesante, ahora bien, si a eso lo llevamos a una funcion agregada de mySQL 5 nos queda:

Paso 2: Crear una funcion agregada para mySQL 5 llamada tiempo_transcurrido:

DELIMITER $$
DROP FUNCTION IF EXISTS `mydb`.`tiempo_transcurrido`$$
CREATE FUNCTION `mydb`.`tiempo_transcurrido` (fecha_usuario DATETIME) RETURNS VARCHAR(75)
BEGIN
DECLARE fecha_t VARCHAR(75);
DECLARE fecha DATE;
DECLARE tiempo TIME;
DECLARE anno TINYINT(2);
DECLARE mes TINYINT(2);
DECLARE dia TINYINT(2);
DECLARE hora TINYINT(2);
DECLARE minuto TINYINT(2);
DECLARE segundo TINYINT(2);
SELECT curdate() INTO fecha;
SELECT curtime() INTO tiempo;
SELECT YEAR(fecha) – YEAR(fecha_usuario) INTO anno;
SELECT MONTH(fecha) – MONTH(fecha_usuario) INTO mes;
SELECT DAY(fecha) – DAY(fecha_usuario) INTO dia;
SELECT abs(HOUR(fecha_usuario) – HOUR(tiempo)) INTO hora;
SELECT abs(MINUTE(fecha_usuario) – MINUTE(tiempo)) INTO minuto;
SELECT abs(SECOND(fecha_usuario) – SECOND(tiempo)) INTO segundo;
IF anno > 0 THEN
BEGIN
IF anno > 1 THEN
BEGIN
SELECT CONCAT(anno, ‘ años, ‘) INTO fecha_t;
END;
ELSE
BEGIN
SELECT CONCAT(anno, ‘ año, ‘) INTO fecha_t;
END;
END IF;
END;
END IF;
IF mes > 1 THEN
BEGIN
SELECT CONCAT(fecha_t, mes , ‘ meses, ‘) INTO fecha_t;
END;
ELSE
BEGIN
SELECT CONCAT(fecha_t, mes, ‘ mes, ‘) INTO fecha_t;
END;
END IF;
IF dia > 1 THEN
BEGIN
SELECT CONCAT(fecha_t, dia , ‘ dias, ‘) INTO fecha_t;
END;
ELSE
BEGIN
SELECT CONCAT(fecha_t, dia, ‘ dia, ‘) INTO fecha_t;
END;
END IF;
IF hora > 1 THEN
BEGIN
SELECT CONCAT(fecha_t, hora , ‘ horas, ‘) INTO fecha_t;
END;
ELSE
BEGIN
SELECT CONCAT(fecha_t, hora, ‘ hora, ‘) INTO fecha_t;
END;
END IF;
IF minuto > 1 THEN
BEGIN
SELECT CONCAT(fecha_t, minuto , ‘ minutos’) INTO fecha_t;
END;
ELSE
BEGIN
SELECT CONCAT(fecha_t, minuto, ‘ minuto’) INTO fecha_t;
END;
END IF;
IF segundo 1 THEN
BEGIN
SELECT CONCAT(fecha_t, ‘ y ‘, segundo , ‘ segundos.’) INTO fecha_t;
END;
ELSE
BEGIN
SELECT CONCAT(fecha_t, ‘ y ‘, segundo, ‘ segundo.’) INTO fecha_t;
END;
END IF;
RETURN fecha_t;
END$$
DELIMITER ;

Sip, es mas larga, pero a la final mas util, su convocatoria devuelve algo como esto:
SELECT `mydb`.`tiempo_transcurrido`(‘2004-07-21 09:15:00′)
Retorna:
2 años, 2 meses, 6 dias, 7 horas, 7 minutos y 43 segundos.
(al momento que la ejecuté pues usa CURRENT_TIME (la fecha actual) como valor para el computo).

Espero esta funcion sea de utilidad no solo para lo cual fue diseñada sino para demostrar lo útil y versatil de mySQL 5 y sus procedimientos almacenados y funciones agregadas.

Un script de perl para xmms y xchat

Habia dado vueltas por la red un script de perl que mostraba las canciones que se reproducian en el xmms mientras chateabas en el xchat, decidí darle un poco más de utilidad, asi que como me da pereza mostrar el xmms cada vez que quiero cambiar de cancion, decidí modificar el script para que controle el xmms, por ahora hace lo necesario, play, pause, stop, next, previous y mostrar la cancion, espero les guste …

Todos los parámetros y los nombres de los comandos son personalizables abriendo el script y editando las variables iniciales …

Descarga: http://unexlug.org.ve/gpl/xchatxmms.pl.tar.bz2

Solo deben copiarlo a la carpeta plugins del xchat (o usar el asistente de cargar plugins del xchat).

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 3.067 seguidores

A %d blogueros les gusta esto: