Tekstualne datoteke

Šteta što nemam dovoljno vremena da promislim i složim neki konkretniji tekst o ljubavi ka tekstualnim datotekama (iako mi to binarna religija zabranjuje). Neka ovo bude neki rani pre alfa draft/podsjetnik mog budućeg TED talka.

Tekstualne datoteke su super. Možeš ih lako pohraniti, brisati, preimenovati i editirati. Naravno, dok god se ne ukazuju gluposti sa drugačijim interpretiranjem novog reda. Najbolje su za spremanje velike količine podataka. Katkad se pitam kako taj briljantan koncept CSV-a nije izbacio .xls i ostale formate iz biznisa. Otvoriš u editoru (ma može i u Wordu) i mijenjaš. Ko čovjek. Obrišeš datoteku ili ju preimenuješ i podataka više nema. Aplikacija ne može do njih. Tko je vidio posebne programe ili instaliravanje drivera za pristup podacima! Hoćeš backup? Ma može i na USB stick ako treba. Ako može cijeli Pirate Bay na stick što ne bi moglo i XY! Kratko, jasno i efikasno.

Kako kompijuteri rade sa binarnim informacijama obično se kao moguće vrijednosti stavljaju “0”/”1″ a kod naprednijih korisnika i “TRUE”/”FALSE”. Kao tekst…. naravno, kako bi drugačije! Lako se mijenja a i kompijuter zna samo baratati sa “TRUE”/”FALSE”. Tekstualne datoteke su idealne i kad imaš sitnu džidžu midžu sa nekim upisom preko weba recimo. Obično concurrency nije problem jer – 1) kurca znaš što je concurrency pa se i ne možeš brinuti 2) na web site općenito i neće doći više od 100 ljudi pa i šansa istovremenog pristupa nije tako velika 3) naravno da direktno barataš sa orginalnom datotekom. Mislim… da li netko zna nekoga tko je ikad imao problema s time?!

Osim što slaba posjećenost web stranicama rješava problem concurrencija postoji i hack kako rješiti atomične transakcije pri radu sa podacima u tekstualnim datotekama! Zataraš ih i pošalješ na drugu stranu. To je to. Tar je car! Briljantno, elegantno i tako prokleto jednostavno. I’l će sve i’l neće nijedna! I wonder kako je Larry Ellison uspio sve te pare namaknuti na prodaji magle.

Eto… svaki dan nešto novo naučim. S obzirom da se može startati više instanci tar-a cijela ova arhitektura bi se dala jako dobro i scaleati. Hmmmm…… double win. Moram im to javiti.

Snježni leopard

10.6 stavljen. Nakon instalacije 10Gb manje na disku. Da se čovjek zapita koga vraga su radili sa 10.5. Pobriso mi neke accounte (postgres i informix). Morao sam ih ponovo kreirati i postavljati file permissione. Neke aplikecije više ne rade ali u queue imam njihove upgrade za staviti. MacPorts sam odmah upgradeao. Došao Python 2.6.1 što znači da ću morati instaliravati neke module ponovo itd….itd….

Sve u svemu sreća i veselje u binarnom taboru.

Ništa se neće dogoditi – Split iliti Soba 306

Ništa se neće dogoditi je definitivno izgubio svoju draž otkako smo prestali sa kombijem obilaziti gradove i sela sjevernog Balkana. S vremenom, znatno većim brojem sudionika i smislenijim predavanjima/prezentacijama prestao je biti samo “skočimo u kombi i malo se glupirajmo uz ćevape i puno muškog bondanja”. Za 2-3 godine neće biti razlike da li idem na NSND ili IBM Forum…. Ah živote… što učini!

Zezam se…. Postaje sve bolje i bolje. Unatoč nešto većem obimu i smislenijem setupu ima mjesta za zakulisne igrice, tračeve i otkrivanje pikanterija iz života omiljenih razmjenjivača. Ove godine mi se nije dala raditi video reportaža. Zato sam strpao svoj mini digitalni foto aparat u džep da zabilježim potencijalno zabavne momente (Ostatak slika se nalazi ovdje). Ova slika iznad bi mogla spadati u tu grupaciju. Naime, njega jako opušta ženama raditi pletenice.

Brijanje prije ševe. To je soba 306.

Naš mačak.

Mjesto je to gdje se uvijek razmjenjuju novi gadgeti. Osim što smo razgledali Sašin Be-Book (e-book reader) igrali smo se i sa mojom kamericom. Na gornjoj slici se isprobava “smile detection”. Radi – vjerovali ili ne. Ako se pitate “da li sam isprobao” moj odgovor je – “jesam”. U Berlinu smo isprobali da li se moze okrenuti kamera i raditi “sad face” iliti “tužno lice” sa nadam da okine sliku. Da li radi? Radi.

Kamerica ima dva poprilično zanimljiva moda – “Lady Portrait” i “Male Portrait”. Da li radi? Radi!

Ne sjećam se točno ali mislim da bi ovaj NSND mogao biti prvi gdje su se Razmjenjivači na nekom događaju našli sa HULK-ovcima (kombiniram i sa BSD-ovcima). Zanimljiv kleš dvije različite ideologije sa puno “Isusek… Isusek… kako su oni čudni”.

Ako noćni provod nije zakazao u Moravicama na NSND-u teško da je moglo omanuti i u Splitu.

Na veliku žalost rasplesanih djevojki Ivan Nikolić zvani Leš je poprilično ozbiljno zaljubljen u svoju Luciju. Nešto se priča da bi mogli zajedno i da se usele na jesen. Samo ne znam “gdje” i sa “čime”. Ah…. ljubav.

Inače, vodeći ljubav sa metalnim šipkama na Bačvicama uspio je odgovoriti oveću količinu mladića od uživanja u Bačvica trance partiju. Oni su nastavili dalje.

Mislim da će se uskoro početi dešavati i “Stolnonogometoskop”. U biti, mislim da se jedan već desio u Alkatrazu. Nije bilo kuglice pa smo morali improvizirati. Ovo je bila loptica v0.30. Verzija 0.89 sa selotejpom je ispala pun pogodak.

Anywho, NSND Split je po mom mišljenju ispao jako dobro. Hrana (organizirana) nije bila tako dobra kao na onom prije toga u Moravicama. S obzirom da je u Splitu bilo znatno toplije mislim da je izbor hrane bio čist ok ali eto… Vidjet ćemo da li će slijedeće Moravice opravdati prijašnja dva puta.

Ja sam pričao o novom siteu. Trebalo bi ga dovršiti, malo ulickati, dovršiti dokumentaciju kako funkcionira pa objaviti. Definitivno će biti puno bolji od ovog sada a vidjet ćemo s vremenom da li će i zaživiti. Više o tome kad dovršim.

I za kraj….

Ostatak slika je ovdje

Moj novi miš

Daklem Šaban (kolega 1 sa posla) ga donio Lugiju (kolega 2 sa posla). Kolega 2 se boji imati takav miš na radnom mijestu pa sam se ja ponudio. Rekoh – “Baš će lijepo pristajati mome Homeru na stolu…”.

Sigurno se pitate kakav je pod rukom? Paaaaa…. majica smeta laseru tako da se mora skinuti i navući na kabl ako mislite imati funkcionalan miš. Pod rukom je osjećaj OK. Sise su taman malo povišene tako da je lako klikati. Rekao bih da je laški osjećaj nego na običnom mišu. Definitivno fali kotačić za skrol ali mislim da bi to pokvarilo malo sveukupni doživljaj. S obzirom da ja uopće ne koristim miš prilikom rada sa računalom (sve je to samo stvar furke) moja sveukupna ocjena je 5/5! Budem ga svakako pokušao malo više koristiti idućih par dana pa napišem koju riječ više.

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.