Category Archives: Web

Instalación de NodeJS en GNU/Linux Ubuntu/Mint

Introducción

NodeJS es  una plataforma de desarrollo de alta escalabilidad para aplicaciones en red basada en un único hilo de ejecución, una arquitectura orientada a eventos y un manejo asíncrono de E/S.  Esta plataforma se programa utilizando Javascript del lado del servidor.

En el presente artículo se describen los pasos realizados para su instalación siguiendo dos estrategias diferentes.

Instalación

Utilizando el gestor de paquetes

En este caso la instalación es mas rápida y sencilla ya que el gestor de paquetes, apt/aptitude en este caso, se hace cargo de la descarga e instalación del software y sus dependencias.

Utilizando los repositorios por defecto

Los repositorios incluídos por defecto con el sistema operativo permiten instalar a NodeJS sin embargo no en su versión mas reciente sino un par de números atrasada.

Versión de NodeJS disponible en los repositorios de Ubuntu

Versión de NodeJS disponible en los repositorios de Ubuntu

Para realizar su instalación se debe ejeuctar el siguiente comando.

$ sudo aptitude install nodejs

Utilizando los repositorios del proyecto

Este método permite actualizar los repositorios del sistema operativo con el repositorio oficial del proyecto de donde se podrán descargar versiones mas recientes.  Para hacer esto se deben ejecutar los siguientes comandos.

$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:chris-lea/node.js
$ sudo apt-get update

Versión de NodeJS disponible en los repositorios del proyecto

Versión de NodeJS disponible en los repositorios del proyecto

Una vez incluído el nuevo repositorio se procede a instalar el paquete normalmente.

$ sudo aptitude install nodejs

Desde el código fuente

Este método permite compilar una distribución de NodeJS para la versión específica del sistema operativo que se está utilizando.  Esto requiere que se cuente con el soporte requerido de las herramientas de desarrollo y dependencias necesarias para construír el proyecto.

Descargar el código fuente de la última versión disponible (la 0.6.7 en este caso) desde la siguiente ubicación.

http://nodejs.org/#download

$ wget http://nodejs.org/dist/v0.6.7/node-v0.6.7.tar.gz

$ tar zxvf node-v0.6.7.tar.gz $ cd node-v0.6.7/

$ ./configure --prefix=/home/jimezam/nodejs/0.6.7

Aviso!  Si desea instalar NodeJS en una ubicación central haciéndolo disponible para todos los usuarios del sistema operativo, omita el parámetro –prefix de la ejecución anterior, de lo contrario ajuste su ruta según la ubicación específica donde desee instalarlo.

Checking for program g++ or c++          : /usr/bin/g++
Checking for program cpp                 : /usr/bin/cpp
Checking for program ar                  : /usr/bin/ar
Checking for program ranlib              : /usr/bin/ranlib
Checking for g++                         : ok  
Checking for program gcc or cc           : /usr/bin/gcc
Checking for program ar                  : /usr/bin/ar
Checking for program ranlib              : /usr/bin/ranlib
Checking for gcc                         : ok  
Checking for library dl                  : yes
Checking for openssl                     : yes
Checking for library util                : yes
Checking for library rt                  : yes
Checking for fdatasync(2) with c++       : yes
'configure' finished successfully (0.776s)

El siguiente paso consiste en construír la distribución compilando su código fuente.

$ make

Y finalmente se debe instalar la distribución recién construída en la ubicación elegida.

$ make install

Aviso!  Si se eligió instalar NodeJS en una ubicación central, la ejecución del comando anterior deberá ser hecha por el usuario root de la siguiente manera: sudo make install.

Actualizar el PATH para que incluya la ubicación de las herramientas de NodeJS recién instaladas.  Realizar esta modificación en el .bash_profile/.bashrc del usuario o /etc/profile para tener un alcance global y garantizar que esta modificación persista cada vez que se inicia la máquina.

