sábado, 4 de octubre de 2014

Perl: POO con Moose, paso de parámetros

En perl todos los objetos son una referencia. Es decir, cuando tenes un $obj es una variable scalar que simplemente mantiene la referencia al objeto.

Ejemplo de paso de objetos

#This is perl 5, version 14, subversion 2 (v5.14.2)
#File: Example.pm
package Example;

    use Moose;
    use strict;
    use warnings;
    #use namespace::autoclean;

    has 'c' => (
                is         => 'rw', #Lectura-Escritura
                isa        => 'Maybe[Str]', #Tipo String
                reader => 'getValor', #getter
                writer => 'setValor', #setter
    );  

sub metodo1{
  my ($self) = @_;

  my $obj = Example->new(obj=>"Primer valor.");
  #$obj = $self->metodo2($obj);
  $self->metodo2($obj);
  print $obj->getValor() . "\n";#Modificado
  return;
}

sub metodo2{
  my ($self, $obj) = @_;

  $obj->setValor("Modificado..."); #usa el objeto pasado como argumento
  return $obj;
}

no Moose;
__PACKAGE__->meta->make_immutable; #no voy a cambiar mi clase
1;

#test_example.pl
#Main.......................................................................
#!/usr/bin/perl
#use strict;
use warnings;

use Example;

my $ex = Example->new();
print $ex->metodo1();
print "\n";
#...........................................................................end

Resultado:
~/examples$ perl test_example.pl
Modificado...


miércoles, 1 de octubre de 2014

Perl: HTML y UTF8 encoding

HTML y UTF8 encoding

Ejemplo de utf8 encoding:

#This is perl 5, version 14, subversion 2 (v5.14.2)
#File: ExampleEncoder.pm
package ExampleEncoder;

    use Moose;
    use strict;
    use warnings;
    #use namespace::autoclean;
    use HTML::Entities;
    use Encode::Encoder;
 
sub encodeHTMLtoUTF8{
  my ($self, $parametro) = @_;

  my $s = HTML::Entities::decode($parametro);
  $s = Encode::Encoder::encoder($s)->utf8;

  return $s;
}

no Moose;
__PACKAGE__->meta->make_immutable; #no voy a cambiar mi clase
1;

#!/usr/bin/perl
#use strict;
use warnings;
use ExampleEncoder;

my $ex = Example->new();
my $str = "Córdoba";
print $ex->encodeHTMLtoUTF8($str);



domingo, 28 de septiembre de 2014

Perl: POO con Moose, Herencia

Herencia con Moose

Uso de herencia en Programación Orientada a Objetos con Perl Moose (perl 5).


1) Herencia simple (INHERITANCE)

#This is perl 5, version 14, subversion 2 (v5.14.2)
#File: Person.pm
package Person; #Super-Class: Es la super-clase

    use Moose;
    use strict; #Obliga a la programación segura y definición de variables
    use warnings; #Ayudará a encontrar errores de sintaxis
    use namespace::autoclean;

    has 'name' => (
                is         => 'rw',
  isa        => 'Str',
                reader => 'getName',
                writer => 'setName',
    );

no Moose;
__PACKAGE__->meta->make_immutable; #no voy a cambiar mi clase
1;

#File: Developer.pm
package Developer;

    use Moose;
    use strict; #Obliga a la programación segura y definición de variables
    use warnings; #Ayudará a encontrar errores de sintaxis
    use namespace::autoclean;

    extends 'Person'; #SUBCLASSING, hereda de Person

    has 'skill' => (
                is         => 'rw',
               isa        => 'Str',
                reader => 'getSkill',
                writer => 'setSkill',
    );
 
no Moose;
__PACKAGE__->meta->make_immutable; #no voy a cambiar mi clase
1;

#.............................................................................................................................
#File: script_subclassing.pl
#!/usr/bin/perl
use strict;
use warnings;
use Moose;
use Developer; #Nuestra clase

