Roboty internetowe

Tagi: google, indeksy, Moje pomysły, roboty_indeksujące, roboty_internetowe, transfer, wyszukiwarki,
Kategoria:

Roboty internetowe zwane także robotami indeksującymi to programy zbierające i przetwarzające informacje o stronach internetowych umieszczonych w indeksach wyszukiwarek lub różnych agregatorów. Popularne strony muszą się liczyć z tym, że takie roboty pożrą dużą część transferu. Poruszył tą tematykę na swoim Piotr Waglowski: Mam się cieszyć, czy martwić?.

Zgadzam się z nim, że nie ma tu dużego wyboru, przecież nie poblokuje wszystkich robotów, można porównać jego (i nie tylko) sytuację do związku między USA a Chinami (USA chciałyby się pozbyć się Chin, ale wtedy gospodarka USA by się załamała). Wydaje się, że problem jest nie do rozwiązania, lecz… wystarczyłoby zaimplementowanie pewnego rozwiązania przez roboty i strony. Webmaster umieszcza na stronie pliczek UPDATED.php (rozszerzenie jest nieważne), który generuje treść XML o określonej strukturze, w której byłyby zawarte informacje, kiedy jaka podstrona została zakutalizowana. Oczywiście mądry webmaster nie umieszczał by tam informacji, że należy ponownie zindeksować wszystkie podstrony, bo plik ze stylem CSS został zaktualizowany. Myślę, że rozwiązanie jest godne poświęcenia uwagi.

Cytat z DI - Polskie Google już szuka w czasie rzeczywistym: Google rozważa w przyszłości rozszerzenie funkcji wyszukiwania w czasie rzeczywistym dzięki protokołowi PubSubHubbub (PuSH). Niewykluczone, że wszyscy dostawcy treści będą mogli po prostu informować Google o nowych treściach, a wyszukiwarka natychmiast je zindeksuje. Więcej informacji na ten temat można znaleźć w innym tekście na łamach DI.

Zobacz komentarze

Udev - problem z konfiguracją

Tagi: Debian, konfiguracja, udev,
Kategoria:

Miałem ostatnio malutki problem, dotyczył on brzydkich ostrzeżeń występujących przy starcie systemu. Nie usuwałem go, bo nie za bardzo miałem kiedy. Dzisiaj się za niego wziąłem. Ostrzeżenia wyglądały tak:

SYSFS{}= will be removed in a future udev version, please use ATTR{}= to match the event device, or ATTRS{}= to match a parent device, in /etc/udev/rules.d/56-hpmud_support.rules:10
BUS= will be removed in a future udev version, please use SUBSYSTEM= to match the event device, or SUBSYSTEMS= to match a parent device, in /etc/udev/rules.d/025_logitechmouse.rules:1

Trochę kombinowałem i jakoś to usunąłem, ale okazuje się, że niepotrzebnie, bo wystarczy wydać jako root polecenie: dpkg-reconfigure udev.

Zobacz komentarze

Użycie wskaźnika na elementy vectora

Tagi: błądbłb, błędy, C++, konkord, programowanie, STL, vector,
Kategoria:

Podczas wprowadzenia zmian i testowania programu do nauki słówek wykryłem błąd, który nie był zwykłą literówką, lecz błędem w strukturze programu, pojawiającym się raz na ileś. Taki błąd jest najgorszy, bo trudno odgadnąć, dlaczego to program się wyspuje, jest trudny do uchwycenia. Z tym błędem wiązało się też, że rozwiązując go, musiałem stanąć przed dylematem, które rozwiązanie wybrać. Zaprezentuję przykład, gdzie będzie ten sam błąd

#include 
#include 
using namespace std;
int main() {
	vector elements;
	int **wsk_to_elements = new int*[10000];
	for(int i = 0; i < 10000; i++) {
		elements.push_back(i);
		wsk_to_elements[i] = &elements[i];
	}
	for(int i = 0; i < 10000; i++) {
		elements.push_back(i);
	}
	vector elements2;
	for(int i = 0; i < 100; i++) {
		elements2.push_back(i+10000);
	}
	for(int i = 0; i < 10000; i++) {
		cout << *wsk_to_elements[i] << endl;
	}
	return 0;
}
Niby wszystko w porządku, ale… po skompilowaniu i uruchomienu raczej zobaczymy, że 100 pierwszych wskaźników z tablicy wsk_to_elements wskazuje nam na jakieś elementy, których wartość jest większa od 10000, czyli chyba elementy vectora elements2. Dlaczego? Vector to taki obiekt, który przechowuje nam elementy, pozwala nam dodawać i usuwać elementy w każdej chwili, ale też stara się zachować ciągłość w pamięci, dlatego gdy przy dodaniu 1000 elementu vector widzi, że na nie ma już miejsca na prawo, to przenosi wszystkie elementy do takiego miejsca w pamięci, gdzie będzie mógł dodać ten 1000 element. Krótko mówiąc, nie gwarantuje nam, że elementy będą cały czas w tym samym miejscu w pamięci. Można się przed tym zabezpieczyć rezerwując miejsce na x elementów, dając mu x w konstuktorze, ale przecież nie zawsze wiemy, jaki rozmiar nam będzie potrzebny. Dlatego użycie wskaźników na elementy vectora jest samobójstwem.