$ PATH=/home/jimezam/nodejs/0.6.7/bin:$PATH

Si el ajuste fue exitoso la aplicación node ya podrá ser accedida directamente desde la línea de comando.

$ which node

/home/jimezam/nodejs/0.6.7/bin/node

Prueba de funcionamiento: Hola Mundo NodeJS!

Crear el siguiente archivo de código Javascript para crear un servicio extremadamente simple que responda "Hola Mundo" ante las peticiones web de los clientes a través de navegadores.

$ vi prueba.js

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hola Mundo NodeJS!\n');
}).listen(7777, '127.0.0.1');
console.log('Servidor ejecutándose en http://127.0.0.1:7777');

Para iniciar el servicio se debe invocar el comando node de la siguiente manera.

$ node prueba.js

Servidor ejecutándose en http://127.0.0.1:7777

Desde un navegador web acceder a la dirección mencionada.

Hola Mundo consultándose desde NodeJS

Hola Mundo consultándose desde NodeJS

 

Enlaces

Mostrar en pantalla los errores producidos en PHP con Apache bajo Ubuntu

Introducción

Mientras que en producción mostrar al usuario final la información relacionada con el error producido es un riesgo de seguridad demasiado alto, durante el desarrollo del software es una condición necesaria para entender que está pasando con el código que se está probando.

En la mayoría de despliegues de Apache/PHP vienen ahora con esta opción desactivada, redireccionando por defecto los mensajes de error al archivo de registro habitualmente ubicado en /var/log/apache2/error.log.

Procedimiento

Es posible activar la opción de mostrar los errores de PHP en pantalla a tres diferentes niveles de acuerdo con el alcance que se le desee dar a este comportamiento.

A nivel global, esta modificación aplica a todo el servidor o sitios web publicados bajo esa configuración.

$ sudo vi /etc/php5/apache2/php.ini

error_reporting = E_ALL
display_errors = On

A nivel de un directorio o una aplicación, esta modificación afecta a los scripts ubicados bajo un directorio específico.

$ vi /var/html/un/directorio/especifico/.htaccess

<IfModule mod_php5.c>
    php_value error_reporting E_ALL

    php_value display_errors on
</IfModule>

A nivel de una sección de código específico, esta modificación afecta sólo una parte de un script.

$ vi /var/html/un/script.php

error_reporting(E_ALL);
ini_set('display_errors','On');

Aclaración adicional

Para que los ajustes de configuración de los últimos dos niveles sean tenidos en cuenta, el directorio donde del sitio web publicado deberá tener por lo menos activa la siguiente opción.

AllowOverride Options