my $instancia = Developer->new(name=>'Daro',skill=>'Perl developer');
print "Nombre: " . $instancia->getName() . "\n"; #return 'Daro'
print "Skill: " . $instancia->getSkill() . "\n"; #return 'Perl developer'
#..........................................................................................................................end


2) Herencia Múltiple (multiple inheritance)


#File: WriterMonkey.pm
package WriterMonkey;

    use Moose;
    use strict;
    use warnings;
    use namespace::autoclean;
 
    has 'keyBySeconds' => (
                is         => 'rw',
  isa        => 'Int',
                reader => 'getKeyBySeconds',
                writer => 'setKeyBySeconds',
    );

    sub writerCode {
        my ( $self ) = @_;
        print "Coding...     \n";
    }
 
no Moose;
__PACKAGE__->meta->make_immutable;
1;

#File: Developer.pm
package Developer;

    use Moose;
    use strict; #Obliga a la programación segura y definición de variables
    use warnings; #Ayudará a encontrar errores de sintaxis
    use namespace::autoclean;
 
    extends 'Person', 'WriterMonkey'; #multiple inheritance

    has 'skill' => (
                is         => 'rw',
  isa        => 'Str',
                reader => 'getSkill',
                writer => 'setSkill',
    );
 
no Moose;
__PACKAGE__->meta->make_immutable;
1;

#.........................................................................................................
#File: script_multiple_inheritance.pl
#!/usr/bin/perl
use strict;
use warnings;
use Moose;
use Developer; #Nuestra clase

my $instancia = Developer->new(name=>'Daro',skill=>'Perl developer', keyBySeconds=>60);
print "Nombre: " . $instancia->getName() . "\n"; #return 'Daro'
print "Skill: " . $instancia->getSkill() . "\n"; #return 'Perl developer'
$instancia->writerCode(); #print 'Coding...'
#..........................................................................................................................end

3) Clases Abstractas o Interfaces con métodos abstractos


Hay que tener en cuenta que ni Perl ni Moose ofrecen clases abstractas. Con Moose se puede definir una clase "interfaz única" con role (Moose::Role), que contiene solo una lista de los métodos requeridos (requires). Cualquier clase que consuma este role debe implementar todos los métodos necesarios, ya sea directamente o a través de la herencia. No se puede retrasar la implementación de los métodos requeridos para que puedan ser implementadas por subclases futuras.

#File: Printable.pm
package Printable; #Clase Interface/Abstracta
    use strict;
    use warnings;
    use Moose::Role;

    requires 'doPrint', 'doPrint2'; #Métodos abstractos
    #requires must be implemented by a subclass or consumer class

no Moose;
1;

#File: Paper.pm
package Paper;
    use Moose;

    with 'Printable'; #Implement la clase Printable

    has 'text' => (
  isa        => 'Str', #Tipo String
                reader => 'getText',
                writer => 'setText'
    );

    sub doPrint {
        my ( $self ) = @_;
        print "Doing 1 ... " . $self->getText() . "    \n";
    };

    sub doPrint2 {
        my ( $self ) = @_;
        print "Doing 2 ... " . $self->getText() . "    \n";
    };
    
    
no Moose;
1;

#File: script_test_interface.pl
#!/usr/bin/perl
use strict;
use warnings;
use Moose;
use Paper; #Nuestra clase que implementa la interface Printable

my $instancia = Paper->new(text=>'texto a immprimir.');
$instancia->doPrint();
$instancia->doPrint2();



Referencias:
-Blog: Getting Started with Moose.
-Moose::Manual::Classes.
-Roles_Versus_Abstract_Base_Classes.
-Moose Manual.



Perl: POO con Moose, Estructura de datos

Estructura de datos con Moose

Las clases en Moose (con perl 5) pueden tener estructuras de datos como atributos usando Types en la definición del isa.

1) Clase con Atributos Hash

