Monthly Archives: April 2008

Hosting con phpSuExec

Uno de los servidores contratados de hosting de la Fundación donde trabajo fue actualizado recientemente. Inicialmente tenía PHP4 y desarrollaron en él un sistema de información basado en la variable register_globals encendida. Ahora con PHP5 register_globals se encuentra desactivada por defecto y por ende, nada funciona.

La solución es muy sencilla, agregar la siguiente línea al archivo .htaccess que se encuentra en el raíz del sitio web.

    <ifmodule mod_php5.c>
        php_flag register_globals on
    </ifmodule>

Sin embargo esto no funcionó para el servidor. Por el contrario generaba un error 500. Investigué un poco mas y empecé a esclarecer la situación. Al parecer la actualización del hosting se realizó utilizando phpSuExec (1) que es la apropiación de PHP del soporte suExec que provee Apache. Esto permite que el demonio de Apache que atiende las peticiones de los diferentes dominios alojados en un hosting compartido se ejecute bajo el mismo usuario de la cuenta mejorando con esto la seguridad de las cuentas individuales. Esto trae consigo otras repercusiones como las observadas, en especial, la que impide que se definan variables PHP en el archivo .htaccess; conclusión: la solución anterior ya no es válida.

Con phpSuExec se deben crear archivos php.ini que se ubican, al igual que los .htaccess, en el árbol web del sitio, en ellos se definen las variables PHP necesarias. A diferencia de los segundos, el alcance de los archivos php.ini es local al mismo directorio, es decir, no es recursivo, así que en rigor es necesario crear en (o enlazar a) el archivo php.ini a cada uno de los directorios donde se necesite.

Esta restricción resulta altamente tediosa, tanto por la tarea mecánica misma de andar copiando archivos como por la de mantenerlos actualizados y ubicados en los directorios que son. Por suerte (y gracias al sitio de Jumba Support Wiki) encontré que es posible indicarle a Apache que un php.ini específico es el que tendrá vigencia a lo largo y ancho del árbol de directorios web utilizando una directiva PHPRC en el .htaccess. Esto nos evitará la necesidad de andar copiando/enlazando archivos en cada subdirectorio, claro está que es útil solamente en el caso en que necesitemos un único php.ini para todo el sitio (99% de los casos ?).

Para implementar esta solución se debe crear/editar un archivo .htaccess en el directorio raíz del sitio web e incluír la siguiente línea.

    SetEnv PHPRC /home/proyecto/public_html

Téngase en cuenta que la ruta /home/proyecto/public_html deberá ser la ruta real donde se ubicará le archivo php.ini.

Manejo de servicios en Windows

En estos días he tenido que instalar algunos programas en mi equipo que solo voy a utilizar en ciertos momentos que esté desarrollando proyectos específicos: VMWare y MS SQL Server Express entre otros. Estos programas al instalarse agregan servicios a Windows que se ejecutan al inicio y consumen recursos a pesar de que no los esté utlizando en ese momento.

Para evitar eso pensé en deshabilitar los servicios de estas aplicaciones y hacer unos scripts para iniciarlos manualmente cuando los vaya a utilizar relamente.

Mi primer paso fue crear un archivo de batch utilizando el comando net {start|stop} SERVICIO. Después descubrí que existía el comando sc {start|stop} SERVICIO para realizar esta administración de servicios y lo modifiqué. Lo desventajoso de esta solución era crear un script para start y otra para stop, yo quería una solución que al estilo de *nix fuera un script único para todas las acciones.

Estuve leyendo un poco y fue cuando a la 1 am. se me ocurrió hacerlo en WSH. No fue muy difícil de aprender lo necesario salvo un par de excepciones que mencionaré posteriormente.

Con WSH creé un script que permite iniciar, detener, desactivar y verificar el estado de los servicios asociados a una aplicación. Los servicios relacionados se pueden configurar en un arreglo en la sección de configuración. Con él preparé los scripts para las aplicaciones que utilizo en este momento.

Los scripts se ejecutan con el comando cscript SCRIPT.js {start|stop|status|disable}.

Enlaces:

Como nunca he sido muy amigo de VB elegí desarrollar el script en JScript cuya sintaxis es similar a la de JavaScript. Desgraciadamente la gran mayoría de ejemplos de WSH están hechos en VB y la conversión de estos no era tan transparente como esperaba inicialmente. Estos fueron un par de detalles muy simples que me gastaron mas tiempo solucionar que el mismo desarrollo.

