Instalando Ruby(1.9.3) on Rails(3.2.2) en Ubuntu Server 11.10 (y de cómo solucioné los errores)

Son las 17:50. Empecé a las 13:20. ¡Lo hice!

Error con RoR y zlib

Error con RoR y zlib

ERROR: Loading command: install (LoadError)
cannot load such file -- zlib
ERROR: While executing gem ... (NameError)
uninitialized constant Gem::Commands::InstallCommand

En estas épocas del año, que me encuentro desarrollando en Ruby on Rails, me ha tocado montar otro servidor que utilizaremos en producción con un proyecto que tengo. Ha sido un largo trabajo. He tenido errores, pero los he solucionado (justo cuando estaba a punto de rendirme).

  1. He instalado un Ubuntu Server y he escogido los paquetes LAMP (para mis proyectos utilizaré Apache y MySQL con RoR).
  2. Instalamos el paquete que nos permitirá compilar y librerías de YAML:
    macool@shiriculapo.local:~$ sudo apt-get install build-essential libyaml-dev zlib1g-dev libreadline-dev libopenssl-ruby libssl-dev
  3. Descargamos el código fuente de Ruby (1.9.3):
    macool@shiriculapo.local:~$ wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p0.tar.gz
  4. Descomprimimos el paquete de código fuente que acabamos de descargar:
    macool@shiriculapo.local:~$ tar xzvf ruby-1.9.3-p0.tar.gz
    Nos cambiamos a la carpeta que acabamos de descomprimir:
    macool@shiriculapo.local:~$ cd ruby-1.9.3-p0
  5. Esta es la parte importante.Antes de realizar este paso, estuve toda la tarde probando un millón de posibles soluciones, incluyendo:
    • utilizar rvm de mil maneras
    • instalar miles de librerías relacionadas con zlib
    • instalar ruby, rubygems y rails desde el repositorio, con apt-get install ruby-full rubygems rails
    • compilar zlib manualmente y especificarlo al momento de configurar ruby para su compilación
    • otras

    No pierdan su tiempo, ni el mío. No hablaré acerca de ninguna de estas “soluciones”; no funcionan. Haremos algo más sencillo, que es lo que a mi me resultó.
    Descomentaremos una línea en la que ruby (por defecto) ignora zlib. Yo soy un fan de GNU, y utilizaré nano(un editor de texto de terminal), pero ustedes pueden utilizar cualquier editor:
    macool@shiriculapo.local:~/ruby-1.9.3-p0$ nano ext/Setup
    Aquí, vamos a la última línea y descomentamos zlib, como en la imagen:

    descomentando zlib

    descomentando zlib

    En nano, cierro el archivo con CTRL+X (y lo guardo)

  6. Configuramos las librerías que ruby necesita para que coincidan con las de nuestro servidor:
    macool@shiriculapo.local:~/ruby-1.9.3-p0$ ./configure
    Una vez configurado, compilamos ruby:
    macool@shiriculapo.local:~/ruby-1.9.3-p0$ sudo make
    … E instalamos ruby:
    macool@shiriculapo.local:~/ruby-1.9.3-p0$ sudo make install
    En este punto, ruby ya debe estar instalado:

    ruby -v

    ruby -v (versión de ruby)

  7. Esta es la otra parte importante. Instalamos zlib. Nos cambiamos a la carpeta ext/zlib dentro del código fuente de ruby:
    macool@shiriculapo.local:~/ruby-1.9.3-p0$ cd ext/zlib/
    Configuramos las librerías de zlib:
    macool@shiriculapo.local:~/ruby-1.9.3-p0/ext/zlib$ ruby extconf.rb
    Compilamos zlib:
    macool@shiriculapo.local:~/ruby-1.9.3-p0/ext/zlib$ make
    Instalamos zlib:
    macool@shiriculapo.local:~/ruby-1.9.3-p0/ext/zlib$ sudo make install
  8. Ahora, vamos por rubygems. Salimos de la carpeta de ruby:
    macool@shiriculapo.local:~/ruby-1.9.3-p0$ cd ..
    Descargamos el código fuente al servidor:
    macool@shiriculapo.local:~$ wget http://production.cf.rubygems.org/rubygems/rubygems-1.8.21.tgz
    Descomprimimos el código fuente de rubygems (que acabamos de descargar):
    macool@shiriculapo.local:~$ tar xzvf rubygems-1.8.21.tgz
    Nos cambiamos a la carpeta del código fuente de rubygems:
    macool@shiriculapo.local:~$ cd rubygems-1.8.21
  9. Instalamos rubygems:
    macool@shiriculapo.local:~/rubygems-1.8.21$ sudo ruby setup.rb
    Salimos de la carpeta de rubygems:
    macool@shiriculapo.local:~/rubygems-1.8.21$ cd ..
    rubygems debe estar instalado:

    gem -v

    gem -v (versión de rubygems)

    En este punto, ya podemos eliminar todo lo que acabamos de descargar; no nos servirá para nada más

  10. Instalamos rails (con rubygems, se deberían instalar todas sus dependencias):
    macool@shiriculapo.local:~$ sudo gem install rails

    rails -v

    rails -v (versión de rails)

