Archives 2012

Working with OpenOffice/LibreOffice Spreadsheets with Python

Monday, 22 October 2012
|
Écrit par
Grégory Soutadé

Working with OpenOffice/LibreOffice Spreadsheets with Python One improvement of OpenOffice was to introduce Python scripting beside VBA one. You can do internal or external scripting. External scripting is done via Python UNO interface, it's like CORBA objects (...). But resources on web are poor and sparse. Only two websites have a clear and complete information :
https://www.wzdftpd.net/downloads/oowall/pyUnoServerV2.py
http://stuvel.eu/ooo-python

This is a mini HOWTO you can use in your external scripts First you have to start server side OOo/LO :

libreoffice "--accept=socket,host=localhost,port=2002;urp;" --invisible

If you don't want to see OOo/LO interface, add --headless. WARNING: You need to close ALL OOo/LO instances before starting server !

Next, load a document :

def connect(port, filename): # get the uno component context from the PyUNO runtime localContext = uno.getComponentContext() # create the UnoUrlResolver resolver = localContext.ServiceManager.createInstanceWithContext( "com.sun.star.bridge.UnoUrlResolver", localContext) # connect to the running office ctx = resolver.resolve("uno:socket,host=localhost,port=" + str(port) + ";urp;StarOffice.ComponentContext") smgr = ctx.ServiceManager # get the central desktop object DESKTOP =smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx) url = unohelper.systemPathToFileUrl( os.path.abspath(filename)) doc = DESKTOP.loadComponentFromURL(url, '_blank', 0, ()) return doc

You can get sheets inside document by creating an enumeration :

doc = connect(port, filename) sheets = doc.getSheets() sheet_enum = sheets.createEnumeration() while sheet_enum.hasMoreElements(): sheet = sheet_enum.nextElement() print sheet.getName()

Retrieve cells :

cell = sheet.getCellByPosition(col, row)

You can use following methods on cell objects : XCell

To retrieve cell type (CellContentType) :

cell.getType()

For me object (or enumeration) comparison fails, so I use string comparison :

if cell.getType().value != 'EMPTY':

cell.getValue() will return cell float value (0.0 if cell is empty or text). Most of the case you need to cast it into int value : int(cell.getValue()) or do all your code with float values !!

Be careful, sometimes cells values are formated with text but contains float/integer !! value = value_cell.getString() will return "0x45"

Now you have all basics to do a spreadsheet parser ! If you don't know how to handle an object, juste print it and look at its supportedInterfaces dictionary, OOo API doc will tells how to handle them.

Dans la maison

Monday, 15 October 2012
|
Écrit par
Grégory Soutadé

Affiche "Dans la maison"

Germain Germain aurait voulu être écrivain, seulement il n'a jamais eu le talent de ceux qu'il admire. Il s'est donc ré orienté en professeur de littérature. En ce début d'année, il corrige un devoir donné à sa classe de seconde : faire une rédaction sur son week end. Au milieu des copies médiocres il tombe sur le récit de Claude. Claude dit avoir observé tout l'été la maison de son camarade Raphaël, en imaginant comment la vie pouvait être à l'intérieur, la vie d'une famille normale. Cette année il a décidé de se lier d'amitié avec ce Raphaël pour pouvoir pénétrer la maison de ses fantasmes, concluant par un "À suivre". Germain, certainement curieux de connaître la suite de l'histoire, décèle dans la prose de Claude un talent indéniable. Il décide alors de l'encadrer pour la construction de sa nouvelle, sans savoir où s'arrête la fiction et commence la réalité.

Que l'on aime ou pas, "Dans la maison" est un des ces films qui sortent de l'ordinaire. En réalité c'est une adaptation d'une pièce Espagnole (Le Garçon du dernier rang). On assiste tout au long du film à la construction de la nouvelle qui alterne récit de Claude (qui va toujours plus loin dans la maison et dans la vie des Rapha) et correction du professeur, le tout avec une réalisation très audacieuse. Fabrice Luchini apparaît en second rôle, corrigeant, modifiant le script de son élève, mais il est parfaitement à l'aise à son poste. On sait l'amour qu'il porte pour la langue française, c'était donc un rôle prédestiné pour ce grand narrateur. Kristin Scott Thomas apparaît, elle aussi, en second rôle. S'il est un peu long sur la fin, il n'en reste pas moins un film très sympathique et original !

