Welcome to Scribd, the world's digital library. Read, publish, and share books and documents. See more
Download
Standard view
Full view
of .
Look up keyword
Like this
2Activity
0 of .
Results for:
No results containing your search query
P. 1
Explota el Potencial de OpenOffice con PyUno

Explota el Potencial de OpenOffice con PyUno

Ratings: (0)|Views: 43|Likes:
Published by Aprender Libre
ÀHas visto alguna vez a los brokers de bolsa? ÀRecuerdas sus sofisticados y caros programas para ver las cotizaciones de las empresas en bolsa en tiempo real? Nosotros haremos lo mismo con 70 lineas de codigo Python, OpenOffice y la tecnologia UNO de
OpenOffice.
ÀHas visto alguna vez a los brokers de bolsa? ÀRecuerdas sus sofisticados y caros programas para ver las cotizaciones de las empresas en bolsa en tiempo real? Nosotros haremos lo mismo con 70 lineas de codigo Python, OpenOffice y la tecnologia UNO de
OpenOffice.

More info:

Published by: Aprender Libre on Jun 30, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

02/01/2013

pdf

text

original

 
Esta es la gran cuestión no resueltade la informática pero, aunque nohayamos encontrado una soluciónfiable, sí se disponen de técnicas queaumentan la probabilidad de que, almenos, se cree algún software útil.Una de estas técnicas consiste enemplear un sistema de componentescomo base para el desarrollo. Un com-ponente es una cantidad de softwareque ofrece un servicio bien definido yque es reutilizable. Además debe serposible reutilizarlo «de verdad»: desdecualquier lenguaje y cualquier sitio.Cualquiera que tenga conocimientosobre cómo funcionan los lenguajes deprogramación a bajo nivel sabrá queesto es muy muy complicado. Por ellose han desarrollado infraestructurasque nos permiten interactuar con loscomponentes de manera indirecta. Aeste software se le suele llamar “mid-dleware” (algo así como “software deen medio”).Ejemplos famosos de Middleware son J2EE, que muchos conocerán, yCORBA, que a muchos les gustaría noconocer. Ambos son sistemas enormesy costosos que relegan al programadora mera herramienta en manos de inge-nieros denominados arquitectos queconocen su compleja infraestructura.Pero los sistemas de componentestambién se emplean en software libre yhan dado buenos resultados. Quizás elmás desconocido es UNO, de UniversalNetwork Objects, el sistema queemplea OpenOffice, ver Listado [1], yque SUN desarrolló para su precursor:StarOffice.
PyUNO
Un sistema de componentes con el quesólo se pueda programar en unlenguaje no tiene mucha utilidad. Poreso en OpenOffice se han asegurado defomentar la creación de interfaces adistintos lenguajes de programación.Podemos acceder a UNO usando Javascript, Java, Ruby, Perl o Python(ver Recurso [2]).PyUNO es el nombre de la interfaz ypodremos encontrarlo sin problemas ennuestra distribución de Linux. Eviden-temente, necesitamos también tenerinstalado OpenOffice. En este artículohemos realizado los programas usandoOpenOffice 2.0, que cambió la interfazrespecto a la versión 1.0, y la versiónde PyUNO 0.7.0.
Un ejemplo rápido
Vamos a crear el famoso «Hola mundo»con PyUNO. Para ello primero debemosarrancar OpenOffice con el siguientecomando desde el directorio donde estéinstalado:
$> ./soffice
"-accept=socket,
host=localhost,
port=2002;urp;"
N
o es ni será la última vez quedesde esta sección recordemosque la idea original de Stallmanera la de que cada programa libre estu-viese construido sobre librerías de fun-ciones, de manera que su código fuesereutilizable por cualquier otro pro-grama.Quizás en un programa pequeño nosea muy útil este tipo de diseño, pero¿qué pasa con esos monstruos consumi-dores de memoria que rondan por nues-tros discos duros? Nos referimos a pro-gramas o entornos del calibre deGnome, KDE, Mozilla u OpenOffice.Todo el mundo se queja de su tamañoexcesivo, su alto consumo de recursos ysu inexplicable complejidad.Quizás con este artículo desmintamoseste mito y hagamos que el lector mirecon nuevos ojos a estos maravillososprogramas.
Grandes sistemas decomponentes
El diseño de un gran programa puedellevar años y cientos o miles de progra-madores. Organizar tal cantidad de per-sonas supone ya una locura sólo por elhecho de asegurarse que todos cobren.Pero vayamos a nuestro mundillo¿cómo podemos organizarles para queel desarrollo no acabe en un fiasco?
DESARROLLO
Python
50
Número 17
WWW.LINUX
-
MAGAZINE.ES
PyUNO: Explota todo el potencial de OpenOffice
PYTHON NO HAYMÁS QUE UNO
¿Has visto alguna vez a los brokers de bolsa? ¿Recuerdas sus sofisticados y caros pro-gramas para ver las cotizaciones de las empresas en bolsa en tiempo real? Nosotrosharemos lo mismo con 70 lineas de código Python, OpenOffice y la tecnología UNO deOpenOffice.
POR JOSÉ MARÍA RUIZ
050-053 Python xx 05.04.2006 16:29 Uhr Página 50
 