En VB un foreach se implementa de la siguiente manera.

For Each i in services
    ...
Next

Para convertirlo a JScript realicé este cambio.

for(var i in services) { ... }

Sin embargo la ejecución no era como se esperaba. Aparentemente este tipo de for sirve para iterar los atributos de un objeto y los valores de un arreglo pero no los elementos de una colección. Por suerte encontré la siguiente función que permite fácilmente realizar la adaptación.

function forEach(enumerable, delegate)
{
    for (var enumerator = new Enumerator(enumerable); !enumerator.atEnd(); enumerator.moveNext())
    {
        delegate(enumerator.item());
    }
}

Así que el código inicial se expresa de la siguiente manera.

forEach(services,
    function(i)
    {
       ...
    });

El otro detalle poco romántico de mi desvelada desarrollando anoche fue mucho mas simple aún. En VB esta es la forma de conexión a la consola de WMI.

Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")

Mi conversión a JScript inicialmente fue la siguiente.

var objWMIService = GetObject("winmgmts:"
    + "{impersonationLevel=impersonate}!\\"
    + strComputer + "\root\cimv2");

Muy fácil. Todos felices. Pero no funciona :-s Me tomó un buen rato darme cuenta que en VB al parecer no hay carácteres escapados así que en sus cadenas un \ es un \, mientras que en JScript si hay y por lo tanto un \ es solamente el inicio de un carácter escapado. En una cadena JScript, un \ se escribe en realidad \\. Por lo tanto la conversión real de la conexión a WMI es la siguiente.

var objWMIService = GetObject("winmgmts:"
    + "{impersonationLevel=impersonate}!\\\\"
    + strComputer + "\\root\\cimv2");

Después de solucionar estos detalles, la implementación fue un pedazo de torta.

Por otro lado, en mi búsqueda de información encontré un snippet interesante. Con WSH es muy fácil utilizar la máquina de texto a voz del sistema operativo.

tts = WScript.CreateObject("SAPI.SpVoice");
tts.Speak ("Hola");

Para mas información consultar Using WMI Scripting with Speech Server.

Enlace: Text To Speech Demo.


Actualización 20080430 @ 1840.

No había caido en cuenta que para que los scripts de administración de servicios funcionen deben ejecutarse con privilegios de administración (Windows Vista). Lo mejor es abrir un shell (Símbolo del sistema) con estos privilegios.

Para hacerlo abra el menú de inicio y en la parte inferior, en el campo de Iniciar búsqueda,
escriba cmd y presione las teclas Ctrl + Shift + Enter para iniciar la aplicación.

El díalogo de permitir la ejecución con privilegios de administración se abrirá y si se acepta se le concederán a todo lo que se ejecute desde esta consola, incluyendo por supuesto a los scripts WSH.

Fotos de Mariana

Milisegundos después de recién conocer este mundo.

Con dos meses de experiencia en campo.

Preparándose para su segundo deporte favorito después de comer matas.

Cansada porque en esta casa no dejan dormir.

Practicando para cuando dormir y soñar sean deportes olímpicos.

Espiral dorada

Como ejemplo de demostración para las primitivas de dibujo había empezado a desarrollar una pequeña aplicación que dibujaba la espiral dorada según el cálculo del radio dorado o phi que también puede calcularse por aproximación con la serie de Fibonacci.  Este programita lo había hecho hace mucho tiempo cuando cursaba la asignatura de Series en pregrado y quería recordar viejos tiempos, ahora con MobileProcessing.

Dividí el problema en dos partes: la primera era en calcular y dibujar los cuadrados basados en el valor de phi y la segunda parte, un poco mas sencilla, era la de dibujar los correspondientes arcos en cada uno de los cuadrados anteriores.

En una tarde de pruebas con las primitivas gráficas hice la primera parte, sin embargo después de luchar mucho con el manejo de punto flotante y de descubrir que con CLDC 1.1 el mundo era mas bonito, también descubrí que MP no tiene como dibujar arcos.  Así que este programita se encuentra detenido por el momento.

Enlace: GoldenSpiral 0.1.

¿ Por qué no BSD ?

