Programacion Interactiva

Descubre una Nueva y Poderosa Herramienta.

FrameWork de Nueva Generacion

Acceso a tu Informacion desde cualquier Dispositivo con Navegador.

Enfoque en el Backend

Frontend de forma facil con Odoo y XML.

Creacion de Verticales

Creacion de nuevas Verticales Conquistando nuevos Mercados.

Tu marca aqui mismo

Llega a miles de personas.

Publicidad

Mostrando las entradas con la etiqueta desarrollo. Mostrar todas las entradas
Mostrando las entradas con la etiqueta desarrollo. Mostrar todas las entradas

viernes, 20 de abril de 2018

Instalación Odoo 11 con Docker

Instalación de Odoo en un Docker Ubuntu


    Las herramientas de virtualización son una gran ayuda en el mundo de las tecnologias de información, ya que encapsulan los servicios, librerias y herramientas necesarias para la ejecución de programas, aplicaciones, servicios, etc. al mismo tiempo que lo hacen portable e independiente del Sistema Operativo, anterior a docker podiamos encontrar hypervisor como una de las mas conocidas, en la actualidad docker tiene ventajas sobre otras y se ha vuelto una de las mas importantes, en el mundo de Odoo desde la versión 10 y ahora versión 11 es casi un estandar para los desarrolladores, ya que nos permite tener diferentes instancias o proyectos de forma independiente con la posibilidad de poder llevar este contenedor al entorno de Producción de un cliente de forma facil y rapida, homologando la versión de Python, la versión de sus librerias y las aplicaciones.

En Odoo podemos encontrar el Docker oficial desde Github o el repositorio oficial de Docker:
  • https://github.com/odoo/docker
  • https://hub.docker.com/_/odoo/
La versión oficial contiene una serie de instrucciones para poder hacer nuestra instalación y quede lista para ponerse en marcha para nuestros desarrollos o en nuestro Cliente para su uso final.

En este Post quiero enseñar una maner alternativa a la oficial, usando la imagen (docker) de Ubuntu y montando nuestro Contenedor para instalar Odoo, Postgres y las librerias requeridas para la ejecución de Odoo.

1.   Instalación de Docker
Lo mas importante es tener instalado nuestro docker en el Servidor o Maquina donde vamos a trabajar, en mi caso utilizo Ubuntu 17.04 y los pasos para instalador docker son:


Actualizar los Repositorios:

sudo apt-get update


Instalar las librerias necesarias:

 sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

AƱadir el repositorio Docker :

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -


sudo apt-key fingerprint 0EBFCD88


sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

sudo apt-get update


sudo apt-get install docker-ce


Debemos crear una cuenta en la Pagina Oficial https://hub.docker.com/

Como paso final de la instalación debemos hacer un loggin en nuestro Sistema Operativo:

docker login

2.   Descarga de Imagen Ubuntu

En este ejemplo usare Ubuntu 16.04 como mi imagen base para ello ejecuto en terminal

sudo docker pull ubuntu:16.04

Podremos visualizar nuestras Imagenes con el comando:

sudo docker images


3.   Creación de nuestro Contenedor

Crearemos un contenedor con las siguientes caracteristicas:
  • Con el puerto 8069 abierto para acceder desde el anfitrion
  • Con el Puerto 22 abierto
  • Con una Terminal Interactiva
  • Con un Directorio Compartido entre huesped (docker) y anfitrion (SO)

docker run -it -p 22 -p 8069:8069 -v /opt/odoo:/home/odoo --name odoo_11_dev ubuntu:16.04

Es importante indicar la versión de la Imagen descargada para ello al final indicamos ubuntu:16.04
(docker run -it -p 22 -p 8069:8069 -v /opt/odoo:/home/odoo --name odoo_11_dev ubuntu:16.04)

El resultado es una consolta interactiva, en la cual podemos ejecutar comandos.

