~hruske Hruške, jabuke, jablane, čežane. » comp
Home Contact Sitemap

Hruške, jabuke, jablane, čežane.

Ste se gdaj vprašali, zakaj Najboljšega soseda nikoli ni doma, ko pridete na obisk?

Prosti podatki za zabavo: 22. Liffe

Posted on November 2nd, 2011 in dovhcajt, kultura, ljubljana, opendata, python, slovenija |

Prosti podatki so pogosto opevani kot zelo uporabna reč, vendar je očitno, da marsikdo te uporabnosti ne prepozna. Pa poglejmo zakaj so podatki, ki so dostopni v tabelarični obliki, lahko uporabni.

Recimo, da si na primer želimo ogledat kak film na Ljubljanskem mednarodnem filmskem festivalu. Izbire je preveč, zato je nujno narediti selekcijo. Kako to narediti? Ročni način bi bil, da z miško klikaš po seznamu, prebereš opise, morda pogledaš še video in si sproti ustvariš zaznamke. Če se ti da še malenkost bolj potrudit (ali če je opis premalo sporočilen), pogledaš še na IMDB za oceno. Na podlagi teh zaznamkov se potem odločiš za ožji izbor.

Malo manj ročni način je z uporabo računalniškega programa. Program festivala žal ni na voljo v tabelarični obliki, kar pomeni, da bo s pridobivanjem podatkov nekoliko več dela. Podatke je potrebno izvleči iz kode spletne strani.

Za programiranje bom uporabil prost programski jezik Python. Najprej preberimo kodo spletne strani. Da bo program “razumel” kodo, bomo uporabili dodatno knjižnico lxml. Sam sem uporabil Python 2.7 in lxml 2.3.

#!/usr/bin/python

# nalozimo knjiznico
import lxml.html

# naslov, kjer se nahaja program festivala
root = 'http://www.liffe.si/program/abc-seznam/'

# preberimo spletno stran
h = lxml.html.parse(root).getroot()
h.make_links_absolute(root)

Zdaj smo prebrali spletno stran. Ta se nahaja v spremenljivki h. Iz naložene spletne strani je zdaj potrebno dobiti zapise o posameznem filmu. Koda spletne strani ima obliko drevesa. S plezanjem po drevesni strukturi izberemo delčke strani, ki nas zanimajo. Če izberemo vse vrstice, bomo lahko prebrali vse filme.

# ... koda se nadaljuje od zgoraj

# zanimajo nas zapisi v tabeli filmov
# s spodnjim ukazom poiščemo vrstice (tr) znotraj tabele (table),
# ki se nahaja znotraj obrazca (form), katerega atribut "id" je "pluginAppForm"
trs = h.xpath('//form[@id="pluginAppForm"]//table/tr')

# seznam za shranjevanje zapisov
filmi = []

# sprehodimo se po vseh vrsticah
for tr in trs:
	# znotraj vrstice tr izberemo polja
	tds = tr.xpath('.//td')
	
	# iz vsakega polja poberemo besedilo
	teksti = []
	for c in tds:
		teksti = teksti + c.xpath('.//text()')
	
	# ker so v nekaterih vrsticah črte med črkami abecede,
	# je potrebno te vrstice ignorirati, kar naredimo tu
	if len(teksti) != 6:
		continue
	
	# izpisimo informacije, ki jih imamo sedaj
	print teksti
	
	# dodajmo informacije o filmu v seznam filmov
	filmi.append(teksti)

Datoteka: liffe1.py

Zdaj smo uspeli prebrati kar nekaj informacij o filmih, ki se bodo na festivalu predvajali. Slovenski naslov, naslov v izvirniku, država in leto, režiserja, jezik in kategorijo, v katero je na festivalu umeščen.

Ker bi želeli to prebrati kot preglednico, se nam splača to shraniti v zapis, ki ga bo prebavil Calc ali Excel. Najenostavnejši je CSV oz. z vejico ločena polja.

# informacije o filmih so shranjene v spremenljivki "filmi"

