Archive for May 2008


Manipulación fácil del DOM de una tabla con MooTools

May 29th, 2008 — 9:10pm

Como mencioné anteriormente, he utilizado MooTools en algunos de los proyectos que he realizado con la Fundación donde trabajo. Una de las funcionalidades que frecuentemente se requiere implementar es la de permitir agregar y remover dinámicamente filas o registros a una tabla, para esto utilizamos JavaScript. El diseño que mas utilizamos es la mas simple de todas: manipular el DOM de la tabla localmente en el cliente y dejarle el trabajo a la aplicación del lado del servidor de manejar el almacenamiento de los registros.

Históricamente realicé una primera versión de esta funcionalidad utilizando las funciones de manipulación del árbol DOM de JavaScript pero no tenía experiencia con ellas y apenas estaba aprendiéndolas por lo que su diseño poco eficiente con una implementación terrible. Después conocí las librerías de JavaScript e hice una segunda versión utilizando MooTools; el resultado fue algo mejor, sin embargo no muy eficiente: debía crearse funciones JavaScript (implementación incluída) por cada tabla que se fuera a manipular :-| . Aún no conocía el buen uso de las funciones $ y $$.

Ahora he creado una nueva versión que como lo que me gusta … es muy simple. Permite agregar y remover filas de cualquier tabla e inclusive permite manejar varias tablas en la misma página que se identifican con su atributo id a través de un único conjunto de funciones que se incluyen a través de una etiqueta <script>.

En el script se definen dos funciones: TDAgregarRegistro(tablaId) y TDRemoverRegistros(tablaId) que permite agregar y remover filas (seleccionadas) de una tabla respectivamente.

El usuario deberá por su parte definir las siguientes funciones para determinar comportamiento de las funciones base.

  1. obtEstructuraRegistro(tablaId): determina la estructura de las filas o registros de la tabla.
  2. obtPropiedadesCampo(tablaId): determina las propiedades o atributos de un campo de la tabla.
  3. obtPropiedadesFila(tablaId): determina las propiedades o atributos de una fila de la tabla.

Cada una de estas funciones recibe el id de la tabla a la cual se hace referencia, con este valor la función deberá determinar su respuesta, la cual es un arreglo asociativo. Por la simplicidad requerida por la solución, por ahora se soportan dos tipos de campos: de texto y de selección.

Enlaces:

Artículo relacionado: Manipulación fácil del DOM de una tabla con Prototype.

VN:F [1.8.5_1061]
Rating: 0 (from 0 votes)

13 comments » | Desarrollo de software, Web

Mapplet demo: Distritos Mineros 0.1

May 29th, 2008 — 5:44pm

El día de hoy he desarrollado un primer demo muy sencillo basado en un Mapplet que presenta los municipios Colombianos que pertenecen a Distritos Mineros e incluye alguna información adicional al respecto.

Este primer bosquejo es muy limitado ya que su información se obtiene de manera estática desde una fuente XML y que esta no se encuentra georreferenciada, por esto hace uso del GeoCoder el cual, al menos para esta prueba, no en todos los casos funciona de manera consistente.

El tiempo de desarrollo de un ejercicio tan sencillo es de unos 30 minutos, sin embargo el cambio a funciones asíncronas que se hizo para pasar de Google Maps a Mapplets si aumentó la complejidad del diseño, el cual me tomó finalizar en mas tiempo de lo esperado.

Las funciones asíncronas, a diferencia de las síncronas que retornan con el resultado después de ser ejecutadas, retornan inmediatamente y contínua el flujo normal del programa, sin embargo su resultado aún no ha sido terminado de procesar. Cuando la función asíncrona ha completado la realización de su código, ejecuta una función cuya implementación es definida por el usuario y se utiliza para procesar su resultado, esta función se especifica a manera de callback.

Palabras mas, palabras menos, las funciones asíncronas (*Async) en los Mapplets se ejecutan cuando se espera pero no es predecible determinar cuando estas terminan su procesamiento y se obtiene un resultado. La complejidad de la demostración se aumentó debido a la utilización del GeoCoder cuya ejecución (getLatLngAsync) es asíncrona y se realizaba múltiples veces (una por cada registro), sin embargo estas se realizan después de obtener la fuente remota con los datos (_IG_FetchXmlContent), la cual también es una función asíncrona.

En conclusión, el desarrollo de este tipo de Mapplets es extremadamente sencillo y rápido, sin embargo se recomienda que los datos ya lleguen georreferenciados, es decir, parecería ser mejor preprocesar la información del lado del servidor y geolocalizarla antes de enviarla al Mapplet que buscar su complemento desde el mismo código del mapa.

Enlaces:

VN:F [1.8.5_1061]
Rating: 0 (from 0 votes)

Comment » | Desarrollo de software, Web

Instalación de Python 2.5.x y mod_python 3.x en FreeBSD 7.x