Esta se deberá modificar bajo /etc/apache2/mods-enabled/userdir.conf para los sitios personales de los usuarios (public_html) o /etc/apache2/sites-enabled/* para los virtualhosts existentes.

Cursos de la Maestría en Software Libre de la UOC

Los cursos listados a continuación hacen parte de la Maestría en Software Libre de la Universidad de Cataluña y que han sido publicados bajo la licencia de Creative Commons a través de su sitio de OpenCourseWare.

50039 – Fundamentos de fotografía e imagen digital
50051 – Sistemas de vídeo y de tratamiento de la imagen
50070 – Laboratorio de PHP y MySQL
75143 – Trabajo final de carrera .NET
75555 – Prácticas de programación
75591 – Estructura de redes de computadores
75611 – Fundamentos físicos de la informática
75614 – Iniciación a las matemáticas para la ingeniería
76514 – Imagen y lenguaje visual
76517 – Arquitectura de la información
76521 – Redes Multimedia
76526 – Composición digital
76529 – Interfaces para sistemas multimedia
76531 – Animación 3D
76532 – Fotografía digital
81504 – Física I
89018 – Trabajo final de carrera de telecomunicación
93133 – Introducción a la creación de páginas web
93134 – Marcadores sociales, una herramienta para organizar la Red
93149 – Fotografia de viajes
B0019 – Estética y narrativa en medios digitales
B0762 – Servicios OGC
B0763 – Programación y Personalización SIG
M1302 – Ingeniería de la usabilidad
M1308 – Tecnología y desarrollo en dispositivos móviles
M2101 – Introducción al software libre
M2102 – Sistema operativo GNU/Linux básico
M2103 – Administración avanzada del sistema operativo GNU/Linux
M2104 – Implantación de sistemas de software libre
M2105 – Redes de computadores
M2107 – Aspectos avanzados de seguridad en redes
M2108 – Desarrollo de aplicaciones web
M2109 – Bases de datos
M2110 – Introducción al desarrollo de software
M2111 – Conceptos avanzados en desarrollo de software libre
M2112 – Ingeniería del software en entornos del software libre
M2113 – Utilidades y herramientas de software libre
M2114 – Aspectos legales y de explotación del software libre
M2114 – Aspectos legales y de explotación del software libre (b)
M2115 – Aspectos económicos y modelos de negocio del software llibre
M2117 – El software libre en el sector público
M2123 – Proyecto web
M2124 – Desarrollo de proyectos de software libre
M2125 – Proyecto de dirección de sistemas de información
M2132 – Proyecto en Administración de Redes y Sistemas Operativos basados en GNU/Linux
M2150 – Administración de sistemas GNU/Linux

Enlaces

Problemas cargando sqlite.so en 20090626+lfs/sqlite.so

Introducción

Instalando Apache+PHP+MySQL en mi equipo con GNU/Linux Mint 12 encuentro el siguiente problema después de instalar el soporte para SQLite (php5-sqlite).

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626+lfs/sqlite.so' – /usr/lib/php5/20090626+lfs/sqlite.so: cannot open shared object file: No such file or directory in Unknown on line 0

La situación

Aparentemente el uso de SQLite versión 2 ha sido desestimado en pos del uso exclusivo de la versión 3, sin embargo extrañamente la configuración por defecto de PHP sigue intentando cargar su librería.

La solución

Remover la configuración de SQLite2 de PHP y utilizar la versión 3 únicamente.

$ sudo mv /etc/php5/conf.d/sqlite.ini /etc/php5/conf.d/sqlite.ini.old

Una vez evitado que este archivo de configuración sea tenido en cuenta el funcionamiento de PHP vuelve a la normalidad.

$ php -v

PHP 5.3.6-13ubuntu3.3 with Suhosin-Patch (cli) (built: Dec 13 2011 18:37:10)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
    with Suhosin v0.9.32.1, Copyright (c) 2007-2010, by SektionEins GmbH

Enlaces

Instalar manualmente Firefox 6.0 en GNU/Linux CentOS (y otros)

Introducción.

About Mozilla Firefox 6.0

Tenía deseos de instalar la versión mas reciente de Firefox (6.0) ya que esta promete por primera vez, manejar mucho mejor la memoria y así no consumirse todos los recursos del equipo unas horas después de trabajar con este navegador.

En uno de mis equipos utilizo GNU/Linux CentOS 6 el cual está enfocado principalmente a servidores y sus actualizaciones provienen directamente de la línea de RedHat.  Por este motivo las versiones del software tardan bastante en actualizarse.  Desafortunadamente la versión de Firefox que incluye la versión actual de CentOS es la 3.6.9 así que se puede suponer que tardarán bastante en llegar a la 6.0.

En el presente artículo se explican los pasos necesarios para instalar Firefox 6.0 manualmente en CentOS 6, sin embargo estos pasos pueden ejecutarse de manera genérica en la mayoría de las principales distribuciones de Linux.

Obtener Firefox.

Descargar el paquete de distribución mas reciente de Firefox para Linux en el idioma que se desee desde la siguiente ubicación.

https://www.mozilla.com/en-US/firefox/all.html

En mi caso obtuve el archivo firefox-6.0.tar.bz2 después de la descarga.

Instalar Firefox.

Se instalará la versión de Firefox recién descargada bajo el directorio /opt.

# tar xjvf firefox-6.0.tar.bz2

# mkdir -p /opt/firefox/

# mv firefox/ /opt/firefox/6.0/

Se remueve el ejecutable desplegado por la versión previa de Firefox.

# mv /usr/bin/firefox /usr/bin/firefox_3.6.9

Establecer las alternativas de versiones.

Se utiliza alternatives para diferenciar las versiones de Firefox instaladas y elegir una de ellas como activa según se desee.  Para hacer esto se crean las dos alternativas.

# alternatives –install /usr/bin/firefox firefox /usr/lib/firefox-3.6/firefox 1

# alternatives –install /usr/bin/firefox firefox /opt/firefox/6.0/firefox 2

Finalente se configura la versión 6.0 como alternativa activa.

# alternatives –config firefox

There are 2 programs which provide 'firefox'.

  Selection    Command
———————————————–
   1           /usr/lib/firefox-3.6/firefox
   2           /opt/firefox/6.0/firefox

Enter to keep the current selection[+], or type selection number: 2

Instalar Google Chrome en GNU/Linux CentOS 6

Introducción.

El artículo presentado a continuación describe el procedimiento necesario para instalar el navegador web Google Chrome en GNU/Linux CentOS 6 utilizando repositorios Yum.  Este procedimiento probablemente aplique también para otras versiones de CentOS y Fedora.

Instalación.

Crear el nuevo repositorio de Yum.

# vi /etc/yum.repos.d/google-chrome.repo

[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/i386
enabled=1
gpgcheck=1

Si se desea la versión de 64 bits utilizar la siguiente descripción del repositorio.

[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64
enabled=1
gpgcheck=1

Instalar los paquetes deseados.

# yum –nogpgcheck install google-chrome-stable

Además de la versión estable también es posible instalar la versión en desarrollo (google-chrome-beta) y la inestable (google-chrome-unstable).

Convirtiendo la documentación de FuelPHP a un único documento

Introducción.

FuelPHP es un framework para el desarrollo de aplicaciones que a pesar de su muy reciente aparición es muy interesante y prometedor para el entorno del desarrollo de aplicaciones web con software libre.  Este framework es similar a Codeigniter o Kohana en términos de su simplicidad, sin embargo no se basa directamente en ninguno de ellos sino que por el contario, toma los conceptos e ideas de diseño exitosas de los principales frameworks y los integra en una única base para la implementación de aplicaciones web.

Teniendo una relativa corta edad, su desarrollo ha sido veloz y su versión 1.0 se encuentra muy próxima a publicarse.  La documentación también ha evolucionado rápidamente y se encuentra en contínua actualización.  Esta se presenta por secciones que se pueden revisar directamente siendo esto muy apropiado para las consultas rápidas de la misma sin embargo -en mi opinión personal- no es tan útil cuando se está aprendiendo del framework por primera vez ya que no es posible realizar una revisión o búsqueda líneal de los temas ni mucho menos imprimirlos.

Dado lo prometedor del framework decidí tomarme un par de minutos para desarrollar una solución que me permitiera consolidar fácilmente la documentación en un único documento para poder imprimirlo y estudiar de él.  Terminé con una pequeña herramienta basada en Javascript con jQuery que realizar esta tarea.  Debido a las limitaciones de seguridad impuestas por los navegadores es necesario que se descargue en un servidor web local la documentación para que pueda ser procesada por esta herramienta.

Debe tenerse en cuenta que los documentos generados o impresos no recibirán las contínuas actualizaciones que si recibe la versión en línea, por este motivo prefiero no distribuír el documento completo con la versión del día sino compartir el método para que pueda ser creado frecuentemente.

Instalación.

Crear una carpeta en el árbol de directorios (DOCUMENT_ROOT) públicos del servidor de páginas.

Descomprimir la distribución de la herramienta en el directorio web.

Descargar la distribución actual de FuelPHP y descomprimirla en el directorio web al mismo nivel de la herramienta. 

Los archivos contenidos en la carpeta de mas alto nivel serán similares a los mostrados a continuación en la cual se utilizó la versión 1.0-RC3 del framework.

Contenidos de la carpeta web

Contenidos de la carpeta web

 

Configuración.

El único paso necesario para configurar la herramienta consiste en editar el archivo FuelPHPOneDoc/FuelPHPOneDoc.js y modificar apropiadamente el valor de la variable baseUrl la cual deberá contener la dirección absoluta en la cual se publicó localmente la documentación de FuelPHP.  De esta manera en el ejemplo anterior, si la carpeta pública web corresponde con la dirección http://localhost/onedoc/ entonces el valor de baseUrl será http://localhost/onedoc/v1.0-rc3/docs/.

Ejecución.

Acceder al URL de la herramienta utilizando un navegador web.  En el caso del ejemplo anterior sería a la dirección http://localhost/onedoc/FuelPHPOneDoc/FuelPHPOneDoc.html.

Documentación de FuelPHP en un unico documento

Documentación de FuelPHP en un unico documento

 

Requerimiento: servidor de páginas web.

Por la razón que se mencionó anteriormente, es necesario contar con un servidor de páginas web para publicar tanto el contenido de la documentación original de FuelPHP como la herramienta para modificar su presentación.

En caso de no contarse con un servidor de páginas instalado, este podrá obtenerse de diferentes maneras: Apache (todas las plataformas), Internet Information Service (sólo Windows), XAMPP (todas las plataformas) y nginx (todas las plataformas) entre muchos otros.

Si no se cuenta con ninguno de estos servidores de páginas web pero se cuenta con soporte para el lenguaje Python, es posible utilizar temporalmente el servidor web de desarrollo que incluye este lenguaje.  Para utilizarlo será necesario abrir una terminal y ubicarse en el directorio que se convertirá en público a través de web e invocar la aplicación.

$ cd /home/jimezam/tmp/FuelPHP

Si cuenta con soporte para Python 2.x:

$ python -m SimpleHTTPServer

En cambio, si se cuenta con soporte para Python 3.x, la instrucción a ejecutar será la siguiente.

$ python -m http.server 8000

En ambos casos el puerto que se utilizará para lanzar el nuevo servidor web será el 8000 así que este tendrá que ser tenido en cuenta durante la determinación del respectivo URL.  En este caso, el URL que deberá ser consultado será http://localhost:8000/FuelPHPOneDoc/FuelPHPOneDoc.html.

Evitar que WordPress remueva los saltos de línea de los artículos

Introducción.

Wordpress logo

  Son muy pocos los problemas que he tenido con WordPress a lo largo de estos varios años escribiendo en el blog.  Uno de los casos mas molestos sucede cuando los saltos de línea de los artículos o comentarios empiezan a desaparecer. 

Este problema me sucedió inicialmente cuando utilizaba Google Chrome únicamente, sin embargo en los últimos días empezó a suceder con Mozilla Firefox 5 también, así que tuve que descartar la explicación de incompatibilidad con el primer navegador.

Después de una búsqueda en los foros no he encontrado cual es la causa específica del problema sin embargo parece estar en TinyMCE, el editor WYSIWYG que incluye WordPress por defecto.  Para este problema he encontrado una solución muy simple que parece estar funcionando bien hasta el momento.

Solución.

La solución consiste en instalar el plugin TinyMCE Advanced y acceder a sus opciones de configuración mediante la opción Settings > TinyMCE Advanced del menú izquierdo del Dashboard.

En la sección de opciones avanzadas, seleccionar la casilla de verificación correspondiente con la opción para evitar que se remuevan automáticamente las etiquetas <p> y <br>.

Activar esta opción de la configuración de TinyMCE Advanced

Activar esta opción de la configuración de TinyMCE Advanced

Presionar el botón Save Changes para aceptar los cambios y verificar que estos hayan tenido el efecto deseado.

Arrastrar y soltar con HTML5

Introducción.

En este artículo se revisarán los pasos necesarios para implementar la facilidad de arrastrar y soltar (drag and drop) en una página web aprovechando las funcionalidades provistas por HTML5.  Para este desarrollo se utilizará jQuery para facilitar la implementación, sin embargo esto no es estrictamente necesario.

Establecer los elementos "arrastrables".

El primer paso consiste en establecer cuales elementos podrán ser arrastrados, para hacer esto se les deberá agregar el atributo draggable='true'.  En el caso del ejemplo, los elementos arrastrables son imágenes de la siguiente manera.

<img id="tool0" draggable="true" title="tool" src="img/tool0.png" alt="tool" />
<img id="tool1" draggable="true" title="tool" src="img/tool1.png" alt="tool" />
<img id="tool2" draggable="true" title="tool" src="img/tool2.png" alt="tool" />

Definir el comportamiento de los elementos "arrastrables".

El siguiente paso es establecer que se debe hacer cuando los objetos arrastrables son manipulados, es decir, manejar sus eventos.  Estos eventos corresponden con los siguientes y su implementación se debe definir cuando la estructura de la página se encuentra completamente cargada.

 dragstart El elemento se empieza a arrastrar.
 drag El elemento está siendo arrastrado.
 dragend El elemento ha dejado de ser arrastado.

Durante el manejo del evento dragstart se realizan las siguientes tareas.

  1. Almacenar la información del elemento arrastrable (su id en este caso) necesaria para ser procesado en caso de ser soltado exitosamente.
  2. Agregar una nueva clase CSS (itemSelected) para modificar su apariencia mientras es arrastrado.
  3. Modificar la imagen del elemento arrastrado la cual por defecto es la del mismo elemento.
$('.page #main #items .item').bind('dragstart', function(event) {
    // Store information about the item dragged.
    event.originalEvent.dataTransfer.setData("text/plain", event.target.getAttribute('id'));
    // Add a CSS class to highlight the dragged item.
    $(event.target).addClass('itemSelected');
    // Set an image as drag icon.  The image was preloaded.
    var dragIcon = document.createElement('img');
    dragIcon.src = 'img/hand.png';
    event.originalEvent.dataTransfer.setDragImage(dragIcon, 139, 43);
});

Durante el manejo del evento drag no se realizan tareas especiales en este caso.

$('.page #main #items .item').bind('drag', function(event) {
    // The item is being dragged!
});

Durante el manejo del evento dragend se realiza una única tarea y corresponde con retirar la clase CSS añadida durante dragstart para indicar que el elemento ya no está siendo arrastrado actualmente.

$('.page #main #items .item').bind('dragend', function(event) {
    // Remove the CSS class that highlights it while beign dragged.
    $(event.target).removeClass('itemSelected');
});

Definir el comportamiento de las "zonas de descarga".

El paso final consiste en establecer que se debe hacer cuando los objetos arrastrables interactúan con las zonas de descarga (drop zones), es decir, manejar sus eventos.  Estos eventos corresponden con los siguientes y su implementación también se debe definir cuando la estructura de la página se encuentra completamente cargada.

 dragenter El elemento arrastrable ha entrado a una zona de descarga.
 dragleave El elemento arrastrable ha salido de una zona de descarga.
 dragover El elemento arrastrable está siendo arrastrado sobre una zona de descarga.
 drop El elemento arrastrable ha sido soltado sobre una zona de descarga.

Durante el manejo del evento dragenter se agrega una nueva clase CSS (itemOnDropArea) para modificar la apariencia de la zona de descarga mientras un elemento es arrastrado sobre ella.

$('.page #main #boxes .box').bind('dragenter', function(event) {
    // Add a CSS class to highlight the drop zone used.
    $(event.target).addClass('itemOnDropArea');
    // Prevents the default event that denies the DnD
    // behaviour.  Acts as "event.preventDefault()" in
    // vanilla Javascript.
    return false;
});

Durante el manejo del evento dragleave se realiza la tarea contraria, se remueve la clase CSS agregada durante el suceso del evento anterior para mostrar que ningún elemento es arrastrado ahora sobre la zona de descarga.

$('.page #main #boxes .box').bind('dragleave', function(event) {
    // Remove the CSS class that highlights the used drop zone.
    $(event.target).removeClass('itemOnDropArea');
    // Prevents the default event that denies the DnD
    // behaviour.  Acts as "event.preventDefault()" in
    // vanilla Javascript.
    return false;
});

Durante el manejo del evento dragover no se realiza en este caso ninguna tarea interesante además de indicarle al navegador que evite su comportamiento por defecto el cual es impedir que se realice.

$('.page #main #boxes .box').bind('dragover', function(event) {
    // Prevents the default event that denies the DnD
    // behaviour.  Acts as "event.preventDefault()" in
    // vanilla Javascript.
    return false;
});

Durante el manejo del evento drop, que sucede cuando el elemento arrastrable se suelta sobre la zona de descarga, se realizan las siguientes tareas en la aplicación de demostración.

  1. Obtener la información almacenada en el objeto dataTransfer definida durante el manejo del evento dragstart.
  2. Obtener la información del objeto arrastrable.
  3. Obtener la información de la zona de descarga.
  4. Determinar si la descarga del objeto es válida o no en la zona de descarga específica.
  5. Realizar una acción según se determine en la tarea anterior: remover el elemento o mostrar un mensaje de error.
  6. Evitar que se efectúe el comportamiento por defecto relacionado con el evento.
$('.page #main #boxes .box').bind('drop', function(event) {
	// Get the stored information about the draggable item,
	// the element ID in this case.
	var itemId = event.originalEvent.dataTransfer.getData("text/plain");
	// Get the type of the draggable item, stored in the
	// ALT attribute in this case.
	var itemType = $("#" + itemId).attr('alt');
	// Get the drop zone's ID to difference the type of it.
	var dropboxType = $(event.target).attr('id');
	// Check if the draggable item can be or not dropped
	// into the current drop zone.
	if(dropboxType == 'toolbox')
	{
		if(itemType == 'tool')
			$("#" + itemId).remove();
		else
			alert("That is a FRUIT, put it on the Fruit's Basket!");
	}
	if(dropboxType == 'fruitbasket')
	{
		if(itemType == 'fruit')
			$("#" + itemId).remove();
		else
			alert("That is a TOOL, put it on the Toolbox!");
	}
	// Remove the CSS class that highlights the used drop zone.
	$(event.target).removeClass('itemOnDropArea');
	// Prevents the default event that denies the DnD
	// behaviour.  Acts as "event.preventDefault()" in
	// vanilla Javascript.
	return false;
});

El prototipo.

En este prototipo se utilizan los fragmentos de código mostrados en este artículo, en él se muestran en la parte inferior dos series de objetos arrastrables (herramientas y frutas) y en la parte superior dos zonas de descarga (una caja de herramientas y una canasta de frutas).  La página web permitirá que el usuario arrastre los elementos a cualquiera de de las zonas de descarga, sin embargo sólo aceptará que se almacenen en la zona correcta.  En caso de intentarse hacer lo contrario se obtendrá un mensaje de error.

Prototipo de demostración de arrastrar y soltar con HTML5

Prototipo de demostración de arrastrar y soltar con HTML5

Enlaces.

Convertir coordenadas geográficas grados-minutos-segundos a notacional decimal (3)

Introducción.

Después de encontrar dos métodos (A y B) para la conversión de coordenadas entre formatos decimal y grados, minutos y segundos, encontré en el libro HTML5 Geolocation de Anthony T. Holdener III la implementación de dos funciones en Javascript que realizan con precisión este procedimiento y que me parecieron muy intersantes.  Este corto libro es en general muy interesante y recomiendo su lectura.

Conversión de coordenadas: formato decimal a grados-minutos-segundos.

/**
 * Convierte una coordenada en formato decimal a su correspondiente
 * versión en formato grados-minutos-segundos.
 *
 * @param	Float	Valor real de la coordenada.
 * @param	Int	Tipo de la coordenada {Coordenada.LATITUD, Coordenada.LONGITUD}.
 * @return	Array	['grados', 'minutos', 'segundos', 'direccion', 'valor'].
 */