#This is perl 5, version 14, subversion 2 (v5.14.2)
#File: MyHash.pm
package MyHash;

    use Moose;
    use strict;
    use warnings;
    use namespace::autoclean;

    has 'myHashRef' => (
is => 'rw',
isa => 'HashRef',
reader  => 'getMyHashRef',
writer  => 'setMyHashRef',
default => sub {
return {
'0' => "first",
'1' => "second"
}
                                    }
                     );

    sub printOptions {
        my ( $self ) = @_;
        my $str = $self->getMyHashRef->{'0'};
        $str .= "\n";
        $str .= $self->getMyHashRef->{'1'};
        $str .= "\n";
        print $str;
    }

no Moose;
__PACKAGE__->meta->make_immutable;
1;

#................................................................................................
#File: script_test_MyHash.pl
#!/usr/bin/perl
use strict;
use warnings;
use MyHash;

my $instancia = MyHash->new();
$instancia->printOptions();
$instancia->setMyHashRef({'0' => "primero", '1' => "segundo"});
$instancia->printOptions();
#.............................................................................................end



Referencias:
-Types in Moose.
-Attribute Native.


jueves, 25 de septiembre de 2014

Perl: POO con Moose, Básico

Programación Orientada a Objetos en Perl con Moose

Para programar OO con Perl se puede usar la vieja escuela con perlobj (mediante un mecanismo conocido como bendición) o usar algo más moderno como uno de los sistemas de POO para Perl: Moose, Moo (Minimalist Object Orientation Moose compatible), Class::Accessor, Class::Tiny, Role::Tiny o Perl 6 OO (en el futuro). Aquí vamos a usar MooseMoose es un "postmodern object system for Perl 5" que hace más amigable la POO que la vieja escuela de perlobj.  En la vieja escuela era necesario crear el método new de las clases, en cambio con Moose no es necesario porque las clases heredan de Moose::Object quien ya implementa el new. O sea que prescindimos de la creación de constructores new.


Instalar Moose



Se debe por lo menos tener instalado Perl 5.8, pero es preferible 5.10 o 5.12. Moose se instala fácilmente con CPAN:

cpan Moose
#o se puede usar: sudo perl -MCPAN -e 'install Moose'
#o también: sudo apt-get install libmoose-perl

Ejemplos de Clases Moose:


1) Una Clase con Atributo String


#File: NameStr.pm
package NameStr;

    use Moose;
    use strict; #Obliga a la programación segura y definición de variables
    use warnings; #Ayudará a encontrar errores de sintaxis
    use namespace::autoclean;

    has 'name' => (
                is         => 'rw', #Lectura-Escritura. También se puede usar 'ro' = read-only
  isa        => 'Str', #Tipo String (es obligatorio el valor string)
    );

    sub myNameIs
    {
        my $self = shift;
        my $myname = $self->name();
        print "My name: $myname \n";
    }


no Moose;
__PACKAGE__->meta->make_immutable; #no voy a cambiar mi clase
1; # Don't forget "1;" at end to return a true value from the file.
=pod
Nota 1: el  "isa  => 'Str'" hace que sea obligatorio que cuando se setea el valor el mismo sea string. Si se quiere que acepte un Undef lo que se debe poner es "isa => 'Maybe[Str]'".
Nota 2: Poner make_immutable junto con autoclean es una buena práctica Moose.
=cut

#...........................................................
#File: script_NameStr.pl
#!/usr/bin/perl
use strict;
use warnings;
use Moose;
use NameStr; #Nuestra clase

my $instancia = NameStr->new();
$instancia->name('Daro');
$instancia->myNameIs();
#......................................................End

2) Una Clase con Atributo String y getter-setter

#Se puede usar getter and setter estilo Java

#File: NameStr.pm
package NameStr;

    use Moose;
    use strict; #Obliga a la programación segura y definición de variables
    use warnings; #Ayudará a encontrar errores de sintaxis
    use namespace::autoclean;

    has 'name' => (
                is         => 'rw', #Lectura-Escritura
  isa        => 'Str', #Tipo String
                reader => 'getName', #getter
                writer => 'setName', #setter
    );

    sub myNameIs
    {
        my $self = shift;
        my $myname = $self->getName(); #getter
        print "My name: $myname \n";
    }