# nalozimo modul csv
import csv

# odprimo novo datoteko liffe22.csv, v katero bomo podatke shranili
wr = csv.writer(open('liffe22.csv','w'))

# vpisimo naslove stolpcev
wr.writerow(['Naslov', 'Originalni naslov', 'Drzava, Leto', 'Rezija', 'Jezik', 'Kategorija'])

# vsak film vpisemo v datoteko
for f in filmi:
	polja = []
	for p in f:
		polja.append(p.encode('utf-8'))
	wr.writerow(polja)

Datoteka: liffe2.py

Če sedaj datoteko liffe22.csv odpremo z Excelom oz. Calcom, bomo videli nekaj podobnega spodnji sliki:

Z uporabo preglednice lahko potem izvajamo bolj zanimive stvari, npr. filtriramo. Najprej uporabimo AutoFilter:

Če sedaj označimo, da želimo pregledati le perspektive, potem vidimo nekaj podobnega:

Če želimo pregledovati po letniku filma, pa naletimo na težavo, saj je leto združeno z državo. Zato moramo naš program malo popraviti:

...

	if len(teksti) != 6:
		continue
	
	# locimo drzavo in leto v dve polji
	drzava_leto = teksti[2].rsplit(', ', 1)
	
	# vkomponiramo novi polji
	teksti = teksti[:2] + drzava_leto + teksti[3:]
	
	# izpisimo informacije, ki jih imamo sedaj
	print teksti

...

# vpisimo naslove stolpcev
wr.writerow(['Naslov', 'Originalni naslov', 'Drzava', 'Leto', 'Rezija', 'Jezik', 'Kategorija'])
...

Datoteka: liffe3.py

Skoraj perfektno, sedaj lahko filtriramo tudi po letu izida.

Sedaj imamo podatke v tabelarični obliki v zapisu, ki ga lahko uporabimo, da podatke obogatimo še s čim drugim… na primer s podatki, ki so v IMDB. IMDB ima v bazi povprečje ocen filma, ki so jih filmu prisodili uporabniki, kar je včasih kar dober indikator. Dodajmo še to:

# nalozimo knjiznice
import lxml.html
import json
import urllib

...

	# locimo drzavo in leto v dve polji
	drzava_leto = teksti[2].rsplit(', ', 1)
	
	# dodajmo še ocene in žanr iz IMDB
	# sestavimo url
	orig_naslov = urllib.quote(unicode(teksti[1]).encode('utf-8'))
	url = 'http://www.imdbapi.com/?t=%s&y=%s' % (orig_naslov, drzava_leto[1])
	
	# prenesimo url
	imdb_text = urllib.urlopen(url).read()
	
	# nalozimo zapis v program
	imdb = json.loads(imdb_text)
	
	# preberemo oceno
	imdb_ocena = imdb.get('Rating', '')
	imdb_zanr = imdb.get('Genre', '')
	
	# vkomponiramo nova polja
	teksti = teksti[:2] + drzava_leto + teksti[3:] + [imdb_ocena, imdb_zanr]

...

wr.writerow(['Naslov', 'Originalni naslov', 'Drzava', 'Leto', 'Rezija', 'Jezik', 'Kategorija', 'IMDB ocena', 'IMDB zanr'])

...

Datoteki: liffe4.py in life22.csv

Tako dobljeno CSV datoteko zdaj ponovno odpremo s Calcom oz. Excelom, ponovno uporabimo AutoFilter in podatke posortiramo padajoče po IMDB oceni (Data -> Sort). Tako dobimo dobro informacijo če je določen film vreden ogleda ali vsi pred njim bežijo.

Seveda teh ocen ni nujno upoštevat. Liffe je super priložnost, da si človek ogleda kak tretji film, ki ga brez festivala sploh ne bi opazil.

Komentarji so izklopljeni

Mednarodna delavnica odprtih podatkov je uspela

Posted on December 6th, 2010 in ljubljana, opendata, python, slovenija |

