Visar inlägg med etikett Python. Visa alla inlägg
Visar inlägg med etikett Python. Visa alla inlägg

2010-11-03

Nästa funktion

C.

Det slog mig att nästlade funktioner borde kunna användas för att göra kod mer läsbar. Istället för att deklarera en privat hjälpfunktion som bara används på ett ställe som static och lägga den ovanför den anropande funktionen (eller, om man är en idiot som dricker bärs och lyssnar på skitmusik: efteråt, och med en för-deklaration längre upp), så stoppar man in den direkt i den anropande funktionen.

En sådan nästlad funktion kommunicerar tydligare än en static-funktion: den är uppenbart en privat hjälpfunktion, eftersom den bara kan anropas från den omslutande funktionen. Man slipper att idioter som dricker bärs och lyssnar på skitmusik lägger sina hjälpfunktioner var som helst i filen, använder fördeklarationer och låter bli att göra dem static. (Idioten som dricker bärs och lyssnar på skitmusik skulle givetvis ändå undvika att använda nästlade funktioner, för att göra koden så oläsbar som möjligt.)

Sen att det här är totalt oanvändbart i praktiken, eftersom det bara stöds av GCC, ja, det är ju lite trist. Men i framtiden kommer nog alla använda Lisp, Scala och Python istället för C. Och kanske Ada. Nej, inte Ada. Idioten som dricker bärs och lyssnar på skitmusik skulle antagligen välja Ada. Eller C#.

2010-05-02

Om att skriva en app till Boxee, del 2

Efter ett andra ryck med SVTPlay-appen så har jag nu något som det funkar att använda. Åtminstone delvis. Jag återkommer till det. Så här kan det se ut:



Åh, snyggt UI! Och så står det "Hello, how are you?", så sympatiskt! Lite grejer att välja på: Barn, Drama, Nyheter... Nej, vet du vad, jag vill se något underhållande! Kultur och nöje låter som min grej!



Här fanns det både roliga och tråkiga grejer, ser det ut som: Babel, Fy Bubblan, Cirkus, det låter som värsta skiten. Jag vill se Det kungliga bröllopet!



Fyra hela avsnitt, på SVT snålas det inte! Jag tror att jag vill se Det Senaste(tm), så jag plockar det...



Ahhhh... Kunglig underhållning!

Vissa brister i appen framgår redan av bilderna ovan. UI:t är inte helt perfekt. Typ det är fult som fan. Det går det nog att fixa. Webbskrapningskoden buggar ur här och där, så ibland kanske ett avsnitt inte heter någonting. Det går nog också att fixa. Bara de program som räknas upp på den första webb-sidan dyker upp. Det tänkte jag fixa. Det finns inte med några beskrivningar eller bilder. Det tänkte jag också fixa.

Det börjar kännas ganska trevligt med webb-programmering. Det går fort och är enkelt, även om man inte vet vad man sysslar med eller har några vidare verktyg att jobba med. Förutom det här skrapandet då, det känns mest hemskt, och jag försöker att inte tänka på det. SVTPlay behöver ett publikt API. Alla borde ha det. Tänk så enkelt allt skulle vara då.

Musik-visualisering

Sådan här musik-visualisering som används i musikspelare, går den någonsin framåt? Det slog igenom med Winamp på 90-talet, och var ganska snart så mainstream att till och med Windows Media Player använde det. I nådens år 2010 sitter jag och lyssnar på musik med Boxee och ser ingen skillnad på hur det såg ut på 90-talet. Eller när det nu var Jeff Minter fipplade med de här sakerna på Amigan.



Rent grafiskt har det kanske blivit lite bättre. Nu kan man använda shaders, det kanske gör någon skillnad. Men det är fortfarande samma primitiva analys av ljudet. Visualiseringen är likadan oavsett om man lyssnar på techno eller mongolisk strupsång. För den mesta musik jag lyssnar på gör visualiseringen mest att jag får associationer till Monty Python.

Och tycker någon över huvud taget om skiten? Att det faktiskt används och tvingas på en, vad beror det på? Görs det bara av gammal vana, för att man tror att det är vad användarna förväntar sig, eller finns det faktiskt folk som tycker att det tillför något? Funkar det i kombination med hallucinogena substanser?

2010-05-01

Om att skriva en app till Boxee

Det stör mig lite att det inte finns någon SVTPlay-app till Boxee, så jag tänkte att jag skulle skriva en. Det finns en till Plex, så jag tänkte att det inte borde vara så svårt att porta den. Det visade sig vara lite svårare än vad jag hade tänkt.

