Izgleda da je ovo tjedan 5 lajnera u pythonu. Anywho, radim neki backend za jedan hax0rski portal. U biti, radim neuspješnu reinkarnaciju Metafeeda-a u vidu naslovnice za site Razmjena vještina. Svečana prezentacija bi trebala biti na "Ništa se neće dogoditi". Nakon toga siguran sam da će to biti vaš prvi (ako ne i jedini) feed uz koji ćete ujutro pijuckati kavu.

Daklem... jedna od stvari koja mi treba za backend portala je operacija "uzmi mi random sliku sa images.google.com". Mislio sam da će biti nekog HTML parsanja sa BeautifulSoup ali moj dragi Google me lijepo iznenadio. Pljunu natrag gomilu JavaScripta koji izgenerira stranicu u samom Browseru. Koristeći najobičniji regular expression uzmem sadržaj tog JavaScript Arraya (kao string). Zgodno je što je u ovom slučaju sintaksa za Array polja u JavaScriptu identična Pythonovim listama pa iskoristim običan Pythonov eval da od toga dobijem Pythonovu listu. Da sam i imao želju za Djeda Mraza (iliti lika sa Coca-Coline reklame) ne bi bilo ovako lako na kraju.

Naravno, cijela ova fora će raditi dok Google ne odluči promjeniti sintaksu. Cilj skripte je pokazati ukratko kako sam rješio problem dobivanja URL-a slike (a i da popunim blog ovom trivijalijom). Zbog toga i nisam onečistio code sa provjerama u slučaju grešaka i neispravnih rezultata. Baš mi nešto i ne radi num argument za podešavanje broja rezultata na stranici. Zato koristim argument -p koji mi kaže na koju stranicu rezultata da odem.

Upotreba:

skini.py -p 4 krava muzara
skini.py -r svinjska gripa
 

Skripta skini.py:

#!/usr/bin/python

import urllib2, urllib, re, sys, getopt, random

def fetchURL(query, start = 0):
    req = urllib2.Request('http://images.google.com/images?hl=en&q=%s&gbv=2&aq=f&oq=&aqi=g10&start=%s' % (urllib.quote_plus(query), start))
    req.add_header('User-Agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.1pre) Gecko/20090701 Ubuntu/8.10 (intrepid) Shiretoko/3.5.1pre')
    req.add_header('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')
    req.add_header('Accept-Language', 'en-us,en;q=0.5')
    req.add_header('Accept-Encoding', 'deflate')
    req.add_header('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.7')
    req.add_header('Connection', 'close')
    r = urllib2.urlopen(req)
    data =  r.read()
    return data

def parseImages(data):
    p = re.compile(";dyn\.setResults\(\[(.+)\]\);\<\/script\>")
    m = p.search(data)
    lst = eval(m.group(1))
    return lst

if __name__ == '__main__':
    try:
        optlist, args = getopt.getopt(sys.argv[1:], 'rp:')
    except getopt.GetoptError, err:
        print "skini.py [-p <page number>] [-r] args\n"
        print str(err)
        sys.exit(-1)
    start, isRandom = 0, False
    for arg, value in optlist:
        if arg == '-p': start = value
        if arg == '-r': isRandom = True
    data = fetchURL(' '.join(args), start = start)
    images = parseImages(data)
    if not isRandom:
        for img in images:
            print img[3]
    else:
        print random.choice(images)[3]
 

Stukas im Visier

Mon, 12/15/2008 - 08:55 | Add new comment


Ideja mi je da verzija Franje 0.10 bude za javnost. Do tada se suzdržite od glupih komentara i savjeta. Ne treba biti Sherlock Holmes da se pročita obavjest koja piše na dnu stranice.

Daklem. Dodao sam na početku upozorenje ako ste korisnik Opere ili Explodera. Ako ste jedan od korisnika Firefoxa koji dobiva katastrofalno loš FPS dobit ćete također malo upozorenje. Upoznat sam sa situacijama gdje Franjo bude neupotrebljiv sa Firefoxom ali moram priznati da me za sad taj problem ne brine. Ne brine me jer nemam Firefoxa gdje to mogu testirati, jer na mojih 10 browsera koje sam probao na različitim platformama sve radi dobro a i brzi google search mi kaže da bi uzrok problemu sa Firefoxom i Canvasom mogao biti negdje drugdje (surprise, surprise).

