Archive for the 'Programación' Category

Jun 01 2013

How to download all files of certain type from a web page in Linux

Published by under Internet,linux,Programación

I’ve been trying to download all the mp3 files of a page (only one url, not the entire website) with wget but I’ve not achieved it because the mp3 files are in different domain than the main url so I’ve made a little script to download all of them in one command.

I’ve used lynx to extract all the links of the page and xargs to create a thread pool to have 4 simoultaneous downloads at the same time. The command is the following:


lynx -dump -listonly -nonumbers http://www.example.com/index.html | grep "\.mp3" | xargs -P 4 -I URL wget URL

2 responses so far

May 15 2009

Realidad Aumentada, Web Semántica y Telefonía Móvil

Published by under Internet,Programación

La Realidad Aumentada no es un concepto nuevo, aunque gracias a los avances en Telefonía Móvil, es una de las tecnologias más llamativas e interesantes que vamos a poder disfrutar en los próximos años (o probablemente meses).
Según la definición de la Wikipedia, la Realidad Aumentada consiste en un conjunto de dispositivos que añaden información virtual a la información física ya existente, es decir, que combinan nuestra realidad física con una realidad virtual generada digitalmente.

realidad-aumentada

Un buen ejemplo de esta tecnologia lo tenemos en los sistemas de GPS utilizados en los automóviles. Estos GPSs nos muestran datos de nuestro entorno adicionales a la realidad. Este mismo concepto se está empezando a incorporar a la Telefonía Móvil, donde se espera la aparición de un gran número, y sobre todo, una gran diversidad en cuanto al tipo de aplicaciones que tendremos disponibles. Este crecimiento será debido principalmente a dos aspectos, las mejoras técnicas en los teléfonos móviles y la consolidación de la Web Semántica.

Mejoras tecnológicas en la Telefonía Móvil.

Cada vez son más los teléfonos móviles que incorporan disposivos de GPS, inclinómetro y brújula para conocer la situación y orientación del terminal. Además, los fabricantes están viendo las ventajas de permitir que terceras personas puedan desarrollar aplicaciones para sus terminales, proporcionando herramientas como SDKs que facilitan en gran medida el desarrollo de las aplicaciones.

La Web Semántica, el próximo reto de Internet.

Hasta hace dos o tres años, en el sector Web se ha estado trabajado en el desarrollo de páginas Web destinadas a ser consultadas por personas. En este momento, se está produciendo un cambio de tendencia, y es que,  se está comenzando a asumir la importancia de que el contenido alojado en la red tenga significado. Y lo que es más importante, que ese significado, aparte de poder ser consultado por las personas pueda ser consultado por las máquinas.

Aquí surge una pregunta bastante interesante, ¿Por qué hacer que los contenidos de Internet sean accesibles por las máquinas?. La respuesta es sencilla, al dotar de significado a los contenidos, estos se van a poder clasificar, filtrar y combinar con otros contenidos, antes de que sean consultados por una persona.

Un ejemplo de lo que se podría hacer mediante esta tecnologia es por ejemplo si estamos en la calle y queremos buscar un restaurante. El teléfono móvil nos señalará en la pantalla los restaurantes más cercanos al lugar donde nos encontramos, tiempo que vamos a tardar en llegar, tipo de comida, precios, opiniones de otros usuarios e incluso si alguna de esas personas que ha dado su opinión pertenece a nuestra red social de amigos y conocidos.

En cuanto a proyectos Web relacionados con la Web Semántica, ya hay algunos bastante interesantes. El que más me ha sorprendido es Yahoo YQL, un servicio que permite realizar búsquedas combinadas de distintas fuentes como fotos de Flickr, productos de Amazón, noticias, geoposiciones, etc,  mediante un lenguaje muy similar a SQL.
Esta semana, Google también ha comenzando a incorporar contenidos sindicados a sus búsquedas mediante el uso de Microformatos, por lo que se espera que el número de páginas que sindiquen contenidos tenga un fuerte aumento y la web semántica comience a despegar.

Ejemplo de realidad aumentada:



No responses yet

Ene 02 2009

¿Android será algo más que un sistema operativo para móviles?

Published by under Programación,web2.0

Desde que Google lanzó su sistema operativo para teléfonos móviles, Android, ha habido muchas voces que decían que la verdadera intención de Google era crear un sistema operativo universal que funcionara en cualquier plataforma, como reproductores de mp3, Set Top Boxes de Televisión o PCs.