no Moose;
__PACKAGE__->meta->make_immutable; #no voy a cambiar mi clase
1;

#...........................................................
#File: script_NameStr.pl
#!/usr/bin/perl
use strict;
use warnings;
use Moose;
use NameStr; #Nuestra clase

my $instancia = NameStr->new();
$instancia->setName('Daro'); #setter
$instancia->myNameIs();
#......................................................End

3) Una clase con atributo Integer


#File: AgeInt.pm
package AgeInt;

    use Moose;
    use strict; #Obliga a la programación segura y definición de variables
    use warnings; #Ayudará a encontrar errores de sintaxis
    use namespace::autoclean;

    has 'age' => (
                is         => 'rw', #Lectura-Escritura
  isa        => 'Int', #Tipo Integer
                default =>  37            
    );


no Moose;
__PACKAGE__->meta->make_immutable; #no voy a cambiar mi clase
1;

#...........................................................
#File: script_AgeInt.pl
#!/usr/bin/perl
use strict;
use warnings;
use Moose;
use AgeInt;  #Nuestra clase

my $instancia = AgeInt->new();
print $instancia->age() . "\n";
$instancia->age(19);
print $instancia->age() . "\n";
#......................................................End

4) Propiedades de atributos


#File: NameStrAtr.pm
package NameStrAtr;

    use Moose;
    use strict; #Obliga a la programación segura y definición de variables
    use warnings; #Ayudará a encontrar errores de sintaxis
    use namespace::autoclean;

    has 'name' => (
                is         => 'rw', #Lectura/Escritura
  isa        => 'Str', #Tipo String
                reader => 'getName',
                writer => 'setName',
                required => 1, #Es requerido y no permite el valor 'undef'
                clearer   => 'clearName', #permite limpiar el valor, provoca que hasName devuelva false
                predicate => 'hasName', #devuelve true si tiene un valor
                lazy    => 1, #no se inicializa hasta que se llama al método lector
                default => '',
                init_arg => 'elNombre' #Nombre con el cual se referencia desde el constructor
    );

no Moose;
__PACKAGE__->meta->make_immutable; #no voy a cambiar mi clase
1;

#.............................................................................................................
#File: script_NameStrAtr.pl
#!/usr/bin/perl
use strict;
use warnings;
use Moose;
use NameStrAtr; #Nuestra clase

my $instancia = NameStrAtr->new(elNombre=>'Daro'); #required
print "Nombre: " . $instancia->getName() . "\n"; #return 'Daro'
$instancia->setName('Daro Andres');
print "Nombre: " . $instancia->getName() . "\n"; #return 'Daro Andres'
print "Has value?: " . $instancia->hasName() . "\n"; #return 1 (true)
$instancia->clearName(); #Limpia el valor
print "Has value?: " . $instancia->hasName() . "\n"; #return (false)
#........................................................................................................End

5) Inicializadores de atributos con Builder   


#File: NameStrBuilt.pm
package NameStrBuilt;

    use Moose;
    use strict; #Obliga a la programación segura y definición de variables
    use warnings; #Ayudará a encontrar errores de sintaxis
    use namespace::autoclean;

    has 'name' => (
                is         => 'rw', #Lectura/Escritura
  isa        => 'Str', #Tipo String
                reader => 'getName',
                writer => 'setName',
                builder   => 'buildName'

    );

    #Constructor inicializador del atributo name
    sub buildName {
        my $self = shift;
        $self->setName('Built Name (Nombre construido)'); #Inicializa
    }

no Moose;
__PACKAGE__->meta->make_immutable; #no voy a cambiar mi clase
1;

#.............................................................................................................
#File: script_NameStr.pl
#!/usr/bin/perl
use strict;
use warnings;
use Moose;
use NameStrBuilt; #Nuestra clase