Activate eSata on Sheevaplug with Debian

Monday, 08 October 2012
|
Écrit par
Grégory Soutadé

esata.png

Activate eSata on Sheevaplug with Debian I recently bought an external hard disk with an eSata interface, it was not easy to find (almost are with USB2/3, other are expensive advanced NAS), but I did. The purpose of this disk is to make backups. But, on my Sheevaplug, the main partitions (/root, /boot...) are on an USB key (Toshiba 16 GB) running Debian stable. When I plugged my new hdd it was not recognized ! Actually I first configured my sheevaplug following some tutorials (http://www.cyrius.com/debian/kirkwood/sheevaplug/ for example). It was said to set the boot variable "arcNumber" to 2097. Why ? In facts ARM SoC doesn't have peripherals discovery mode, so you need to tell which board you're running on.

After looking a bit into Debian's kernel, it seems that eSata interface is activated only if arcNumber is set to 2678 ! If I do that, original Ubuntu on NAND flash (factory installation) doesn't recognize the current SoC because arcNumber 2678 is a patch from Debian (in original installation, eSata is activated by default). The second point is that if you set the board as an eSata board, Debian will try to boot on the eSata hard disk (even if you specify different kernel root=XX values).

So what to do ? The solution is to specify your partitions not using classic /dev/sdXXX format, but using UUID numbers. They are not human readable, nevertheless they refer to an unique partition ! The first step consists in listing your partitions UUID :

ls -l /dev/disk/by-uuid/ lrwxrwxrwx 1 root root 10 Sep 27 07:34 1642ad57-77aa-494c-aa77-6998d420eb8f -> ../../sda3 lrwxrwxrwx 1 root root 10 Sep 27 07:34 198239b4-ff16-4dda-8df0-37b106005817 -> ../../sda1 lrwxrwxrwx 1 root root 10 Sep 27 07:34 2e0cd399-3839-4e4e-bc57-5e6628841bc1 -> ../../sda2 lrwxrwxrwx 1 root root 10 Sep 27 07:34 dd27350b-2522-46a6-862e-0cbc072b535f -> ../../sda4

Then, edit /etc/fstab to use UUID and not /dev/sdXXX (it's fastidious I know) After that, you need to reboot with the serial console connected and stop automatic boot (type a key) to edit uBoot configuration. We'll set arcNumber to 2678 by default.

setenv arcNumber 2678

Then edit bootargs_options (for me it's bootargs_options_usb) to set correct UUID value

setenv usb_bootargs_root "root=UUID=2e0cd399-3839-4e4e-bc57-5e6628841bc1"

Last step is to edit the global boot_cmd to set arcNumber to 2097 before booting to NAND (in my case, if USB boot fails it will try to boot on MMC then on NAND) :

setenv bootcmd 'setenv arcNumber 2678; saveenv; run usb_boot; setenv arcNumber 2097; saveenv; run bootcmd_mmc; run bootcmd_nand'

Finally save environment variables to flash and boot

saveenv boot

My final environment variables

ethact=egiga0 bootargs_root=ubi.mtd=1 root=ubi0:rootfs rootfstype=ubifs mtdpartitions=mtdparts=orion_nand:0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs) ethaddr=00:50:43:01:4C:56 bootargs_console=console=ttyS0,115200 bootargs_root_nand=ubi.mtd=1 root=ubi0:rootfs rootfstype=ubifs bootcmd_nand=setenv bootargs $(bootargs_console) $(mtdpartitions) $(bootargs_root_nand); \ nand read.e 0x00800000 0x00100000 0x00400000; bootm 0x00800000 bootargs_root_mmc=root=/dev/mmcblk0p2 rootdelay=5 bootcmd_mmc=setenv bootargs $(bootargs_console) $(bootargs_root_mmc); mmcinit;\ ext2load mmc 0:1 0x800000 /uImage; bootm 0x00800000 real_bootcmd=run bootcmd_mmc; run bootcmd_nand filesize=32D62A usb_bootargs_console=console=ttyS0,115200 usb_bootcmd_usb=usb start; ext2load usb 0:1 0x01100000 /uInitrd; ext2load usb 0:1 0x00800000 /uImage usb_boot=setenv bootargs $(usb_bootargs_console) $(usb_bootargs_root); run usb_bootcmd_usb;\ bootm 0x00800000 0x01100000 mainlineLinus=yes bustargs_root_usbroot=/dev/sda2 usb_bootargs="root=UUID=2e0cd399-3839-4e4e-bc57-5e6628841bc1" stdin=serial stdout=serial stderr=serial mainlineLinux=yes enaMonExt=no enaCpuStream=no enaWrAllo=no pexMode=RC disL2Cache=no setL2CacheWT=yes disL2Prefetch=yes enaICPref=yes enaDCPref=yes sata_dma_mode=yes netbsd_en=no vxworks_en=no bootdelay=3 disaMvPnp=no enaAutoRecovery=yes

I added a rule in fstab to mount my hdd at startup

UUID=590f30b1-7727-4d0a-a86a-2360ec0b3f88 /media/backup ext4 defaults 0 1

A simple backup script based on rsync that power down disk after backup is done.

Le magasin des suicides

Monday, 01 October 2012
|
Écrit par
Grégory Soutadé

affiche "Le magasin des suicides"

Entre "Là-bas" et "Ailleurs" se trouve une ville, une ville grise, pluvieuse, morose, une ville où même les pigeons se suicident. À tel point que se suicider sur la voir publique est passible d'une amende ! Seulement, depuis 1854, la famille Tuvache veille au bien être des futurs suicidés : cordes, poison, armes blanches ou à feu, lames de rasoir, le Magasin des suicides vous offre tout ce dont vous avez besoin pour réussir votre suicide. Pour vous accueillir Mishima et Lucrèce sont là, accompagnés de leurs deux enfants Marylin et Vincent. Mais voilà que le troisième, Alan de son prénom, pointe le bout de son nez. Que diable, un enfant qui sourit ! Un enfant qui aime la vie ! Serait-ce bientôt la fin de l'entreprise familiale ?

"Le magasin des suicides" se pose en tant que comédie, même si certains propos peuvent heurter la sensibilité des plus jeunes. Une comédie, mais aussi une comédie musicale : il y a beaucoup de parties chantées. Cet aspect là n'est pas forcément le plus réussi, les chansons sont simples, pas forcément mélodieuses et ont la rime facile. En réalité c'est la transcription en film d'animation (2d ou 3d) du roman de Jean Teulé. Et sur ce point-là c'est une vraie réussite, le style graphique mis en avant est vraiment superbe et s'accorde parfaitement avec cet univers emplit de sinistrose. Un peu court du haut de son 1h25, il mérite toutefois le détour pour son originalité.

Les saveurs du palais

Tuesday, 25 September 2012
|
Écrit par
Grégory Soutadé

Affiche Les saveurs du palais

Le Président de la République souhaite retrouver le goût des choses simples, la cuisine de sa grand-mère. La cuisine centrale de l'Elysée perd donc la réalisation des repas du Président au profit de la réputée Hortense Laborie, tenant un restaurant dans le Périgord. C'est un grand honneur pour Hortense, néanmoins elle ne se doute pas des embûches qui vont parsemer son chemin.

Inspiré de faits réels (Danièle Delpeuch, cuisinière de François Mitterrand), le film passe... Le peu de rebondissements ne suffisent pas à capter l'attention du spectateur qui s'ennuie malgré l'attente des révélations finales. Le seul point positif est que Catherine Frot réussit à nous mettre l'eau à la bouche (ne pas regarder avant l'heure du repas).