Si cerramos la terminal el docker seguira corriendo y ya no existe necesidad de ejecutar nuevamente el comando anterior, ahora debemos ejecutar el comando para listar los contenededores activos:

docker ps


Si queremos ver todos los que hemos creado:

docker ps -a

Para poder ingresar al contenedor activo:

docker attach odoo_11_dev

Si no vemos la terminal pasados unos segundos es importante dar un enter mas o dos.

4.   Instalación de Aplicaciones

Una ves que tenemos nuestro Contenedor Ubuntu 16.04, vamos a instalar las aplicaciones y librerias.

Primero debemos hacer un update a los repositorios:

apt-get update

Instalamos Python 3 para Odoo 11:

apt-get install python3 -y

Instalamos Pip 3:

apt-get install python3-pip -y

Instalamos algunas dependencias de Odoo:

apt-get install python3-dev libxml2-dev libxslt1-dev libevent-dev \
libsasl2-dev libldap2-dev libpq-dev libpng12-dev libjpeg-dev \
poppler-utils node-less node-clean-css python3-pypdf2 npm python3-babel \
python3-decorator python3-docutils -y

Creamos un Usuario del Sistema para Gestionar Odoo

useradd -d /home/odoo -s /bin/bash odoo

Cambiamos la contraseƱa del usuario:

passwd odoo

Instalamos Git

apt-get install git

Descargamos Odoo, dentro de la carpeta /opt

cd /opt

git clone https://github.com/odoo/odoo --branch 11.0

Cambiamos los permisos de la carpeta hacia el usuario odoo:

chown odoo.odoo /opt/odoo -R

Instalamos las dependencias de odoo

pip3 install /opt/odoo/requirements.txt -r

pip3 install /opt/odoo/doc/requirements.txt -r

Instalacion de Wkhtmltopdf:

apt-get install wget -y

wget https://nightly.odoo.com/extra/wkhtmltox-0.12.1.2_linux-jessie-amd64.deb

dpkg -i wkhtmltox-0.12.1.2_linux-jessie-amd64.deb

apt-get -f install


Instalamos Postgres:

apt-get install postgresql

Iniciamos Postgres:

service postgresql start

Creamos el usuario de Postgres para Odoo:

su postgres

createuser -s -P -e odoo

ContraseƱa: odoo

Instalamos un Editor de Textos, por ejemplo nano:

apt-get install nano

Cambiamos al usuario odoo:

su odoo

Ejecutamos Odoo y creamos nuestro Archivo de configuración:

python3 /opt/odoo/odoo-bin -c odoo_server.conf -s

Editamos el Archivo de Configuración y modificamos los Parametros de Base de Datos:

nano odoo_server.conf

db_host = localhost
db_password = odoo
db_port = 5432
db_sslmode = prefer
db_template = template1
db_user = odoo


Una ves Editado, guardamos con el Comando Ctrl + O

Volvemos a ejecutar sin el  parametro -s

python3 /opt/odoo/odoo-bin -c odoo_server.conf

Y listo, en nuestro navegador podemos acceder a Odoo:

Ante cualquier error de fuentes podemos consultar:
https://poncesoft.blogspot.mx/2016/05/solucion-al-error-bundle.html



miƩrcoles, 25 de enero de 2017

Obtener ID de registro desde datos XML Odoo

MƩtodo para obtener el ID de la tabla desde el ID de una Vista de un modulo Odoo



Se que el titulo sonada un poco extraƱo, pero la idea es muy sencilla, existe un metodo de Odoo que te permite obtener el ID de un registro ya creado en la base de datos, enviandole el ID con el cual lo creamos desde un XML, para que sea un poco mas claro vamos a analizarlo.

  • Normalmente creamos un registro desde un XML de la siguiente manera:
<record id="product_uom_categ_kgm" model="product.uom.categ">
            <field name="name">Weight</field>
</record>
     