Eso es todo :)

Instalando OpenERP 6

Bueno, hablaremos un poco de nuestra última experiencia, instalando OpenERP 6 en Ubuntu Server 10.10, y coloco un par de scripts muy útiles para ejecutar OpenERP Server y Web como servicios del sistema.

En la instalación de Ubuntu Server, se puede elegir la instalación de ciertos paquetes:


Ubuntu Server. Selección de Software a instalar



Esta vez, elegí los paquetes:

  • LAMP server (Para dar una buena bienvenida a los visitantes, con Apache).
  • OpenSSH server (Para administrar el servidor remotamente).
  • PostgreSQL database (Postgres es la base de datos que usa OpenERP).

Bueno, no necesitamos más paquetes de momento. Una vez instalado el Ubuntu Server 10.10, debemos descargar los sources, desde http://www.openerp.com/downloads. Una vez descargados, a instalar dependencias. Como lo dice un archivo de texto dentro del paquete de OpenERP server, las dependencias necesarias para instalar el mismo son:

  • Python (Viene con Ubuntu Server 10.10)
  • Postgresql (Lo instalé antes, con el instalador de Ubuntu Server)
  • Psycopg2 (Módulo de python)
  • Reportlab (Librería de python para generar PDFs)
  • Lxml (Módulo de python)
  • Pytz (Módulo de python)
  • PyYaml (Módulo de Python)
  • Vobject (Módulo de Python)

Además, estos paquetes (No aparecen en el archivo que viene en los sources de OpenERP Server, pero sirven para compilar y satisfacer ciertas dependencias en el OpenERP Server y el Web Server):

  • build-essential
  • python-setuptools
  • python-profiler
  • python-pastedeploy

En Ubuntu y otras distribuciones basadas en Debian, es posible instalarlo todo con las siguientes líneas:
$ sudo apt-get install -y postgresql graphviz python-psycopg2 python-lxml python-tz python-imaging python-pychart python-egenix-mxdatetime build-essential python-setuptools python-profiler python-pastedeploy python-vobject
$ sudo easy_install PyYaml

Nota: Una vez instalado, me pidió la librería PyWebDAV. En lugar de descargarla de ese link, la hallé en los repositorios de Ubuntu.

Una vez instalados dichos paquetes, sólo hace falta desempaquetar los sources, y basta con un:
$ tar xzf openerp-web-6.0.1
$ tar xzf openerp-server-6.0.1

Ahora, a cambiarnos a las carpetas que acabamos de crear desempaquetando y a instalar, así:

  • Server:
    $ cd openerp-server-6.0.1$sudo python setup.py install
  • Web (He notado que busca e instala por si misma las dependencias):
    $ cd openerp-web-6.0.1$ sudo python setup.py install

Listo. En este punto, ya deben estar instalados el servidor y el cliente web. Ahora, creemos un usuario para la base de datos:

  • Nos cambiamos al super usuario postgres:
    $ sudo -i
    # su postgres
  • Creamos el usuario openerp, que será el usuario de la base de datos postgres:
    $ createuser -d -R -S -P openerp

Ahora, los scripts para arrancar OpenERP Server y Web cuando Ubuntu arranque:

  • Script para OpenERP Server. Borrar su extensión *.txt y colocar en /etc/init.d. (Ha sido modificado para que no muestre las bases de datos; así se mantiene confidencialidad entre bases de datos y mejora la seguridad; el usuario tiene que ingresar manualmente el nombre de la base de datos en lugar de seleccionarla de una lista).
  • OpenERP Web. Borrar su extensión *.txt y colocar en /etc/init.d.
  • Configuración para el servicio web. Borrar su extensión *.txt y colocar en /etc

Ahora, decirle a Linux que ya tiene los scripts:
$ sudo update-rc.d openerp-web defaults
$ sudo update-rc.d openerp-server defaults
Ya está todo listo, podemos usar los scripts de la siguiente manera:
$ sudo /etc/init.d/openerp-server start
$ sudo /etc/init.d/openerp-web start

En lugar de start, se puede usar stop y restart para detener y reiniciar los servicios.

