FLOSS Manuals – Theora Cookbook

Završio je četverodnevni Theora sprint u Berlinu. Rezultat je u vidu 212 stranica papira …. Theora Coockbook knjiga… ttarrraaaaa….. Sprint podržao Google i Berlin Summercamp.

Kao i obično, idućih par dana će se prolaziti kroz tekstove i ispravljati greške. Užasno mi je žao što na ovome nisam mogao biti… ali eto, teško je usaglasiti regularan posao sa paradiranjem po Evropi i sudjelovanju u različitim projektima. U ovaj manual se uspio progurati i Barack Hussein Obama. Skidajte, čitajte i širite glas dalje (naravno, možete i pomoći u pisanju).

Link na web izdanje:
http://en.flossmanuals.net/theoracookbook

Link na PDF i papirnato izdanje:
http://www.lulu.com/content/7531795

Link na FLOSS Manuals:
http://en.flossmanuals.net/

Conversation and Community: The Social Web for Documentation!

Anne Gentle piše za paru tehničku dokumentaciju. U slobodno vrijeme radi na FLOSS Manualsima, piše neke svoje priče i stara se o mužu i dvoje djece. Simpatična teksašanka (donijela mi je nekoliko kutijica Altoidsa). Teško da ću zaboraviti naš susret u Amsterdamu. Njen prvi put u Evropu i odmah poslom u Amsterdam. Smješak na licu koji kaže “ah da je sve ovo prije 15 godina”.

Daklem. Izdala je žena svoju prvu knjigu pod nazivom “Conversation and Community: The Social Web for Documentation”. Ako vas zanima ta tematika slobodno pogledajte free chapter (spominje se i moja malenkost unutra…. samo riječju i imenom ali eto).

Više o knjizi na:

Announcing Conversation and Community: The Social Web for Documentation!

U Dabićevom zagrljaju….

Kao što smo svoje čitatelje i prošli put iznenadili dugo skrivanim tajnama HRT-a tako i ovaj put razotkrivamo glamur hrvatskog jet-set-a.

Fotografiju smo dobili iz vrlo dobro informiranih izvora. Uslikana na ФЕСТ-u koji je Dolores Lambaša (Doooollloooores na slici) posjetila u društvu tadašnjeg partnera Frane Lasića. Dr. Dragan Dabić (stariji bradonja sa slike) prezentirao je svoj dokumentarni film “U rašljama života”.

Da li je dr. Dragan Dabić pokazao svoje rašlje Dolores? Ne znamo, ali uskoro možete očekivati više o ovoj temi.

Friedrich Nietzsche i thumbnailovi sa images.google.com

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]

Prekrasna juhica u Googleovoj zdjelici servisa

“Ej Aco..” – prekinuo me Srki u ___________ dok sam ljenčario na poslu. Naime, zanima ga… da li bi mu mogao prebaciti sadržaj “prodaja Ega/hiperinflacija Emocija” sa http://srdjansandic.blog.com/ na blogger.com. Da li bih mogao… pif….

S obzirom da Aco nije nikad odbio besplatno pivo odlučio sam složiti neku sitnu skriptu koja će mu to raditi. Naime, blogger.com (kaže Srki, nisam ja provjeravao) ne može to sam importati. blog.com nema nikakav public API za export podataka ali zato blogger/blogspot ima.

Brz na idejama, kakav već jesam, bacio sam kratki pogled na
http://srdjansandic.blog.com/. Analizirajući stranice mojim omiljenim FireBugom odlučio sam se na najkraće moguće rješenje (u međuvremenu se malo promjenio template ali u vremenu kad sam prebacivao code je imao smisla).

Daklem…. govoreći riječnikom iskusnih kiber hakera i internauta odlučio sam se za slijedeće:

ćopi_sve_linkove_na_arhivu sa strane "http://srdjansandic.blog.com/";

vrti_kroz_te_stranice { | stranica |

  ćopi_sve_linkove_na_perma_link sa stranica;

  -- LoL !
  vrti_kroz_te_stranice { | stran1ca | 
      ćopi_sadržaj_stranice stran1ca;
      izvuci_iz_dom [title, datum, content] -> snimi_u_bazu;
  }
}

Naime, šema je slijedeća. Ćopim naslovnu stranu. Na naslovnici se nalaze linkovi na stranice sa arhivama. Uzmem te linkove i skinem svaku od tih stranica posebno. Tamo se nalazi popis svih postova (lako je jer je sve na jednoj stranici) sa dijelom sadržaja. Vrtim kroz svaki od tih postova i uzmem linkove na koje pokazuje link na njihov permalink. Uzmem svaku od tih permalink stranica i iz nje izvučem sadržaj naslova, datum objave i sadržaj. Može i komentare na taj način ali Srki je rekao da nema potrebe za tim.

Zatim dobiven sadržaj spremim negdje (u mom slučaju sqlite3). S obzirom da blogger ima neku zaštitu od SPAM-anja podnosi samo određeni broj postova u danu. Preko Web interfacea se može postati više ali se mora popuniti neki CAPTCHA. Preko GData API-a nisam vidio da ima neka opcija za to pa zbog toga svaki dan opalim nekih 50-etak novih članaka iz baze.

U svemu ovome koristio sam Beautiful Soup. Zakon library koji mi je do sad dosta puta uskočio u pomoć. Kuži loš HTML, lako se izvlači sadržaj iz njega i brine se za encodinge. To im čak piše i na naslovnoj stranici 🙂 Iz nepotpunog primjera koji slijedi (koji nisam ni isprobao) je vidljivo kako se koristi Beautiful Soup i kako sam ja primjenio gornji algoritam na Srkijevom siteu.

import urllib
from BeautifulSoup import BeautifulSoup

def fetchURL(url): return BeautifulSoup(urllib.urlopen(url).read(), fromEncoding="utf-8")
soup = fetchURL("http://srdjansandic.blog.com/")
for link in soup.find('div', {"class":"block slideshow"}).findAllNext("a"): archive = fetchURL(link["href"])
for post in archive.find('div', {"id": "posts", "class": "posts"}): for plink in post.findAllNext("span", {"class": "permalink"}): clanak = fetchURL(plink.next["href"])
title = clanak.find("h4", {"class": "posttitle"}).next datum = clanak.find("h3", {"class": "date"}).next text = clanak.find("div", {"class": "posttext"}).next

Fali dio koji izvlači podatke iz baze i preko GData python clienta posta na blogger/blogspot.

Neukusni dobio svoj site

Na adresi http://tasteless.binarni.net/ ili http://neukusni.binarni.net/ počeo sam stavljati neki materijal o Neukusnome. S obzirom da sam se morao prisjetiti svih tih stvari zadnjih mjesec dana odlučio sam malo neke stvari dokumentirati.

Uzeo sam neki free Drupal themu i pobacao neke osnovne stvari. Trenutno sam poprilično zauzet ali s vremenom ću staviti više infoa gore. Stavio sam i neke od članaka online a počeo sam raditi i na pojmovniku. Budem s vremenom izbacio one robote i stavio neku svoju grafiku a mogao bih poraditi i na faviconici.

Slobodno postajte komentare sa ispravkama ili svojim tekstovima. Ako netko ima kakvog dodatnog materijala (ili npr. broj 9 koji sam ja izgubio) bio bih mu vrlo zahvalan.

Hrvoje i Šaban

Što se desi kad doneneš na posao video kameru da pomogneš kolegi oko odluke kod kupovine…. i maaaalo youtube-dl-a, gimpa, ffmpega i avidemuxa. Usput da testiramo i Facebook Video. Zaključak: glup je – ne kuži mp2 pa se zato i ne čuje zvuk a bogami ima problema i sa nekim codecima. Fali mi moj Final Cut i za editiranje.

Jedan tipičan dan u životu IBM Informix tehničke podrške. Ovo je kratki klip iz našeg pilota. Nešto što će zapaliti sve ljubitelje IT Crowda, Flight of the Conchords-a, Napoleon Dynamite-a i The Big Bang Theory-a. Iz tjedan u tjedan nova pričica o ekipi koja svoje shell skriptice započinje sa – “PATH=`awk -F: ‘{for(i=1;i<=NF;i++){if(!($i in a)){a[$i];printf s$i;s=":"}}}'<<<$PATH`". Obrada podataka nikad nije bila smješnija. link na video