lunes 6 de julio de 2009

Di NO a las PATENTES DE SOFTWARE

Actualmente (2008-2009) se está desarrollando una campaña de recogida de firmas para solicitar al Parlamento Europeo medidas más contundentes que erradiquen de una vez por todas las patentes de software en Europa. Te invito a que te informes de porqué este cambio nos conviene no sólo a los informáticos, sino también a la industria del software en general y de forma indirecta a toda la sociedad. Mientras que las patentes sólo benefician el "lucro" a corto plazo de un número contado de empresas y retrasan enormemente la competitividad y el progreso del sector informático, y de rebote de toda la sociedad!



Te invito pues a:



  • Visitar la página oficial de recogida de firmas.

  • Dejar allí tu firma y leer alguno de los estudios científicos que hay en torno al tema

  • Divulgar este asunto, colocando un banner en algunas de tus webs ;)

  • Incluir un artículo en tu blog



Banners


Para que lo tengas más fácil, aquí te dejo el código para insertar un banner horizontal y otro vertical:


<a target="_blank" href="http://petition.stopsoftwarepatents.eu/211002065663/"><img src="http://stopsoftwarepatents.eu/media/ssp-732-121.gif" alt="stopsoftwarepatents.eu petition banner" width="580" height="96" style="border:none;" /></a>


stopsoftwarepatents.eu petition banner


<a target="_blank" href="http://petition.stopsoftwarepatents.eu/211002065663/"><img src="http://petition.stopsoftwarepatents.eu/banner/211002065663/ssp-240-400.gif" alt="stopsoftwarepatents.eu petition banner" width="240" height="400" style="border:none;" /></a>


stopsoftwarepatents.eu petition banner

lunes 8 de junio de 2009

Comillas dobles y simples en HTML "input text"

Si eres desarrollador de aplicaciones web, sabrás ya que el tema de las comillas (simples y dobles) es siempre una fuente de problemas hasta que no descubres cómo lidiar con ellas. Voy a resumir ahora cuatro cosas que te van a funcionar siempre ;) si trabajas con PHP.

El problema principal es cuando queremos definir una cadena de texto que contenga unas comillas. Es un problema en sí mismo porque las cadenas de texto generalmente se delimitan usando comillas.

La mayoría de las veces es posible insertar comillas en una cadena de texto "escapando" esas comillas, es decir, usando un símbolo de "escape" (usualmente es la barra invertida \) delante de las comillas a escapar. Por ejemplo:

<input type='text' value='L\'Hospitalet' />

Sin embargo, este otro ejemplo (cuando delimitan comillas dobles) no funciona:

<input type="text" value="un \"gran\" hombre" />

Para incluir comillas dobles dentro de comillas dobles en HTML, tenemos que usar "carácteres especiales", así:

<input type="text" value="un &quot;gran&quot; hombre" />

La última cuestión es cómo hacer todo esto de manera fácil en PHP. Esto sería un ejemplo de cómo generar desde PHP el código HTML anterior suponiendo que la variable $value contenga una cadena con comillas dobles como un "gran" hombre:

<?php

echo "<input type=\"text\" value=\"".htmlspecialchars($value)."\" />";

?>

Como puedes suponer, la función htmlspecialchars transforma las comillas dobles (") en el código &quot;.

Otro caso que podemos necesitar es cuando trabajamos con comillas simples (a mí me gusta más, aunque ya sé que no es la opción recomendada por el W3C):

<?php

echo "<input type='text' value='".addslashes($value)."' />";

?>

Esto produciría esta salida (que hemos puesto antes como ejemplo):

<input type='text' value='L\'Hospitalet' />

Y como te decía, a mí me gusta más porque si te fijas en el código del echo en PHP precisa de menos símbolos de escape, y por tanto el código HTML generado es más fácilmente "copiable" dentro de una cadena delimitada por comillas dobles en PHP. Pero ése es otro tema ;)

Estoy seguro de que a más de uno le habrá ayudado este breve resúmen :)))

De todas formas:

  • posiblemente se me escapa algo, pues continuamente salen cosas nuevas o uno descubre nuevos "trucos"
  • existen artículos mucho más extendidos y con más ejemplos. Éste me gustó particularmente para gente que se incia en PHP, pues da un repaso más a fondo del uso de comillas en este lenguaje de programación: http://www.dxpro.es/index.php?topic=181.0
  • si detectas que he cometido algún error en mis ejemplos o en mi explicación, please, comenta aquí abajo y lo corregiré para ayuda de otros :)) Gracias!
Un saludo!
SERGI

miércoles 27 de mayo de 2009

Cargar javascript desde JSON o AJAX con eval() en FF y execScript() en IE