my $instancia = NameStrBuilt->new();
print "Nombre: " . $instancia->getName() . "\n"; #return 'Built Name (Nombre construido)'
#........................................................................................................End

6) Disparadores trigger en atributos

Un disparador es una función que es llamada cada vez que se cambia el atributo.

#File: NameStrTrigged .pm
package NameStrTrigged;

    use Moose;
    use strict; #Obliga a la programación segura y definición de variables
    use warnings; #Ayudará a encontrar errores de sintaxis
    use namespace::autoclean;

    has 'name' => (
                is         => 'rw', #Lectura/Escritura
  isa        => 'Str', #Tipo String
                reader => 'getName',
                writer => 'setName',
                trigger => \&triggerForSetName, #referencia a la función que se va a disparar cuando se setea el valor

    );

    #El trigger se dispara despues que se setea el atributo
    sub triggerForSetName {
        my ( $self, $name, $old_name ) = @_;
        if ($old_name){
            print "Trigger executed... new: ".$name." old: ".$old_name."\n";
        }
    }
 
no Moose;
__PACKAGE__->meta->make_immutable; #no voy a cambiar mi clase
1;

#.............................................................................................................
#File: script_NameStr.pl
#!/usr/bin/perl
use strict;
use warnings;
use Moose;
use NameStrTrigged; #Nuestra clase

my $instancia = NameStrTrigged->new(name=>'Nombre inicial');
print "Nombre: " . $instancia->getName() . "\n"; #return 'Built Name (Nombre construido)'
$instancia->setName('Segundo nombre');
print "Nombre: " . $instancia->getName() . "\n"; #return 'Built Name (Nombre construido)'
=pod
Se imprime en pantalla:
Nombre: Nombre inicial
Trigger executed... new: Segundo nombre old: Nombre inicial
Nombre: Segundo nombre
Presione una tecla para continuar . . .
=cut
#........................................................................................................End


Bueno, así vimos un resumen general del uso de clases con Moose.


Referencias:
http://en.wikibooks.org/wiki/Programming_with_Moose
https://dl.dropboxusercontent.com/u/45670449/Moose_Manual.pdf
http://modernperlbooks.com/books/modern_perl/chapter_07.html
https://www.perl.org/about/whitepapers/perl-object-oriented.html
https://metacpan.org/pod/Moose::Manual
http://perlmaven.com/object-oriented-perl-using-moose
https://metacpan.org/pod/Moo
http://perldoc.perl.org/perlootut.html#Role%3a%3aTiny

viernes, 8 de agosto de 2014

Java: Evolución de Java

Listas de novedades y cambios en la evolución de Java.


  • Java 8, JSE 8 (2014):

8)a) Eliminación del espacio de memoria (remove PermGen).
8)b) Compact Profiles (Small VM).
8)c) Expresiones Lambda (Explicaciónprogramación funcional con funciones anónimas y clausuras)
8)d) Métodos predeterminados en interfaces (Default Methods).
8)e) API Stream (java.util.stream) con estilo funcional y paralelismo.
8)f) Nuevo API para Fechas (java.time).
8)g) Nuevo motor Javascript (Nashorn).
8)h) Soporte estándar de codificación Base64.
8)i) Anotaciones en cualquier uso de tipos.
8)j) Java HotSpot más Mission Control.
8)k) Mejoras en JDBC (JDBC 4.2).
Ver novedades: Lista completa de novedades,
Tutorial:  Oracle Java Tutorial.
DownloadJDK 8.

  • Java 7JSE 7 (2011), Dolphin:

7)a) Project coin. (JSR334 Mejoras para la productividad)
7)b) Strings en switchs.
7)c) Gestión automática de recursos en sentencias try-catch.
7)d) Multicatch.
7)e) Rethrow de excepciones más precisos.
7)f) Operador diamante <>.
7)g) Literales binarios.
7)h) Guiones bajos en literales numéricos.
7)i) Fork/Join y utilidades de concurrencia.
7)j) Mejoras en trabajo con archivos y carpetas.