El ejemplo anterior es una categorĆ­a creada desde el modulo product.

  • Si necesitĆ”ramos saber el ID que tiene esa categorĆ­a en la base de datos:

          La manera natural o normal que yo realizarĆ­a es:
          categ_id = self.env['product.category'].search([('name','=','Weight'])
         Utilizando el mĆ©todo de odoo seria de la siguiente manera:
          uom_categ_id = self.env['ir.model.data'].xmlid_to_res_id( 'product.product_uom_categ_kgm')

Los parĆ”metros que recibe son:

  • Nombre del Modulo.
  • ID del registro en el XML.


En resumen el metodo xml_to_res_id, te permite conocer el ID de cualquier registro en cualquier tabla siempre y cuando se haya creado desde un XML en un modulo de Odoo.


lunes, 19 de septiembre de 2016

Filtros XML Odoo usando la libreria Time & Datetime

¿Podemos aƱadir filtros en  Odoo usando librerias para el Manejo de Fechas?



La respuesta es Si, el Core de Odoo tiene el manejo de algunas librerías y métodos para enviar información desde una vista XML y esta sea renderizada al momento de ejecutar una acción sobre ella, un filtro, una agrupación, abrir una ventana de un formulario, etc...

Mostrare dos ejemplos sobre el uso de las librerias time y  datetime en vistas XML, muy similar a lo que nosotros realizamos en Python:

<!-- Usando libreria Time -->
<filter string="Today"
   domain="[('date','<', time.strftime('%%Y-%%m-%%d 00:59:59')), 
   ('date','>=', time.strftime('%%Y-%%m-%%d 00:00:00'))]"
   help="Today objects" />
 
<!-- Usando libreria datetime -->
<filter  string="Ejemplo 2"
   domain="[('date','&#60=',(datetime.date.today()-datetime.timedelta
   (days=7)).strftime('%%Y-%%m-%%d 00:00:00'))]" />

En estos casos podemos ver los caracteres &#60 , esto es porque en xml no podemos usar estos elementos <, > ya que son reservados.

En esta web podrĆ” consultar los codigos html de los caracteres.

Pero también existe un palabra reservado muy útil current_date, esta palabra retorna la fecha actual y puede ser usada en un dominio o un tree color como en este ejemplo:
<tree colors="grey:date_end &#60 current_date;">


Fuente Tomada de Odootricks

jueves, 18 de agosto de 2016

Solución a la lectura de Registros por permisos Ocultos en Odoo

Saltarnos algunas Reglas de Lectura de Registros en Odoo



    Este pequeƱo fragmento de Código es un ejemplo sobre como poder saltarse las reglas de lectura de registros para algunas clases, les contare un poco que me orillo a esta solución un poco agresiva, esto lo he tenido que hacer para un Cliente que tiene desarrollos de Terceros, por alguna circunstancia dentro de algĆŗn modulo existe un fragmento de Código que limita al usuario a solo visualizar sus Registros Creados sin utilizar las Reglas de Odoo, buscando dentro de todos los módulos no encontrĆ© ese fragmento y me puse a pensar una solución a este detalle y se me ocurrió usar la librerĆ­a SUPERUSER_ID de Odoo y pasarla al mĆ©todo principal de bĆŗsqueda, esto ayuda a poder usar el Root de Odoo y visualizar la información sin problema, el ejemplo siguiente es para la tabla de Albaranes o Movimientos de AlmacĆ©n:


class stock_picking(osv.osv):
    _name = 'stock.picking'
    _inherit ='stock.picking'
    _columns = {
        }

    _defaults = {
        }

    ########## METODOS PARA VOLARNOS LAS REGLAS DE LECTURA DE REGISTROS #############

    def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
        from openerp import SUPERUSER_ID

        res = super(stock_picking, self).fields_view_get(cr, SUPERUSER_ID, view_id, view_type, context=context,
        toolbar=toolbar, submenu=submenu)
        
        return res

    def search(self, cr, uid, args, offset=0, limit=None, order=None,
            context=None, count=False):
        from openerp import SUPERUSER_ID

        res = super(stock_picking, self).search(cr, SUPERUSER_ID, args, offset, limit, order,
            context, count)
        return res

