jueves, 19 de enero de 2012

Como usar AjaxPro con JQuery

En uno de mis proyectos tengo configurado AjaPro con ASP.Net, ya es tiempo de actualizar dicho código, pues tiene más de tres años, así que me dí a la tarea de configurar la versión más reciente que pudiera encontrar de AjaxPro y JQuery.

Requerimientos:
  • AjaxPro: el proyecto está un poco descuidado y en su sitio en codeplex, el autor no ha hecho actualizaciones desde el 2009. La última versión estable es la 9.2.17.1 al momento de redactar este post.
  • JQuery: la versión más reciente al momento es la 1.7.1
  • ASP.Net (.Net Framework): Estoy usando la versión 3.5 del .net framework para este proyecto.

Pasos para usar AjaxPro con JQuery en ASP.Net:
1. Descargamos AjaxPro desde aquí, los descomprimimos y lo agregamos al proyecto ASP.Net.

2. Creamos una clase sensilla para probar por ejemplo las siguiente:



3. Creamos una pagina aspx para probar que lo anterior funciona bien, a continuación un ejemplo:

 Nota: estoy usando head.js para cargar jquery.

Si todo está bien, deberemos ver una alerta mostrando el mensaje "Hello World!".


Algunas páginas que consulté y me ayudaron a hacer funcionar todo son esta y esta otra.
Les recomiendo también el siguiente enlace, donde pueden ver las características principales de AjaxPro y por supuesto el sitio de jquery.

Hasta la próxima.

miércoles, 11 de enero de 2012

Metodos de extension en C#

Hace algún tiempo que vengo trabajando con C# y he visto algo que en mi opinión es bastante útil y se llama métodos de extensión. Por medio de estos métodos podemos hacer algo como lo que ofrece Ruby y extender las interfaces de las clases que vienen incluidas como parte del .Net framework.

Veamos algunos ejemplos donde esto puede ser útil.
1. Extendiendo linq, supongamos que queremos calcular el hash de una cadena, podemos definir un método de la siguiente forma para obtener el hash md5


2.  Leer los AppSettings (xml) de una aplicación.


¿Qué hay de malo con los ejemplos?
Como estos son ejemplos simples no mucho en realidad, pero en ejemplo 1 se podría reusar la lógica de conversión de byte a hexadecimal y en el ejemplo 2 en todos lados donde se use la función GetAppSetting debemos saber exactamente que cadena hay que pasar como parámetro para obtener el setting deseado y si por si acaso alguien escribe mal la llave (key) la aplicación fallará pues la función GetAppSetting retornará null.

Pues bien mejoremos el código
Voy a crear una sola clase con mis métodos de extensión, sin embargo ustedes pueden separar todo en varias clases según sea necesario.

Nota: Del ejemplo anterior pueden ver que tengo una clase y un enum definidos. La clase define los métodos de extensión mientras que el enum es usado para simplificar el código de acceso a las configuraciones, veamos como quedan las las funciones que vimos antes:

Ejemplo 1:

Nota: Como pueden ver aquí, la función en si misma se hace más simple y de ahora en adelante donde sea que tengamos una instancia de IEnumerable podemos llamar al método ToHexString .
Muchas cosas puede usarse como instancias de IEnumerable, un arreglo, una lista, una colección (ICollection), etc.

Ejemplo 2:

Nota:  Ahora en la función delegamos el acceso a los AppSettings a nuestro enum, de esta forma existe un solo lugar donde se leen los mismo y eliminamos la necesidad de mantener una cadena o una constante  aparte solo para el nombre de una configuración. Ademas con esta solución podemos usar el autocompletado de nuestro IDE favorito.

Administrando e investigando problemas en ubuntu one

Tratando de hacer que una pc sincronice varios archivos con Ubuntu One (U1) me topé con problemas, los archivos no se estaban cargando, por lo que decidí buscar una forma de vigilar el trabajo de sincronización y ver la causa del problema.

Despues de buscar un rato encontré en askubuntu un par páginas con información muy útil:
  1. http://askubuntu.com/questions/16592/how-can-i-tell-whether-ubuntu-one-file-sync-is-working-and-what-progress-it-is
  2. http://askubuntu.com/questions/61471/ubuntu-one-state-still-processing-process-sleeping-not-transfer-uploads-downlo