V soboto je v 63 državah potekal open data hack day in ena izmed sodelujočih je bila prvič tudi Slovenija. Zbralo se nas je kakih osem, devet, kar se je izkazalo za ravno lepo število, da lahko že kaj naredimo. In kaj smo uspeli narediti?

V prvi vrsti je zelo pomemben popis virov podatkov, ki omogoča, da se sploh zavedamo do kakih podatkov je dostop trenutno možen in da obstaja katalog, ki popisuje vse te vire informacij. To je kar dobro uspelo, seveda pa je še kar ogromno zadev, ki še niso na seznamu.

Lotili smo se sicer večih vizualizacij, a dokočali smo le eno, je pa ta toliko bolj zanimiva – verjetnost, da bo vaš narobe parkiran avto v Ljubljani odpeljal pajek mestnega redarstva. Na voljo je tudi tabela vnosov na Google Docs.

Na koncu bi se prav lepo zahvalil Mateju Praprotniku, ki je pomagal pri organizaciji, in RTV Slovenija, ki je dogodku nudila prostor in prigrizek ter tako omogočila, da je bila prva delavnica prostih podatkov tako uspešna.

iPad zaradi iPada

Posted on November 4th, 2010 in comp, mediji, slovenija |

Vsakič, ko vidim kako slovensko časopisno hišo, kako izda novo iPad aplikacijo … se najprej nasmehnem, potem pa začnem odkimavati in skrivati obraz za dlanjo. Kako slepi morajo biti menedžerji, ki se za to odločijo!

Imeti svojo lastno iPad aplikacijo je v tem času zgolj prestiž. No, prestiž je, v kolikor ima aplikacija očesu prijeten in prstom prijazen uporabniški vmesnik, ki ga je veselje uporabljati. Ampak vemo, da se to zgodi le izjemoma in take aplikacije so redke, predvsem pa zelo drage za izdelavo.

Kolikšna bi bila cena ene povprečne, na novo razvite iPad aplikacije? Pokriti moramo stroške:

  • približno treh mesecev dela inženirja, recimo “kriznih” neto 900€/mesec, “bruto bruto” 1500€/mesec,
  • amortizacije iPada, ki smo ga kupili za razvoj, skupno 600€,
  • porabljene elektrike, stroške ogrevanja, internetne povezave in druge infrastrukture, 100-200€/mesec,

…  ne smemo pa pozabiti tudi ustvariti dobička.

Stroški za izdelavo so torej nekje okrog 2000€ mesečno, pokriti je potrebno še menedžment, prodajo in podporo, kar precej hitro pride do 1000€, na ta znesek pa moramo potem še prišteti 20% davka. Dobrih 3600€ na mesec, skupaj dobrih 10000€ – brez dobička. Velja pa omeniti, da so mobilne aplikacije tretutno zelo modne in so lahko tudi precej bolj dobičkonosne, če pa hočemo svoje inžinirje zgledno plačati, pa morajo ali delati hitreje oz. učinkoviteje ali pa moramo zvišati ceno.

Nič ne de, dobrih 10 tisoč evrov kasneje ima naš prestižni časnik iPad aplikacijo. Povprečno, nekvalitetno in čeprav se včasih sesuje, se lahko časnik še vedno z njo ponosno hvali.

Preskočimo pol leta in v soju medijske pozornosti je zopet Steve Jobs, ki predstavi krasno in revolucionarno novo izdajo iOS, operacijskega sistema, ki teče na iPadu. Ta nova izdaja pa spremeni določene zahteve in vaša iPad aplikacija bo zahtevala vzdrževalna dela. Ampak nič ne de, odpovedati se bomo morali še kakemu tisočaku ali trem, ampak iPad aplikacijo pa le imamo, in to šteje!

Četudi so z aplikacijo sami stroški.

iPadov bo v Sloveniji vedno samo kakih tisoč, morda dva. iPhoneov morda 5-10 tisoč. Takih uporabnikov, ki bi želeli na svojo iNapravo dati še eno povprečno aplikacijo in jo potem tudi uporabljati pa … ?