Podrƭamos mejorar un poco el codigo aƱadiendo algunas normas de lectura, etc...

Notas: El ejemplo esta hecho para OpenERP 7 y Odoo 8, para Odoo 9 solo sustituimos la herencia y los mƩtodos por la API.


Espero les sea de utilidad.

viernes, 27 de mayo de 2016

Solucion al Error bundle 'web.assets_common' o error lessc

Solución de Errores lessc y web.assets_common




    Últimamente las nuevas librerĆ­as de Odoo 9 para mejorar el ambiente (interfaz) web tienen una serie de conflictos con el Sistema Operativo, en ocasiones podemos ver errores como la imagen anterior, errores 404, errores 500, etc., las causas pueden ser muchas pero la mayorĆ­a se basan en la librerĆ­a nodejs y npm, para dar solución a este error debemos ejecutar los siguientes comandos:

  1. sudo apt-get install nodejs
  2. sudo apt-get install npm
  3. sudo npm install -g less
  4. sudo npm install -g less-plugin-clean-css
  5. sudo ln -s /usr/local/bin/lessc /usr/bin/lessc
  6. sudo ln -s /usr/bin/nodejs /usr/bin/node


Listo, solo debemos reiniciar el servicio de Odoo y refrescar el navegador web, en ocasiones sera necesario tener que eliminar los archivos temporales y la cache del navegador.

Nota: Estos comandos solo funcionan para los Sistemas derivados de debĆ­an (Ubuntu Server, Ubuntu Desktop, Linux Mint, erc..)

jueves, 26 de mayo de 2016

¿Por que hay tantos Pythons?

Python es asombroso.


Sorprendentemente, esa es una declaración bastante ambigua. ¿A quĆ© me refiero con ‘Python’?, ¿Me refiero a la interfaz abstracta de Python?, ¿Me refiero a CPython, la implementación comĆŗn de Python (y no confundir con Cython, que son similares en sus nombres)?, ¿O me refiero a algo completamente distinto? Tal vez me estĆ© refiriendo indirectamente a Jython, o IronPython, o PyPy. O tal vez me he ido al extremo y estoy hablando de RPython o RubyPython (los cuales son cosas muy, muy distintas).
Mientras las tecnologías mencionadas anteriormente son llamadas de formas parecidas y referenciadas de la misma manera, algunas de ellas sirven para propósitos completamente distintos (o, al menos, operan de maneras completamente distintas).
A lo largo de mi tiempo trabajando con Python, me topé con toneladas de estas herramientas .*ython. Pero no hasta hace poco me tomé el tiempo de entender qué es lo que son, cómo funcionan y por qué son necesarias (a sus maneras).
En este artículo, voy a empezar desde cero y recorreré varias implementaciones de Python, concluyendo con una introducción detallada a PyPy, el cual creo es el futuro del lenguaje.
Todo empieza con entender que es lo que ‘Python’ realmente es.
Si tienes un buen entendimiento sobre código binario, mĆ”quinas virtuales y parecidos, siĆ©ntete libre de saltarte esta parte.

“Python es interpretado o compilado?”

Este es un punto común de confusión para principiantes en Python.
La primera cosa que hay que saber es que ‘Python’ es una interfaz. Existe una especificación sobre lo que Python deberĆ­a hacer y cómo deberĆ­a comportarse (cómo con cualquier interfaz). Y hay mĆŗltiples implementaciones (como en cualquier interfaz).
Lo segundo que hay que saber es que ‘interpretado’ y ‘compilado’ son propiedades de una implementación, no de una interfaz.
Entonces, la pregunta no estĆ” realmente bien formada.
¿Python es interpretado o compilado? La pregunta no estĆ” realmente bien formada.
Dicho esto, para la implementación mĆ”s comĆŗn (CPython: escrito en C, usualmente llamado simplemente ‘Python’, y seguramente lo que estĆ”s usando si no tienes idea de lo que estoy hablando), la respuesta es:interpretado, con algunas partes compiladas. CPython compila** el código fuente de Python a *bytecode, y en ese momento interpreta ese bytecode, ejecutĆ”ndolo sobre la marcha.
Nota: no es una ‘compilación’ en sentido tradicional de la palabra. Normalmente, decimos que ‘compilar’ es tomar el código de alto nivel y convertirlo en código binario. Pero es un tipo de ‘compilación’.
Veamos la respuesta un poco mƔs de cerca, ya que nos permitirƔ entender algunos de los conceptos que surgirƔn mƔs adelante en el artƭculo.