Ya tenemos OpenERP Web corriendo en el puerto 8080! No hace falta más que abrir un navegador, colocar la Ip del equipo que corre los servicios seguido del puerto 8080:

Ventana de acceso de OpenERP 6

PSeInt en Linux

Un pequeño tutorial, para ejecutar PSeInt (Link al post anterior), en Linux.
Para éste(link al link de descarga) paquete (PSeInt.tar.gz), haremos en consola:

  • Nos cambiamos al directorio donde hayamos descargado el paquete (En caso de no estar dentro de la carpeta personal, en descargas, cambiar “Descargas” por el directorio donde se encuentra el paquete):
    ~ $ cd Descargas
  • Descomprimimos el paquete PSeInt.tar.gz(Esto descomprimirá el paquete con los ejecutables y los videos en el directorio actual):
    ~ $ tar -xf PSeInt.tar.gz
  • Ahora, a descomprimir el paquete de los ejecutables; pseint-l6-20090421.tgz:
    ~ $ tar -xf pseint-l6-20090421.tgz
  • Nos cambiamos al directorio donde se encuentran los ejecutables que acabamos de extraer:
    ~ $ cd pseint
  • A darle permisos de ejecución al archivo ejecutable wxPSeInt:
    ~ $ chmod +x wxPSeInt
  • Ejecutemos el wxPSeInt(Ejecutable del programa con interfaz gráfica):
    ~ $ ./wxPSeInt

Listo, tenemos el PSeInt funcionando con interfaz gráfica en nuestro Linux. Pero hagamos un script ejecutable en nuestro escritorio para abrirlo con un click:

  • Abrimos un editor de texto cualquiera (yo prefiero gedit) en el escritorio:
    ~ $ cd Escritorio; gedit
  • Dento del editor de texto, colocamos lo siguiente (Este es el script que se cambiará a al directorio donde está PSeInt y a continuación lo ejecutará):
    !# /bin/bash
    cd Descargas/pseint
    ./wxPSeInt

    Esto en caso de llamarse la carpeta pseint, como en este tutorial; y estar alojada dentro de “Descargas” en la carpeta personal. En caso de no ser así, modificar la segunda línea por el directorio donde se encuentran los ejecutables de PSeInt.
    Una vez terminado, guardar el documento (en mi caso como pseint en el escritorio y cerrar gedit. No hace falta que indiquemos una extensión para el archivo.
  • De nuevo en consola, le damos permisos de ejecución al archivo que acabamos de crear (si su archivo no se llama “pseint”, reemplazar por el nombre de su archivo:
    ~ $ chmod +x pseint

Listo, ahora podemos ejecutar PSeInt con su interfaz gráfica desde el escritorio con un simple “doble click”

Aprendiendo a programar; PSeInt

Esta vez hablaremos de una herramienta, llamada PSeInt, que ayudará a muchos nuevos en el mundo de la programación. A mi parecer, es la manera más rápida y sencilla para aprender a programar. Una de las ventajas es que esta herramienta interpreta el código fuente escrito en pseudocódigo (Mezcla de español y el orden de un lenguaje de programación; realmente fácil de entender para alguien que habla español; y no conoce ningún lenguaje de programación); es decir el lenguaje de programación que utiliza PSeInt es pseudocódigo; español; muy interesante. Incluso existe una opción denominada “paso a paso”, en donde el programa se ejecuta ‘paso a paso’, pudiendo así indicar al programador en donde hay un error de sintaxis, en caso de haberlo.

"Hola mundo!" en PSeInt

Además se puede exportar el código fuente a *.cpp (Extensión de código fuente de C++. Es decir, es posible escribir un programa en pseudocódigo y dejar que PSeInt lo traduzca a código fuente de C++. No hay necesidad de compilar ni de guardar antes de ejecutar el programa recién escrito.

Ejemplo de programa en PSeInt

Como si fuera poco (ésta me ha gustado mucho), nos permite ver un gráfico con el diagrama de flujo del código fuente del programa.

Flujograma creado por PSeInt

Se puede descargar PSeInt desde su página oficial, pero colgaré un enlace para bajarlo desde mi cuenta de Dropbox; la ventaja? Agrego dos videos además del programa, que ayudarán a familiarizarse con PSeInt (Espero no violar (muchos) derechos).
Enlaces:

  • PSeInt (página oficial)
  • PSeInt ( +2 videos; instalador para windows)
  • PSeInt ( +2 videos; paquete ejecutable para Linux; no necesita instalarse. Simplemente descomprimir y ejecutar)

Tal vez te interese ver un tutorial para ejecutar PSeInt con interfaz gráfica en Linux.