GMail mobile en mi teléfono

Hace dos dias por fin pude configurar la cuenta de GPRS en mi teléfono, un Nokia 6300. Lo primero que intenté hacer fue instalar el cliente de correo de GMail el cual en mi teléfono anterior, un SE Z550, funcionaba de maravillas. Obtuve el cliente accediendo al sitio http://www.gmail.com/app desde el navegador nativo y descargué la aplicación MIDP2 de al rededor de 120KB. El ejecutarla me mostraba el siguiente mensaje.

Sorry, the Gmail mobile app will not work on your phone. Your phone doesn’t have the appropriate certificate to communicate with Gmail. Try accessing Gmail on your mobile browser at http://m.gmail.com.

Tuve que instalar primero el certificado de Verisign antes de poder utilizar el cliente. Para esto accedí a https://www.verisign.com/cgi-bin/support/rootcert/getrootcert.cer o tinyurl.com/yhrayo si no desea escribir mucho, utilizando el navegador nativo. Después de guardar el certificado el cliente de GMail empezó a funcionar correctamente.

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 & "rootcimv2")

Mi conversión a JScript inicialmente fue la siguiente.

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

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.

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 FilesCommon Filesmicrosoft sharedDevServer9.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:ProyectosWS_Tallerservicio 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.

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.

Aplicación UpTimeCheck 0.1

UpTimeCheck es una aplicación muy simple desarrollada en PHP para verificar y registrar que diferentes sitios web se encuentren en línea.

Esta aplicación corre como un script de CLI (command line interface) y puede ejecutarse por demanda o a través de un proceso cron como es más conveniente. En la configuración pueden especificarse los sitios a revisar sin ningún límite o restricción respecto a su cantidad y algunos parámetros adicionales para personalizar su funcionamiento.

Para más información acerca de la aplicación por favor consultar el archivo README de la misma.

Como para todo en la vida, se reciben sugerencias y reportes de problemas.

Enlace: uptime_0.1.zip

Instalación de redmine 0.6.4 en un host compartido

Desde hace unos días tenía ganas de instalar un software estilo forge (SourceForge, GForge, Trac, entre otros) para el control y registro de los proyectos en la Fundación donde paso la mayor parte del tiempo.Inicialmente estuve probando dotNetProject, sin embargo se veía complejo (muchas opciones) y me pareció que se centraba mas en el control del tiempo y de las actividades que en otras cosas mas técnicas que era lo que yo busco. Me interesa en este momento poder llevar el control de solicitudes (tickets) y errores reportados (bugs) a los diferentes proyectos y que se integre con el control de versiones del código para llevar la historia (time line) del desarrollo del proyecto, ojalá documentando los esfuerzos realizados por los ingenieros desarrolladores. Si a esto se le puede agregar el manejo de archivos y de documentación incluyendo un Wiki pues mucho mejor.

Algo muy similar a mis requerimientos fue lo que encontré en Trac, software muy utilizado por varios proyectos importantes opensource. Estaba muy interesado en instalarlo y probarlo cuando me di cuenta que está desarrollado en Python. Me preocupó que nunca había instalado nada en Python y menos para web, sin embargo eso nunca será un problema porque me divierte intentar cosas nuevas.

Sin embargo mientras revisaba información acerca de la instalación de este software encontré varias referencias positivas de otro similar que me empezó a llamar la atención: Retrospectiva. Este en cambio está desarrollado en Ruby on Rails. Igual situación, nunca había instalado nada en RoR pero todo se puede hacer en esta vida, nada es imposible.

Y nuevamente sucedió. Revisando documentación acerca de este software me llamó la atención otro mas con muchas características interesantes: Redmine. También hecho en RoR terminó por gustarme mas que el resto así que me decidí instalarlo para probarlo lo más rápido posible antes de que encontrara otro 😛 No se nada de RoR pero he estado aprendiendo un poco de Ruby y esto me dió más ánimos.

