14 Dec 2011

Creación de un proyecto Lift con SBT e IntelliJ Idea Community Edition (usando Git o Mercurial)

Voy a tratar de escribir un pequeño instructivo de como iniciar y poner a punto un proyecto Liftweb usando sbt e IntelliJ Idea, usando postgres como DBMS y Squeryl Record como ORM.

Lo primero que debemos hacer es bajarnos la última versión de Liftweb 2.4-M5 una vez descargada, procedemos a descompromirla y veremos que existen 2 carpetas: scala_28 y scala_29 que son las que contienen las distintas variantes de proyectos base con las que podemos iniciar un proyecto nuevo según la versión de Scala que queramos usar, scala_28 para Scala 2.8 y scala_29 para Scala 2.9. En este caso vamos a usar Scala 2.9 asi que ingresamos a la carpeta scala_29.

Dentro de la carpeta scala_29, tenemos nuevamente varias carpetas:

  • lift_basic: contiene una clase User, y algunas hojas de estilo, y html5
  • lift_blank: es un proyecto vacio, contiene lo esencial, nada de hojas de estilo ni html(a parte del index y los templates base de lift)
  • lift_mvc: es para aquellos que quieren usar el patrón MVC en lugar de View First
  • lift_xhtml: igual que lift_basic solo que este usa xhtml