Esta semana, varios programadores de VentureBeat han anunciado que han conseguido ejecutar Android en un NetBook, incluyendo gráficos, sonido y acceso a Internet a través de Wireless (sobre una plataforma Linux). Y lo más importante, lo han conseguido en unas pocas horas, por lo que han extraido que Google podría tener planificado un futuro mucho más amplio para Android que los teléfonos móviles.

android-netbook

La verdad es que, estos últimos años, está habiendo una batalla bastante importante por parte de las grandes compañias en permitir que las aplicaciones web desplacen a las aplicaciones escritorio. Adobe con Air, Google con Gears y Microsoft que no se quiere quedar atrás con Silverlight. No sé si llegará algún día en el que podamos prescindir por completo de las aplicaciones de escritorio aunque todo parece indicar que será así.

Todas las piezas no solo parecen encajar sino que ya tendrían el puzzle completo. Tendrían ya su propio sistema operativo (Android + Kernel de Linux), su propio navegador web con funciones de escritorio a través de Chrome+Gears, servidor de aplicaciones (Google App Engine) y aplicaciones suficientes como para que se pueda considerar un sistema operativo completo (aunque muy básico) con cliente de correo, suite ofimática, lector de Feeds, mensajeria

La apuesta de Google es clara, siempre han creido en las aplicaciones como servicio frente a las aplicaciones de escritorio, por lo que no creo que sorprenda a nadie que finalmente den el paso y creen su propio sistema operativo para NetBooks basado en Android, aunque de momento, son todo especulaciones.

2 responses so far

Ago 31 2008

HttpOnly Cookies

Published by under Programación

HttpOnly Cookies es una ampliación del estándar de gestión de cookies que se utiliza para prevenir el robo de cookies a través de ataques de tipo XSS (Cross Site Scripting). Fué propuesto e implementado inicialmente por Microsoft en Internet Explorer 6 (Año 2002). Aunque al principio no tuvo mucha aceptación, este último año ya lo han ido implementando otros navegadores como Opera 9.5 o Firefox 3.

Al definir una cookie como HttpOnly, lo que estamos haciendo es eliminar la posibilidad de que ésta pueda ser leida por el navegador a través de JavaScript. Es decir, los navegadores que soportan este estándar, gestionan las cookies de igual manera, solo que ocultan parte de los datos de variable document.cookie de JavaScript, lo que impide el robo de las cookies de sesión a través de ataques de tipo XSS.

Ejemplo de definición en una cabecera Http:

Set-Cookie: USER=123; expires=Wednesday, 09-Nov-99 23:12:40 GMT; HttpOnly

Me ha parecido una idea bastante buena que se debería adoptar como norma general para definir cookies, ya que, si nunca necesitamos acceder a ellas desde JavaScript, ¿por qué permitimos su acceso?. Si bien, las implicaciones de un ataque de tipo XSS son mucho mayores que el robo de cookies, nunca estará de más añadir esta limitación.

Hay un caso en el que la lectura de cookies a través de JavaScript sí que se suele utilizar bastante. Se utiliza para evitar otro tipo de ataque de tipo XSS, el CSRF (Cross Site Request Forgery). Se trata de enviar por duplicado la cookie de sesión en el envío de formularios (double cookie submission), la enviada automáticamente por http y otra a través de un campo input de tipo hidden. De esta forma desde el servidor se puede verificar que el formulario no ha sido enviado desde un sitio externo al que el usuario está navegando.  Para este caso, no sería totalmente necesario leer la cookie, se puede utilizar un token de sesión gestionado desde el servidor para el envío del formulario.

Hay que destacar también que en estos momentos esta opción está todavía un poco verde, ya que tanto Firefox 3.01 como Internet Explorer 7 tienen un bug que permite la lectura de las cookies marcadas como HttpOnly a través de la consulta de las cabeceras de una petición XHR (XMLHttpRequest). En cualquier caso, creo que es una opción bastante interesante que hay que seguir y empezar a implementar.

Más información:
OWASP: HTTPOnly
Microsoft: Mitigating Cross-site Scripting With HTTP-only Cookies
Bug Mozilla: XMLHttpRequest allows reading HTTPOnly cookies

No responses yet

Feb 10 2008

Validación Ajax mediante serialización del formulario

Published by under Programación