Pensé que si tanta gente habla tan bien de RoR debe ser fácil de instalar … error. No se si fue porque era la primera vez que instalaba un software desarrollado con este framework pero me pareció difícil y poco intuitivo. Seguí inicialmente las instrucciones y sugerencias generales que encontré después de una revisión rápida y sólo logré que apareciera un mensaje diciendo: “Application error, Rails application failed to start properly“. Si, claro, con gusto yo lo arreglo, pero dígame donde le duele ? Qué no le funciona ? Nada, no mas mensajes, cero logs.

Descubrí que era posible ejecutar el controlador frontal (public/dispatch.fcgi) desde línea de comando y pude ver que se generaba por consola una página de error 500. Esto por lo menos provocó que se generar registros (logs) y tuviera que investigar. El mensaje de error no ayudó mucho: “The error occurred while evaluating nil.downcase“. Por lo que a mi respectaba era un error de la aplicación que intentaba llamar un método en un objeto sin instanciar, sin embargo la búsqueda en Internet de este error sugirió que se podía deber a múltiples causas, la principal de ellas a una mezcla de versiones de software entre Ruby, Rails y librerías de Gems.

Todo pintaba mal. Sin embargo después de un día de trabajo (de 24 horas), mucha paciencia, muchos experimentos y consultas en Internet lo pude hacer funcionar 😮 Ahora tengo que tratar de sacar un tiempo para configurarlo completamente (integración con SVN), jugar con él y concluir si me es útil para mis labores como desarrollador de software.

A continuación detallo los pasos que seguí para realizar la instalación del software.

Descargué la distribución mas reciente de RubyForge, en este momento la 0.6.4.

$ wget http://rubyforge.iasi.roedu.net/files/redmine/redmine-0.6.4.zip

Se descomprimió y la renombre $INSTALL_HOME. Según parece las aplicaciones RoR se instalan por fuera del árbol público de directorios compartidos a través de web (alias public_html) y sólo debe hacerse público el directorio homónimo: /public. Para esto instalo el software en $INSTALL_HOME y después hago un enlace dinámico a /public.

$ unzip $HOME/redmine-0.6.4.zip

$ mv $HOME/redmine-0.6.4.zip $HOME/$INSTALL_NAME

$ cd $HOME/$INSTALL_NAME

Realicé la configuración de la base de datos.

$ cp $HOME/$INSTALL_NAME/config/database.yml.example $HOME/$INSTALL_NAME/config/database.yml

$ vi $HOME/$INSTALL_NAME/config/database.yml

production:
adapter: mysql
database: DATABASE_NAME
host: DATABASE_HOST
username: DATABASE_USERNAME
password: “DATABASE_PASSWORD”

Se solicitó la creación de las tablas en la base de datos.

$ rake db:migrate RAILS_ENV=”production”

Y de la inserción de los datos iniciales.

$ rake redmine:load_default_data RAILS_ENV=”production”

Se organizó el script que actúa como controlador frontal de la aplicación. Nótese que se eligió la versión FastCGI (fcgi) lo cual debe -en Dreamhost- activarse para el dominio específico donde se está trabajando, de lo contrario deberá utilizarse la versión CGI la cual es increiblemente lenta.

$ cp $HOME/$INSTALL_NAME/public/dispatch.fcgi.example $HOME/$INSTALL_NAME/public/dispatch.fcgi

$ dos2unix $HOME/$INSTALL_NAME/public/dispatch.fcgi

Se establecieron las reglas de ModRewrite para redireccionar todo el tráfico web a través del controlador frontal definido anteriormente. Nótese que esta regla se deja de última ya que inicialmente la tenía cerca al comienzo y estaba apareciendo la página pero fallaba el acceso a los contenidos de javascripts/ y stylesheets/ entre otros bajo /public ya que estos segmentos estaban siendo pasados al controlador como si fueran solicitudes de otros controladores y acciones.

$ vi $HOME/$INSTALL_NAME/public/.htaccess

SetEnv RAILS_ENV production
RewriteEngine On
RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
ErrorDocument 500 “Application errorRails application failed to start properly”

Como mencioné inicialmente, sólo /public debe poderse acceder a través de una petición web, por eso desde el directorio web del dominio ($DOMAIN_NAME) que en Dreamhost se ubica en $HOME y tiene el nombre del [sub]dominio creo un enlace que servirá como punto de acceso al sitio y apunta a la carpeta pública.