I właśnie taki błąd miałem w programie i miałem do wyboru kilka możliwości rozwiązania problemu: I. Posłużyć się iteratorami, ale w praktyce wyglądałoby to tak:

class SingleWord {
	//…
	vector::iterator something;
	//…
}
class Kurs {
	//…
	vector singleWords;
	//…
Trochę głupio uzależniać klasę SingleWord, która ma być niezależna od klas ją wykorzystujących. W porównaniu do drugiego rozwiązania zachowałbym taki sam czas dostępu do elementów. I rozwiązanie nie jest rozwiązaniem, bo ma te same wady, co rozwiązanie oparte na wskaźnikach. Rozwiązaniem podobnym do tego opartego na iteratorach byłoby:
class SingleWord {
	//…
	unsigned int something; //numer słowa w vectorze
	//…
}
class Kurs {
	//…
	vector singleWords;
	//…
To rozwiązanie ma jedną zasadniczę wadę: klasa SingleWord jest zależna od klasy ją wykorzystującej Kurs. II. W samym vectorze posłużyć się wskaźnikami, wyglądałoby to tak:
class SingleWord {
	//…
	SingleWord *something;
	//…
}
class Kurs {
	//…
	vector singleWords;
}
W tym rozwiązaniu klasa SingleWord zachowuje swoją niezależność, ale jest trochę wolniejszy dostęp do elementów z klasy Kurs, bo odbywa się przez wskaźniki. To, że w vectorze są wskaźniki, ma jeszcze inną zaletę, gdy vector będzie zmieniał swoje miejsce w pamięci, nie będzie kopiował ponad 100 bitowego elementu klasy SingleWord, lecz 64 bitowe wskaźniki. Oczywiście nie należy zapomnieć, że tym przypadku musimy samodzielnie zwalniać pamięć, vector.erase() usunie tylko wskaźniki, elementy, na które wskazywały zostaną.

Wybrałem II rozwiązanie, lecz zaskutkowało to tym, że musiałem zmieniać działanie wielu funkcji. Przy okazji tych zmian, stwierdziłem, że gdy chcę odmówić prawa do zmieniania elementu, lepiej zwrócić "wskaźnik na stały element" niż "element", program będzie szybciej działał, ponieważ wskaźnik jest tylko 64 bitowy. Zmieniłem… lecz mocno się zdziwiłem, bo funkcja wygląda tak:

SingleWord const* Kurs::getSingleWord() {
	SingleWord const* something;	
	//…
	return something;
}
, a program skompilował się(a nie powinien) z przypisaniem:
Kurs kurs;
//…
SingleWord sword = kurs.getSingleWord();
//…
Zgłosiem buga na Debianie dla pakietu g++-4.4. Bug nie jest taki straszny, lecz z pewnością utrudnia wykrywanie błędów w programie.

Zobacz komentarze

Podsumowanie roku 2009

Tagi: 2009, 2010, blog, Nowy Rok, postanowienia, zmiany,
Kategoria:

Jest to najwyższy czas na podsumowanie tego roku, który był rokiem bardzo owocnym w zmiany w moim życiu lub raczej sposobie życia. W drugiej połowie 2009 roku zacząłem czytać książkę „Jak zdobyć przyjaciół i zjednać sobie ludzi” Dale'a Carnagie'o i wcielać w życie wskazówki tam umieszczone. Zmieniłem też podejście do dziewczyn, ale nie dzięki książce, po prostu przemyślałem niektóre sprawy; głównie dzięki jednemu kumplowi i tym, że moje traktowanie dziewczyn przyniosło sukesy, nie zaprzestałem kontynuowania tego, co zacząłem. A w zmiany w sferach mego życia?

...

Przeczytaj cały artykuł i zobacz komentarze