Bytecode vs. código binario

Es muy importante entender la diferencia entre bytecode y código binario (o nativo), tal vez mejor ilustrada con ejemplos:
  • C compila a código binario, que luego es ejecutado directamente en tu procesador. Cada instrucción le indica a tu CPU que mueva cosas alrededor.
  • Java compila a bytecode, que luego es ejecutado en la mĆ”quina virtual de Java(Java Virtual Machine, ó JVM), una abstracción de una computadora que ejecuta programas. Cada instrucción es entonces manejada por la JVM, que interactĆŗa con tu computadora.
En tĆ©rminos breves: código binario es mĆ”s rĆ”pido, pero bytecode es mĆ”s portable y seguro.
El código binario se ve distinto, dependiendo de tu mÔquina, pero bytecode se ve igual en todas las maquinas. Se podría decir que el código binario estÔ optimizado para tu configuracion.
Volviendo a CPython, el proceso en el conjunto de herramientas sucede de la siguiente manera:
  1. CPython compila tu código Python a bytecode
  2. Ese bytecode es entonces ejecutado en la MƔquina Virtual CPython
Los principiantes asumen que Python es compilado a raíz de los archivos .pyc. Hay alguna verdad en esto: el archivo .pyc es bytecode compilado, que es después interpretado. Entonces si haz ejecutado código Python y ya tienes un archivo .pyc disponible, el mismo va a ejecutarse mÔs rÔpido la segunda vez ya que no necesitarÔ recompilar el bytecode.

Maquinas virtuales alternativas: Jython, IronPython, y mƔs