Hay tantas cosas que quiero aprender, experimentar, desarrollar. Hay tantas tareas y actividades que tengo que hacer. Hay tantos libros que quisiera leer. Hay tantas cosas nuevas que ni siquiera conozco que quisiera buscar. Hay tantas ideas que se me van a ocurrir, que me hace falta tiempo en el día y cuando lo tengo no se ni siquiera por donde empezar.

Ayer recordé que dejé olvidado mi "proyecto" de instalar y documentar un servidor web que había iniciado hace ya un tiempo con fines académicos. Ayer se me ocurrió por qué no hacerlo con FreeBSD ? En mi época en la UAM utilice un poco FreeBSD, lo utilice cuando estuve montando un router para el Centro de Informática obteniendo en poco tiempo resultados considerables. Al final no continué el proyecto pero fue por motivos administrativos ;-)

El poco contacto que tuve con FreeBSD me dejó un buen recuerdo. La facilidad de instalar la mayoría de los paquetes que uno requiere a través de los ports es muy interesante, también me gustó la sensación de controlar que se instala en el servidor y no un montón de cosas que no pedí, no conozco y pueden ser un problema después, la misma que me hace preferir Linux Slackware para la instalación de servidores ante otras distribuciones que parecen cada vez mas estar enfocadas a los escritorios de los usuarios finales.

Es por esto que se me ocurrió retomar mi proyecto simple pero ahora con FreeBSD, para esto estoy descargando en este momento el FreeBSD 7.0 e hice una búsqueda de bibliografía ya que sin documentación cualquier cosa es un caos, en especial, la administración de servidores.

A continuación documento algunas de las fuentes de información mas interesantes que encontré relacionadas con el sistema operativo FreeBSD.

Explaining BSD
http://www.lemis.com/bsdpaper.html

FreeBSD Man Pages

http://www.freebsd.org/cgi/man.cgi

FreeBSD Architecture Handbook
http://www.freebsd.org/doc/en/books/arch-handbook/index.html
ftp://ftp.freebsd.org/pub/FreeBSD/doc/en/books/arch-handbook/book.pdf.zip

The FreeBSD Corporate Networker's Guide
http://www.freebsd.org/doc/en/books/corp-net-guide/
ftp://ftp.freebsd.org/pub/FreeBSD/doc/en/books/corp-net-guide/book.pdf.zip

The Design and Implementation of the 4.4BSD Operating System
http://www.freebsd.org/doc/en/books/design-44bsd/
ftp://ftp.freebsd.org/pub/FreeBSD/doc/en/books/design-44bsd/book.pdf.zip

A project model for the FreeBSD Project
http://www.freebsd.org/doc/en/books/dev-model/
ftp://ftp.freebsd.org/pub/FreeBSD/doc/en/books/dev-model/book.pdf.zip

FreeBSD Developers' Handbook
http://www.freebsd.org/doc/en/books/developers-handbook/
ftp://ftp.freebsd.org/pub/FreeBSD/doc/en/books/developers-handbook/book.pdf.zip

Frequently Asked Questions for FreeBSD 5.X and 6.X
http://www.freebsd.org/doc/en/books/faq/
ftp://ftp.freebsd.org/pub/FreeBSD/doc/en/books/faq/book.pdf.zip

FreeBSD Documentation Project Primer for New Contributors
http://www.freebsd.org/doc/en/books/fdp-primer/
ftp://ftp.freebsd.org/pub/FreeBSD/doc/en/books/fdp-primer/book.pdf.zip

FreeBSD Handbook
http://www.freebsd.org/doc/en/books/handbook/
ftp://ftp.freebsd.org/pub/FreeBSD/doc/en/books/handbook/book.pdf.zip

PMake — A Tutorial
http://www.freebsd.org/doc/en/books/pmake/
ftp://ftp.freebsd.org/pub/FreeBSD/doc/en/books/pmake/book.pdf.zip

FreeBSD Porter's Handbook
http://www.freebsd.org/doc/en/books/porters-handbook/
ftp://ftp.freebsd.org/pub/FreeBSD/doc/en/books/porters-handbook/book.pdf.zip

A comprehensive Guide to FreeBSD
http://www.vmunix.com/fbsd-book/

The Complete FreeBSD
http://grog.evilcode.net/book.pdf.gz