Al arrancar OpenOffice se arranca susistema de componentes. Podemos pen-sar en este proceso como en el arranquede un servidor, sólo cuando esté funcio-nando podrán los clientes trabajar conél.Las opciones que pasamos son paraque se cree un socket y se escuche enlocalhost en el puerto 2002. Por defectoOpenOffice no abre el socket, de ma-nera que no podrán controlar nuestroOpenOffice sin nuestro consentimiento.OpenOffice incorpora de serie variosintérpretes de lenguajes, entre ellos unode Python que ya viene preconfiguradopara poder hacer uso de la librería UNO.Está junto al resto de ejecutables deOpenOffice, así que lo ejecutaremosdesde allí. El programa que usaremos seencuentra en el Listado [2].El proceso es el siguiente:Obtenemos un contexto local (unsitio donde guardar los datos de laconexión)• Arrancamos el componente
UnoUrl- Resolver 
que nos sirve para accedera otro OpenOffice en otro equipo(en nuestro caso accederemos anuestro propio equipo)• Emplearemos el objeto
resolver 
paraacceder al OpenOffice remoto• Arrancamos un «Desktop» (escrito-rio) de OpenOffice (esto es unainstancia de OpenOffice vacía)• Arrancamos un
SWriter 
(es decir, elprocesador de textos) en el escrito-rioObtenemos un cursor, con el quepodremos posicionarnos dentro deltexto• e insertamos texto en el cursorEl resultado, no muy espectacular,podemos verlo en la Figura [1]. Ya te-nemos nuestro «hola mundo» insertadoen SWriter.¿Demasiado código? Piensa por unmomento lo que estamos haciendo.Hemos levantado dos componentes yhecho acceso remoto a otro OpenOffice.Este segundo OpenOffice puede estar enuna máquina al otro lado del mundo. Esalgo bastante impresionante, pero por elmomento poco útil. Veamos un pocomás sobre UNO antes de realizar unprograma más útil.
Arquitectura de UNO
OpenOffice está implementado enC++. UNO se usa internamente pararealizar cualquier cosa. BásicamenteOpenOffice no es más que una grancantidad de componentes que interac-túan entre sí. Todo dentro de OpenOf-fice es un componente, así quepodemos acceder a cualquier parte de laaplicación, ¡incluso reconstruir Open-Office en Python!Los sistemas de componentes usanun registro de componentes al que se lepuede pedir que arranque compo-nentes. El registro localiza el compo-nente en disco y lo carga en memoria,de manera que puede ser usado. Las lla-madas a las funciones no se realizandirectamente, sino que se suele emplearalgún sistema no dependiente delenguaje o plataforma, como puede serXML o un formato ASCII.El registro también debe ser capaz degestionar los recursos que consume elcomponente, descargándolo de memo-ria cuando ya no sea necesario.Los componentes pueden ser progra-mados en cualquier lenguaje con elque se tenga interfaz. Un componentees un conjunto de ficheros que propor-cionan un servicio. Se acompañan deun fichero XML que describe su fun-cionalidad. Lo mejor es que podemosvincular ese servicio a algún compo-nente gráfico, como por ejemplo unbotón o menú.Comenzaremos por realizar un pro-grama que funcionará de maneraexterna a OpenOffice y después creare-mos un componente con él y lo inte-graremos en OpenOffice.
Nuestro programa deStocks
Comencemos con la parte útil, ver Lis-tado [2]. Vamos a crear un sistema quenos permita controlar las acciones deuna serie de empresas que están enbolsa dentro de un índice tecnológico,el Nasdaq (para algo estamos en unarevista de informática), usando la hojade cálculo SCalc y un programaPython. Nuestro programa accederáusando Internet a un sitio web dondepodrá recoger los datos en CSV (Val-ores Separados por Comas), los proce-sará y los introducirá en SCalc.Comenzaremos por crear una fun-ción que recoja el fichero CSV y lo pro-cese. Lo que hacemos es conectarnoscon la página web
finance.yahoo.com
.Yahoo tiene un sitio web bastanteavanzado sobre cotizaciones de bolsa,y uno de sus servicios nos permiterecoger los datos de cotización de unaempresa en tiempo real en formatoCSV. Sin embargo, Yahoo no nos per-mitirá acceder a los datos demasiado amenudo, ya que dispone de un servi-cio de pago para ello, así que puedecortarnos el «grifo» en cualquiermomento si hacemos demasiadas con-sultas por minuto. Por eso recogere-mos los datos cada 10 segundos. Lafunción
 getSimbolo()
