wtorek, września 30, 2008

SSD a programowanie

Jakiś czas temu opisywałem tu moje eksperymenty mające na celu ustalenie trwałości dysków SSD w EEE PC.Jak napisałem w update'cie dyski SSD chronią się przed ciągłym zapisem do tych samych komórek.Przekonałem się o tym jakiś tydzień temu gdy w celu zdobycia danych do pewnego eksperymentu napisałem na EEE PC i uruchomiłem nań program w Pythonie. Program miał na celu wejść na stronę wykop.pl, pobrać listę linków, wejść na każdy z nich i pobrać listę osób które wykopały link i listę osób które go zakopały. Później program zapisywał w pliku danej osoby linkę którą wykopała, lub zakopała. Ogólnie polegało to więc na tym, że program co chwilę otwierał pliki i dopisywał do nich nowe linie...I ciekawa sprawa :-) najpierw wszystko działało całkiem sprawnie, aż od pewnego momentu, od tego momentu wszystko szło szybko, po czym zawisało na kilka-kilkanaście sekund i znów szło szybko :-)Wniosek stąd taki, że programy na EEE PC które intensywnie piszą do tych samych obszarów dysku mogą szybko spodziewać się tego, że dostaną zadyszki i większość czasu spędzą na oczekiwaniu na przeniesienie różnych obszarów dysku na SSD :-)Jak ktoś ciekawy tutaj źródło skanera ;-) Przechodzi teoretycznie przez pierwsze 100 stron wykop.pl i buduje na dysku mapę głosowań użytkowników. W pliku [nazwa usera].digg jest lista linków na które głosował, a pliku [nazwa użytkownika].dugg jest lista linków które zakopał. Przed ewentualnym uruchomieniem programu należy sprawdzić w pliku robots.txt wykopu czy te działania są dozwolone [teraz są].
import urllib2#http://www.wykop.pl/kategoria/wszystkie/1def getText(addr): print addr handler = urllib2.urlopen(addr) s=handler.read() return sdef getLines(addr): #handler = urllib2.urlopen(addr) #s=handler.read().split("\n"); s=getText(addr).split("\n") return sdef getUsers(lines): searchedText = "http://www.wykop.pl/ludzie/" list = []  for i in range(1,len(lines)):  if lines[i].find(searchedText)!=-1:   q=lines[i].find(searchedText)   s=lines[i][q+len(searchedText):]   q2=s.find('"')   item=s[:q2]   print(item)   list.append(item) return list   def analyze(id): addr="http://www.wykop.pl/link/"+id+"/" text = getText(addr) addrLen = len(addr) q=text.find(addr) s=text[q+addrLen:] q=s.find('"') s=s[1:q]+"/" print s linkDigg = addr+s+"/wykopali" diggLines = getLines(linkDigg) diggUsers = getUsers(diggLines) for name in diggUsers:  f=open(name+".digg","a")  f.write(id+"\n")  f.close() linkDugg = addr+s+"/zakopali" duggLines = getLines(linkDugg) duggUsers = getUsers(duggLines) for name2 in duggUsers:  f=open(name2+".dugg","a")  f.write(id+"\n")  f.close()  for i in range(1,100): addr="http://www.wykop.pl/kategoria/wszystkie/"+str(i) print addr s=getLines(addr) print(len(s)) for il in range(1,len(s)):  if s[il].find("linkid")!=-1:   print s[il]   q=s[il].find('"linkid-')+8   s2=s[il][q:]   q=s2.find('"')   id=s2[:q]   print id   analyze(id)
Żeby było zabawniej program zawiera błąd, ale i tak działa ;-) Błąd polega na zbyt dużym obcięciu części adresu potrzebnego do uzyskania listy wykopywaczy i zakopywaczy. Widać jednak wykop.pl potrzebuje w tym miejscu tylko jakichś liter, nie ważne czy takich samych na jakie kieruje usera.


Podobne postybeta
Jak walczyć z gigantycznym kodem w Java'ie, część 1 ;-)
Jak zrobić plik OVPN (dla OpenVPN) w wersji unified format?
Jak nie zapomnieć kupić biletu miesięcznego - revised ;-)
Polowanie na Nexus 4 - wersja automagiczna ;-)
Python z urllib = najlepszy menadżer pobierania ;-)