May 27th, 2008 — 2:27pm

Instalación del intérprete de Python.

# cd /usr/ports/lang/python

# make install clean
    THREADS
    UCS4
    PYMALLOC
    IPV6
# python -V
    Python 2.5.2

Instalación de mod_python.

# cd /usr/ports/lang/mod_python3
# make install clean

Configuración de Apache con mod_python.

# vi /usr/local/etc/apache22/httpd.conf
    LoadModule python_module libexec/apache22/mod_python.so
    PythonOption mod_python.mutex_directory "/tmp"
    PythonOption mod_python.mutex_locks 8
    <Directory "/home/web">
        AddHandler mod_python .py
        PythonHandler pythontest
        PythonDebug On
    </Directory>

Recuérdese que el DOCUMENT_ROOT del servidor es “/home/web“.

A continuación se creará el siguiente archivo ubicado en /home/web/pythontest.py para verificar el funcionamiento del módulo.

# vi /home/web/pythontest.py
from mod_python import apache

import datetime

def handler(req):
    today = datetime.date.today()
    req.content_type = "text/plain"
    req.write("Hello, today is " + str(today.day) + "/" + str(today.month) + "/" + str(today.year) + ".")
    return apache.OK

Si se consulta el sitio http://webserver.mydomain.com/pythontest.py deberá obtenerse una respuesta similar a la mostrada a continuación.

    Hello, today is 27/5/2008.

Si se intenta ejecutar cualquier otro programa .py ubicado en el mismo directorio (/home/web) se obtendrá siempre la misma respuesta ya que en la configuración de Apache se especificó que ese archivo (pythontest.py) sería quien manipulase los archivos Python en ese directorio. Para permitir el acceso de otros programas desde la misma ubicación se deberán utilizar manipuladores (handlers) especiales como mod_python.Publisher, mpservlets o Vampire.

Enalces.

VN:F [1.8.5_1061]
Rating: 0 (from 0 votes)

Comment » | Linux/Solaris/BSD

Instalación de mod_security 2.1.7_1 en FreeBSD 7.x

May 26th, 2008 — 10:51pm
# cd /usr/ports/www/mod_security2
# make install clean
# vi /usr/local/etc/apache22/httpd.conf
LoadFile /usr/local/lib/libxml2.so
LoadModule mod_security2    libexec/apache22/mod_security2.so

<IfModule security2_module>
    SecRuleEngine On
</IfModule>
# /usr/local/etc/rc.d/apache22 restart

Nota: la instalación con la versión 2.1.3 no se pudo realizar ya que el Makefile no realizaba correctamente el enlace con libxml2 y fallaban las reglas que requerían procesamiento de XML. Se recomienda actualizar a una versión superior.

El siguiente paso consiste en configurar las reglas de seguridad que apliquen a su negocio. Para esto edite apropiadamente los siguientes archivos bajo la ruta /usr/local/etc/apache22/Includes.

  • mod_security2.conf
  • no-accf.conf
  • mod_security2/ (directorio de reglas)

Enlaces

VN:F [1.8.5_1061]
Rating: 0 (from 0 votes)

Comment » | Internet, Linux/Solaris/BSD, Web

Configuración básica de SSHD con FreeBSD 7.x

May 26th, 2008 — 7:24pm
# vi /etc/ssh/sshd_config
Port 22
Protocol 2
SyslogFacility AUTH
LogLevel INFO
LoginGraceTime 2m
PermitRootLogin no
Subsystem    sftp    /usr/libexec/sftp-server
# /etc/rc.d/sshd restart
VN:F [1.8.5_1061]
Rating: 0 (from 0 votes)

Comment » | Linux/Solaris/BSD

Configurando Apache 2.2.x/PHP 5.2.x con FastCGI mod_fcgid en FreeBSD 7.x

May 26th, 2008 — 5:10pm

Descargar compilar e instalar el paquete mod_fcgid y sus posibles dependencias.

# cd /usr/ports/www/mod_fcgid
# make install clean

Verificar que la instalación de PHP cuente con el soporte de FastCGI.

# /usr/local/bin/php-cgi -v

Configurar a Apache para que utilice el nuevo módulo de FCGI.

# vi /usr/local/etc/apache22/httpd.conf

Agregar al final del archivo httpd.conf.

LoadModule fcgid_module libexec/apache22/mod_fcgid.so

<IfModule mod_fcgid.c>
    AddHandler fcgid-script .fcgi
    FCGIWrapper /usr/local/bin/php-cgi .php
</IfModule>

Ubicar la sección del directorio del DOCUMENT_ROOT y complementarla con la nueva opción.

<Directory "/home/web">
    # ...
    Options ExecCGI
</Directory>

Reiniciar el servicio de Apache para que se tengan en cuenta los cambios realizados.

# /usr/local/etc/rc.d/apache22 restart

Consultar la salida de phpinfo() para verificar su correcto funcionamiento.