function dec2gms(valor, tipo)
{
	grados    = Math.abs(parseInt(valor));
	minutos   = (Math.abs(valor) - grados) * 60;
	segundos  = minutos;
	minutos   = Math.abs(parseInt(minutos));
	segundos  = Math.round((segundos - minutos) * 60 * 1000000) / 1000000;
	signo     = (valor < 0) ? -1 : 1; 	direccion = (tipo == Coordenada.LATITUD) ?
                    ((signo > 0) ? 'N' : 'S') :
	            ((signo > 0) ? 'E' : 'W');
	if(isNaN(direccion))
		grados = grados * signo;
	return {
		'grados'   : grados,
		'minutos'  : minutos,
		'segundos' : segundos,
		'direccion': direccion,
		'valor'    : grados + "\u00b0 " + minutos + "' "+ segundos +
		             "\"" + ((isNaN(direccion)) ? (' ' + direccion) : '')
	};
}

Por ejemplo.

var x = 48.853;
r1 = dec2gms(x, Coordenada.LATITUD);
alert('Conversion dec2gms = ' + r1.valor);

Conversión de coordenadas: formato grados-minutos-segundos a decimal.

/**
 * Convierte una coordenada en formato grados-minutos-segundos a su
 * correspondiente versión en formato decimal.
 *
 * @param	Float	Grados de la coordenada.
 * @param	Float	Minutos de la coordenada.
 * @param	Float	Segundos de la coordenada.
 * @param	String	Sentido de la coordenada {Coordenada.NORTE,
					Coordenada.SUR, Coordenada.ORIENTE,
					Coordenada.OCCIDENTE}
 * @return	Array	['decimal', 'valor'].
 */