$ ln -s $HOME/$INSTALL_NAME/public $HOME/$DOMAIN_NAME/redmin

Se especifican los permisos de archivo necesarios para la ejecución del FCGI y se verifica la ejecución del mismo.

$ chmod 755 $HOME/$INSTALL_NAME/public/

$ chmod 755 $HOME/$INSTALL_NAME/public/dispatch.fcgi

$ $HOME/$INSTALL_NAME/public/dispatch.fcgi

Se remueve el archivo de distribución.

$ rm $HOME/redmine-0.6.4.zip

Y listo, software instalado! Se puede acceder al sitio a través de un navegador visitando $DOMAIN_NAME/redmine.

En caso de problemas tenga en cuenta estas sugerencias.

  • Verifique el funcionamiento y salida estándar de la ejecución directa por linea de comando del controlador frontal.$ $HOME/$INSTALL_NAME/public/dispatch.fcgi
  • Revise los logs del framework que se ubican en $HOME/$INSTALL_NAME/log. Es posible que no se estén generando durante el acceso web, sin embargo si se generarán si ud. realiza la sugerencia anterior.
  • Gracias al módulo WEBrick de Ruby es posible iniciar un servidor web independiente (puerto 3000) para verificar la instalación. Es útil para verificar que se va por buen camino, sin embargo no es la verificación final porque en mi caso el sitio se podía acceder a través de este servidor pero no a través del puerto 80 convencional debido a que tenía problemas de permisos de archivos y en el archivo .htaccess.$ ruby script/server -e production

Esta última sugerencia debe hacerse con cuidado y rapidez ya que Dreamhost detiene el servidor unos segundos después de iniciado y le envían a uno un correo regañadolo por incumplir los términos del contrato 🙁

Our automated system has come across the following activity under your account that is in violation of our Terms of Service.
We request that you take any necessary action to cease the activity as quickly as possible or we will be forced to take further action. If
you were not aware of any such activity, please feel free to contact support and we can look into the issue further.

User fdq_usr running “ruby script/server -e production”. This process is against our policies.

This appears to be a Denial of Service attack script

Enlaces: Actualización a Redmine 0.73.

Problemas con el módulo Localizer y Gallery en Drupal

La semana pasada detecté un problema con uno de los portales basados en Drupal. Por solicitud del cliente se instaló el módulo Localizer que permite mantener versiones en distintos idiomas de los contenidos de los nodos.

Este módulo modifica el estilo de los URL que maneja Drupal cambiándolos del estilo ?q=modulo/accion al estilo ?q=idioma/modulo/accion. Esto requirió que en algunas partes donde se autoriza o no el uso de algún recurso según el URL (como por ejemplo donde mostrar TinyMCE) se actualizara de node/* a */node/* y así sucesivamente.

Todo funcionaba perfectamente hasta que me percaté que el módulo de Galería de Imágenes que en realidad realiza la interacción con Gallery estaba fallando, los enlaces estaban siendo mal construídos y por ende llevaban al usuario a un error 404.

  • Incorrecta: http://HOST/apps/site/?q=es/index.php?q=gallery&g2_itemId=1&g2_GALLERYSID=XXX
  • Correcta: http://HOST/apps/site/?q=es/gallery&g2_itemId=1&g2_GALLERYSID=XXX

A pesar de que el autor de Localizer menciona en su sitio web que existen varias formas de configurar el módulo para que integre la información del idioma (la modificación mencionada al parámetro q es una de ellas) no encontré documentación acerca de como hacerlo. Investigué un poco y encontré una solución al problema.

En el archivo gallery_base.inc ubicado en modules/gallery realicé las siguientes modificaciones basadas en las incluídas para el módulo de I18.

En la línea 87 (función _gallery_init) agregué el siguiente código después de la línea “include_once($embed_path);“.

// Localizer url rewrite
if(module_exists('localizer'))
{
$embed_uri = preg_replace('/index.php?q=/', '', $embed_uri);
}

Esto corrige el URL de forma adecuada para que los visitantes puedan acceder a los álbumes de Gallery desde Drupal.