Ver novedades:
Tutorial:
Download:
Java EE: API Java EE7, Java EE7 SpecificationOracle Announces Availability of Java Platform Enterprise Edition 7.

  • Java 6, JSE 6 (2006), Mustang: 
Estuvo en desarrollo bajo la JSR 270.

6)a) Lenguajes de scripting.
6)b) API para el compilador.
6)c) Nuevas anotaciones.
6)d) Nueva API para XML (StaX).

Ver novedades:
Tutorial:
Download:
Java EE: API Java EE6, Java EE6 Specification.

  • Java 5, J2SE 1.5 (2004), Tiger: 
Desarrollado bajo JSR 176.

5)a) Generics.
5)b) Bucle for mejorado.
5)c) Autoboxing/unboxing.
5)d) Enums.
5)e) Varargs.
5)f) Static import.
5)g) Anotaciones.

Ver novedades:
Tutorial: Free Java Certification Training & Java Core Training.
Download:
Java EE: API Java EE5, Java EE5 Specification.

  • Java 4, J2SE 1.4 (2002), Merlin: 
Primer lanzamiento de la plataforma Java desarrollado bajo el Proceso de la Comunidad Java como JSR 59.


  • Java 3, J2SE 1.3 (2000), Kestrel: 

  • Java 2,  J2SE 1.2 (1998), Playground:

  • Java 1 (1996-1997): 



- JDK 1.1 (1997) — modelo de eventos AWT, clases internas (inner classes), JavaBeans, JDBC (Java Database Connectivity), RMI (Remote Method Invocation).

- JDK 1.0 (1996) — Primer lanzamiento.

lunes, 2 de septiembre de 2013

OpenERP: Install version 6.1 on ubuntu for development

Install OpenERP 6.1 on ubuntu for development

¿How to install OpenERP 6.1? ... Guide:

 I) Dependences

 
# Install postgres (database)
#----------------------------------------------------------------------

sudo apt-get install postgresql postgresql-client postgresql-contrib libpq-dev
psql --version

sudo su postgres -c psql
ALTER USER postgres WITH PASSWORD 'postgresdemo';

sudo passwd -d postgres
sudo su postgres -c passwd

sudo su - postgres
createuser --createdb --username postgres --no-createrole --no-superuser --pwprompt openerp
exit



# Install python (base language)
#----------------------------------------------------------------------

sudo apt-get install python python-psycopg2 python-reportlab \
python-egenix-mxdatetime python-tz python-pychart python-mako \
python-pydot python-lxml python-vobject python-yaml python-dateutil \
python-pychart python-webdav

sudo apt-get install python-cherrypy3 python-formencode python-pybabel \
python-simplejson python-pyparsing

sudo apt-get install python-gtk2 python-glade2 \
    python-matplotlib python-egenix-mxdatetime python-hippocanvas

#sudo apt-get install python-xml 
 

II) OpenERP

# Install OPENERP (Application)
#----------------------------------------------------------------------
 
To see more in: http://trescloud.blogspot.com.ar/2012/11/instalacion-de-openerp-6.html
 
The recommended installation is copy all in a folder named /opt/openerp
 
#Create structure folder, user and permission
sudo adduser --system --home=/opt/openerp --group openerp
cd /opt/openerp
sudo mkdir /opt/openerp/download
sudo chmod 755 /opt/openerp/download
sudo chown openerp: /opt/openerp/download
sudo mkdir server
sudo chmod 755 /opt/openerp/server
sudo chown openerp: /opt/openerp/server
sudo mkdir web
sudo chmod 755 /opt/openerp/web
sudo chown openerp: /opt/openerp/web
sudo mkdir client
sudo chmod 755 /opt/openerp/client
sudo chown openerp: /opt/openerp/client
sudo mkdir /var/log/openerp
sudo chown openerp:root /var/log/openerp
 