Medtem pa tisti, ki z brskalnikom na svoji iNapravi zaidejo na spletno stran taiste “prestižne” medijske hiše, vidijo ali neko PDA napravam prilagojeno spletno stran, ki je popolnoma neprimerna za uporabo na tako zmogljivi napravi, ali pa čisto navadno spletno stran. Časopisne hiše pa z vsakim takim naključnim obiskom izgubijo potencialne redne obiskovalce, hkrati pa zapravljajo na aplikaciji, ki bo na dolgi rok ostala neuporabljana, pozabljena in odvečna.

Enostavnost uporabe spletnih nagradnih iger

Posted on Junij 23rd, 2010 in comp, mediji, slovenija |

V zadnjem času so se na Slovenskem spletu razmahnile spletne nagradne igre. Od oblikovanja Šparovih vrečk, ki je manijo nakazal, do Nikonove spletne igre, ki je fenomenalen primer izvedbe spletne nagradne igre. Seveda pa se najdejo tudi manj uspešni posnemovalci.

No, nagradna igra Nikon zelo dobro uporabi vsa sodobna sredstva za dosego čim širše publike. Pri tem sta predvsem pomembna dva elementa – družabno omrežje Facebook in nizek prag sodelovanja. Zagotovo niso vsi opazili, ampak ta nagradna igra ima za sodelovanje izredno nizek prag. Za glasovanje je dovolj klik na gumb “glasuj” in ni potrebno izpolnjevanje polja z e-poštnim naslovom – v tem primeru si se pač odločil, da ne želiš sodelovati v žrebu za nagrado. Tehnično je glasovanje omejeno na eno glasovanje iz vsakega IP naslova na dan, s tako enostavno izvedbo glasovanja pa so si prislužili toliko obiska, da so se odločili, da bodo v ožji izbor za nagrajene sprejeli 500 namesto prvotnih 50 izdelkov.

Če je Nikonova nagradna igra fenomenalen uspeh, je nagradna igra, pri kateri oblikujete nalepke za hladilnik Beko popolna polomija. Nagradno igro sicer izvaja Big Bang, v kolikor še niste slišali za hladilnike Beko. Za glasovanje je potreben vnos e-poštnega naslova, na katerega se pošlje pošta. Ta pošta vsebuje povezavo, s katero lahko šele glasujete. Poleg tega je prejeta pošta uporabna zgolj v HTML formatu. To pomeni, da v nobenem primeru v nagradni igri ne morete sodelovati (niti zgolj glasovati), če ne vpišete e-poštnega naslova. Predvidevam, da je omejevanje glasov tehnično rešeno tako, da lahko vsaka oseba za enim e-poštnim naslovom glasuje enkrat na dan.

Od enega instinktivnega klika pri Nikonu do vpisovanja e-poštnega naslova, čakanja petih minut in šele potem klikanja na povezavo, ki glas odda pri nagradni igri Beko. Tudi s tehničnega vidika je veliko lažje namnožiti npr. 100 e-poštnih naslovov kot pa IP naslovov. Poleg tega lahko IP naslove še vedno omejite samo na Slovenske ponudnike in s tem zajamete samo Slovensko občinstvo, z e-poštnimi naslovi pa tega nikoli ne boste mogli narediti.

Tudi ob načrtovanju tako navidezno enostavne stvari, kot je spletna nagradna igra, lahko na koncu izvajalci podarijo spletu še eno spletno stran, ki je tako tehnično kot tudi uporabniško neustrezna in za katero bi bilo veliko bolje, če bi sploh ne obstajala.

Zemljemerske zapuščine

Posted on Maj 12th, 2010 in django, dovhcajt, python, slovenija |