De lo anterior me parece muy interesante que existe una herramienta para manejar U1 desde la consola llamada u1sdtool  y que los archivos de log de  U1 están en la carpeta
~/.cache/ubuntuone/log/
Para más detalles sobre como usar u1sdtool pueden consultar el manual:
man u1sdtool

Revisando el log ~/.cache/ubuntuone/log/status.log vi varios mensajes indicando que la conexión era adquirida y luego perdida. Sospecho que algo no se cargó bien, quizás como actualicé la pc el servicio de  U1 necesita reiniciarse:
u1sdtool --quit
u1sdtool --start

Luego ejecuté el siguiente comando para ver el estatus de U1:
u1sdtool --status
Del comando anterior veo una respuesta parecida a los siguiente,  que indica que todo funciona correctamente :
State: QUEUE_MANAGER
    connection: With User With Network
    description: processing the commands pool
    is_connected: True
    is_error: False
    is_online: True
    queues: WORKING
Y revisando el archivo ~/.cache/ubuntuone/log/status.log veo el siguiente mensaje:
2012-01-11 10:48:21,814 - ubuntuone.status - DEBUG - notification shown: «PICT0127.JPG» y 3513 archivos más se se están subiendo a su nube personal.
En ell archivo ~/.cache/ubuntuone/log/syncdaemon.log podemos ver con más detalle el progreso de la sincronización

Ahora sí todo funciona como debería.

Espero que esto les sirva de algo si tienen problemas con su U1 en algún momento.

Hasta la próxima.

martes, 10 de enero de 2012

Instalar apache archiva en Jetty 7

Ya que logré instalar Jetty 7 en Ubuntu y que me gusta mucho trabajar con maven, es el momento de actualizar mi guía de como instalar archiva en Ubuntu, pero está vez, dentro de un Jetty 7 que ya está funcionando.

Antes de seguir debemos aclarar que [jetty.home] se refiere a el sitio donde está instalado el servidor o lo que sea que tengan configurado en la variable de entornor JETTY_HOME (generalemente definida en el archivo /etc/default/jetty), pueden consultar mi post anterior sobre instalar jetty para más detalles.

Lo pasos a seguir:
1. Configuramos jetty, sino lo está ya, para hacer la instalación en caliente usando ContextProvider, para esto necesitamos editar el archivo jetty.xml
sudo nano [jetty.home]/etc/jetty.xml
El siguiente ejemplo lo armé usando los distintos xml que vienen incluidos en la carpeta etc de jetty

Hay que detener y reiniciar jetty para que los cambios sean efectivos, usaré el modo de supervisión para monitorear que todo está bien con la configuración nueva.
sudo /etc/init.d/jetty stop
sudo /etc/init.d/jetty supervise

2. Descargamos el archivo war de apache archiva (sitio de descargas).
cd ~/Downloads
wget -c http://mirrors.sonic.net/apache//archiva/binaries/apache-archiva-1.3.5.war
Nota: al descargar recuerden comprobar el md5 del archivo war de archiva http://www.apache.org/dist/archiva/binaries/apache-archiva-1.3.5.war.md5, es una buena práctica y además por errores de la red tuve que volver a bajar el archivo de otro mirror. 

 3. Creamos un "deployment descriptor" en formato xml, pueden tomar como ejemplo el siguiente texto y ajustar lo que crean conveniente.

Pueden comparar este descriptor con el que se crea para tomcat 5.5 y 6, según la documentación de archiva: http://archiva.apache.org/docs/1.3.5/adminguide/webapp.html


4. Colocamos el archivo war en la carpeta [jetty.home]/webapps
sudo cp ~/Downloads/apache-archiva-1.3.5.war  [jetty.home]/webapps

5. Colocamos el "deployment descriptor" en la carpeta [jetty.home]/contexts
 sudo cp archiva-context.xml [jetty.home]/contexts

Usando la capacidad de jetty de hacer instalaciones en caliente (hot deployment), configurada en el primer paso, veremos nuestra aplicación funcionando de inmediato, si todo va bien.

Si modificamos el archivos de contexto jetty removerá y reinstalará la aplicación y si lo borramos jetty eliminará el contexto desinstalando la aplicación.