#Download OpenERP server:
sudo -su openerp 
cd /opt/openerp/download 
wget http://nightly.openerp.com/6.1/releases/openerp-6.1-1.tar.gz
sudo tar -zxvf openerp-6.1-1.tar.gz
sudo mv openerp-6.1-1/* /opt/openerp/server
sudo rm -R openerp-6.1-1
cd /opt/openerp/
sudo chown -R openerp: *
 
wget http://nightly.openerp.com/6.1/releases/openerp-client-6.1-1.tar.gz
sudo tar -zxvf openerp-client-6.1-1.tar.gz
sudo mv openerp-6.1-1/* /opt/openerp/client
sudo rm -R openerp-client-6.1-1 /opt/openerp/
sudo chown -R openerp: *
cd /opt/openerp/
sudo chown -R openerp: *
 
 
 
#Configuration OpenERP server:
sudo cp /opt/openerp/server/doc/openerp-server.conf /etc/openerp-server.conf
sudo chown openerp:root /etc/openerp-server.conf
sudo chmod 640 /etc/openerp-server.conf
sudo cp /opt/openerp/server/openerp-server /etc/init.d/openerp-server
sudo chmod 755 /etc/init.d/openerp-server
sudo chown root: /etc/init.d/openerp-server
sudo cp /opt/openerp/web/doc/openerp-web.cfg /etc/openerp-web.conf
sudo chown openerp:root /etc/openerp-web.conf
sudo chmod 640 /etc/openerp-web.conf
sudo cp /opt/openerp/web/scripts/openerp-web /etc/init.d/openerp-web
sudo chmod 755 /etc/init.d/openerp-web
sudo chown root: /etc/init.d/openerp-web
 
# Launch applications
#----------------------------------------------------------------------

sudo /etc/init.d/postgresql restart
sudo /etc/init.d/openerp-server start
less /var/log/openerp/openerp-server.log

#sudo python /opt/openerp/server/bin/openerp-server.py -r openerp -w postgresdemo --db_host 127.0.0.1
#/opt/openerp/server/bin/openerp-server.py --config=/etc/openerp-server.conf

# See if OpenERP is running
#----------------------------------------------------------------------
ps aux | grep openerp
 

III) Development

# Install Eclipse (Java + IDE)
#----------------------------------------------------------------------
 
# Install Java
 
# If we install Oracle Java 7:

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-installer
 
# If we install sun-java6-jdk on ubuntu 12.04 
#
sudo add-apt-repository ppa:flexiondotorg/java
sudo apt-get update
sudo apt-get install sun-java6-jdk sun-java6-plugin 
 
# Select java to use between installed alternatives
sudo update-alternatives --config java


# View version:
~$ java -version
java version "1.6.0_30"
Java(TM) SE Runtime Environment (build 1.6.0_30-b12)
Java HotSpot(TM) Server VM (build 20.5-b03, mixed mode)
 
 
# Install Eclipse (see more...)
Download Eclipse from http://www.eclipse.org/downloads/packages/eclipse-classic-421/junosr1
or http://www.eclipse.org/downloads/ 
 
# Install Plugins
 Install plugins following:
  • JavaScript Development Tools
  • XML Editors and Tools
  • Eclipse Web Developer Tools
  • PyDev for Eclipse
 For install go: Help->Install new software...
 
 
 
Referencias:
https://doc.openerp.com/v6.1/developer/index.html/#book-develop-link
http://www.slideshare.net/openobject/openerp-61-web-framework-tutorial
http://informaticartica.blogspot.com.ar/2012/02/crear-entorno-de-openerp-61.html
http://openerpdev.wordpress.com/2012/01/31/minimal-openerp-module-example/
http://planet.agilebg.com/en/2012/04/how-to-create-an-openerp-module-the-easy-way/
http://www.slideshare.net/openobject/openerp-61-web-framework-tutorial
http://trescloud.blogspot.com.ar/2013/02/configurar-eclipse-4.html