VN:F [1.8.5_1061]
Rating: 0 (from 0 votes)

Comment » | Linux/Solaris/BSD

apt-get wife

May 24th, 2008 — 1:01pm

VN:F [1.8.5_1061]
Rating: 0 (from 0 votes)

Comment » | Humor

“phpinfo” en Wordpress

May 20th, 2008 — 11:54pm

Acabo de darme cuenta de algo interesante. A este Wordpress (2.5.1) no le gusta del todo la palabra phpinfo. Si la escribo en un post o en una página junto con dos paréntesis de parámetros sin espacio que los separe me muestra siempre un error 503.

Esta línea de texto.

Produce este error cuando deseo guardar o publicar el mensaje.

Nótese que el texto hace parte del contenido del post, es decir la idea es que se muestre tal cual, no que sea interpretado por PHP.

Extrañamente si agrego un espacio entre la función y los parámetros de esta forma.

Funciona de maravillas.  Aunque usted … no lo crea ;-)

VN:F [1.8.5_1061]
Rating: 0 (from 0 votes)

Comment » | Internet, Software, Web

Instalación de PHP 5.x CGI en FreeBSD 7

May 20th, 2008 — 11:37pm

Descargar, compilar e instalar la última versión de la distribución de PHP5. Remover los archivos binarios resultantes de la compilación después de instalar.

# cd /usr/ports/lang/php5

# make config
CLI
CGI
SUHOSIN
MULTIBYTE
IPV6
FASTCGI
PATHINFO
# make install clean

Compilar e instalar las extensiones de PHP que se consideren necesarias. El sistema de ports descargará e instalará cualquier paquete adicional que se requiera como dependencia de las extensiones elegidas.

# cd /usr/ports/lang/php5-extensions
# make config
BCMATH
BZ2
CALENDAR
CTYPE
CURL
DOM
EXIF
FILTER
FTP
GD
GETTEXT
HASH
ICONV
IMAP
JSON
LDAP
MBSTRING
MCRYPT
MHASH
MING
MSSQL
MYSQL
MYSQLI
NCURSES
ODBC
OPENSSL
PCRE
PDF
PDO
PDO_SQLITE
PGSQL
POSIX
READLINE
SESSION
SIMPLE_XML
SOAP
SOCKETS
SPL
SQLITE
TIDY
TOKENIZER
WDDX
XML
XMLREADER
XMLRPC
XMLWRITER
XSL
ZIP
ZLIB
# make install clean

Modificar el archivo de configuración de Apache (httpd.conf) para especificar como manejar los archivos con la extensión .php.

# vi /usr/local/etc/apache22/httpd.conf
<IfModule dir_module>
    DirectoryIndex index.php index.html index.htm
</IfModule>

Agregar al final de httpd.conf.

ScriptAlias /php-cgi "/usr/local/bin/php-cgi"
AddHandler php-handler .php
Action php-handler /php-cgi

<Location "/php-cgi">
    Options None
    Order allow,deny
    Allow from all
</Location>

Crear un archivo de configuración de PHP (php.ini) a partir de los archivos base incluídos en la distribución (dist para desarrolladores o recommended para ambientes en producción).

# cp /usr/local/etc/php.ini-recommended /usr/local/etc/php.ini

# vi /usr/local/etc/php.ini

(Quitar el comentario)

session.save_path = "/tmp"

Crear un archivo de prueba para verificar el funcionamiento del CGI de PHP recién instalado.

# vi /home/web/test.php
    <?php echo phpinfo (); ?>

Consultar la dirección del servidor (http://webserver.mydomain.com/test.php) con un navegador web. Si la instalación fue exitosa se deberá visualizar una página similar a la mostrada a continuación.

VN:F [1.8.5_1061]
Rating: 0 (from 0 votes)

1 comment » | Linux/Solaris/BSD, Personal

CSS la ciencia oculta

May 20th, 2008 — 5:13pm

El año pasado aprendí algunas cositas de CSS, las suficientes para modificar la presentación de una página y lo que es mas importante, lo suficiente para saber que no se nada.  Lo más difícil de todo hasta ahora ha sido tratar de entender el manejo del boxmodel, el tratar de hacer que los divs se queden en las posiciones que necesito, tarea ardua para mi.

Por eso me gusta encontrarme con cosas extrañas en este mundo, cosas que por lo menos no se me hubieran ocurrido o no me hubiera dado ganas intentarlas.  La demostración de que en este mundo si hay gente que sabe lo que usted no sabe.  Gente como Román Cortés quien dibujó este Homero Simpson …

pero con CSS.  Si se inspecciona el código se verá que cada pedacito de la imagen son divs con carácteres organizados con clases CSS.  Muy bonito.

Enlace: Homer CSS.

VN:F [1.8.5_1061]
Rating: 0 (from 0 votes)

Comment » | Desarrollo de software, Internet, Web

Back to top