Cómo mencionĆ© anteriormente, Python tiene varias implementaciones. De vuelta, como mencionĆ© antes, la mĆ”s comĆŗn es CPython. Ɖsta es una implementación de Python escrita en C y es considerada la implementación ‘por defecto’.
¿Pero, quĆ© pasa con las alternativas? Una de las mĆ”s prominentes es Jython, una implementación en Java que utiliza la JVM. Mientras CPython produce bytecode para ser corrido en la VM de CPython, Jython produce bytecode de Java para correr en la JVM (esto es lo mismo que es producido cuando se compila un programa en Java).
“¿Por quĆ© usarĆ­a alguna vez una implementación alternativa?”, podrĆ­as preguntar. Bueno, para empezar, esasdiferentes implementaciones juegan muy bien con diferentes conjuntos de tecnologĆ­as.
CPython hace muy fĆ”cil el escribir extensiones C para tu código Python porque al final es ejecutado por un intĆ©rprete de C. Por otro lado, Jython, facilita trabajar con otros programas en Java: puedes importar cualquier clase de Java sin mayor esfuerzo, evocando y utilizando tus clases Java dentro tus programas Jython. (Nota aparte: si no pensaste en esto detalladamente, es una locura. Estamos en un punto donde puedes mezclar y triturar diferentes lenguajes y compilarlos todos en una misma esencia. Como fue mencionado por Rostin, los programas que mezclan código Fortran y C estĆ”n desde hace un tiempo. AsĆ­ que, por supuesto que esto no es algo necesariamente nuevo. Pero sigue siendo genial.)
Cómo ejemplo, esto es código Jython vÔlido:
[Java HotSpot(TM) 64-Bit Server VM (Apple Inc.)] on java1.6.0_51
>>> from java.util import HashSet
>>> s = HashSet(5)
>>> s.add("Foo")
>>> s.add("Bar")
>>> s
[Foo, Bar]
IronPython es otra implementación popular de Python, escrita enteramente en C# y apuntando a la tecnologĆ­a .NET. En particular, corre con lo que se podrĆ­a llamar la MĆ”quina Virtual .NET,Common Language Runtime (CLR)de Microsoft, comparable con la JVM.
Podrías decir que Jython : Java :: IronPython : C#. Corren en sus respectivas VMs, puedes importar clases C# en tu código IronPython y clases Java desde tu código Jython, etc.
Es totalmente posible sobrevivir sin tocar alguna vez una implementación de Python no-CPython. Pero hay ventajas que se obtienen desde el cambio, muchas de ellas son dependientes de la tecnologĆ­a que uses. ¿Usas muchos lenguajes basados en la JVM? Jython puede ser para tĆ­. ¿Todo lo que haces es sobre la tecnologĆ­a .NET? Tal vez debas probar IronPython (y tal vez ya lo hayas hecho).
Por cierto: mientras que esto no serĆ­a una razón para usar una implementación diferente, nota que estas implementaciones sĆ­ difieren en comportamiento mĆ”s allĆ” de como tratan tu código fuente en Python. Sin embargo, esas diferencias son comĆŗnmente menores, y se disuelven o emergen con el tiempo mientras estas implementaciones se encuentran bajo un activo desarrollo. Por ejemplo, IronPython usa cadenas Unicode por defecto; Sin embargo, CPython, por defecto usa ASCII para versiones 2.x (fallando con un error de codificaciónUnicodeEncodeError para caracteres no-ASCII), pero sĆ­ soporta cadenas Unicode por defecto para las versiones 3.x.

Compilación Justo-a-Tiempo: PyPy y el futuro

Por lo tanto, tenemos una implementación de Python escrita en C, una en Java una en C#. El próximo paso lógico: una implementación de Python escrita en… Python. (El lector educado encontrarĆ” esta notación levemente engaƱosa).
Aquí es donde las cosas se ponen confusas. Primero, discutamos sobre compilación Justo-a-Tiempo (Just-in-Time, ó JIT).

JIT: El por qué y el cómo

Recordemos que el código binario es mucho mĆ”s rĆ”pido que bytecode. Bueno, ¿y si pudiĆ©ramos compilar algunas partes de nuestro bytecode y luego correrlo como código nativo? TendrĆ­amos que pagar algĆŗn precio al compilar a bytecode (por ej., tiempo), pero si el resultado fuese mĆ”s rĆ”pido, eso serĆ­a genial! Esa es la motivación de la compilación JIT, una tĆ©cnica hĆ­brida que mezcla los beneficios de los interpretadores y los compiladores. En tĆ©rminos bĆ”sicos, JIT quiere utilizar compilación para acelerar un sistema interpretado.
Por ejemplo, un enfoque común tomado por la compilación JIT:
  1. Identificar bytecode que es ejecutado frecuentemente.
  2. Compilar a código binario.
  3. Almacenar el resultado en memoria cachƩ.
  4. Siempre que el mismo bytecode sea encontrado para ejecutar, en vez de usarlo, ejecutar el código binario precompilado y cosechar los beneficios (por ej., aumentos de velocidad)
De esto se trata PyPy: llevar JIT a Python (mira el ApĆ©ndice para ver esfuerzos anteriores). Hay, por supuesto, otros objetivos: PyPy apunta a ser multiplataforma, bajo en consumo de memoria e independiente del conjunto de tecnologĆ­as. Pero JIT realmente se vende por si solo. Como promedio de un puƱado de pruebas de tiempo, se dice que mejora el rendimiento a un factor de 6.27. Para un mayor anĆ”lisis, vĆ©ase este cuadro del PyPy Speed Center:

PyPy es difĆ­cil de entender