ASP.NET Development Server desde línea de comando

El ASP.NET Development Server es el pequeño servidor ASP.NET que trae consigo el Framework de .NET y el Visual Studio Express para realizar la depuración y pruebas de este tipo de aplicaciones. Esta semana descubrí que es posible ejecutarlo desde la línea de comando, es decir, no es necesario iniciar el Visual Web Developer Express completo para utilizarlo. Para esto se debe ejecutar el siguiente comando en una ventana de Símbolo del sistema.

prompt> set DEVSRV=C:\Program Files\Common Files\microsoft shared\DevServer\9.0\
prompt> "%DEVSRV%"\webdev.webserver.exe /port:8080 /path:"RUTA_PROYECTO" /vpath:/SERVICIO

Utilizo la variable %DEVSRV% para evitar digitar la ruta del servidor (webdev.webserver.exe) en cada llamado. Aparentemente su ubicación puede variar según la versión del .NET Framework que se tenga instalada.

En la segunda línea se debe reemplazar la cadena RUTA_PROYECTO con la ubicación del serivicio web: G:\Proyectos\WS_Taller\servicio por ejemplo y la cadena SERVICIO por la ruta virtual web bajo la cual quedará publicada el webservice. Si no se especifica un puerto se utiliza el puerto 80 por defecto.

3.1

This month the firmware was updated to the 3.1 version.  If it would be Windows it would have a nice and user friendly interface.  But it is not.  Just command line shell style interface.

Las responsabilidades al estilo Calvin

Conceptos básicos de Rebol

Un programa en Rebol es una secuencia ordenada de valores. A continuación se relacionan los tipos nativos de valores del lenguaje.

NombreDescripcionEjemplos
NúmerosIncluye a los enteros, los reales y los expresados en notación científica.
1234
-45
3.1415
1.54E7
Horashoras:minutos:segundos
21:47
13:45.15
FechasD-M-Y (formato internacional)

Y-M-D (formato USA)

Pueden incluir una hora y una zona horaria.

En el campo mes es posible utilizar la abreviación de su nombre.

23-04-2008
23/04/2008
2008-04-23
2008-04-23/21:51
2008-04-23/21:51-5:00
MonedaSímbolo internacional de tres letras de la moneda y su correspondiente valor.
$12.45
USD$12.45
CAD$12.45
DEM$12.45
TuplasSon secuencias de números separadas por puntos. Son útiles para representar direcciones IP y colores RGB por ejemplo.
192.168.1.3
128.45.92
CadenasExisten cadenas de una sóla línea las cuales se rodean por comillas dobles y cadenas multilínea las cuales se rodean por llaves. Las cadenas multilínea deben utilizarse cuando la cadena contiene comillas, tabulaciones o saltos de línea en su contenido.
"Cadena de una línea"
{Esta es una
cadena multi linea
con "comillas"}
EtiquetasÚtiles para representar lenguajes como XML y HTML. Estos valores se rodean por mayor y menor que.
<font size="2" color="blue">
Direcciones de correoDeben incluír el símbolo de arroba (@) para separar el nombre de usuario de su dominio.
jimezam@gmail.com
URLsDeben empezar con un protocolo seguido por su correspondiente ruta.
http://www.jorgeivanmeza.com/
Nombres de archivoEmpiezan por el símbolo de porcentaje.
%/etc/init.d/apache2
aresÚtiles para representar posiciones (x, y) o dimensiones (ancho, alto). Son valores separados por el carácter x.
1024x768
50x200
AsuntosRepresentan números de identificación como números telefónicos, modelos de serie, números de tarjetas de crédito entre otros. Deben iniciar con el símbolo de número.
#300-654-5544
#KFC-2145-9878
BinariosSon cadenas ilimitadas de valores binarios codificadas en hexagecimal o base-64. Se rodean por llaves iniciando con el carácter de número.
#{42652061205245424F4C}
64#{UkVCT0wgUm9ja3Mh}

Las palabras son los símbolos utilizados por lenguaje los cuales pueden ser o no variables según como se utilicen. Algo interesante de Rebol es que tiene palabras reservadas. Cualquier palabra puede utilizarse según el contexto, inclusive pueden utilizarse para redefinir un comportamiento nativo provisto por el lenguaje.

Las palabras no son sensitivas a mayúsculas/minúsculas y pueden incluír carácteres especiales como: +, -, ‘, *, !, ~, &, ., y ?. Los siguientes carácteres no están permitidos: @ # $ % ^ ,.


Los bloques son un conjunto de valores organizados en un órden específico y se utilizan para representar secciones de código, listas, arreglos, tablas, directorios y asociaciones, entre otras secuencias. Los bloques se rodean por corchetes y pueden separarse en varias líneas de código.

loop 10 [print "hello"]
[
"Pepe" 1 0:55:68
"Rosa" 2 0:61:35
"Juan" 3 0:50:12
]

Las variables son referencias conocidas a valores. La asignación se realiza con el operador dos puntos.

nombre: "Jorge"
edad: 31

Un aspecto importante que se debe tener en cuenta es que el lenguaje no presenta ningún tipo de precedencia para los operadores aritméticos. Esta debe realizarse explícitamente mediante el uso de los paréntesis para agrupar las expresiones matemáticas.

print 2 + 3 * 10
> 50
print 2 + (3 * 10)
> 32

Las funciones son bloques nombrados que pueden o no recibir argumentos (parámetros) que pueden ser modifcados durante su llamado.

sumar: func [a b] [a + b]
print sumar 2 3
> 5

Si la función utiliza además variables locales se deben crear entonces functions.

promedio: function [series] [total] [
total: 0
foreach value series [total: total + value]
total / (length? series)
]
print promedio [37 1 42 108]
> 47

Es posible incluír la documentación de la función dentro de su misma especificación.

promedio: function [
"Descripción de la función PROMEDIO"
series "Descripción del parámetro SERIES"
] [total] [
total: 0
foreach value series [total: total + value]
total / (length? series)
]

Cuando se ejecuta el siguiente comando: help promedio, se obtiene esta información.

USAGE:
    PROMEDIO series
DESCRIPTION:
    Descripción de la función PROMEDIO
    PROMEDIO is a function value.
ARGUMENTS:
    series -- Descripción del parámetro SERIES
(Type: any)

Las rutas (paths) son un conjunto de valores que representan pasos o niveles y que proveen un mecanismo para acceder a la información, de igual manera a como se accede a un archivo dentro de carpetas (%proyecto/recursos/logo.jpg) o a un recursos web (http://www.servidor.com/docs/nomina.html).

Las rutas, que son cadenas separadas por barras diagonales (slashes), permiten acceder a la información contenida en cadenas, objetos, bloques y a refinar la ejecución de las funciones.

Departamentos/Caldas/Manizales/poblacion (acceso a un bloque – arreglo)
nombre/10 (acceso a una posición de una cadena)
nomina/reporte (acceso a un método de un objeto)
match/any (opción de una función)

A continuación un ejemplo de uno de sus aplicaciones.

Departamentos: [
    Caldas [
        poblacion #12345
        web http://www.manizales.gov.co
    ]
    Risaralda [
        poblacion #54321
        web http://www.risaralda.gov.co
        email alcalde@risaralda.gov.co
    ]
]
print Departamentos/Caldas/web
> http://www.manizales.gov.co

Más información: http://www.rebol.com/docs.html.

Problemas suspendiendo/hibernando con Windows Vista

Reinstalé nuevamente el sistema operativo (Windows Vista Premium edition) del portátil (Dell Vostro 1400) y volví a tener nuevamente problemas cuando cierro la pantalla, es decir, cuando el sistema operativo entra en estado de suspensión o de hibernación. Cuando se despierta el sistema operativo inicia normalmente pero la resolución del escritorio se encuentra modificada a una menor. Esto es bastante molesto ya que no solo es necesario configurarla cada vez sino que revuelve los íconos del escritorio.

Por suerte encontré el motivo. Tiene que ver con una aparentemente nueva tecnología de dispositivos de video (TMM) que Vista soporta pero que el hardware todavía no y su software es el que causa este inconveniente. Para solucionar el problema seguí estos pasos.

  1. Inicio > Todos los programas > Accesorios > Herramientas del sistema > Programador de tareas.
  2. Programador de tareas (local) > Biblioteca del programador de tareas > Microsoft > Windows > MobilePC.
  3. Seleccionar la tarea TMM y la acción Deshabilitar.