Estos últimos días he estado probando una nueva forma de validar formularios que me ha convencido bastante, se trata de serializar los datos del formulario en JavaScript y enviarlos a través de una conexión XHR(XmlHttpRequest) al servidor, este sería el funcionamiento,

  1. El usuario rellena todos los campos del formulario y pulsa el botón de enviar.
  2. Al dispararse el evento onsubmit serializamos los campos del formulario y realizamos una petición XHR al servidor para que realice la validación.
  3. El servidor realiza la validación y devuelve en formato JSON el resultado con el nombre de los campos erróneos y los mensajes a visualizar.
  4. El cliente recupera el resultado.
    – Si hay algún error se muestra por pantalla mediante HTML dinámico.
    – Si no hay errores se envía el formulario a través de submit.
  5. El servidor realiza una segunda validación de los datos.
    – Si hay errores se vuelve a recargar el formulario presentándolos.
    – Si no hay errores, continúa con el proceso de guardado y siguientes acciones.
    Esta segunda validación es importante ya que el usuario puede tener un navegador que no soporte javascript o haberlo deshabilitado para saltarse la validación Ajax.

Principales ventajas:

  • Accesibilidad. La petición Ajax se realiza en el evento onsubmit del formulario, por lo que si el usuario no tiene javascript seguirá funcionando correctamente.
  • Al realizarse por Ajax la primera validación de los datos no es necesario recargar la página
  • Evitamos desarrollar por duplicado la validación en javascript y por otro lado la validación en el servidor.
  • Permite tanto la validación del formulario completo una vez se pulsa submit como la validación campo por campo a través de eventos onchange/onblur de cada campo.
  • Permite realizar comprobaciones avanzadas que requieran acceso a base de datos.
  • Al contrario que las soluciones basadas en iframes, mediante XHR no cambia el estado del history.

Inconvenientes:

  • Es un poco más lento que realizar la validación en javascript.
  • La mayor parte de los controles como cajas de texto, selects, radios… funcionan bien, aunque los input type=submit, image y reset no se envían correctamente. Siempre que se sepa no debería ser un problema. Existe una comparativa con las diferencias en la serialización que realizan diferentes librerías como jquery, dojo, prototype, YUI y Moochkit en JavaScript Form Serialization Comparison.

Pongo un ejemplo con parte de la implementación en PHP y la la libreria de JavaScript YUI

Devolución en formato JSON del resultado de la validación desde el servidor:

$errores=array();
$errores[]=array('TIPO'  => 'ERROR',
                 'TEXTO'   => 'El login debe tener un mínimo de 6 letras',
                 'CAMPO' => 'login',
                 );
if (count($errores)>0){
 	Zend_Loader::loadClass('Zend_Json');
        echo Zend_Json::encode($errores);
} else {
         echo 'false';
}

Serialización del formulario, petición ajax y presentación de los mensajes:

var $=YAHOO.util.Dom.get;
validaciones = {
    handleSuccess:function(o){
        if(o.responseText !== undefined){
        var res = eval("(" + o.responseText + ")");
        if (!res){
            document.forms['formulario'].submit();
        } else {
            $('divErrores').innerHTML='';
            for (var i=0;i<res.length;i++){
                if(res[i]['TIPO']=='ERROR'){
                    var str='<div class="error">'+res[i]['TEXTO']+'</div>';
                    $('divErrores').innerHTML=$('divErrores').innerHTML+str;
                }
            }
            $(res[0]['CAMPO']).focus();
        }
    }    },
    handleFailure:function(o){
        if(o.responseText !== undefined){
            var str='Se produjo un error al realizar la conexión<br />';
            $('divErrores').innerHTML=$('divErrores').innerHTML+str;
        }
    },
    enviar:function() {
        YAHOO.util.Connect.setForm($('formulario'));
        var sUrl = "/index.php/modulo/validar/";
 	var callback =
        {
            success:validaciones.handleSuccess,
            failure:validaciones.handleFailure,
            scope: validaciones
        };
 	var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback);
        return false;
    }
};

Div para presentar los errores y formulario HTML:

<span id='divErrores'></span>
<form name='formulario' id='formulario' action="/index.php/modulo/envioFormulario/"
method="post" onsubmit="return validaciones.enviar();">        

<input type="text" value="" name='login' id='login' />
 ...

<input type='submit' name='enviar' value='Enviar' />
</form>

No responses yet