12 marzo 2010

Java + Scala

Creo que una de las ventajas de Scala es la facilidad de mezclar código Scala con código Java, haciendo mucho más fácil el desarrollo.
Para empezar, hay que instalar Scala:
sudo aptitude install scala

Luego hay que instalar el plugin de Eclipse (o tu ide preferida). El update site es:
http://www.scala-lang.org/scala-eclipse-plugin

Si estamos trabajando con un proyecto Java, le hacemos click derecho sobre el proyecto y vamos a la opción
Scala -> Add Scala Nature

Ahora podemos crear una clase Scala (o un objeto que viene a ser un Singleton) y referenciarlo desde nuestras clases Java. El único problema que vi es que desde la clase java, si referencio a un método de Scala, me aparece un error de compilación, pero creo que esto se debe al orden de compilación. Primero se compila el código Java y luego el Scala (es como el huevo y la gallina, uno de los dos tiene que ir primero).

Desde Scala invocando código Java no tengo ese problema. Igualmente si ejecuto, andan ambas invocaciones, hacia un lado y hacia el otro.



El eclipse que usé es el eclipse-SDK-3.5 para linux

23 noviembre 2009

Grails and Vaadin

Vaadin es un exelente framework para hacer aplicaciones web, a mi particularmente me gustó porque tiene una forma de programar muy similar a Swing. Me encontré con algunos inconvenientes para dejarlo funcionando, así que aquí voy a documentar un poco mi experiencia:

Después de pelearme un poco para integrar grails con vaadin, decidí empezar por un ejemplo simple con Vaadin: http://vaadin.com/tutorial
Aquí empezaron los problemas, pero también pude encontrar las soluciones. En primer lugar, en el ejemplo (http://dev.vaadin.com/svn/incubator/SimpleAddressBook) se ve que en el web.xml el servlet-mapping define la url como /* y esto es muy importante para que funcione la aplicación. Yo traté de cambiarlo por /HelloWorld y no funcionaba... Pero encontré la solución (si bien todavía no se el porqué real).
El url pattern debe terminar con /*, es decir, para lo que quería hacer debería quedar como /HelloWorld/* y además hay que agregar un mapping al mismo servlet que mapee /VAADIN/*. Dicho esto, la parte del web.xml que define los servlets mappings quedaría:
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld/*</url-pattern>
</servlet-mapping>
<!-- this is needed to work with vaadin -->
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/VAADIN/*</url-pattern>
</servlet-mapping>

Ahora si, de vuelta a grails... creé una aplicación:
grails create-app test
Luego para poder editar el web.xml (que por defecto no aparece en la aplicación):
grails install-templates
Luego edité el web.xml como en el ejemplo.
Agregué el jar de vaadin a la carpeta lib
Agregué el código de mi aplicación vaadin en src/java

Todo parecía que iba a marchar bien, pero luego de ejecutar grails run-app y al acceder a la aplicación de ejemplo, ocurría un error al tratar de cargar la clase que yo había agregado al src/java. Sin entender por qué, compilé mi aplicación en un jar y lo agregué en la carpeta lib... Y ahora si estaba funcionando!
Luego hice lo siguiente: borré el jar que había creado y generé el war de la aplicación con grails war y esta vez si me compiló la clase que había agregado y pude deployar el war en un tomcat 6 y vi funcionando la aplicación.
Otra opción que encontré que funciona es ejecutar grails run-war en vez de grails run-app. Esto también compila la carpeta src y anda.

En resumidas cuentas, parece que al ejecutar run-app no se compilan los fuentes que están en src/java. Todavía no pude encontrar una explicación o motivo... seguramente alguna configuración que no modifiqué...

Todavía queda pendiente ver como acceder los scaffolding de grails desde vaadin y obtener en poco tiempo una aplicación con una linda interfaz y generada rápidamente con grails

02 septiembre 2009

Gestión de tareas o incidentes con trac y eclipse

Algo que no me gusta de usar trac, bugzilla, mantis u otro sistema de gestión de incidentes es que todos tienen interfaz web, y eso implica loguearse, navegar hasta un incidente y recién entonces editarlo. Muchas veces encontrar el incidente implica realizar muchas veces este proceso. Por estos motivos en general siempre veo que los incidentes terminan siendo monitoreados por los Project Leaders o alguna otra persona que termina invirtiendo su tiempo en averiguar el estado de las tareas e irlo actualizando. Es así que seguí buscando hasta dar con una combinación que me gustó: Mylyn + Trac.

Hace tiempo había escuchado de Mylyn para eclipse, pero nunca había podido probarlo ni tampoco había encontrado mucha documentación. Ahora conseguí hacerlo funcionar con el Trac. Es un proceso muy sencillo y hace que uno se sienta a gusto con su uso.

Lo primero es tener instalado el eclipse (yo tengo la versión 3.4 del eclipse classic) y un trac (http://trac.edgewall.org). Los pasos para instalar el plugin de eclipse son:
  1. Ir a actualizaciones (help -> software updates...)
  2. Ir a Available software
  3. Add site
  4. Agregar: http://download.eclipse.org/tools/mylyn/update/e3.4 y http://download.eclipse.org/tools/mylyn/update/extras (verificar que lo agregue a la lista de Available software, si no, es posible que haya que marcarlo en Manage sites)
  5. Buscar y marcar Mylyn connector: Trac
  6. Install
  7. Si no tenían instalado Mylyn, les va a instalar también las dependencias
Luego de esto habrá que reiniciar el eclipse. La lista de tareas de mylyn hay que habilitarla:
  • window -> show view -> other...
  • Tasks -> task list
La lista de tareas es muy fácil de usar, pero lo que quiero aclarar es como conectarse con trac, y para esto lo primero es agregar un "Task repository" (buscar entre las acciones de la lista de tareas). Seleccionar trac y seguir las instrucciones. Si buscan entre las opciones avanzadas se puede configurar un proxy (es útil si hay que conectarse a una vpn, pero ese es otro asunto). Prueben primero validar la conexión, y si hicieron las cosas bien, ya tendrían disponible sus tareas.

Ahora sólo falta un paso más, que es definir una Query para obtener las tareas. Ahí pueden definir con qué criterios obtener las tareas (por defecto no van a ver ninguna). Se pueden definir tantos queries como sean necesarios. Y eso es todo. Ahora si pueden gestionar sus tareas de trac desde eclipse. Y realmente ahorra mucho tiempo.

Quizás después explique un poco mi experiencia usando la herramienta, pero por ahora sólo publico la guía del usuario que está fácil de seguir y con imágenes: http://wiki.eclipse.org/index.php/Mylyn/User_Guide

09 diciembre 2008

Dual screen

Bueno, algo que pensé que era dificil lo tengo funcionando, el comando que me funcionó fue este:
sudo aticonfig --initial=dual-head --screen-layout=right --resolution=0,1680x1050 --mode2=1280x800 -v
Probé otras cosas y después tuve que retocar el archivo /etc/X11/xorg.conf a mano porque hubo algunas cosas que no las podía cambiar una vez configuradas (mal, por error mío) con el aticonfig.
Por suerte cada comando aticonfig genera un backup, así que se puede probar sin riesgo.
Otro detalle más: La resolución me quedó igual en ambos monitores (1280x800), así que tuve que cambiar el de más resolución a mano desde el menú de sistema de Ubuntu
Una página que me sirvió de envión: http://www.xaprb.com/blog/2007/08/10/how-to-set-up-dual-monitors-in-ubuntu-on-dell-inspiron-1501
Y algunos comentarios en: http://www.ubuntu1501.com/2008/03/ubuntu-hardy-heron-804.html

03 julio 2008

Host virtuales para symfony (falta pulir un poco)

Crear un Virtual Host para Symfony.
Para esto hay que tener habilitado mod_rewrite: en Ubuntu hay que crear un link simbólico de /etc/apache2/mods-available/rewrite.load a /etc/apache2/mods-enabled/rewrite.load
El código de mi vhost en /etc/apache2/sites-enabled y también debe estar en /etc/apache2/sites-available (ambos pueden ser links simbólicos a un archivo en otro lado)
NameVirtualHost symfony:80

<virtualhost symfony:80>
ServerAdmin admin@localhost
ServerName symfony
DocumentRoot /home/user/symfony/

Alias /web/sf /usr/share/php5/symfony/data/web/sf  
<Directory "/usr/share/php5/symfony/data/web">
AllowOverride All
Options FollowSymLinks +Indexes
Order allow,deny
Allow from all
</Directory>

<Directory /home/user/symfony/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog /var/log/apache2/errorSymfony.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

CustomLog /var/log/apache2/access.log combined
ServerSignature On
</virtualhost>
Lo importante son los AllowOverride All

02 julio 2008

Actualización de Symfony a 1.1

Bueno, con la actualización de symfony a 1.1 tuve algunos inconvenientes, pero nada que no se pueda solucionar leyendo el manual:
http://www.symfony.es/documentacion/actualizacion-de-symfony-10-a-symfony-11/

Vi que hay varios cambios, por lo que recomendaría a cualquiera que tenga un proyecto funcionando de hace tiempo, que tome precauciones antes de actualizar.
Lástima que ahora sólo funciona para php 5.1 o superiores, pero por suerte no voy a tener problema con mis proyectos, ya que hace rato que uso la versión 5 de php.

Yo apuesto por Symfony

Después de varios golpes con Java, demasiadas cosas para leer y aprender, muchas líneas de configuración, llegué a la decisión de que no vale la pena usar y escribir tanto código cuando la funcionalidad del sistema no lo requiere. Al final es como dice la frase: "En Java lo difícil es posible y lo fácil es difícil". Así que para lo fácil, opté por Symfony, donde lo fácil es fácil y lo relativamente complejo también es fácil.
Para empezar:
Mi sistema: Ubuntu 8.04
Requerimientos previos:
sudo apt-get install php5 apache2 libapache2-mod-php5 mysql-server php-pear
Instalar symfony:
pear channel-discover pear.symfony-project.com
pear install symfony/symfony
Autocompletar para bash: Crear el archivo /etc/bash_completion.d/symfony con este contenido:
_symfony()
{
local cur prev action
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
prev=${COMP_WORDS[COMP_CWORD-1]}
action=${COMP_WORDS[1]}

case "$prev" in
"init-module"|"propel-generate-crud"|"propel-init-crud"|"propel-init-admin"|"generate:module"|"propel:generate-crud"|"propel:init-admin")
COMPREPLY=( $( compgen -W "$( ls -1 apps 2>/dev/null | sed -e 's/ /\\ /g' | sed -e 's/\/$//g' )" -- $cur ) )

return 0
;;

"init-project"|"generate:project")
COMPREPLY=( $( compgen -W "$( pwd | perl -pe "s/^.*?([^\/]+)$/\$1/g" )" -- $cur ) )

return 0
;;

"init-app"|"generate:app")
COMPREPLY=( $( compgen -W "frontend backend" -- $cur ) )

return 0
;;

"sync")
if (($COMP_CWORD == 3)); then
COMPREPLY=( $( compgen -W 'go' -- $cur))
fi

return 0
;;

*symfony)
SYMFONY_VERSION=$( $prev -V | sed 's/^symfony version //g' | awk -F '.' '{print $1 "." $2;}' )

case "$SYMFONY_VERSION" in
0.*)
# Versions less than 1.0 are not supported.
COMPREPLY=()
;;

"1.0")
COMPREPLY=( $( compgen -W "$( $prev -T | awk '/^ /' | cut -d ' ' -f 3 )" -- $cur ) )
;;

*)
COMPREPLY=( $( compgen -W "$(
NAMESPACE=''
OLD_IFS=$IFS

IFS=$'\n'
for line in $( $prev -T ); do
if [ $line != 'Available tasks:' ]; then
if [ ${line:0:2} == ' ' ]; then
TASK=$(echo $line | awk -F ':' '{print $2;}' | cut -d ' ' -f 1)
if [ -z $NAMESPACE ]; then
echo $TASK
else
echo $NAMESPACE:$TASK
fi
else
NAMESPACE=$line
fi
fi
done

IFS=$OLD_IFS
)" -- $cur ) )

# Work-around bash_completion issue where bash interprets a colon as a separator.
# Work-around borrowed from the darcs work-around for the same issue.
local colonprefixes=${cur%"${cur##*:}"}
local i=${#COMPREPLY[*]}
while [ $((--i)) -ge 0 ]; do
COMPREPLY[$i]=${COMPREPLY[$i]#"$colonprefixes"}
done
;;
esac

return 0
;;

*)
case "$action" in
"propel-generate-crud"|"propel-init-crud"|"propel-init-admin"|"propel:generate-crud"|"propel:init-admin")
if (($COMP_CWORD == 3)); then
COMPREPLY=( $( compgen -W "$( find lib/model -maxdepth 1 -name '*.php' -exec basename '{}' '.php' ';' | grep -v 'Peer$' | tr [:upper:] [:lower:] )" -- $cur ) )
elif (($COMP_CWORD == 4)); then
COMPREPLY=( $( compgen -W "$( find lib/model -maxdepth 1 -name '*.php' -exec basename '{}' '.php' ';' | grep -v 'Peer$' )" -- $cur ) )
fi

return 0
;;
esac

return 0
;;
esac

return 0
}

complete -F _symfony symfony
Para desarrollar con Eclipse:
Symfoclipse