se encargará deello.Ahora ya tenemos los datos, te-nemos que mandarlos a SCalc. Hemoscreado un objeto llamado
Calc 
paragestionar el acceso. Hemos metido enel método constructor (
__init__
) elcódigo que conecta con el OpenOffice,puesto que sólo lo haremos una vez.Una hoja de cálculo posee varias«hojas», así que tendremos que solici-
Python •
DESARROLLO
51
Número 17
WWW.LINUX
-
MAGAZINE.ES
01 import uno0203 localContext =uno.getComponentContext()0405 resolver =localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver",06localContext )07 ctx = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" )0809 desktop =ctx.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop",ctx)1011 doc =desktop.loadComponentFromURL("private:factory/swriter","_blank",0,())1213 cursor =doc.Text.createTextCursor()1415 doc.Text.insertString( cursor,"Hola Mundo", 0 )1617 ctx.ServiceManager
Listado 1: programa «Hola Mundo»
050-053 Python xx 05.04.2006 16:29 Uhr Página 51
 
primera hoja, que es la que se vecuando arrancamos SCalc.El método
actualiza()
admite unalista con los datos de cotización ynúmero que representa la fila dondeaparecerá en SCalc. Una hoja de cálculose compone de celdas y éstas tienen untipo. La función
 getCellByPosition()
nospermite acceder a una celda pasándolela columna y la fila (al revés de lo nor-mal, así que cuidado).Una vez localizada la celda tenemosvarias funciones para poder asignar unvalor:
setString()
: para poner una cadena
setValue()
: para poner un número
setFormula()
: para poner una fór-mulaEl dato
cotización
es la lista deparámetro de cotización, pero vienendados como cadenas de caracteres. Lasposiciones 0, 2 y 3 son realmente cade-nas, pero el resto son números. Por esotenemos que convertir ciertos valoresal tipo
float()
mediante la función
float()
.El resultado se puede ver en la Figura[2], veremos cómo se abre una ventanatar una usando el método
 getSheets()
,que nos devuelve una lista con las dis-tintas hojas. Dentro de esta lista usare-mos
 getByIndex()
para seleccionar la
DESARROLLO
Python
52
Número 17
WWW.LINUX
-
MAGAZINE.ES
01 import uno02 import random03 import time04 import httplib05 import csv0607 class Calc:08 def __init__(self):09 self.conecta()1011 def conecta (self):12 self.local =uno.getComponentContext()13 self.resolver =self.local.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver",self.local)1415 self.context =self.resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")1617 self.desktop =self.context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop",18self.context)1920 #self.doc =self.desktop.getCurrentComponent()21 self.doc =self.desktop.loadComponentFromURL("private:factory/scalc","_blank",0,())2223 self.hojas =self.doc.getSheets()24 self.s1 =self.hojas.getByIndex(0)2526 def actualiza(self,cotizacion, fila):2728 i = 029 for entrada incotizacion:30 if (i == 0) or (i== 2) or (i ==3):31self.s1.getCellByPosition(i,fila).setString(entrada)32 else:33self.s1.getCellByPosition(i,fila).setValue(float(entrada))3435 i = i + 13637 def getSimbolo(simbolo):38 c =httplib.HTTPConnection("finance.yahoo.com")39c.request("GET","/d/quotes.csv?s="+simbolo+"&f=sl1d1t1c1ohgv&e=.csv")40 r = c.getresponse()41 cad = r.read()42 reader = csv.reader([cad])43 resultado = []44 for row in reader:45 resultado = row46 return resultado4748 if __name__ == '__main__':4950 simbolos =["GOOG","MSFT","RHAT"]5152 c = Calc()5354 while(1):55 i = 0;56 for s in simbolos:57c.actualiza(getSimbolo(s),i)58 i = i + 15960 time.sleep(10)
Listado 2: «OfficeBroker»
Figura 1: Un documento de Write de OpenOffice con el ineludible “Hello World” generado a par-tir de PyUNO.
050-053 Python xx 05.04.2006 16:29 Uhr Página 52

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->