En nuestro caso crearemos un proyecto usando lift_blank.

  1. Creamos un directorio para nuestro proyecto(en este caso liftidea):
  2. Copiamos los archivos de la carpeta lift_blank a nuestro nuevo proyecto
  3. Iniciamos el nuevo repositorio con hg init o git init segun sea la herramienta que queramos usar, en este caso vamos a usar mercurial(hg).
  4. Y agregamos los archivos al proyecto con hg add
  5. Hacemos un commit a nuestro repositorio local con hg commit -u usuario -m "Commit inicial"


 j2@luthien:~$ mkdir liftidea
 j2@luthien:~$ cp -r lift/scala_29/lift_blank/* liftidea/
 j2@luthien:~$ cd liftidea/
 j2@luthien:~$ hg init
 j2@luthien:~$ hg add
 j2@luthien:~$ hg commit -u usuario -m "Commit inicial"

Seguidamente creamos un archivo .hgignore con el siguiente contenido:



# use glob syntax.
syntax: glob
*.ser
 *.class
 *~
 *.bak
 *.off
 *.old
 .DS_Store
 project/boot/*
 project/plugins/lib_managed/*
 project/plugins/project/*
 project/plugins/src_managed/*
 project/plugins/target/*
 
 # logs
 derby.log
 
 # eclipse conf file
 .settings
 .classpath
 .project
 .manager
 
 # building
 target
 build
 null
 tmp*
 dist
 test-output
 
 # sbt
 target
 lib_managed
 src_managed
 */project/boot
 */*/project/boot
 
 # db
 lift_proto*
 
 # other scm
 .svn
 .CVS
 .hg*
 
 # switch to regexp syntax.
 #  syntax: regexp
 #  ^\.pc/
 
 # IntelliJ
 *.iml
 *.ipr
 *.iws
 .idea
 
 # Pax Runner (for easy OSGi launching) runner 
 

Posteriormente debemos editar el archivo project/build/LiftProject.scala, primero hacemos que la clase del proyecto herede de IdeaProject, esto lo hacemos poniendo with IdeaProject  justo después de extends DefaultWebProject(info) y antecitos del { , posteriormente agregamos las siguientes lineas justo despues de la linea que dice lazy val JavaNet...:

val lift_postgresql = "postgresql" % "postgresql" % "8.4-701.jdbc4"

override def managedStyle = ManagedStyle.Maven

override def jettyWebappPath = webappPath

override def scanDirectories = Nil

Las tres últimas lineas son importantes porque permiten que cuando ejecutemos el proyecto desde sbt, los cambios a los archivos estáticos:html, css, js, imágenes sean reflejados en la aplicación que se ejecuta sin tener que reiniciar la ejecución de la aplicación(con lo que solo será necesario reiniciar la aplicación cuando cambiemos cosas en el código Scala). En el mismo archivo dentro del método libraryDependencies justo despues de la línea:

  


"net.liftweb" %% "lift-webkit" % liftVersion.value.toString % "compile",

Agregamos:

"net.liftweb" %% "lift-record" % liftVersion.value.toString % "compile",
"net.liftweb" %% "lift-squeryl-record" % liftVersion.value.toString % "compile",


A continuación creamos un archivo llamado Plugins.scala dentro de project/plugins, que nos sirve para poder generar un archivo de configuración para Idea a partir de nuestro proyecto sbt, el contenido del archivo es el que sigue:



import sbt._
class Plugins(info: ProjectInfo) extends PluginDefinition(info) {
  val sbtIdeaRepo = "sbt-idea-repo" at "http://mpeltonen.github.com/maven/"
  val sbtIdea = "com.github.mpeltonen" % "sbt-idea-plugin" % "0.4.0"
}


El siguiente archivo a editar(aunque no es necesario, me imagino que la mayoria lo hará) es: project/build.properties, este archivo contiene el nombre de la organización a la que pertence el proyecto, el nombre del proyecto, la versión del proyecto y otros datos relativos a Sbt, Lift y Scala.

Una vez editados todos estos archivos, procedemos a ejecutar sbt, hacer un update y crear los archivos de configuración para IntelliJ Ide con el comando idea dentro de la consolta sbt:

 j2@luthien:~/liftidea$ ./sbt


...


> update


...


> idea


Esto genera un archivo .iml dentro de la carpeta raiz del proyecto, con este archivo generado ejecutamos Idea, una vez en Idea nos vamos a File > Open project, y seleccionamos la carpeta donde creamos nuestro proyecto(se puede ver que esa carpeta sale con el loguito de IntelliJ Idea), va a tardar un poco en importar el proyecto.(Nota: deben tener instalados  los plugins de sbt y scala para IntelliJ Idea antes de importar el proyecto). Debido a que estamos usando la versión Comunnity Idea de IntelliJ va a salir un mensaje que dice Error Loading Project, Cannot load facet.., hacemos click en details, y le damos click a yes(esto eliminara este facet del proyecto).

Lo siguiente que necesitamos es configurar o crear una configuración de ejecución de Idea para eso nos vamos a: Run > Edit configurations, hacemos click en el + -Add New Configuration (Insertar)-, selecionamos Scala console, le asignamos un nombre(name), tickeamos Run Sbt Action, hacemos click en los puntos suspensivos, y escribimos jetty dentro de la caja de texto que aparece, hacemos nuevamente click en Ok, click en Apply, click en Ok.

Una vez se cierre el dialogo de configuración, para ejecutar la aplicación hacemos click en la flechita verde (Run) o presionamos Mayúsculas + F10, podemos ver que abajo en las consolas inferiores la pestaña que dice Sbt empieza a mostrar algo, una vez muestre:

[info] Waiting... (press any key to interrupt)

Significa que todo esta bien, en caso contrario en algo nos hemos equivocado :p, si todo esta bien vamos al navegador y escribimos http://localhost:8080, y veremos ya la aplicacion Lift ejecutandose, claro bien feita pues no tiene nada :p todavia.

PD: las lineas del archivo .hgignore no deben tener espacios delante, si no no ignorara los archivos temporales o que no tienen nada que ver con el proyecto en si.

Notas extra de aclaracion:

  1. El proyecto no posee los templates html (default.html) adecuados para trabajar con html5, por lo que hay que cambiar a uso de selectores css los binds de este archivo y agregar el soporte de html5 en el archivo Boot.scala

 

 

 

 

 

 

 

 

 

 

 

 

29 Nov 2011

Costumbres graciosas de la gente en Cochabamba

Recien hoy me doy cuenta, de que muchas veces las personas cuando saludan a otra persona que conocen pero que no es cercana o cotidiana, lo hacen usando frases como: Como estas?, Que cuentas?, pero no se detienen a hablar o realmente no les interesa la respuesta, pues una vez terminan de decir la frase pasan de largo(me incluyo),  es bastante extrano. No se como es en otros paises, no recuerdo algo similar en Holanda o Chile.

8 Sep 2011

Primer post!

Creo que debe ser como la décima vez que trato de iniciar un blog, espero que esta vez si lo mantenga :p.

Basicamente los temas que se van a tratar son temas relacionados al Desarrollo de Software, Software Libre,  Programación Funcional, Scala, Lift, Haskell y alguna que otra vez sobre acontecimientos, lugares relativos a mi país(Bolivia).

El siguiente artículo, será sobre el primer capítulo del libro: Desarrollo de aplicaciones web, de la Maestría de Software Libre de la UOC, ojo no estoy cursando la maestría, pero el material me parece bastante bueno, aunque extenso, asi que en general voy a tratar de hacer unos resumenes más concisos.

Ah!, el título del blog es provisional :p