Postoji još određeni broj bugova koji se mogu odmah zamjetiti ali plan mi je do 0.10 to sve ispraviti. Od novosti imamo:
* sustav menija
* učitavanje mape
* sa Q i ESC izlazimo van
* P za pauzu
* oblaci usporavaju
* univerzalan način hendlanja pozicije objekta => omogućen detection
* game over kad lupiš u zemlju
* bomba i govno padaju dobro
* bomba detektira zemlju
* lubanje u terenu
* nisam htio ali eto, koristim jquery sada
* ispravljeni neki bugovi, nadopisano dosta novih stvari

http://www.binarni.net/projects/franjo/

Slijedeće što ću mijenjati će biti pozicioniranje objekata na teren. Za sad je to obična glupa for petlja na client strani ali plan mi je to prebaciti na server stranu i učiniti znatno inteligentnijim. Za sad je to toliko glupo da katkada treba refreshati ne bi li se dobio teren sa dobro raspoređenim tenkovima i kravicama.

Internet je baš super stvar. U davno vrijeme DOS-a pisao sam neke svoje TSR programčiće da mi snime sadržaj video memorije na disk. Alatići da mi to konvertiraju u PCX ili pitaj boga koji je ono format bio aktualan. Sve to ne bi li se domogao neke grafike koju bih mogao naknadno modificirati za svoje potrebe. Sad odem na advanced search na flickeru, kažem da hoću materijal koji mogu modificirati i eto Aci slike tužnog ćuke. Divno!


Franjo gura svojim tempom i ne brine se previše za lavež sa strane. S obzirom da imam stalni posao + 4 posla u fušu (plus jedan zabavni projekat za Oca) koja radim nakon posla ovo sa Franjom se dosta brzo i odvija. Možda čak i prebrzo.

Klik da probate novog Franju: http://www.binarni.net/projects/franjo/

Anywho, dodao sam nekoliko stvari u Franju. Prva i najvidljivija je koliko toliko normalan teren. Teren se generira na server strani svaki put kod startanja (od tud i početno usporenje sada). Na 10,000 kockica generiram 6,000 brda različitih veličina (imam neki raspon ali za sad nemam postotke da pogodim teren brdovite Bosne). Nakon toga teren se normalizira, malo se i poglede rubovi (s ovim još eksperimentiram) i pošalje se clientu. U usporedbi s onim prvim čistim randomom (začudo, nitko se nije bunio na taj izgled) ovo je predivno. Ove dvije slike i nisu baš jako reprezentativne.

Druga stvar koju sam dodao je mala kravica. Ono što je specifično kod kravice je da je animirana. Ako proletite sporo pokraj kravice vidjet ćete animaciju. Treća stvar je lagano izmjenjeni code koji se brine za dinamičke objekte (za sada švabski avion, panzer, krava, oblak). Izbacio sam neko Array sliceanje u nadi da će me to rješiti onog povremenog zastajkivanja koje se dešava. Naravno, to nije bilo to.


Zadnja stvar koju sam dodao je mali pokazivač trenutnog FPS-a. Moja najveća briga kod Franje je sama brzina. Kao što ste možda i zaključili, brzina izvođenja Franje uvelike ovisi o izboru vašeg operativnog sustava, browsera ali i poinstaliravanih pluginova. Naime, probao sam kako brzo radi na jednom Mac Pro (8-Coreova, 16Gb RAM-a) iz Firefoxa koji je imao instalirane pluginove za blockiranje skripti itd. Totalna katastrofa, 5 puta sporije nego na mom MacBooku kad je na 800Mhz. Na mom Terminusu (Lenovo W500) sa Linuxom brzina je zadovoljavajuća, samo što aviončić zna flickerati prilikom iscrtavanja. Izrazito iritantno. Po prvim rezultatima što se tiče FPS-a najsporija je Opera 9.6x/10.x, zatim Firefox 3.0.4 te na kraju ubjedljivo najbolji Safari 3.1.2 sa 90 FPS-a. Budem probao i ostale verzije a možete mi javiti i vi vaše rezultate te specifikaciju na čemu ste probali.

Što se tiče daljnjeg razvoja. Budem posložio inicijalno učitavanje igrice, malo ajaxa, progress bar dok se učitava mapa itd. Trebao bih i generiranje smetala staviti na server side. Kao što sam i rekao, najveća briga mi je konačna brzina. Odluku o tome da li će se moći u jednom trenutku baciti samo jedna ili više bombi (jer više bombi može uzrokovati više esplozija. više eksplozija znači više crtanja a sve to u konačnici znači sporiji scroll sa zastajkivanjem) ću donjeti kad isprobam neke modele eksplozija.

