Monthly Archives: July 2011

GTG, Zim, NoteCase y Tilda

Introducción.

Estas son unas aplicaciones pequeñas basadas en GNOME que encuentro útiles para el uso diario y que reseño hoy para no olvidarlas.

GTG.

La primera de ellas es Getting Things GNOME! que permite manejar las tareas por hacer de una manera flexible y rápida con cierto estilo wiki, ya que según como se escriba el contenido de la tarea este va a tener cierca connotación sobre la misma.

Ejemplo de GTG

Ejemplo de GTG

Su sitio web es http://gtg.fritalk.com y puede instalarse directamente de los repositorios de Fedora a través del siguiente comando.

$ sudo yum install gtg

Zim.

Es un editor de texto que facilita la edición y almacenamiento de notas las cuales se editan al estilo wiki, es decir, sus atributos se definen según ciertas convenciones inmersas en los textos.

Ejemplo de Zim

Ejemplo de Zim

Su sitio web es http://zim-wiki.org/y puede instalarse directamente de los repositorios de Fedora a través del siguiente comando.

$ sudo yum install Zim

Note Case.

Es una aplicación similar a Zim que permite crear y almacenar notas en diferentes plataformas.

Ejemplo de Notecase

Ejemplo de Notecase

Este año se dejó de actualizar la versión opensource para crearse una versión pro la cual es comercial e incluye muchas mas características pero puede utilizarse de manera gratuita con restricciones.

Su sitio web es http://notecase.sourceforge.net/ (versión opensource) y http://www.notecasepro.com/ (versión pro), y puede instalarse directamente de los repositorios de Fedora a través del siguiente comando.

$ sudo yum install notecase

Tilda.

La última de estas aplicaciones es Tilda la cual permite acceder a una consola única y desplegable al estilo de Quake, muy útil para realizar labores cortas de administración evitando la necesidad de abrir una nueva terminal cada vez.

Ejemplo de TIlda

Ejemplo de TIlda

Su sitio web es http://tilda.sourceforge.net/ y puede instalarse directamente de los repositorios de Fedora a través del siguiente comando.

$ sudo yum install tilda

Para su ejecución inicial es recomendable hacerlo de la siguiente manera para que se desplieguen automáticamente sus opciones y establecer así su configuración, especialmente la relacionada con la combinación de teclas que la activa (key binding) la cual en mi caso personal es CTRL+ALT+T.

$ tilda –config

Inicio automático de las aplicaciones.

La mayoría de estas aplicaciones permite configurarlas para que se inicien automáticamente cuando el usuario ingresa en una sesión, sin embargo con GNOME3 he tenido algunos problemas para que esta configuración funcione.  Por este motivo bien pueda ser conveniente agregar a la sesión de usuario a estos programas que se desea que se inicie automáticamente utilizando el comando gnome-session-properties.

sudo yum install tilda

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.

Instalar las fuentes TrueType de Microsoft en GNU/Linux Fedora 15

Introducción.

Este procedimiento permite instalar las fuentes TrueType para web de Microsoft en la distribución de GNU/Linux Fedora 15, esto mejora bastante la presentación de los textos en GNOME3.  El procedimiento es un tanto mas complejo que el de Ubuntu (instalar un único paquete) pero no resultó difícil.

Procedimiento.

Instalar chkfontpath.  Para otras distribuciones/versiones obtenga el paquete apropiado del repositorio.

# yum install http://dl.atrpms.net/all/chkfontpath-1.10.1-2.fc15.i686.rpm

Instalar otros paquetes requeridos.

# yum install rpm-build cabextract ttmkfdir wget

Descargar la especificación del paquete de las fuentes.

# wget http://corefonts.sourceforge.net/msttcorefonts-2.0-1.spec

Construír el paquete de las fuentes.

# rpmbuild -ba msttcorefonts-2.0-1.spec

Instalar el paquete de las fuentes recién creado.

# yum install –nogpgcheck $HOME/rpmbuild/RPMS/noarch/msttcorefonts-2.0-1.noarch.rpm

Es necesario reiniciar el sistema de ventanas para que los cambios efectuados por el paquete instalado tengan efecto.

Enlaces.

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.