PyPy tiene un gran potencial, y a estas alturas es muy compatible con CPython (asĆ­ que puede correr Flask, Django, etc.).
Pero hay mucha confusión alrededor de PyPy (vĆ©ase, por ejemplo, esta propuesta sin sentido para crear unPyPyPy…). En mi opinión, eso es principalmente porque PyPy es actualmente dos cosas:
  1. Un intĆ©rprete de Python escrito en RPython (no Python (he mentido antes). RPython es un subconjunto de Python con tipos estĆ”ticos. En Python, es “prĆ”cticamente imposible” razonar rigurosamente acerca de tipos (¿Por que es tan difĆ­cil? Bueno, considera el hecho que:
     x = random.choice([1, "foo"])
    
    serĆ­a código Python vĆ”lido (crĆ©ditos a Ademan). ¿De quĆ© tipo es x? ¿Cómo podemos razonar acerca de tipos de variables cuando los tipos ni siquiera son estrictamente forzados?). Con RPython, sacrificas algo de flexibilidad, pero a cambio es muchĆ­simo mĆ”s fĆ”cil razonar sobre manejo de memoria y demĆ”s, lo cual permite optimizaciones.
  2. Un compilador que compila código RPython para varios objetivos y agrega JIT. La plataforma por defecto es C, por ej., un compilador RPython-a-C, pero también puedes apuntar a JVM y otros.
Únicamente para mayor claridad, me referiré a ellos como PyPy (1) y PyPy (2).
¿Por quĆ© necesitarĆ­as esas dos cosas, y por quĆ© bajo el mismo techo? PiĆ©nsalo de esta manera: PyPy(1) es un intĆ©rprete escrito en RPython. Entonces toma el código Python del usuario y lo compila a bytecode. Pero el interpretador en sĆ­ (escrito en RPython) tiene que ser interpretado por otra implementación de Python para poder correr, ¿Verdad?
Bueno, podrĆ­amos simplemente usar CPython para correr el intĆ©rprete. Pero eso no serĆ­a lo suficientemente rĆ”pido.
En cambio, la idea es que usemos PyPy(2) (también conocido cómo RPython Toolchain)-Set de herramientas RPython) para compilar al interpretador de PyPy a código que otra plataforma (por ej., C, JVM o CLI) pueda correr en nuestra mÔquina, agregando también JIT. Es mÔgico: PyPy agrega dinÔmicamente JIT a un interpretador, generando su propio compilador! (De vuelta, esto es una locura: estamos compilando un interpretador y agregando otro compilador independiente por separado).
Al final, el resultado es un ejecutable independiente que interpreta el código fuente Python y explota las optimizaciones de JIT. Que es lo que justamente queríamos! Es un gran bocado, pero tal vez este diagrama ayude:
Reiterando, la verdadera belleza de PyPy es que podemos escribir nosotros mismos un puƱado de interpretadores Python distintos en RPython sin preocuparnos por JIT (salvo algunas sugerencias). PyPy entonces implementarĆ­a JIT por nosotros usando el set de herramientas de RPython/PyPy(2).
De hecho, si nos ponemos aĆŗn mĆ”s abstractos, podrĆ­as, teóricamente, escribir un interpretador para cualquierlenguaje, alimentar a PyPy con Ć©l, y obtener un JIT para ese lenguaje. Esto es porque PyPy se enfoca en optimizar el interpretador actual, en vez de los detalles del lenguaje que estĆ” interpretando.
Podrías, teóricamente, escribir un interpretador para *cualquier* lenguaje, alimentar a PyPy con él, y obtener un JIT para ese lenguaje.
Divagando un poco, me gustarĆ­a mencionar que JIT en sĆ­ mismo es absolutamente fascinante. Usa una tĆ©cnica llamada tracing (ó seguimiento), la cual se ejecuta de la siguiente manera:
  1. Correr el interpretador e interpretar todo (sin agregar nada de JIT)
  2. Perfilar levemente el código interpretado.
  3. Identificar operaciones que hayas realizado antes.
  4. Compilar esos pedazos a código binario.