Ni meni do sada većina generalnih ideja oko Franje nije bila jasna. Ne želim raditi tipičnu pucačinu jer 1) ja ne volim pucačine 2) ja ne mogu sa canvasom i javascriptom napraviti konkurentnu pucačinu. Dosta stvari u igri će biti oko Priče i dosta misija će se baviti izbjegavanjem prepreka, skupljanjem stvari te dostavljanjem paketa na teren. Između misija će biti male igrice (za sad tajna kakve). Paketi će varirati od cigara za druga Titu, novog britanskog špijuna, oružje Savi Kovačeviću na Sutjesku, novi Politički da popravi poljuljani moral u jedinicama...

Također ono što mi je bio cilj od samog početka, a sad ispada da će biti moguće za izvesti, je da sav teren u Bosni i u Dalmaciji gdje će se igra odvijati budu autentični online podaci izvučeni iz GIS sustava (online znači da se vide promjene u igrici skoro pa čim se dodaji zapisi o novim selima, cestama, rijekama...). Također ono što mi je cilj je osim predefiniranih misija koje se moraju završiti napraviti i brze misije koje će moći uzeri sami definirati. Znači 2d mapa Bosne po kojoj skrolate i kreirate svoju rutu. Od rute se napraviti 2d mapa sa realnim podacima na koju vi možete random staviti prepreke. Pa kad letite iznad Jajca "eto Plive eto vodopada" možete zapjevati! Dosta o planovima... nešto mora ostati i tajna.

Safari i debugiranje

Mon, 10/01/2007 - 15:55 | Add new comment

Pretpostavljam da je to nešto što svaki MacOSX user zna ali eto, meni je malo trebalo. Ako nekome dobro dođe eto ga...

Jedna od web aplikacija koju radim ponašala se dosta čudno (JavaScript problemi) na Safariju. Loš je to osjećaj kad se pred kraj sezone iznajmljivanja brodova radi fakturiranje i onda sve stane zbog nekog nedefiniranog i nedokučivog buga. Naravno, nema previše smisla reći "meni i Igoru na firefoxu radi..hmm.. hmm" pa ja bootam svoje Windowse i probavam iz Safarija 3.0.4. Sve radi... "dovraga" govorim u sebi "mora da su ispravili taj feature u ovoj verziji". Odlazim do ibooka i gledam u taj prokleti Safari. Vidim da je odlučan da me ne obavjesti o grešci sa nekakvom blinkajućom ikonom. Ne pokušava ni neki prozorčić da otvori i ne do Bog mi otprilike pokaže liniju gdje i zašto se to krši. Ništa... to je onaj user-friendly pristup u kojem me ne zamaraju sa viškom nebitnih informacija. Nakon što mi pomalo i patetičan pokušaj "A da stavite Firefox?" nije uspio odlazim do svog prijatelja googlea i bacam se u potragu za MacOSX imageom za vmwareov player. Kao "budem ja to doma probao".

Download je trajao satima. Naravno, baš onih zadnjih 10Mb nije imao tko seedati pa se sve pomalo i odužilo. Nakon pola dana shvatih da ja nemam mjesta na disku za to odkompresirati. Ništa, sačekat ćemo da dođemo do mog externog diska da na njemu to obavimo. Anywho... kad sam sve i obavio shvatio sam da ja i dalje ne znam kako viditi JavaScriptove errore u Safariju. Sva sreća, otišao sam na neki družijanac u m.a.m.a.-u i na nekom izjedanju pizze sasvim slučajno sam pitao jednog šetajućeg Nizozemca Marijna da li ima iskustva s time (inače lik piše online knjigu Eloquent JavaScript). Nasmijao se i spomenuo mi da se treba iz komandne linije promjeniti postavke i da će se onda magično pojaviti Debug menu. Nakon malo googlanja pronašao sam i tu linijicu...


defaults write com.apple.Safari IncludeDebugMenu 1
 

Naravno, bug koji sam otkrio je bio bolno trivijalan i kad me Apple tuži i država strpa u zatvor zbog downloada ilegalne kopije MacOSX-a (koja je ubrzo nakon otkrivenog buga bila obrisana) imat ću dosta vremena u zatvoru za razmišljati o tom malom "," (zarezu) viška....