function gms2dec(grados, minutos, segundos, direccion)
{
	if(direccion)
	{
		signo     = (direccion.toLowerCase() == 'w' ||
		             direccion.toLowerCase() == 's') ?
		            -1 : 1;
		direccion = (direccion.toLowerCase() == 'w' ||
		             direccion.toLowerCase() == 's' ||
		             direccion.toLowerCase() == 'n' ||
		             direccion.toLowerCase() == 'e') ?
		            direccion.toLowerCase() : '';
	}
	else
	{
		signo     = (grados < 0) ? -1 : 1;
		direccion = '';
	}
	dec = Math.round((Math.abs(grados) + ((minutos * 60) + segundos) / 3600) * 1000000) / 1000000;
	if(isNaN(direccion) || direccion == '')
		dec = dec * signo;
	return {
		'decimal': dec,
		'valor'  : dec + "\u00b0" + ((isNaN(direccion) || direccion == '') ? (' ' + direccion) : '')
	};
}

Por ejemplo.

var xg = 48;
var xm = 51;
var xs = 10.8;
r2 = gms2dec(xg, xm, xs, Coordenada.NORTE);
alert('Conversion gms2dec = ' + r2.valor);

Código fuente y demostración.

Obtenga el código fuente del artículo junto con la ejecución de la demostración en la siguiente ubicación.

http://demo.jorgeivanmeza.com/JavaScript/CoordConverter/0.3/