Archive

Posts Tagged ‘python’

Python, Maemo, WLAN & webbrowser

April 25th, 2010

Just scratched an itch with a couple of lines of Python code, which launches a browser if my cellphone (Nokia N900, Maemo 5) connects to a specific WLAN. The WLAN names to look for, as well as the URL that is opened in the browser are specified in gconf.
The itch is about WLANs with login pages/portals and is reported in Maemo bug tracker as Bug 7678.

I put the source on source.wendt.se but also “inlined” here (spaces might get truncated by WordPress):

#!/usr/bin/python2.5 
 
"""
This is a quick hack that launches a browser when the device connects to an IAP with a
name that is present in gconf key 
 
There's no fancy GUI. To set the IAP names to listen for, run:
gconftool-2 -s --type=list --list-type=string "/apps/wlan-browser-launcher/iap-names" "[limbergwendt2,CSWLAN]"
 
To change the URL that opens, run
gconftool-2 -s --type=string "/apps/wlan-browser-launcher/url" "http://wendt.se/ip/"
 
All gconf values are re-read on each connect signal.
 
Based on Conic examples on PyMaemo wiki by Lauro Moura [lauro .neto_indt.org.br].
"""
 
import conic
import dbus
import gobject
import gnome.gconf
import dbus.glib
import webbrowser
 
GCONF_KEY_NAMES = "/apps/wlan-browser-launcher/iap-names"
GCONF_KEY_URL = "/apps/wlan-browser-launcher/url"
 
iap_id_to_name = {}
names_to_look_for = []
 
def load_iap_id_to_name(connection):
    global iap_id_to_name
    iap_id_to_name = {}
    iaps = connection.get_all_iaps()
    for iap in iaps:
        iap_id = iap.get_id()
        iap_name = iap.get_name()
        iap_id_to_name[iap_id] = iap_name
 
def load_names_to_look_for():
    global names_to_look_for, url_to_open
    gc = gnome.gconf.client_get_default()
    names_to_look_for = gc.get_list(GCONF_KEY_NAMES, gnome.gconf.VALUE_STRING)
    url_to_open = gc.get_string(GCONF_KEY_URL)
    print "Looking for IAP with these names: %s" % names_to_look_for
 
def connection_cb(connection, event):
    global iap_id_to_name, names_to_look_for, url_to_open
    status = event.get_status()
    iap_id = event.get_iap_id()
    if status == conic.STATUS_CONNECTED:
        load_iap_id_to_name(connection)
        load_names_to_look_for()
        iap_name = 'UNRECOGNIZED'
        if (iap_id_to_name.has_key(iap_id)):
            iap_name = iap_id_to_name[iap_id]
        print "CONNECTED (%s, %s, %i)" % (iap_id, iap_name, status)
 
        if (iap_name in names_to_look_for):
            if (not url_to_open):
                print "No URL setup for gconf key %s: not launching browser" % GCONF_KEY_URL
            else:
                print "Opening browser (pointing it to %s) for IAP %s" % (url_to_open, iap_name)
                webbrowser.open_new(url_to_open)
 
def start():
    connection = conic.Connection()
    connection.connect("connection-event", connection_cb)
    connection.set_property("automatic-connection-events", True)
    return connection
 
def stop(connection, loop):
    connection.set_property("automatic-connection-events", False)
    loop.quit()
 
def check_browser():
     gc = gnome.gconf.client_get_default()
     if (gc.get_string('/desktop/gnome/url-handlers/http/command') == 'epiphany %s'):
         raise Exception('Browser in gconf invalid (see NB#136012). Installation error.')
 
if __name__ == "__main__":
    check_browser()
    loop = gobject.MainLoop()
    bus = dbus.SystemBus(private=True)
 
    connection = start()
    loop.run()
    stop(connection, loop)

Fredrik Wendt Uncategorized , , ,

Dags att växla upp

February 17th, 2010

Behövde tanka Ubuntu Desktop-skivan och jag tänkte att jag lika gärna kan låta arla (fil-maskin) servera Ubuntu-avbilder 24/7. Hur som, för att från min laptop lägga till en torrent på arla gjordes följande:

easy_install -U transmissionrpc
cat > /usr/local/bin/torrent-relay
#!/usr/bin/python

import sys
from base64 import b64encode
import transmissionrpc

HOST = "filserver"
PORT = 9091

filename = sys.argv[1]
metainfo = b64encode(open(filename, 'rb').read())

tc = transmissionrpc.Client(HOST, port=PORT)
tc.add(metainfo)

Fredrik Wendt Uncategorized , , ,

Konvertera SVG till PNG

February 14th, 2010

Jag har haft stor glädje av Gnome-grafikerna ikoner de sista dagarna då jag gjort presenatationer på olika ämnen (just nu sitter jag och försöker städa upp introbilderna till TDD och JDojo). OpenOffice hanterar dock inte av SVG-filerna snyggt - det ser riktigt illa ut tyvärr. Så, lösningen har varit att konvertera dem till PNG istället (för hand) till 320×320 pixlar - det räcker fint för att det skall se bra ut på projektor.

Det jag ville göra nu var att slippa utföra jobbet för hand, och det lyckades jag inte med (trodde jag). ImageMagick (convert) gjorde nämligen att det blev svart bakgrund istället för transparent. Efter att jag fick igång den interaktiva python-fu-prompten så fick jag ut svart bakgrund där också, och även http://guillaume.segu.in/blog/code/43/svg-to-png/ producerade svart bakgrund … Sedan tittade jag på filerna utan att använda Eye Of Gnome (eog) och upptäckte att det visst var fina bilder med fin transparent bakgrund. Problemet var helt enkelt att jag lurats av eog.

Well well, här är python-koden som behövs för att skripta Gimp:

>>> import sys
>>> import os
>>> from gimpfu import *
>>> image = pdb.file_svg_load(filename, filename, 90, 320, 320, 0) #dpi, w, h, paths
>>> drawable = pdb.gimp_image_active_drawable(image)
>>> pdb.file_png_save2(image, drawable, outfilename, outfilename, 1, 9, 1, 1, 1, 1, 1, 0, 1)

Riktigt trevligt. :)

Fredrik Wendt Uncategorized , , , , , , , ,

PyUseCase för ExtJS

December 21st, 2009

Häromdagen var jag på GothPy-möte och fick se och testa på PyUseCase. Efteråt funderade jag på det 18-månadersprojekt (~8 utvecklare) jag nyss avslutat där ExtJS varit GUI-ramverket i applikationen (dvs en Rich Internet Application).

PyUseCase för ExtJS

  1. Det hade varit väldigt användbart.
  2. Jag har inte sett något liknande för webb.
  3. Jag tror inte att det är omöjligt …
  4. … men det kan kräva en hel del kunskap (om Selenium IDE) och kod att få till. :/

Jag har ännu inte kollat på Selenium 2. Jag har inte testkört Bromine utan bara tittat på dess screencast. ** I början av projektet jag satt på pratade vi dock om att det hade varit fint att ta oss till den nivån att man hade selenium-test som verifierade use case. Det närmaste jag såg ett verktyg som skulle kunna stödja det var STIQ, men organisationen ville inte testa detta - att använda Selenium var tillräcklig risk i projektet tyckte man.

** “Management can look at the icons ” 7 minuter in i filmen :)

Versionshantering

Varken STIQ eller Bromine verkar dock versionshantera testen, eller gruppera dem i “detta är use-casen för sprint 10″, och det är något jag känner att jag saknar. Under de 18 månader vi jobbade så byggdes flera funktioner om, så i sprint 10 kanske vi stödde 15 Use case, medan sprint 11 bara klarade 12 eftersom 3 skrevs om.

Sättet vi hanterade det på var att kommentera bort test case från testsviten. Inte snyggt, men eftersom Hudson mailade oss varje gång testen inte fungerade var vi nästan tvungna …

Avslutande tankar

  • Det jag gillar med Bromine är kopplingen till krav/use case.
  • Det jag gillar med STIQ är wiki-hanteringen och att man försöker abstrahera testen till logiska enheter/interaktionssteg.
  • Det jag gillar med PyUseCase (för GTK) är hur inspelningen mappar till logisk enhet/interaktionssteg. Separationen med texttest är inte dum, eftersom valideringsbiten faller bort från stegen som behövs för att utföra use caset. Att ha två representationer av GUI:t (en ASCII-art och en verklig) är dock inte intuitivt för mig och känns som ren duplicering. Kanske är det ett nödvändigt ont man får acceptera för att få rena “use case test”?
  • Med ett UI-ramverk som ExtJS borde man kunna lyssna på komponenter på samma sätt som PyUseCase gör med PyGTK. ASCII-art-rendreringen server side (eller iaf någon logg) är jag tveksam till.

Fredrik Wendt Uncategorized , , , , , ,

Python and Maemo, where’s that N900

December 3rd, 2009

Work in progress! :)

Väntar tålmodigt på att Nokia Online Store skall skicka mig meddelande om att “nu är din beställning skickad” - i Italien verkar utrullningen vara i full gång, i Sverige har den inte börjat ännu. Senaste budet är att i vecka 50 kommer de första beställningarna skickas ut. Vet inte om jag ligger med bland dem.

Nåväl. Jag har jobbat på att få till en applikation som kan visa avgångar och resvägar inom Göteborg med hjälp av Västtrafiks web services. Det har tagit ungefär så lång tid som jag förävntat mig och följande var utmaningarna.

Get the Flash Player to see this player.

Python

Jag är inte överens om att block-level avgörs av indentering - vilket företag vill betala utvecklare för att sitta och flytta kod till vänster och höger? Jag programmerar mycket hellre med {} och låter ett verktyg formatera koden “vackert”.

IDE - här har jag dock varit lat. PyEclipse skall tydligen vara rätt bra och ge bra stöd (hoppas det finns code completion-stöd för gtk.* med signaler och annat?)

PyGtk (API)

Väldokumenterat. Ihop med GTK+-dokumentationen måste jag säga att det är komplett. Widget-galleriet är också kanon att kunna snegla på.

PyMaemo och Hildon

(API) Hildon C-API

Detta upplever jag vara den svagaste länken i kedjan. Att jobba med en touch-applikation är nytt för mig, och jag gissar att det gäller många andra också, och då behövs vägledning, widget gallerier och tonvis med exempel så att man kan få en känsla för hur man bör bygga bra GUI:n.

Lite vägledning finns (plus Nokias UI guide lines och usability-dokument), men widget galleri och tonvis med exempel saknas - det finns ett tiotal exempel som visar lika många widgets, men inte ett enda “riktigt” program.

Py* för Web Services

Efter att ha prövat ett par bibliotek, alla med olika tillkortakommanden (schematolkning, teckenkodning, …), så stötte jag på suds som fungerar utmärkt om man bara vill ha en väl fungerande klientdel.

PS

Screen captures with XVidCap, konverterat med

ffmpeg -y -i test-0000.mpeg -qscale 5 -an -s 400x240 -f flv test.flv

Get the Flash Player to see this player.

Fredrik Wendt Uncategorized , , , , , , , , , ,

Hur går bygget?

July 10th, 2009
I-Buddy

I-Buddy

Låt en kompis berätta, en I-Buddy. Med lite python har andra lyckats hacka ihop lite enkel styrning. Finns även javalib för samma sak. Bara att sätta ihop när tid finns.

Fredrik Wendt Uncategorized , , ,