Para mĆ”s información, este documento es altamente accesible y muy interesante.
Para ir concluyendo: usamos el compilador RPython-a-C de PyPy (u otra plataforma) para compilar el interpretador implementado RPython de PyPy.

Concluyendo

¿Por quĆ© es tan genial? ¿Por quĆ© vale la pena perseguir esta idea tan loca? Creo que Alex Gaynor lo describió muy bien en su blog: “[PyPy es el futuro] porque ofrece mejor velocidad, mĆ”s flexibilidad y es una mejor plataforma para el crecimiento de Python.”
En resumen:

ApƩndice: Otros nombres que tal vez hayas oƭdo

  • Python 3000 (Py3k): nombre alternativo para Python 3.0, un mayor, compatible-con-versiones-anterioreslanzamiento de Python que alcanzó la escena en 2008. El equipo de Py3k predijo que llevarĆ­a alrededor decinco anos para que esta versión sea completamente adoptada. Y mientras que la mayorĆ­a (cuidado: se dice que es anecdótico) de los desarrolladores de Python siguen usando Python 2.x, la conciencia de Py3k entre la gente estĆ” incrementĆ”ndose.
  • Cython: un super set de Python que incluye bindings (ó enlaces)para llamar funciones de C.
    • Objetivo: permitirte escribir extensiones en C para tu código Python
    • AdemĆ”s te permite agregar tipos de variables estĆ”ticos a tu código Python, permitiĆ©ndole que sea compilado y alcanzar rendimiento parecido al de C.
    • Es similar a PyPy, pero no es lo mismo. En este caso, estĆ”s forzado a escribir el código del usuario antes de pasarlo al compilador. Con PyPy, escribes simplemente código Python, y el compilador maneja cualquier optimización.
  • Numba: : un “compilador especializado justo-a-tiempo” que agrega JIT a código Python anotado. En tĆ©rminos mĆ”s bĆ”sicos, le das algunas indicaciones y acelera partes de tu código. Numa viene como parte de la distribución Anaconda,un set de paquetes para manejo y anĆ”lisis de datos.
  • IPython: muy diferente a todo lo que hemos discutido hasta ahora. Es un ambiente de procesamiento para Python. Interactivo y con soporte para herramientas grĆ”ficas y experiencia de navegador, etc.

Enlaces de lenguaje

  • RubyPython: un puente entre las mĆ”quinas virtuales de Ruby y Python. Permite embeber código de Python dentro de tu código de Ruby. Defines donde Python comienza y termina, y RubyPython calcula los datos entre las VMs.
  • PyObjc: enlaces de lenguaje entre Python y Objetive-C, actuando como un puente entre ellos. PrĆ”cticamente, eso significa que puedes utilizar librerĆ­as de Objective-C (incluyendo todo lo que necesitas para crear aplicaciones de OS X) desde tu código Python, y módulos de Python desde tu código Objective-C. En este caso, es conveniente que CPython estĆ© escrito en C, el cual es un subconjunto de Objective-C.
  • PyQt: mientras PyObjc te ofrece una interfaz para los componentes grĆ”ficos de OS X, PyQt hace lo mismo para el framework de QT, permitiendote crear completas interfaces grĆ”ficas, acceso a bases de datos SQL, etc. Otra herramienta dirigida a traer la simplicidad de Python a otros frameworks.

Frameworks JavaScript

  • pyjs (Pyjamas): un framework para crear aplicaciones web y de escritorio en Python. Incluye un compilador Python-a-Javascript, un conjunto de widgets, y algunas herramientas mĆ”s.
  • Brython: una mĆ”quina virtual de Python escrita en JavaScript para permitir que el código de Py3k sea ejecutado en navegadores.

Creditos:
      By CHARLES MARSH 
      Traduccion: Pablo Fabregat, miembro de TransBunko
Fuente Original: