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

Luftwaffenmuseum

Listajući vodič za turiste prije nekoliko godina vidio sam da se spominje (u to vrijeme zatvoren) Luftwaffenmuseum. Ove godine sam provjerio i ugodno se razveselio kad sam shvatio da je otvoren.

Daklem, uputio sam se u http://www.luftwaffenmuseum.de/.

Truckanje U-banima, S-banima, autobusima i na kraju pješačenje od kilometar i pol. Majko mila. Kad se dođe tamo shvati se zašto ne naplaćuju ulaz. U svakom slučaju, radi se o aerodromu na koji su parkirali oveću količinu otpada. Sudeći po websiteu čovjek bi pomislio da će se tamo naći oveća količina željezarije iz drugog svjetskog rata ali trebao sam i znati kako će to završiti sa Joomla powered websiteovima. Kad se uđe na aerodrom dočeka vas veliki natpis “50 godina Luftwaffea”. Da.. dobro ste pročitali – “50 godina!”. Dobri stari američki guilt trip nabijan švabama zadnjih 60 godina je učinio svoje. Od drugog svjetskog rata vidio sam – “malu maketu štuke”, “kopiju Bf-109 prirodne veličine”, “kopiju Me-163 Komet normalne veličine”, “totalno razjebani motor od Me-263 koji se jedva može i prepoznati”, “totalno uništeni i hrđavi nos od V-2” i “radar FuMG 65”. Ono najzanimljivije u Luftwaffeu je tako grozno prezentirano da je meni bilo neugodno. San Diego muzej avijacije ima 100 puta bolje to prikazano. Totalna katastrofa. U Shopu ima za kupiti katastrofalno loše plastične modele (koje su farbali 5 godišnjaci) i neke lutkice medvjeda u avijatičarskim jaknicama. Najviše ima čaša i krigli sa logoima koje ne želite ni vidjeti. Prodaju čokoladicu Mars koja je 30% jeftinija 2 metra dalje na automatu. Totalna katastrofa ali je meni i na kraju cijele balade bilo lijepo.

Slike se nalaze ovdje. Ušasno je jako sunce bilo i teško sam mogao pogoditi neke kuteve u kojima ne bi bilo odsjaja. Kako vani tako i u hali.