Boxee har ett eget API för att skriva appar: man specificerar sitt UI i XML och drar in lite Python-kod här och där för att göra saker, t.ex. skrapa info från SVTPlays HTML. XML-en i sig är ganska knölig att jobba med. En enkel kontroll kan se ut så här:

<control type="image">
<posx>0</posx>
<posy>0</posy>
<width>1280</width>
<height>720</height>
<texture>background.png</texture>
</control>

Det blir ganska mycket XML. Det kan man klara, även om XML:en blir ganska rörig. Ännu rörigare blir det när man börjar embedda Python-kod i den.

SVTPlay-appen till Plex är skriven helt i Python. Jag måste alltså plocka ut delar ut Plex-appen och använda i min. Där dyker nästa problem upp. I Plex finns det Python-API:er för att manipulera XML, t.ex. så finns xpath implementerat. Boxee har inget sådant, och dessutom så kör Boxee Python 2.4, som inte har stöd för xpath. Så jag får skriva om all kod från Plex-appen och gjorde en egen ful-implementation av xpath. Jag läser in HTML:en från SVTPlay som ett DOM-träd och söker själv igenom det.

Det här kanske hade varit enkelt om jag hade kunnat Python, men det gör jag ju inte. Så efter ett par timmars kodande så har jag slutligen klarat av nummer ett på min TODO-lista, att kunna visa upp en lista med program-kategorierna (Barn, Nyheter, Live etc.). Förhoppningsvis går det lite lättare nu när jag har lärt mig hantera DOM-trädet, unicode etc.

Med lite mer vana så borde det vara ganska smidigt att skriva sådana här appar, fast det kommer nog vara uppförsbacke ett tag till.

2010-01-05

Konkret syntax från abstrakt syntax

Tittade lite på ast-modulen i Python, där ast står för Abstract Syntax Tree. Man kan använda den för att parsa Python-kod och analysera eller modifiera parse-trädet. Rätt coolt. Så här kan det se när en Python-n00b använder ast för att leta upp och skriva ut en funktion i en källkodsfil:


import ast

def find_last_line(func):
last_line = 0

for n in ast.walk(func):
if isinstance(n, ast.stmt) and n.lineno > last_line:
last_line = n.lineno

return last_line

def find_func(func_name, parse_tree):
for n in ast.iter_child_nodes(parse_tree):
if isinstance(n, ast.FunctionDef) and n.name == func_name:
return n

def read_file(filename):
f = open(filename, 'r')
text = f.read()
f.close()

return text

source = read_file('test_ast.py')
lines = source.split('\n')

p = ast.parse(source)

func_node = find_func('find_func', p)
last_line = find_last_line(func_node)

for l in lines[func_node.lineno-1:last_line]:
print l


Kanske inte världens mest solida kod, men vafan. Funkar det då? Ja, det är väl för i helvete klart att det funkar:


Olsson:testo linusakerlund$ python test_ast.py
def find_func(func_name, parse_tree):
for n in ast.iter_child_nodes(parse_tree):
if isinstance(n, ast.FunctionDef) and n.name == func_name:
return n
Olsson:testo linusakerlund$


Sensmoral: det är trevligt med högnivåspråk ibland.

2008-07-06

Massor av ljud i Python

Jag (erkänner helt öppet att jag) läste senaste numret av Linux Weekly News, där jag hittade nyheten att One Laptop Per Child-projektet har släppt ett samplingsbibliotek med över 8000 samplingar för fri nedladdning. Jag vet inte hur just du skulle reagera på en sådan nyhet, men min reaktion var att jag kände att jag måste skriva ett program som slumpar fram "musik" ur den här högen ljud.

Mina tidigare erfarenheter av att skriva ljudkod i mitt standardspråk C är att det brukar bli för jobbigt och att jag ger upp. Men Python då? Det har jag ju ändå tänkt lära mig någon gång. Att programmera i Python är typ 1000 gånger enklare än C, om man kan det, och det finns rutiner för att ladda och spara ljudfiler i standardbiblioteket. Bara att köra alltså. Jag skrev lite kod för att ladda och spara ljudfiler, vilket tog fem minuter. Mitt nästa steg var att testa lite enkla manipulationer av ljudbufferten. Där tog det stopp i över en timme, medan mr. Python n00b försökte ta reda på hur en int kan tryckas in i en sträng av bytes. I C hade man castat och varit klar. I Python, lärde jag mig till slut, kan man använda struct.pack(). Så nu sitter jag här med ett program på 21 rader som kan vända på en sampling, och känner mig nöjd tills vidare.

Kanske orkar jag vidare imorgon. Det känns som om jag har löst det ena av två svåra problem nu. (Det andra är hur jag ska få tag på 10GB ledigt diskutrymme till samplingarna.)