¿Estás desarrollando una aplicación web en la que usas JSON o AJAX para cargar dinámicamente datos? ¿Además necesitas cargar dinámicamente no solamente datos sino también código javascript para ser utilizado en la página? A continuación te expongo el modo de hacerlo para que funcione en FireFox 3.X y IE7 (casualmente, también funciona en IE6).

Voy a partir de la base de que utilizas jQuery para la consulta JSON o AJAX al servidor. Y me voy a centrar en la "carga" del código javascript. Pero obviamente, no importa la librería o código que uses para el JSON o AJAX. Hay muchísima literatura en internet sobre ese tema.

Ejemplo de carga de datos

Empezaré con un ejemplo de carga de datos tipo texto, que es lo más habitual. Y luego pondré un ejemplo de carga de código javascript.


function js_actualizar_top_webs(){
var url_json = 'json_top_webs.php?mes='+$('#select_mes').val();
$.getJSON(
url_json,
function(datos){
$('#div_top_webs').html(datos.table_webs);
}
);
}

Imaginemos que en nuestra web de ejemplo tenemos un control tipo lista desplegable (select) que permite al usuario escoger un mes del año, y queremos que nuestra página recargue un <div id="'div_top_webs'"></div> con la lista del top 10 de webs de ese mes. Es un ejemplo clásico de recarga de datos dinámica usando JSON o AJAX.

Para ello construimos una función llamada js_actualizar_top_webs, que llamaremos al cambiar el valor de ese select. Esta función tal como está definida en el código de ejemplo hace una llamada JSON mediante el objeto $ de jQuery y cuando los datos se hayan recibido por completo ejecutará el código en rojo, en dónde "datos" es un objeto de javascript (no un array!!) que contiene diferentes "propiedades" con los datos enviados. En este caso, suponemos que el archivo de PHP que ha sido llamado devuelve un string llamado "table_webs" que contiene el código HTML de un "<table>" con la lista de webs que queremos mostrar.

Para "obtener" el valor de ese string HTML simplemente llamamos a datos.table_webs y lo colocamos como "contenido" de "div_top_webs" mediante el método .html() de jQuery. ¿Sencillo, no?


Ejemplo de carga de código javascript


Bueno, vamos ahora a algo que "cuesta" un poquitín más. Bueno, de hecho a mí me ha hecho gastar casi 8 horas de cansada búsqueda por internet y de leer mucho y probar mucho, hasta llegar a lo que te voy a poner aquí! ;)

Abajo tienes el código anterior ligeramente cambiado: hemos añadido unas líneas de código más, con el fin de poder cargar y ejecutar un código de javascript elaborado en el lado servidor.



function js_actualizar_top_webs(){
var url_json = 'json_top_webs.php?mes='+$('#select_mes').val();
$.getJSON(
url_json,
function(datos){
$('#div_top_webs').html(datos.table_webs);
if (window.execScript) window.execScript(datos.script_leyenda);
else window.eval(datos.script_leyenda);
}
);
}

Puedes ver en rojo dos nuevas líneas que corresponden a una sentencia condicional, y esto es necesario para ejecutar un código u otro según estemos en FireFox o en Internet Explorer (como mínimo estos dos navegadores). Para ambos casos el código de javascript pasado es el mismo y lo recuperamos de nuevo mediante jQuery con la propiedad datos.script_leyenda (que habremos rellenado desde el PHP con el código javascript que necesitemos ejecutar en nuestra web).

La diferencia radica en que Internet Explorer ejecutará el código de javascript mediante el método window.execScript(), mientras que FireFox ejecutará el código al usar el método window.eval(), en ambos casos pasando como argumento el código javascript que queremos ejecutar.

Otro aspecto importante y que tal vez pase desapercibido a primera vista es que en ambos casos ejecutamos sendos métodos sobre el objeto window. Eso es fundamental (me llevó más de una hora leyendo descubrirlo), para que el código javascript a ejecutar pase a estar "disponible" desde otros "ámbitos" de la misma página. De esta forma, si por ejemplo, dentro de ese código cargado dinámicamente definimos una función llamada "js_mostrar_leyenda()", si queremos usarla en el resto de la página, deberemos llamarla así: window.js_mostrar_leyenda();

Estoy seguro de que a más de uno le va a ir de perlas estas 3 líneas de código! al menos a mí me va a dar mucha potencia de programación con JSON y javascript. Y sinceramente, cuesta encontrar información "actualizada" en internet. Ya sabes que este tipo de información técnica (especialmente cross-browser) se desfasa con facilidad, con la salida de nuevas versiones de navegadores continuamente!! Así que lo que es válido hoy deja de serlo al cabo de 2 años :(

Te invito a que comentes cualquier sugerencia que tengas al respecto, eh! seguro que a todos nos interesa (temas de compatibilidad, por ejemplo). Si probando el código ves que te funciona en otros navegadores, por favor, coméntalo brevemente ;)

Un saludo!!!
SERGI