Geodetska uprava Republike Slovenije daje na uporabo nekatere “brezplačne” geodetske podatke. Uporaba ni čisto brez omejitev, ampak so pa na voljo takoj, brez križev z birokracijo. Tudi čisto brezplačni niso, vsaj ne za komercialno rabo – od vas bojo podatki zahtevali najmanj to, da nejasne pogoje uporabe, v katerih je nepooblaščena uporaba celo zagrožena z globo, pregleda pravniško oko.

Če prepustimo pravniške zadeve pravnikom, nam ostane še tehnični del, ki pa v sebi skriva prav toliko nejasnosti. Geodetski podatki, ki so na voljo, so namreč zapisani v Slovenskem prostorskem referenčnem sistemu, bodisi D48/GK ali D96/TM. Spletne aplikacije po večini uporabljajo WGS84, ki je uporaben za celotno Zemljo, a je zato na lokalnem nivoju nekoliko manj natančen. WGS84 sicer uporablja tudi standard GPS, ki ga poznate iz raznih garminov in nekoliko dražjih telefonov. Za pretvarjanje iz enega prostorskega referenčnega sistema v drugega sicer obstajajo “recepti”, ki v sebi skrivajo 7 parametrov, s katerimi opišemo transformacije.

Transformacija iz D48/GK - neuspešno

Ob uporabi napačnih vrednosti parametrov se seveda transformacija izvede narobe, kot rezultat pa so potem meje občine ali države na zemljevidu, ko jih primerjaš z npr. Google maps, zamaknjene. Seveda “ročno” popravljanje odpade: če na eni strani države še ujameš pravo koordinato, se ti na drugem koncu sfiži. Zato je potrebno poznati pravih 7 vrednosti parametrov. No, za te transformacije sicer obstaja register, ki ga vzdržuje European Petroleum Survey Group – EPSG. V tem registru je zbrano malo morje informacij o prostorskih referenčnih sistemih, vendar se izkaže, da je točnost teh podatkov včasih vprašljiva.

V starih časih, preden so “izumili” Greenwich, oz. se dogovorili, da je nulti poldnevnik Greenwich, so za nulti poldnevnik jemali marsikaj. Nekateri “veliki imperiji” so vzeli sedež imperija – Italija je vzela Rim, Nemčija Berlin, Francija Pariz, Anglija pa London, oz. natančneje del Londona, poimenovan Greenwich. Kasneje je Greenwich – predvsem zaradi svoje razširjenosti za pomorsko navigacijo – postal tudi mednarodni referenčni poldnevnik.

Transformacija iz D48/GK - zmaga!

No, ker so bili v uporabi različni poldnevniki, se je moralo izvesti tudi prehod na novi standard – Greenwich. Za Slovenijo, takrat sicer Avstro-Ogrsko, je geodetske podatke urejal Militärgeographisches institut oz. MGI. Za referenčni poldnevnik je MGI vzel otok Hierro, ki je najzahodnejši del “Starega sveta”, ki so ga poznali do Kolumbovega podviga. Po razpadu Avstro-Ogrske je na njenem območju nastalo več držav, ki so nasledile dediščino MGI. Te države so kasneje tudi izvedle prehod na Greenwich kot referenčni poldnevnik, a pri tem je prišlo do neskladja – Avstrija je za poldnevnik Hierro vzela, da leži na 17° 40′ 00″ zahodno, medtem ko sta Jugoslavija in Madžarska privzeli, da je Hierro na 17° 39′ 46” zahodno. Pri tem je nastalo za 14” razlike, kar je ravno okrog 300m in dovolj, da meje območja na Google maps izgledajo popolnoma napačno.

Zakaj je do te “napake” prišlo in kdo je kriv je zdaj že vseeno, važno pa je, da smo dobili prave parametre, tako da zdaj transformacija deluje, da so podatki v WGS84 in da se projekcije pokrijejo. No, sicer še vedno nisem stoodstotno prepričan, da je to prava transformacija, ampak sodeč po odstopanjih je kar blizu. Za transformacijo sem vzel WKT za SRS 3787, zraven pa pri 6. parametru odštel 14 (za 14 sekund), da se odstopanje popravi.

Komentarji so izklopljeni