Solo nos queda probar que funciona ingresando en el navegador web a http://localhost/archiva

Finalmente les dejo este enlace, donde dan algunos detalles de lo que hace falta para que archiva funcione en jetty, puede que les resulte de ayuda.

Hasta la proxima.


domingo, 8 de enero de 2012

Cómo instalar jetty 7.x en Ubuntu

Después de mucho buscar por la red, logré encontrar por fin referencias sobre como instalar jetty 7 en Ubuntu, es bastante simple pero me parece que es buena idea dejar aquí guardados los pasos para el fúturo cuando me hagan falta y de paso si le son de ayuda a alguien más pues mejor.

Estoy basando me en este post, aunque voy a tocar algunos temas que Jawher no menciona.

Esta guía está hecha y probada en Ubuntu 11.10 (oneiric); en teoría debería funcionar también para la versión 11.04, tan pronto pueda lo verifico.

Si bien jetty (mas aquí) está disponible en los repositorios de oneiric la versión disponible es la 6 considerada madura y es algo vieja, por otra parte jetty 7 es considerado estable y jetty 8 beta (en desarrollo).

$ aptitude show jetty
Paquete: jetty                                  
Estado: sin instalar
Versión: 6.1.24-6
...

Los pasos a seguir para instalar son:
  • Descargar la versión que queremos usar:
    cd /usr/local/
    sudo wget -c http://dist.codehaus.org/jetty/jetty-hightide-7.5.4/jetty-hightide-7.5.4.v20111024.tar.gz
    sudo tar -xzvf jetty-hightide-7.5.4.v20111024.tar.gz
    sudo ln -s jetty-hightide-7.5.4.v20111024 jetty
    actualmente existe dos tipos de  distribuciones de jetty, la de eclipse y la de codehaus, pueden ver aquí para más detalles, yo usé la de codehaus versión 7.5.4.v20111024.
    Por comodidad descomprimí el tar.gz y cree un enlace a la carpeta llamado jetty, que es fácil de recordar.
  • Configuración:
    sudo touch /etc/default/jetty
    Según la documentación de jetty, si el archivo que acabamos de crear existe, es leído para determinar la configuración que el servidor va a usar. Entonces con nuestro editor preferido abrimos dicho archivo y agregamos cómo mínimo lo siguiente (por favor ajustar los valores a su gusto)
    NO_START=0
    #maquina virtual de java
    JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386
    #instalación de jetty
    JETTY_HOME=/usr/local/jetty
    #para escuchar a todas las interfaces (redes)
    JETTY_HOST=0.0.0.0
    #puerto a usar por jetty
    JETTY_PORT=80
  • Jetty como servicio:
    sudo cp /usr/local/jetty/bin/jetty.sh /etc/init.d/jetty
    sudo update-rc.d jetty defaults
    como mencioné en un post anterior el comando update-rc.d se puede usar para configurar un programa para que se ejecute de forma automática al inicio, justo lo que debe hacer un servicio.
Todo listo, ya solo nos queda ejecutar el servidor y lo podemos hacer de la siguiente forma:
sudo /etc/init.d/jetty start
Pueden ejecutar el comando sin ningún parámetro para que les muestre las opciones posibles, merece la pena resaltar supervise, que ejecuta jetty y muestra todos los mensajes en la consola, así podemos ver en pantalla si algo falla.
sudo /etc/init.d/jetty supervise
Consideraciones adicionales:
De acuerdo a los expertos, debemos tratar de tener java actualizado a la versión estable más reciente y eliminar las antiguas que no necesitamos, en general esto aplica para muchos programas, para instalar la openjdk 7 usamos el comando
sudo aptitude install openjdk-7-jdk openjdk-7-jre
Jetty es capaz de servir tanto contenido estático como aplicaciones, por lo que no necesitamos otro servidor extra, de ahí que lo puse directamente en el puerto 80, pero deben recordad de adiconal a establecer el valor de JETTY_HOST a 0.0.0.0 en el archivo /etc/default/jetty hay que asignar los permisos al firewall, por ejemplo usando ufw sería algo como lo siguiente:
sudo ufw allow 80
Saludos y será hasta la proxima.