Implementacja rozszerzenia do przeglądarki

Transkrypt

Implementacja rozszerzenia do przeglądarki
Rok akademicki 2012/2013
Politechnika Warszawska
Wydział Elektroniki i Technik Informacyjnych
Instytut Informatyki
PRACA DYPLOMOWA INśYNIERSKA
Jakub Janczyk
Implementacja rozszerzenia do przeglądarki
internetowej na potrzeby cyfrowego repozytorium
dokumentów
Opiekun pracy
dr inŜ. Łukasz Skonieczny
Ocena: .....................................................
................................................................
Podpis Przewodniczącego
Komisji Egzaminu Dyplomowego
Kierunek:
Informatyka
Specjalność:
InŜynieria Systemów Informatycznych
Data urodzenia:
1990.10.10
Data rozpoczęcia studiów:
2009.10.01
śyciorys
Urodziłem się 10 października 1990 roku w Kielcach. W 2009 roku ukończyłem
II Liceum Ogólnokształcące im. Jana Śniadeckiego w Kielcach, gdzie uczęszczałem do
klasy z rozszerzonymi matematyką, fizyką oraz informatyką. W tym samym roku otrzymałem świadectwo dojrzałości i w październiku rozpocząłem studia na Wydziale Elektroniki i
Technik Informacyjnych Politechniki Warszawskiej. Od trzeciego roku studiów moją specjalnością jest InŜynieria Systemów Informatycznych.
............................................................
Podpis studenta
EGZAMIN DYPLOMOWY
ZłoŜył egzamin dyplomowy w dniu ............................................................................. 2013 r
z wynikiem ..............................................................................................................................
Ogólny wynik studiów: ..........................................................................................................
Dodatkowe wnioski i uwagi Komisji: ....................................................................................
.................................................................................................................................................
.................................................................................................................................................
2
STRESZCZENIE
Praca zawiera opis dodatku do przeglądarki Mozilla Firefox, które rozszerza funkcjonalność cyfrowego repozytorium dokumentów Wydziału Elektroniki i Technik Informacyjnych. Opis ten dotyczy zarówno projektu rozszerzenia, jak i jego implementacji.
Pierwsza część pracy zawiera przedstawienie sposobu tworzenia rozszerzeń do przeglądarki Firefox, z wyszczególnieniem najwaŜniejszych technologii uŜywanych w tym celu. W
dalszej części zaprezentowane zostały wymagania postawione tworzonemu rozszerzeniu
oraz ich analiza. NajwaŜniejszym z wymagań jest udostępnienie uŜytkownikom moŜliwości pobierania liczby cytowań publikacji, znajdujących się w repozytorium. W tej części
zostały takŜe opisane napotkane problemy, wraz ze sposobami ich rozwiązania. Praca kończy się opisem najwaŜniejszych elementów zaimplementowanego rozszerzenia oraz metod
jego testowania.
Słowa kluczowe: Mozilla Firefox, rozszerzenie, XUL, XPCOM, Google Scholar
ABSTRACT
Title: Implementation of a web browser extension for a digital documents repository
Thesis describes Mozilla Firefox browser add-on, which extends the functionality of
the digital documents repository of the Faculty of Electronics and Information Technology.
Description applies to both project and implementation of extension. The paper begins
with a description of how to create extensions for Firefox, detailing the most important
technologies using for this purpose. The next section contains given requirements of extension and their analysis. The most important requirement is to give users the possibility of
retrieving citations count of every paper stored in the repository. This section also presents
encountered problems, alongside with their solutions. Paper ends with the description of
the most important elements of implemented extension and its testing methods.
Keywords: Mozilla Firefox, extension, XUL, XPCOM, Google Scholar
3
Spis treści
1
2
Wstęp ................................................................................................................... 6
1.1
Cel pracy .................................................................................................... 7
1.2
Układ pracy................................................................................................ 7
Tworzenie rozszerzeń .......................................................................................... 9
2.1
Czym jest rozszerzenie? ............................................................................ 9
2.2
Elementy rozszerzenia ............................................................................. 10
2.2.1 Manifest instalacji .................................................................................. 10
2.2.2 Chrom ..................................................................................................... 11
2.3
Wykorzystywane technologie .................................................................. 13
2.3.1 XUL ........................................................................................................ 14
2.3.2 XPCOM .................................................................................................. 17
3
2.4
Typy rozszerzeń ....................................................................................... 18
2.5
Zotero ....................................................................................................... 19
Projekt rozszerzenia .......................................................................................... 20
3.1
Wymagania .............................................................................................. 20
3.2
Współpraca z repozytorium oraz interfejs uŜytkownika ......................... 21
3.3
Źródło liczby cytowań ............................................................................. 22
3.4
Metody pobierania liczby cytowań .......................................................... 25
3.4.1 Analiza strony źródłowej Google Scholar.............................................. 25
3.4.2 Wysyłanie Ŝądań HTTP w języku JavaScript ........................................ 28
3.4.3 Pobieranie danych pojedynczej publikacji ............................................. 29
3.4.4 Pobranie liczby cytowań wielu publikacji.............................................. 31
3.4.5 Ograniczenia wprowadzane przez Google Scholar ................................ 32
3.5
4
Baza danych ............................................................................................. 33
Opis implementacji............................................................................................ 36
4
4.1
Wprowadzone elementy interfejsu uŜytkownika..................................... 37
4.1.1 Modyfikacja interfejsu przeglądarki ...................................................... 37
4.1.2 Modyfikacja strony repozytorium .......................................................... 39
4.1.3 Okno z listą prac cytujących .................................................................. 40
4.2
Wykrycie repozytorium ........................................................................... 42
4.3
Pobieranie danych .................................................................................... 46
4.3.1 Obsługa błędów pobierania .................................................................... 47
4.4
Obsługa języków ..................................................................................... 48
4.5
Testy ........................................................................................................ 50
4.5.1 Scenariusze testowania ........................................................................... 50
4.5.2 Testy wydajnościowe ............................................................................. 53
5
Podsumowanie................................................................................................... 54
6
Bibliografia ........................................................................................................ 56
5
1 Wstęp
Autorzy naukowi często przytaczają w swoich pracach dzieła poprzedników, korzystając z wyników przeprowadzonych tam badań, czy negując lub udoskonalając postawione teorie. Powoływanie się na inne publikacje i zapoŜyczanie cudzych myśli bez dosłownego przytaczania, jednak ze wskazaniem dokładnego źródła, nazywane jest cytowaniem.
Początkowo cytowania słuŜyły do tego, aby m.in. uniknąć bycia oskarŜonym o plagiat czy
docenić pracę innego autora. Z czasem zaczęto rozwaŜać moŜliwości ich praktycznego
wykorzystania. Okazało się, Ŝe liczba cytowań moŜe być uŜyta, jako ocena jakości i wpływu prac naukowych [1]. Aby móc to osiągnąć, Eugene Garfield, w 1960 roku, stworzył
pierwszą współczesną bazę danych, która zawierała powiązania między publikacjami. Pozwalała ona na łatwe ustalenie, które z później napisanych prac, cytowały te wcześniejsze.
Baza tego typu jest nazywana powszechnie indeksem cytowań.
Analizą cytowań nazywane są badania częstotliwości i wzorców cytowań pojawiających się w ksiąŜkach czy artykułach. Pozwoliły one na zdefiniowanie kilku zastosowań dla
liczby cytowań:
•
Ocena pojedynczej publikacji – na podstawie sumy jej cytowań.
•
Ocena dorobku naukowego autora – na podstawie sumy cytowań lub ich
średniej liczby, uwzględniając kaŜdą pracę opublikowaną przez autora.
•
Ocena czasopisma – na podstawie średniej liczby cytowań, uwzględniając
kaŜdą pracę opublikowaną w danym czasopiśmie.
Poza przedstawionymi, prostymi sposobami wykorzystania liczby cytowań, w ostatnich latach zaproponowane zostało wiele metod, pozwalających lepiej zmierzyć dorobek i
wpływ pojedynczego autora. W 2005, Jorge E. Hirsch zaprezentował współczynnik, nazwany h-index, który moŜe zostać do tego uŜyty [2]. Korzystając z niego, autor ma współczynnik równy h, jeśli opublikował h prac, z których kaŜda była cytowana przynajmniej h
razy. Oprócz mierzenia dotychczasowego dorobku, twórca współczynnika przedstawił w
pracy [3], Ŝe moŜe on zostać takŜe wykorzystany do przewidywania przyszłych osiągnięć
autorów. Pomimo, Ŝe h-index jest powszechnie stosowany, nie jest wolny od wad i moŜe
dostarczać błędne informacje (jednak większość z wad nie odnosi się wyłącznie do tego
współczynnika). Wśród najczęstszych argumentów, wskazywanych przez krytyków, jest
to, Ŝe nie uwzględniany jest kontekst cytowania [4], a takŜe moŜe on być łatwo zmanipulowany przez auto-cytowania [5].
6
H-index nie jest jedynym tego typu współczynnikiem. Innym, często wykorzystywanym, jest zaproponowany w 2006 roku, przez Leo Egghe’a, współczynnik, który został
nazwany g-index [6]. Współczynnik ten wynosi g, w przypadku, gdy g najwięcej cytowanych publikacji autora, posiada łącznie przynajmniej g2 cytowań.
Często oceny całkowitych dorobków autorów uŜywane są na uczelniach, w stosunku
do zatrudnionych w nich pracowników naukowych. TakŜe sami pracownicy mogą być
zainteresowani łatwym znalezieniem liczby cytowań swoich publikacji. W związku z powyŜszym, konieczne jest zebranie wszystkich opublikowanych przez nich prac. Taką rolę,
w przypadku Wydziału Elektroniki i Technik Informacyjnych Politechniki Warszawskiej,
spełnia stworzone na nim cyfrowe repozytorium dokumentów. Opracowane zostało w Instytucie Informatyki, pod kierunkiem prof. Henryka Rybińskiego, i wykorzystywane jest
do gromadzenia opisów podstawowych efektów działalności naukowo-badawczej pracowników Wydziału. Są to m.in. publikacje, prace dyplomowe, artykuły, raporty, itp.
1.1 Cel pracy
Przedstawione repozytorium nie posiada niestety w swojej bazie danych informacji,
dotyczących liczby cytowań poszczególnych publikacji. Przez to nie moŜe być ono
postrzegane jako kompletne. Głównym celem tej pracy jest stworzenie aplikacji, która
zwiększy
funkcjonalność
repozytorium.
Jego
zadaniem
będzie
umoŜliwienie
uŜytkownikom (przede wszystkim pracownikom naukowym Wydziału) pobrania, w łatwy
sposób, liczby cytowań dla interesujących ich prac, znajdujących się w repozytorium.
Narzędziem, najlepiej nadającym się do tego zadania, są rozszerzenia do przeglądarek
internetowych. W dzisiejszych czasach, wśród najpopularniejszych przeglądarek są, przede
wszystkim, Mozilla Firefox oraz Google Chrome, a jako docelowa platforma
wykorzystana zostanie pierwsza z wymienionych (chociaŜ nie moŜna odrzucić takŜe
implementacji rozszerzenia na drugą z nich). W związku z tym, pośrednim celem tej pracy,
wymaganym do zrealizowania głównego, jest zapoznanie się z przeglądarką Firefox oraz z
zasadami i moŜliwościami tworzenia jej rozszerzeń.
1.2 Układ pracy
Praca ta została podzielona na trzy części. Pierwsza z nich (rozdział 2) zawiera teorię
dotyczącą tworzenia rozszerzeń. Przedstawione zostały ich podstawowe elementy, takie
jak manifest instalacji czy pakiet chrom, a takŜe moŜna dowiedzieć się w jaki sposób prze7
glądarka obsługuje dostarczone pliki, składające się na rozszerzenie. Oprócz tego, opisane
zostały podstawowe technologie, wykorzystywane w celu ich stworzenia. Jedną z nich jest
XUL (czyt. „zul”), która jest przeznaczona do definiowania interfejsu uŜytkownika.
Druga część pracy (rozdział 3) zawiera projekt rozszerzenia, w tym, przedstawione
zostały jego wymagania oraz ich analiza. Zaprezentowane tu zostały równieŜ sposoby
pobierania wymaganych danych. Dokonano wyboru źródła, z którego będą one
uzyskiwane, a takŜe jak będą przechowywane w bazie danych repozytorium. Opisane są
takŜe wszelkie problemy, jakie napotkano podczas projektowania, wraz z ich
proponowanymi rozwiązaniami.
Trzecia, i ostatnia, część pracy (rozdział 4) zawiera opis zarówno najwaŜniejszych
elementów zaimplementowanego rozszerzenia, oraz takich, które sprawiły najwięcej problemów. Opisana została struktura dodatku, przy czym wyszczególniony został jego podział na moduły, wraz z wykonywanymi przez nie funkcjami. Oprócz tego, przedstawione
zostały elementy interfejsu uŜytkownika, które dodaje rozszerzenie. Część ta kończy się
opisem
scenariuszy
testowania
oraz
wykonanych
testów
wydajnościowych.
Praca była finansowana przez Narodowe Centrum Badań i Rozwoju w ramach
Programu Strategicznego "Interdyscyplinarny system interaktywnej informacji
naukowej i naukowo technicznej", Umowa SP/I/1/77065/10.
8
2 Tworzenie rozszerzeń
2.1 Czym jest rozszerzenie?
Twórcy przeglądarki Mozilla Firefox zaprojektowali ją w taki sposób, aby moŜliwe
było łatwe, i w bardzo szerokim zakresie, dostosowanie jej do potrzeb uŜytkownika. Dostosowanie to jest moŜliwe za pomocą tzw. dodatków. Za oficjalną stroną Mozilli [7]:
„Dodatki to niewielkie programy tworzone przez ludzi z całego świata, dzięki którym
moŜna Firefoksa wzbogacić o nowe moŜliwości i funkcje, dodając nowe wyszukiwarki,
słowniki lub zmienić jego wygląd.[…] Ogólnie ujmując, za pomocą dodatków moŜna dostosować Firefoksa do swoich potrzeb i gustów.”
Dodatki moŜna podzielić na trzy główne kategorie, którymi są: wtyczki, rozszerzenia
oraz motywy graficzne. Ostatni z nich, czyli motyw jest najmniej skomplikowany, jego
jedynym celem jest zmiana wyglądu przeglądarki. Dwa pozostałe spełniają więcej zadań.
Czasami jednak bywa, Ŝe rozszerzenia nazywane są wtyczkami, oraz na odwrót, lub nazwy
te są uŜywane zamiennie. Nie jest to poprawne ich postrzeganie, bowiem formalnie dodatki te róŜnią się od siebie znacząco, zarówno pod względem przeznaczenia, jak i sposobu
ich tworzenia.
Wtyczki to dynamiczne biblioteki, napisane w języku C++, które umoŜliwiają przeglądarce współpracę z programami zewnętrznymi, lub na wyświetlanie treści nie obsługiwanych przez nią domyślnie. Są nimi zazwyczaj zamieszczone na stronach WWW róŜnego
rodzaju filmy, gry, animacje czy dokumenty PDF. Wtyczki są przewaŜnie tworzone przez
zewnętrzne firmy, które posiadają prawa patentowe do formatów określonych treści [7].
Przykładem najpopularniejszej wtyczki jest Flash, słuŜąca do wyświetlania m.in. filmów i
stworzona przez Adobe Systems.
Wtyczki są powiązane z elementami zamieszczonymi na stronach WWW i tylko na
nich uruchamiane. Inaczej jest w przypadku rozszerzeń, które jedyne czego wymagają, to
sama przeglądarka. Głównym ich zadaniem jest dodanie do niej nowych funkcji lub modyfikację tych istniejących. Mają one zazwyczaj niewielkie rozmiary i dzięki nim przeglądarka moŜe zostać dowolnie dostosowana do potrzeb uŜytkownika, bez konieczności obciąŜania czystej aplikacji zestawem funkcjonalności, których część uŜytkowników nie potrzebuje. Stworzenie prostego rozszerzenia nie jest zadaniem skomplikowanym, czy wy9
magającym bardzo specjalistycznej wiedzy, dlatego większość z nich została napisana
przez zwykłych uŜytkowników, którym czegoś brakowało w przeglądarce. W lipcu 2012
roku istniało 150 tys. rozszerzeń stworzonych przez uŜytkowników, które były do tego
momentu pobrane ponad 3 miliardy razy.
2.2 Elementy rozszerzenia
Rozszerzenie jest zbiorem plików, które zostały skompresowane do archiwum z rozszerzeniem XPI. XPI (wym. „zippy”) to skrót od Cross-Platform Installer (Międzyplatformowy instalator), a pliki tego typu są zwykłymi archiwami ZIP ze zmienionym rozszerzeniem, które przeglądarka potrafi rozpoznać i rozpocząć instalację. Wśród wspominanego zbioru plików, składających się na rozszerzenie, znajduje się kilka plików konfiguracyjnych. Ich obecność jest wymagana, aby rozszerzenie mogło zostać zainstalowane i poprawnie działało. Muszą one zostać takŜe ułoŜone w określoną strukturę, której przykład
został zaprezentowany poniŜej.
Nazwa_rozszerzenia.xpi
|------ install.rdf
|------ chrome.manifest
|------ chrome
|-----content
|
|-----skrypt.js
|
|-----interfejs.xul
|-----locale
|
|-----pl-PL
|
|-----pakiet_językowy.dtd
|-----skin
|-----skórka.css
Pliki install.rdf oraz chrome.manifest są wspomnianymi wcześniej plikami konfiguracyjnymi i muszą zawsze znajdować się w głównym katalogu rozszerzenia. Zostały one
opisane odpowiednio w rozdziałach 2.2.1 oraz 2.2.2. Oprócz tego znajduje się tutaj takŜe
katalog chrome, wraz z podkatalogami content, locale oraz skin. Zawierają one pliki z tzw.
pakietu chrom, który został opisany w rozdziale 2.2.2.
2.2.1 Manifest instalacji
Pierwszym z wymaganych plików jest install.rdf, nazywany manifestem instalacji.
Słowo manifest zostało w tym przypadku zapoŜyczone z określenia spisu przewoŜonych
przez statek towarów, czyli manifestu okrętowego. Analogia wydaje się być odpowiednia,
bowiem plik ten jest wykazem podstawowych atrybutów rozszerzenia. Jest to dokument
10
XML w formacie RDF, który dostarcza przeglądarce informacje niezbędne, aby rozszerzenie mogło zostać poprawnie w niej zainstalowane. Zawiera on metadane pozwalające na
zidentyfikowanie rozszerzenia, takie jak: identyfikator, nazwa, informacje o twórcy, specyfikujące aplikację docelową, itp. Pełną listę atrybutów moŜna znaleźć w [8]. PoniŜej przedstawiony został krótki przykład manifestu instalacji.
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<Description about="urn:mozilla:install-manifest">
<em:id>nazwa@domena</em:id>
<em:name>Nazwa</em:name>
<em:version>1.0</em:version>
<em:description>Opis rozszerzenia</em:description>
<em:creator>Informacje o twórcy</em:creator>
</Description>
</RDF>
Listing 2.1 Przykład manifestu instalacji
2.2.2 Chrom
Aby móc w pełni zrozumieć cel, dla jakiego utworzony został plik chrome.manifest,
naleŜy wyjaśnić znaczenie słowa chrom, w kontekście produktów firmy Mozilla, w tym
przeglądarki Firefox i jej rozszerzeń. Przede wszystkim, jest to określenie na zbiór wszystkich elementów interfejsu uŜytkownika, znajdujących się poza obszarem treści okna [9].
Obszar treści jest tą częścią przeglądarki, która odpowiada za wyświetlanie odwiedzanych
stron WWW. Wspomniane elementy dostarczane są przeglądarce w tzw. pakietach chrom.
Pakiet ten dostarcza takŜe część funkcjonalną rozszerzenia. KaŜdy pakiet chrom składa się
z trzech typów dostawców chrom, nazywanych zazwyczaj sekcjami, które są następujące:
•
Zawartość (ang. content) – NajwaŜniejsza sekcja. Znajdują się tutaj głównie
pliki
XUL (technologia
uŜytkownika,
opisana
w
wykorzystywana
rozdziale 2.3.1),
przy tworzeniu
które
definiują
interfejsu
interfejs
uŜytkownika rozszerzenia oraz skrypty w języku JavaScript, które zawierają
logikę rozszerzenia.
•
Pliki lokalizacyjne (ang. locale) – Sekcja ta zawiera paczki z tłumaczeniami
uŜywanych tekstów na obsługiwane języki. Są to pliki w formacie DTD lub
pliki własności, takie same jak te uŜywane w języku Java.
11
•
Skórki (ang. skin) – Sekcja ta zawiera pliki związane z wizualizacją
interfejsu uŜytkownika. Głównie są to pliki CSS oraz dodatkowe obrazki i
grafiki.
NaleŜy zaznaczyć, Ŝe wszelkie skrypty umieszczone w pakietach posiadają specjalne
uprawnienia, co oznacza, Ŝe mogą wykonywać operacje, jakie są niedostępne dla skryptów
zamieszczanych na stronach WWW. Przykładem takiej operacji jest wykonanie między
domenowego Ŝądania HTTP. UmoŜliwia to spełnienie podstawowego wymagania postawionego tworzonemu rozszerzeniu, jakim jest pobranie danych z zewnętrznego serwera.
Dostęp do plików z pakietu jest uzyskiwany za pomocą tzw. protokołu chrom, w podobny
sposób, w jaki otwierane są pliki, znajdujące się na dysku lokalnym, z uŜyciem protokołu
file. Jego URI jest następujące:
chrome://nazwa_pakietu/sekcja/ścieŜka/do/pliku
Przeglądarka nie jest w stanie samodzielnie, dla kaŜdego rozszerzenia, określić ich
nazw pakietów oraz zlokalizować połoŜenia poszczególnych sekcji. Aby jej to umoŜliwić
uŜywany jest plik chrome.manifest. Jego zawartość mówi przeglądarce gdzie mogą być
znalezione sekcje, dla określonego pakietu chrom (czyli dla rozszerzenia). Przykład podstawowej zawartości takiego pliku:
content
locale
skin
nazwa
nazwa
nazwa
pl-PL
classic/1.0
chrome/content/
chrome/locale/pl-PL/
chrome/skin/
Listing 2.2 Przykład manifestu chrom
KaŜdy z wierszy moŜna podzielić na cztery kolumny (w przypadku pierwszego, trzecia kolumna jest pusta). Pierwsza z nich określa czego dany wiersz dotyczy. Jest to tzw.
instrukcja. W tym przypadku są to nazwy sekcji, jednak istnieją takŜe instrukcje innego
typu. Pełną listę moŜna znaleźć w [9]. Druga kolumna oznacza nazwę pakietu, do którego
wiersz się odnosi. W czwartej kolumnie znajduje się bezwzględna ścieŜka do katalogu, w
którym mogą być znalezione pliki z określonej sekcji. Trzecia kolumna jest specyficzna
dla instrukcji locale oraz skin i słuŜy do sprecyzowania jaki język lub skórka są rozszerzane przez pliki z zadanych katalogów. Rozszerzenia najczęściej zawierają wiele wierszy z
instrukcją locale, co umoŜliwia obsługę wielu języków. O ile pliki z poszczególnych sekcji
moŜna umieścić w dowolnym katalogu, przyjęte jest, aby ich nazwy były zgodne z odpowiadającymi im sekcjami.
12
2.3 Wykorzystywane technologie
NajwaŜniejszymi technologiami, wykorzystywanymi podczas tworzenia rozszerzeń są:
•
XUL (wym. „zul”)
•
JavaScript
•
XPCOM
•
CSS
XPCOM bywa nazywany mózgiem rozszerzenia. Dokładniejszy opis tej technologii
znajduje się w rozdziale 2.3.2.
XUL moŜna określić jako szkielet rozszerzenia. Technologia ta powstała na podstawie języka XML. UŜywana jest do tworzenia interfejsu uŜytkownika i to na niej w duŜej
mierze opierają się rozszerzenia. Opis tej technologii znajduje się w rozdziale 2.3.1.
JavaScript to mięśnie rozszerzenia. Jest to język skryptowy uŜywany do wykonywania logiki rozszerzenia. Jest on powszechnie stosowany takŜe na stronach internetowych, jednak w przypadku rozszerzeń, szczególnie w połączeniu z technologią XPCOM,
skrypty posiadają znacznie więcej moŜliwości. Przede wszystkim, dzięki wykorzystaniu
technologii DOM (Document Object Model) mogą one dynamicznie modyfikować wygląd
okien przeglądarki. Skrypty mogą być dołączane do rozszerzenia na dwa róŜne sposoby.
Pierwszym, i najczęściej stosowanym, jest uŜycie w dokumentach XUL znanego z HTML
elementu <script>. W takim przypadku atrybut src tego znacznika, jako wartość, ma
podawane URI do wybranego skryptu (z uŜyciem protokołu chrom). Drugim sposobem
jest stworzenie tzw. modułów kodu JavaScript (ang. JavaScript code module). UmoŜliwiają one dzielenie kodu pomiędzy dwoma zakresami, zapobiegając jego wielokrotnemu załadowaniu do pamięci. Mogą być uŜywane zarówno przez samą przeglądarkę, jak i rozszerzenia. Ponadto moŜliwe jest ich dynamiczne importowanie. Cecha ta bywa uŜyteczna w
przypadku kodu, który wykonuje się rzadko, ale ma duŜe zapotrzebowanie na pamięć. Poprzez załadowanie go w wymaganym miejscu innego kodu i usunięciu po wykonaniu odpowiednich operacji, przeglądarka nie jest niepotrzebnie obciąŜana, co skutkuje jej szybszym działaniem. DuŜa część istniejących modułów została napisana przez Mozillę, jednak
uŜytkownicy tworzący rozszerzenia mogą z łatwością konstruować swoje własne i udostępniać je innym.
13
Ostatnia z technologii, czyli CSS, określana jako skóra rozszerzenia, jest uŜywana
podobnie jak w przypadku języka HTML. MoŜe posłuŜyć do zmiany koloru tła okna, wyrównania tekstu, ustawienia rozmiarów elementów, itp. CSS wspólnie z XUL odpowiadają
za interfejs uŜytkownika rozszerzenia.
2.3.1 XUL
XUL jest skrótem od angielskiego XML-Based User-Interface Language, co moŜe
zostać przetłumaczone jako Język Interfejsu UŜytkownika Oparty o XML. Technologia ta
została stworzona przez firmę Mozilla na potrzeby ich produktów. Jak sama nazwa wskazuje, jest to język uŜywany do tworzenia interfejsu uŜytkownika, przede wszystkim, dla
przeglądarki Firefox oraz jej rozszerzeń. XUL jest językiem pochodnym od XML, ale
twórcy podczas jego projektowania mocno inspirowali się językiem HTML, co moŜna
zaobserwować w wielu podobieństwach. XUL w znacznym stopniu został jednak ulepszony, w stosunku do swojego poprzednika, dzięki czemu moŜliwe jest tworzenie bardziej
zaawansowanych interfejsów. Wzorowanie się twórców na HTML skutkuje równieŜ tym,
Ŝe język ten wspiera takie technologie, jak: CSS, JavaScript, DOM, a takŜe sam HTML.
XUL posiada m.in. zbiór podstawowych kontrolek oraz elementów graficznych uŜywanych w przeglądarce, takich jak okna dialogowe, przyciski, listy wyboru, elementy menu,
itp. Dzięki temu XUL moŜna określić, jako XML z predefiniowanymi elementami. Język
ten jest interpretowany przez wbudowany w przeglądarkę silnik wyświetlania stron internetowych, o nazwie Gecko, który równieŜ został stworzony przez Mozillę. Pliki XUL rozszerzeń dostarczane są przeglądarce w sekcji zawartości (content) pakietu chrom.
Podczas tworzenia rozszerzeń, XUL zwykle definiuje jedną z dwóch rzeczy: okna
lub dynamiczne nakładki (ang. overlay). Okna dzielą się na zwykłe, oznaczane
znacznikiem <window>, które dostarczają jedynie obramowanie, całą zawartość
programista musi dodać sam. Drugim typem są okna dialogowe, oznaczane znacznikiem
<dialog> które mają wbudowane kilka przycisków, takich jak „akceptuj” czy „anuluj”,
i za pomocą odpowiedniego atrybutu znacznika, programista moŜe wybrać, których z nich
chce uŜywać. Ponadto okna mogą być określone jako modalne. Wszystkie, niezaleŜnie od
rodzaju, otwierane są za pomocą funkcji w języku JavaScript. Przykład dokumentu XUL
zawierającego definicję okna, wraz z jego rezultatem, zostały przedstawione poniŜej
(listing 2.3 oraz rys. 2.1):
14
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="chrome://global/skin/"
type="text/css"?>
<window
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.onl
y.xul" title="Przykładowe okno">
<vbox>
<vbox align="center">
<label id="etykieta" align="center"
value="Etykieta"/>
</vbox>
<hbox >
<button id="przycisk1" flex="1"
label="Przycisk 1"/>
<button id="przycisk2" flex="3"
label="Przycisk 2"/>
</hbox>
<hbox>
<textbox flex="1" value="Pole tekstowe"/>
</hbox>
</vbox>
</window>
Listing 2.3 Przykład dokumentu XUL
Rys. 2.1 Przykład okna w języku XUL
Na powyŜszym listingu zaprezentowane zostały dwie waŜne cechy języka XUL. Po
pierwsze, wszystkie dokumenty tego typu muszą posiadać odpowiednią przestrzeń nazw,
zdefiniowaną w elemencie korzenia (w tym przypadku <window>). Po drugie, układ elementów jest oparty na tzw. „modelu pudełkowym”. Za pomocą znaczników <vbox> oraz
<hbox> moŜna zebrać dowolną ilość elementów, które na wynikowym oknie zostaną ułoŜone obok siebie, zgodnie z orientacją, którą określają litery v(pionowo) oraz h(poziomo)
w nazwach znaczników. Jest to kolejna analogia do języka HTML i uŜywanych w nim
znaczników <div>.
Drugim zastosowaniem technologii XUL jest moŜliwość definiowania nakładek na
okna. Są one kolejnym elementem, który czyni XUL bardzo potęŜnym narzędziem. Pozwalają one na dodawanie nowych elementów do istniejącego juŜ interfejsu uŜytkownika,
bez konieczności modyfikacji jego kodu źródłowego. KaŜde rozszerzenie musi posiadać
15
przynajmniej jedną nakładkę, aby mogło wykonywać jakiekolwiek zadania. Są w nich bowiem umieszczone skrypty obsługujące logikę rozszerzenia, a same nakładki zostają uruchomione wraz ze startem przeglądarki. Bez dodanych elementów interfejsu, uŜytkownik
nie ma moŜliwości otwarcia ewentualnych okien rozszerzenia, zdefiniowanych w dostarczonych dokumentach XUL. Nowe elementy nakładane są najczęściej na główne okno
przeglądarki, aczkolwiek zdarzają się takŜe nakładki na inne rozszerzenia. Dodawane są
np. nowe pozycję w menu, ikony na pasku narzędzi lub dowolne inne, istniejące elementy
zdefiniowane w języku XUL. Nakładki dostarczane są jako dokument typu XUL z elementem <overlay> jako korzeniem, czego przykład znajduje się poniŜej:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="chrome://global/skin/"
type="text/css"?>
<overlay xmlns="http://www.mozilla.org/keymaster/
gatekeeper/there.is.only.xul">
<menupopup id="menu_ToolsPopup">
<menu insertafter="devToolsSeparator"
label="Element Menu">
<menupopup>
<menuitem label="Opcja 1"
oncommand="alert('Opcja 1');"/>
<menuseparator />
<menuitem label="Opcja 2"
oncommand="alert('Opcja 2');"/>
</menupopup>
</menu>
</menupopup>
</overlay>
Listing 2.4 Przykładowa nakładka w języku XUL
Na powyŜszym przykładzie zaprezentowano sposób dodania nowej pozycji do menu,
istniejącego w głównym oknie przeglądarki. PoniewaŜ ma to być nakładka, elementem
korzenia jest <overlay>, wraz ze zdefiniowaną przestrzenią nazw. Aby rozszerzyć
istniejące elementy, naleŜy się do nich odwołać za pomocą odpowiednich identyfikatorów.
W tym przypadku jest to menu „Narzędzia”, znajdujące się na pasku menu głównego okna
przeglądarki, posiadające identyfikator "menu_ToolsPopup". Dodane zostaje nowe
podmenu, które ma dwie pozycje, a miejsce jego umieszczenia określone jest takŜe za
pomocą odwołania do innego elementu. W tym przypadku jest to po separatorze,
znajdującym
się
w
menu
„Narzędzia”,
który
ma
identyfikator
"devToolsSeparator". Analogicznie rozszerzane są inne elementy, jak na przykład
paski narzędzi czy dodatków.
16
Samo zamieszczenie pliku w pakiecie chrom nie wystarcza, aby mógł on być poprawnie obsłuŜony w przeglądarce. śeby stało się to moŜliwe, wymagane jest zasygnalizowanie jego obecności wewnątrz pliku chorme.manifest (opisanym w rozdziale 2.2.2)
poprzez dodanie następującego wiersza:
overlay
chrome://browser/content/browser.xul
chrome://nazwa/content/overlay.xul
Wiersz ten oznacza, Ŝe plik browser.xul, znajdujący się w pakiecie browser
(czyli głównym pakiecie przeglądarki) jest rozszerzany o plik overlay.xul z przykładowego pakietu.
2.3.2 XPCOM
XPCOM to skrót od angielskiego Cross Platfrom Component Object Model, co
moŜna przetłumaczyć jako Międzyplatformowy Model Komponentów. Przeglądarkę
Firefox moŜna podzielić na dwie znaczące warstwy. Pierwszą z nich jest „wewnętrzna”,
kompilowana platforma, napisana głównie w języku C++ oraz „zewnętrzna” warstwa
chrom (opisana w rozdziale 2.2.2). Funkcjonalności „wewnętrznej” warstwy nie są
dostępne dla skryptów umieszczonych w chromie (takŜe ze względu na ograniczenia
języka JavaScript), ale często występują sytuacje, kiedy w trakcie tworzenia rozszerzeń
pojawia się potrzeba wykonania operacji specyficznej dla przeglądarki. Aby nie
ograniczać, w drastyczny sposób, moŜliwości programistów, tworzących aplikacje oparte
na produktach Mozilli, funkcjonalności te zostały udostępnione za pomocą komponentów
oraz interfejsów XPCOM. Innymi słowy, XPCOM moŜna postrzegać jako sposób
komunikacji opisanych warstw lub jako warstwę, umoŜliwiającą dostęp do operacji
niedostępnych z poziomu języka JavaScript, jak np. zarządzanie pamięcią.
XPCOM moŜe być obsługiwany w wielu róŜnych językach programowania, a w
przypadku rozszerzeń jest to JavaScript. Do komunikacji pomiędzy tym językiem i
XPCOM słuŜy technologia XPConnect (Cross Platform Connect).
var preferences =
Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
var value = preferences.getCharPref("nazwaPreferencji");
Listing 2.5 Przykład wykorzystania komponentu XPCOM
17
Na powyŜszym listingu przedstawiony został sposób wykorzystania komponentu
XPCOM w języku JavaScript, z uŜyciem technologii XPConnect. Aby móc korzystać z
komponentów naleŜy wykonać kilka operacji. Po pierwsze, niezbędne jest wydobycie
definicji klasy, odpowiadającej wybranemu komponentowi. Odbywa się to za pomocą
obiektu, który zawiera te definicje, czyli Component.classes. Podany tekst,
znajdujący się pomiędzy nawiasami kwadratowymi, jest identyfikatorem komponentu. W
tym przypadku jest to komponent udostępniający usługę preferencji przeglądarki.
Otrzymany tym sposobem komponent moŜe być serwisem (statycznym obiektem) lub
instancją klasy. Aby otrzymać ostateczny obiekt, na którym będzie moŜliwe wykonywanie
operacji, naleŜy wywołać metodę getService() lub getInstance(), odpowiednio
dla serwisu i instancji. Jako argument, dla tych metod, podawany jest wybrany interfejs.
Zbiór interfejsów, analogicznie jak definicje klas, dostępny jest za pomocą obiektu
Components.interfaces, a sam interfejs jest definicją zbioru atrybutów i metod,
które musi posiadać obiekt implementujący. Tutaj obiektami tymi są komponenty, a wiele
z nich implementuje kilka róŜnych interfejsów. Na otrzymanym, końcowym obiekcie,
moŜliwe jest wykonanie operacji dostępnych dla wybranego interfejsu. Największy zbiór
dostępnych interfejsów oraz komponentów, wraz z ich opisami, moŜna znaleźć w [10].
Komponenty XPCOM są bardzo potęŜnym narzędziem, które znacznie zwiększa zakres wykorzystania rozszerzeń, z których większa część nie mogłaby powstać, gdyby nie
one. Oprócz moŜliwości korzystania z wbudowanych komponentów, programista ma takŜe
do dyspozycji narzędzia pozwalające stworzyć własne implementacje.
2.4 Typy rozszerzeń
Wykorzystanie omówionych w poprzednich rozdziałach technologii jest jednym z
dwóch sposobów tworzenia rozszerzeń. Ze względu na uŜycie języka XUL, dodatki tego
typu nazywane są rozszerzeniami opartymi o XUL lub inaczej tradycyjnymi. Drugim ze
sposobów jest uŜycie zestawu bibliotek Add-on SDK, udostępnianych przez Mozillę. W
momencie powstawania tej pracy, technologia ta była dosyć nowa i nieustannie rozwijana
o kolejne elementy. Został w niej całkowicie wyeliminowany język XUL, zastąpiony przez
HTML, a oprócz niego wykorzystywane są takŜe CSS oraz JavaScript.
Pierwszym zadaniem, koniecznym do realizacji tej pracy była decyzja o wyborze
sposobu stworzenia rozszerzenia. Co jest niewątpliwą zaletą rozszerzeń opartych o SDK,
18
skrypty w nich uŜywane są w głównej mierze oparte na dostarczonych interfejsach programowania aplikacji (API). Zawierają one wiele najczęściej uŜywanych funkcji, które są
łatwe w uŜyciu i, w związku z tym, część operacji moŜna wykonać szybciej, niŜ w tradycyjnych rozszerzeniach. Mankamentem tego rozwiązania jest to, Ŝe w momencie podejmowania decyzji nie wszystkie wymagane funkcje były przez SDK wspierane, co skutkowałoby wieloma ograniczeniami. NajwaŜniejszym z nich jest tworzenie interfejsu uŜytkownika, który po rezygnacji z języka XUL został oparty na HTML, a ten nie jest wystarczająco rozbudowany, aby moŜliwe było stworzenie wszystkich wymaganych elementów
graficznych. Ponadto nie ma takŜe wbudowanej obsługi bazy danych, która jest bardzo
istotną częścią tworzonego rozszerzenia.
Ostatecznie wybór padł na tradycyjne rozszerzenie. Pomimo koniecznego większego
wkładu czasowego, wybrane rozwiązanie skutkuje moŜliwością uŜycia potęŜniejszych
narzędzi, pozwalających na spełnienie postawionych wymagań.
2.5 Zotero
Zotero to rozszerzenie do przeglądarki Firefox, które ułatwia gromadzenie, organizowanie oraz analizowanie źródeł informacji. Zostało ono zaprojektowane jako narzędzie
wspomagające pracę naukową, a przede wszystkim tworzenie bibliografii. Z jego pomocą
moŜna w łatwy sposób pobrać i zapisać na dysku obszerne dane bibliograficzne (autor,
tytuł, ISBN, ilość stron, itp.), dotyczące wybranej publikacji. Jest ono wykorzystywane
głównie przez naukowców i studentów piszących prace naukowe oraz dyplomowe.
Do tego dodatku powstało rozszerzenie o nazwie „Zotero Scholar Citations”, które
wprowadza moŜliwość pobrania liczby cytowań pracy, czego nie ma w samym Zotero.
Taka sama funkcja jest wymagana w rozszerzeniu tworzonym w ramach tej pracy, co moŜe
wydawać się niepotrzebnym duplikowaniem pracy. Istnieje jednak kilka powodów, dlaczego nie moŜna uŜyć omawianego tutaj rozszerzenia, aby spełnić postawione cele. Przede
wszystkim, nie współpracuje ono z repozytorium, dla którego mają być pobierane cytowania i nie ma moŜliwości ich powiązania. Pobierana liczba cytowań jest praktycznie tylko
do odczytu, zapisywana jest ona bowiem w bazie danych rozszerzenia Zotero. W celu ich
uzyskania i dostarczenia do repozytorium, konieczne byłoby i tak napisanie odpowiedniego rozszerzenia. Ponadto, co jest najwaŜniejsze, pobieranie liczby cytowań z serwisu Google Scholar jest nieefektywne, czego zarówno powody, jak i skutki zostały opisane w rozdziale 3.4.5.
19
3 Projekt rozszerzenia
3.1 Wymagania
Głównym wymaganiem, jakie zostało postawione przed tworzonym rozszerzeniem
jest umoŜliwienie pobrania liczby cytowań dla kaŜdej publikacji, znajdującej się w cyfrowym repozytorium dokumentów Wydziału Elektroniki i Technik Informacyjnych Politechniki Warszawskiej. Oprócz samej liczby cytowań, aplikacja powinna takŜe pobierać
listę prac, w których się one znajdują (prac cytujących), wraz z odnośnikami do ich cyfrowych kopii, o ile są dostępne. Wskazane jest, aby dostępne były dwie formy pobierania
danych: zautomatyzowane uzyskanie liczby cytowań dla wielu publikacji jednocześnie, lub
ręczne, dla pojedynczej publikacji. NaleŜy takŜe zapobiec wielokrotnemu pobieraniu tych
samych danych. W tym celu musi zostać stworzona baza danych publikacji, wraz z ich
cytowaniami, z której, za kaŜdym kolejnym razem po pobraniu, będą uzyskiwane informacje. Baza ta musi równieŜ umoŜliwiać aktualizację znajdujących się w niej danych, dotyczących wybranej publikacji.
Tworzone rozszerzenie musi prezentować pobrane dane uŜytkownikom, którymi będą głównie pracownicy naukowi Wydziału. Tak jak wszystkie aplikacje wyświetlające
informacje, tak i w tym przypadku interfejs powinien być przyjazny w odbiorze oraz uŜytkowaniu. Dodatek będzie współpracować z cyfrowym repozytorium, dlatego musi się ono
wpasować w istniejący interfejs uŜytkownika, w taki sposób, aby dodatkowe informacje
były widoczne na pierwszy rzut oka, ale nie przesłaniały pozostałych elementów strony.
Muszą być takŜe spełnione poniŜsze wymagania niefunkcjonalne:
•
Rozszerzenie powinno działać na dowolnym komputerze, niezaleŜnie od systemu operacyjnego, o ile ma on zainstalowaną najnowszą wersję przeglądarki
Mozilla Firefox.
•
Dodatek powinien być jak najlŜejszy. Oznacza to, Ŝe nie powinien zajmować
duŜo miejsca w pamięci, a takŜe czasu procesora, poprzez wykonywanie niepotrzebnych operacji „w tle”.
•
Przeglądarka nie moŜe zostać zablokowana przez rozszerzenie. Wszystkie
operacje, czy to wykonywane w rozszerzeniach, czy w głównej aplikacji wy-
20
konywane są w jednym wątku, dlatego waŜne jest, aby kończyły się one najszybciej, jak to jest moŜliwe.
•
W zaleŜności od wybranego języka repozytorium, powinna istnieć moŜliwość
odpowiedniego przetłumaczenia wyświetlanych tekstów rozszerzenia.
3.2 Współpraca z repozytorium oraz interfejs uŜytkownika
Tworzone rozszerzenie będzie współpracowało z cyfrowym repozytorium dokumentów Wydziału Elektroniki i Technik Informacyjnych Politechniki Warszawskiej, a konkretnie z jego interfejsem uŜytkownika. W momencie powstawiania tej pracy, dostęp do
wyszukiwarki publikacji moŜna uzyskać, wchodząc pod jeden z dwóch adresów:
•
http://repo.pw.edu.pl/search.seam?lang=pl
•
http://www.elka.pw.edu.pl/pol/Badania-naukowe/RepozytoriumWEiTI/Publikacje-pracownikow
Na samą wyszukiwarkę rozszerzenie nie będzie w Ŝaden sposób wpływać. Istotna
jest strona otrzymana po dokonaniu wyszukania. Zawiera ona tabelę z rezultatami wyszukiwań, której fragment został przedstawiony poniŜej.
Rys. 3.1 Fragment tabeli z rezultatami wyszukiwania w repozytorium
Jak widać, tabela ta składa się w większości (poza wierszami tytułowymi) z trzech
kolumn, z których najbardziej interesująca jest ostatnia. Po analizie okazało się, Ŝe będzie
ona najlepszym miejscem, w którym moŜna dokonać zmiany w interfejsie. Widoczne są
tam dwie etykiety. Pierwsza z nich „szczegóły” prowadzi do wewnętrznej strony repozytorium, zawierającej informacje o danej publikacji. Druga, nazwana „scholar”, zawiera od21
nośnik do serwisu Google Scholar, z tytułem publikacji, jako frazą wyszukiwania. Adres
ten, po drobnej zmianie, będzie pomocny podczas pobierania cytowań, a sposób opisu jego
wykorzystania został opisany w rozdziale 3.4.3. Modyfikacja tej komórki tabeli będzie
polegała na dodaniu trzeciej etykiety. Jej tekst będzie zawierał informacje o liczbie cytowań publikacji, znajdującej się w danym wierszu tabeli. Oprócz tego, po kliknięciu na nią,
otwierane będzie dodatkowe okno, w którym znajdą się informacje dotyczące publikacji, w
tym lista prac ją cytujących, o ile takie istnieją.
Dzięki opisanemu powyŜej rozwiązaniu nastąpi modyfikacja istniejącego interfejsu
uŜytkownika, która będzie zarówno przyjazna uŜytkownikowi, jak i nie zmieniająca w
drastyczny sposób oryginalnego wyglądu. UŜytkownik w prosty sposób będzie mógł poznać liczbę cytowań publikacji. Lista prac cytujących moŜe zawierać wiele pozycji, więc
ich wyświetlenie dla kaŜdej z publikacji znajdującej się w tabeli (jest ich maksymalnie 20
na stronę) zajęłoby duŜą część okna przeglądarki. Nie jest to poŜądane zachowanie, szczególnie dlatego, Ŝe przewaŜnie uŜytkowników nie interesują informacje dotyczące wszystkich rezultatów wyszukiwania. Natomiast w proponowanym rozwiązaniu dane te są początkowo ukryte, a jeśli uŜytkownik będzie chciał dowiedzieć się więcej o wybranej publikacji, wystarczy jedno kliknięcie na odpowiednią etykietę.
Inna istotną kwestią, jaka wymagała rozwiązania, było wykrycie wejścia na stronę
zawierającą repozytorium. Dokładny sposób został opisany w rozdziale 4.2, jednak w tym
miejscu naleŜy wspomnieć, Ŝe opiera się on na adresie serwera repozytorium. W trakcie
tworzenia tej pracy, repozytorium nie było jeszcze w pełni ukończone, a jego adres się
zmieniał. Z tego powodu, konieczne było wprowadzenie opcji, która umoŜliwi uŜytkownikowi ręczne wprowadzenia aktualnego namiaru. Realizacja moŜliwości jego ustawienia
została opisana w rozdziale 4.1.1.
3.3 Źródło liczby cytowań
Istotnym aspektem, niezbędnym do zrealizowania postawionych wymagań jest
określenie źródła, z którego będzie uzyskiwana liczba cytowań. W sieci dostępnych jest
kilka baz danych zawierających publikacje naukowe, wraz podstawowymi informacjami
na ich temat (w tym właśnie liczbą cytowań). Najpopularniejszymi serwisami
umoŜliwiającymi przeszukiwanie tych baz są: Google Scholar, Scopus, Web of Science,
Scirus oraz CiteSeerX. Przyjęto pewne kryteria, których analiza posłuŜy do wyboru
22
jednego z serwisów. NajwaŜniejsze z nich to: dostępność dla uŜytkowników, łatwość w
uzyskaniu liczby cytowań oraz wielkość bazy danych.
Biorąc pod uwagę dostępność, wymienione serwisy moŜna podzielić na dwie kategorie: darmowe oraz płatne. Do pierwszej grupy zaliczają się Google Scholar, Scirus oraz
CiteSeerX i kaŜdy moŜe ich uŜywać. Scopus oraz Web of Science znajdują się w drugiej i
wymagane jest wykupienie subskrypcji, aby moŜliwe było wyszukiwanie publikacji z ich
bazy danych. Wydział Elektroniki i Technik Informacyjnych ma, na moment pisania tej
pracy, opłacony abonament na te serwisy. W związku z tym, docelowi uŜytkownicy rozszerzenia, czyli pracownicy naukowi Wydziału, mogą z nich korzystać, jednak tylko będąc
połączonym z Internetem poprzez sieć wydziałową. Ograniczenie to jest zatem powaŜnym
argumentem przeciwko uŜyciu któregoś z tych serwisów, jako głównego źródła informacji.
Kolejnym kryterium jest łatwość w uzyskaniu liczby cytowań. Przede wszystkim,
przedstawione serwisy nie udostępniają Ŝadnego interfejsu programowania aplikacji (API),
który umoŜliwiałby pobranie pełnych informacji dotyczących publikacji, lub chociaŜ samej
liczby cytowań. Jedynym sposobem jest analiza dokumentu HTML, zawierającego stronę z
rezultatami wyszukiwania. W serwisach Google Scholar, CiteSeerX, Web of Science oraz
Scopus liczba cytowań jest bardzo łatwo dostępna. Wystarczy bowiem jedynie wyszukać
odpowiednią frazę (przykładowo tytuł publikacji) i przy kaŜdym zwróconym rezultacie
widoczna jest etykieta z przedstawioną liczbą cytowań. Po kliknięciu na nią, moŜliwe jest
uzyskanie listy prac, w których te cytowania się znajdują. UŜycie tych serwisów pozwala
więc na spełnienie postawionych wymagań. Scirus z kolei nie pozwala na łatwe uzyskanie
ani liczby cytowań, ani listy prac cytujących. Ręczne pobranie odbywa się za pomocą
skryptów zamieszczonych na stronie, co całkowicie wyklucza moŜliwość uŜycia tego serwisu w tworzonym rozszerzeniu.
Ostatnim z omawianych kryteriów jest wielkość bazy danych. W tym przypadku
rozwaŜane serwisy równieŜ moŜna podzielić na dwie grupy, a podział ten opiera się na
zawartościach baz danych. W pierwszej znajdują się Google Scholar oraz CiteSeerX.
Podobnie jak najpopularniejsze wyszukiwarki internetowe, przeszukują one automatycznie
dostępne strony WWW i pobierają z nich znalezione publikacje. Ich baza danych zawiera
więc jedynie pozycje, które są zamieszone, i moŜliwe do znalezienia, w Internecie.
CiteSeerX posiada w swojej bazie ponad 2 miliony dokumentów, natomiast Google
Scholar nie udostępniło liczby posiadanych przez nich rekordów. Wiadome jest jednak, Ŝe
23
znajduje się ona w czołówce baz tego typu, o ile nie jest największa, głównie ze względu
na moŜliwość przeszukania większej liczby stron (Google Scholar korzysta takŜe z bazy
danych regularnej wyszukiwarki Google). Na potwierdzenie powyŜszego stwierdzenia,
przeprowadzone zostało porównanie znalezionej liczby cytowań na obu serwisach, dla tej
samej publikacji. Dla pracy o tytule „Fast algorithms for mining association rules”,
Google Scholar wskazał 13609 cytowań, natomiast CiteSeerX jedynie 2121 [Dane na
dzień: 13.01.2013 r].
Drugą grupę, w ramach omawianego kryterium, tworzą serwisy Web of Science oraz
Scopus. Oba posiadają własne bazy danych. Ich główną róŜnicą, w porównaniu z serwisami naleŜącymi do pierwszej grupy, jest to, Ŝe uwzględnione są w nich przewaŜnie tylko
publikacje z oficjalnych, zrecenzowanych czasopism, ksiąŜek oraz konferencji. Szczególnie moŜna w nich znaleźć takie, które nie są dostępne nigdzie indziej w sieci. Ponadto,
cytowania dostępne w tych serwisach nie są wyszukiwane automatycznie, jak w poprzednim przypadku. Web of Science posiada w swojej bazie danych prawie 50 milionów rekordów. Wśród nich znajdują się cytowane prace, które były publikowane w okresie od roku
1900 do czasów obecnych. Scopus takŜe posiada prawie 50 milionów rekordów, z czego
objętych liczbą cytowań jest 28 milionów. W tym przypadku są one datowane najwcześniej na 1996 rok. Obie te bazy zawierają takŜe większą ilość informacji dotyczących publikacji, niŜ Google Scholar (np. pełne streszczenia prac).
Autorzy pracy [11] porównują serwisy Google Scholar oraz Web of Science, wskazując przy tym ich wady. Przede wszystkim, Web of Science ogranicza cytowania do publikacji z oficjalnej listy czasopism, mimo, Ŝe pozycje spoza niej mogą równieŜ być wysokiej
jakości. Ponadto serwis ten pokrywa jedynie w małym stopniu źródła w języku innym, niŜ
angielski, tłumacząc przy tym tytuły wszystkich publikacji na ten właśnie język. Z drugiej
strony, Google Scholar nie ma dostępu do niektórych czasopism naukowych, więc nie
uwzględnia znajdujących się w nich cytowań. Nie zawiera takŜe wielu starszych publikacji, a oprócz tego, serwis ten jest zdecydowanie rzadziej aktualizowany. Zaprezentowane
zostały takŜe wyniki przeprowadzonych badań, które wykazały, Ŝe Google Scholar znajduje 2,5 razy więcej cytowań niŜ Web of Science. Podobne wyniki uzyskali równieŜ autorzy
pracy [12].
Ostatecznie, po przeanalizowaniu wszelkich argumentów, wybrany został serwis
Google Scholar. Posiada on największą darmową bazę danych publikacji, a takŜe liczba
24
cytowań jest łatwo dostępna. Biorąc pod uwagę dziedzinę nauki, w jakiej znajdują się prace w repozytorium, czyli głównie Informatykę, wady takie jak brak starszych publikacji,
czy brak dostępu do niektórych czasopism naukowych nie sprawiają duŜego kłopotu.
Większość prac z tego obszaru jest bowiem powszechnie dostępna on-line (w przeciwieństwie do np. publikacji medycznych). Ponadto, czasami w publikacjach wskazywana jest
wada Google Scholar, dotycząca problemu z wyszukiwaniem prac, uŜywając słów kluczowych. Jednak nie dotyczy on tego przypadku, bowiem wyszukiwaną frazą będzie zawsze cały tytuł publikacji. Mimo wszystko, wybór tego serwisu wprowadza ograniczenia do
tworzonego rozszerzenia, które zostały przedstawione w rozdziale 3.4.5.
3.4 Metody pobierania liczby cytowań
Kolejnym wymaganym krokiem, w kierunku poprawnego zaprojektowania rozszerzenia, jest określenie sposobu, w jaki liczba cytowań będzie pobierana z wybranego serwisu. Jak zostało wspomniane w rozdziale 3.3, Google Scholar nie posiada interfejsu programowania aplikacji, który umoŜliwiłby uzyskanie danych w bezpośredni sposób. Z tego
powodu konieczne było opracowanie innej metody, która w łatwy sposób umoŜliwi ominięcie problemu brakującej funkcjonalności.
3.4.1 Analiza strony źródłowej Google Scholar
ZałoŜone podejście zakłada analizę zawartości dokumentu HTML ze stroną wynikową wyszukiwania publikacji, z uŜyciem technologii DOM. Na rys. 3.2 przedstawiony
jest zrzut ekranu zawierający fragment strony, otrzymanej po wyszukaniu frazy „mining”.
Widoczne są cztery róŜne wyniki. Dla kaŜdego z nich, wszystkie informacje, takie jak tytuł, opis czy liczba cytowań są umieszczone w elemencie HTML <div>. Mają one ustaloną klasę, o nazwie gs_r, dzięki czemu, uŜycie wbudowanej metody technologii DOM:
getElementsByClassName(„gs_r”), umoŜliwia łatwe zebranie listy wszystkich
rezultatów. Metoda ta, w języku JavaScript, zwraca tablicę, która zawiera elementy oznaczone zadaną nazwą klasy. Wnętrze znalezionych elementów moŜe przyjmować róŜną
postać.
25
Rys. 3.2 Fragment strony Google Scholar z rezultatami wyszukiwania
Tytuły znalezionych publikacji są prezentowane na dwa sposoby. Powoduje to, Ŝe
konieczne jest opracowanie dwóch metod ich znalezienia i uzyskania. Pierwszy przypadek
dotyczy prac, dla których nie zostały znalezione cyfrowe kopie dokumentów. Znajdują się
jednak w bazie, poniewaŜ są cytowane w innych pracach. Przykładem jest pierwszy rezultat widoczny na powyŜszym zrzucie ekranu. Tytuł ten składa się zawsze z dwóch części:
etykiety „[CYTOWANIE]” oraz właściwego tekstu. Obie części zostały umieszczone
wewnątrz elementu <h3>, któremu została nadana klasa gs_rt. Aby otrzymać poprawny
tytuł naleŜy ponowne uŜyć metody getElementsByClassName(„gs_rt”) i, dla
pierwszego elementu otrzymanej tablicy, usunąć wspomnianą etykietę.
Drugi przypadek prezentacji tytułu jest stosowany zdecydowanie częściej. Dotyczy
on tych pozostałych prac, dla których znalezione zostały cyfrowe kopie dokumentów. Cały
tekst, łącznie z ewentualną etykietą (w tym przypadku są to „[PDF]” oraz
„[KSIĄśKA]”), podobnie jak poprzednio, został umieszczony wewnątrz elementu
<h3>. Jednak poniewaŜ tytuł jest prezentowany jako odnośnik, uŜyty został takŜe element
<a>, który zawiera tylko i wyłącznie właściwy tekst tytułu. Elementy te, dla kolejnych
rezultatów wyszukiwania, przyjmują róŜniące się, ale schematyczne nazwy klas i są to
kolejno: yC0, yC2, yC4, itd. Dzięki temu, wystarczające jest jedynie uŜycie metody
26
getElementsByClassName(), z odpowiednią klasą jako argumentem. Pierwszym
elementem wynikowej tablicy będzie szukany tytuł.
W ostatnim wierszu pojedynczego rezultatu wyszukiwania znajduje się element
<div>, o klasie gs_fl, który grupuje dodatkowe informacje dotyczące publikacji, w
tym, przede wszystkim, liczbę jej cytowań. Znajduje się tam kilka elementów o znacznikach <a>. Sposobem na uzyskanie liczby cytowań jest pobranie pierwszego z tych elementów. Następnie naleŜy sprawdzić, czy wartość jego atrybutu href jest zgodna z następującym schematem: „/scholar?cites=” (jest to fragment adresu URL do odpowiedniej
strony serwisu Google Scholar). Jeśli tak, to znaczy Ŝe dana publikacja jest cytowana
przynajmniej jeden raz, a odnośnik ten prowadzi do strony zawierającej listę prac, w których te cytowania się znajdują. Znaleziony element ma etykietę w formacie „Cytowane
przez 1234”. Najlepszym sposobem na pobranie dokładnej liczby cytowań, jest usunięcie z
etykiety tekstu (czyli „Cytowane przez”) i pozostawienie jedynie numeru. Przypadek, kiedy atrybut href nie ma wartości, która wpasowuje się w zadany schemat oznacza, Ŝe publikacja taka nie jest nigdzie cytowana (liczba jej cytowań wynosi 0). Przykład został
przedstawiony na rys. 3.3.
Rys. 3.3 Przykład publikacji nieposiadającej cytowań
Strona, która zawiera listę prac cytujących jest podobna do zwykłej strony z
rezultatami wyszukiwania, a jej fragment został przedstawiony na rys. 3.4. Pierwszym
widocznym wierszem, na tym zrzucie ekranu, jest tytuł publikacji, do której cytowania się
odnoszą. Następnie, kolejne wyniki są takŜe umieszczane wewnątrz elementu <div> o
klasie gs_r. W związku z czym, pobieranie tytułów przebiega tak samo, jak zostało to
opisane na początku tego rozdziału. W tym przypadku nie będzie konieczne pobieranie
liczby cytowań, a jedynie tytułów publikacji, oraz ewentualnie odnośników do ich
cyfrowych kopii. Jeśli takie istnieją, są one wartościami atrybutu href elementów <a>,
zawierających tytuł.
27
Rys. 3.4 Fragment listy publikacji cytujących
Przyjęta metoda uzyskiwania danych ze strony źródłowej Google Scholar jest szybka
i nie wymaga skomplikowanych operacji, jednak posiada pewną wadę. W przypadku
zmiany układu elementów na stronie, lub nazw ich klas, wymagana będzie modyfikacja
kodu źródłowego rozszerzenia, aby mógł on poprawnie odczytać aktualny układ strony i
pobrać z niej wymagane dane. Niestety, brak alternatyw wymusza zastosowanie opisanego
podejścia.
3.4.2 Wysyłanie Ŝądań HTTP w języku JavaScript
Posiadając sposób uzyskania wymaganych danych ze strony Google Scholar,
kolejnym krokiem jest zdefiniowanie metody, która pozwoli na pobranie odpowiedniego
dokumentu HTML z zewnętrznego serwera. Proponowane rozwiązanie zakłada
wykorzystanie wbudowanego obiektu języka JavaScript – XMLHttpRequest, który jest
powszechnie uŜywany do wykonywania Ŝądań HTTP. Jest on głównym elementem bardzo
popularnej techniki tworzenia stron internetowych – AJAX (Asynchronous JavaScript and
XML). Technika ta umoŜliwia asynchroniczną komunikację klienta z serwerem, dzięki
czemu moŜliwe jest wyświetlanie nowych treści na stronie, bez potrzeby przeładowywania
całego dokumentu HTML. Jest to potęŜna technologia, która w znacznym stopniu
przyczyniła się do tego, jak wygląda dzisiaj sieć WWW (uŜywają jej takie serwisy, jak
Gmail, Google Maps czy Facebook). Została ona jednak z powodów bezpieczeństwa
28
znacznie ograniczona. Mianowicie, zabroniona została moŜliwość wysyłania Ŝądań HTTP
do innej domeny, niŜ ta, na której zamieszczony jest skrypt wykonujący operację.
Restrykcja ta jest przestrzegana po stronie przeglądarki i nie są nią objęte skrypty
składające się na rozszerzenie. Znajdują się one bowiem w pakiecie chrom i mają wyŜszy
poziom uprawnień niŜ skrypty zamieszczane na stronach (rozdział 2.2.2). Sprawia to, Ŝe
nic nie stoi na przeszkodzie, aby wykorzystać obiekt XMLHttpRequest w tworzonym
rozszerzeniu.
Na listingu 3.1 przedstawiono przykład uŜycia obiektu XMLHttpRequest, w języku JavaScript, który po odpowiednim dostosowaniu zostanie wykorzystany w tworzonym
rozszerzeniu. Atrybut onload słuŜy do przypisania funkcji, która będzie wywoływana, w
momencie, gdy odpytywany serwer zwróci Ŝądaną stronę. W tym przypadku sprawdza
ona, czy Ŝądanie zostało zakończone (readyState===4) oraz kod odpowiedzi HTTP
jest poprawny (status===200). Jeśli oba warunki są spełnione, odpowiedź na Ŝądanie
zawiera oczekiwany dokument HTML, który moŜe zostać odpowiednio przeanalizowany.
Metoda open() jest uŜywana do ustalenia kolejno: metody Ŝądania, adresu Ŝądanej strony oraz określenia, czy Ŝądanie ma zostać wykonane asynchronicznie. Za ostateczne wysłanie Ŝądania odpowiada metoda send(), która moŜe przyjąć jako argument dodatkowe,
potrzebne dane. Pełna specyfikacja obiektu XMLHttpRequest znajduje się w [13].
var http_request = new XMLHttpRequest();
http_request.onload = function() {
if (request.readyState===4 && request.status===200){
//obsługa otrzymanej odpowiedzi
}};
http_request.open("GET", "www.example.com", true);
http_request.send(null);
Listing 3.1 Przykład uŜycia obiektu XMLHttpRequest
3.4.3 Pobieranie danych pojedynczej publikacji
Pobieranie danych pojedynczej publikacji odbywać się będzie na kilka sposobów.
Przede wszystkim, jak zostało przedstawione w rozdziale 3.2, wewnątrz okna, otwieranego
po kliknięciu na dodaną etykietę, obecny będzie przycisk, umoŜliwiający aktualizację cytowań. Pobranie pełnych danych odbywać się będzie zawsze. Jeśli dla danej publikacji
będą one juŜ obecne w bazie danych, nastąpi tylko aktualizacja daty pobierania. Po udanym wykonaniu operacji, uzyskane dane będą prezentowane uŜytkownikowi – odświeŜona
zostanie zarówno zawartość okna, jak i odpowiednia etykieta na stronie repozytorium.
29
Opisany sposób wymaga od uŜytkownika wykonania dwóch akcji, które prowadzą do uzyskania oczekiwanego rezultatu. Aby uczynić rozszerzenie bardziej przyjaznym w uŜytkowaniu, wprowadzona zostanie moŜliwość częściowego zautomatyzowania tych operacji.
UŜytkownikowi udostępniony zostanie wybór, dotyczący tego, jak rozszerzenie będzie zachowywać się w przypadku kliknięcia na dodaną przez rozszerzenie etykietę cytowań. Oprócz tego, Ŝe zawsze zostanie otwarte odpowiednie okno, w zaleŜności od wybranej opcji nastąpi takŜe pobranie brakujących danych. Będzie to albo sama liczba cytowań
danej publikacji, albo jej pełne dane (czyli dodatkowo lista prac cytujących). Opisane operacje będą jednak dostępne tylko w przypadku, gdy dane nie były wcześniej pobierane. To
znaczy, Ŝe aktualizacja danych będzie moŜliwa jedynie za pomocą wspomnianego w poprzednim akapicie przycisku.
Aby móc spełnić postawione wymagania, konieczne jest zdefiniowanie procedury,
która obejmuje pobranie danych, a zakończona zostaje wyświetleniem ich uŜytkownikowi.
Pierwszy jej etap wymaga ustalenia adresu URL do serwera Google Scholar, który
pozwoli uzyskać dokument HTML, zawierający stronę wyszukiwania zadanej publikacji.
W tym celu uŜyty zostanie element obecny w tabeli rezultatów wyszukiwania
repozytorium, oznaczony etykietą „scholar”, przypisany do danej pracy. Jest to element ze
znacznikiem
<a>,
którego
wartość
atrybutu
href
ma
następującą
postać:
scholar.google.com/scholar?q="tytuł publikacji". Adres ten, aby mógł posłuŜyć do
pobrania danych, musi zostać poddany drobnej modyfikacji. UŜyty w oryginalnym URL
parametr q zostanie zamieniony na as_q, a takŜe dodany zostanie parametr as_sauthors,
który pozwala na wyspecyfikowanie autora wyszukiwanej publikacji. Ostateczny wygląd
adresu będzie następujący:
scholar.google.com/scholar?as_q="tytuł publikacji"&as_sauthors=Autor
Zmiana ta jest podyktowana tym, Ŝe czasami istnieje kilka prac o takim samym tytule, ale napisanych przez innych autorów. Dzięki ich wyspecyfikowaniu, wyszukiwanie
będzie bardziej precyzyjne, co pozwoli na uniknięcie konieczności wykonywania dodatkowych operacji, podczas analizy dokumentu HTML.
Drugi etap składa się z dwóch kroków, a pierwszym z nich jest wysłanie Ŝądania
HTTP, metodą GET, pod opisany w poprzednim akapicie adres. Jeśli nie wystąpi Ŝaden
błąd i w odpowiedzi otrzymany zostanie odpowiedni dokument HTML, naleŜy przystąpić
do znalezienia odpowiedniego rezultatu dla szukanej publikacji. Z kolejnych wyników
30
wyszukiwania wydobywane są tytuły (według sposobów opisanych w rozdziale 3.4.1),
które następnie zostają porównane z tytułem szukanej publikacji. Ze znalezionego rezultatu pobierana jest liczba jego cytowań oraz odnośnik do prac cytujących. W tym momencie,
jeśli praca nie jest cytowana (liczba cytowań równa jest 0), następuje koniec tego etapu
procedury i przejście do następnego. Brak liczby cytowań występuje takŜe w przypadku,
gdy publikacja nie została znaleziona wśród rezultatów wyszukiwania (w szczególności,
gdy zapytanie z szukaną frazą nie zwróciło Ŝadnych wyników). Zakończenie etapu ma
takŜe miejsce teraz, gdy uŜytkownik wybrał opcję automatycznego pobrania jedynie liczby
cytowań.
Kolejny krok omawianego etapu jest wykonywany tylko wtedy, gdy warunki
zakończenia, opisane w poprzednim akapicie nie zostały spełnione. W jego trakcie
wysyłane jest Ŝądanie HTTP, metodą GET, z pobranym wcześniej adresem URL,
prowadzącym do strony z listą prac, w których znajdują się cytowania szukanej publikacji.
Ich tytuły oraz odnośniki do cyfrowych kopii dokumentów będą uzyskane w taki sposób,
jak zostało to opisane w rozdziale 3.4.1. Konieczne było jednak wprowadzenie limitu na
liczbę tak pobranych prac. Wynosi on 100 i zarówno powód takiej restrykcji oraz to, z
czego wynika podana liczba, zostały opisane w rozdziale 3.4.5.
Kolejnymi etapami jest zapisanie pobranych informacji do bazy danych oraz ich wyświetlenie uŜytkownikowi. Schemat bazy danych, wraz z wykonywanymi na niej operacjami, zostały opisane w rozdziale 3.5.
3.4.4 Pobranie liczby cytowań wielu publikacji
Zaimplementowana zostanie takŜe moŜliwość automatycznego pobrania brakującej
liczby cytowań, dla kaŜdej publikacji znajdującej się na aktualnej stronie tabeli z
rezultatami wyszukiwania w repozytorium. Pierwszym etapem masowego pobierania jest
znalezienie wszystkich prac z widocznej strony, dla których nie ma zapisanej liczby
cytowań w bazie danych. Następnie, dla kaŜdej z nich, wykonywane są operacje
analogiczne do tych, które zostały wykorzystane do pobrania danych pojedynczej
publikacji (rozdział 3.4.3). W tym przypadku celem jest uzyskanie jedynie liczby cytowań,
więc pominięty zostaje etap pobierania listy publikacji cytujących. UŜytkownik będzie
mógł rozpocząć wykonywanie opisanych operacji, za pomocą specjalnie dodanego w tym
celu elementu interfejsu przeglądarki.
31
3.4.5 Ograniczenia wprowadzane przez Google Scholar
Google Scholar niestety nie pozwala na zautomatyzowane i masowe pobieranie danych z ich serwerów. Jeśli wykryte zostanie zbyt duŜo Ŝądań, otrzymanych w krótkim czasie, Google zablokuje usługę dla adresu IP, z którego zostały one wysłane. Początkowo
blokada ta jest tymczasowa i jej zdjęcie następuje po odczekaniu pewnego, stosunkowo
niedługiego czasu lub po wpisaniu kodu CAPTCHA, dostępnego po manualnym wejściu na
stronę. Jednak w przypadku powtarzających się blokad, Google moŜe podjąć decyzję o
permanentnej blokadzie na adres IP. Jest to niewątpliwie uzasadnione podejście, mające na
celu wyeliminowanie programów, które mogą automatycznie wysyłać tysiące Ŝądań w
krótkim czasie, nie tylko pobierając dane, ale takŜe obciąŜając serwery.
Z problemem tym zetknął się twórca rozszerzenia do dodatku Zotero (rozdział 2.5),
które takŜe umoŜliwia pobranie liczby cytowań dla wielu publikacji naraz. Rozwiązanie w
tym przypadku nie zostało jednak opracowane w optymalny sposób. Polega ono na tym, Ŝe
po kaŜdym setnym wysłanym Ŝądaniu, następuje minutowa przerwa przed kolejnym. Wadą
jest to, Ŝe te 100 Ŝądań moŜe zostać wysłane w ciągu kilkunastu sekund, a to z pewnością
spowoduje blokadę usługi.
W tworzonym rozszerzeniu ograniczenie to występuje, przede wszystkim, podczas
automatycznego pobierania liczby cytowań dla wielu publikacji (pobranie danych dla pojedynczej publikacji nie jest automatyczne – wymaga interakcji uŜytkownika). Proponowane rozwiązanie zakłada utworzenie kolejki adresów, pod które mają być wysłane Ŝądania. Po otrzymaniu odpowiedzi na pierwsze z nich, i przeanalizowaniu strony, pobierany
jest kolejny adres z kolejki. Zanim jednak zostanie wysłane odpowiednie Ŝądanie, wymuszane jest pewne losowe opóźnienie. Cykl ten powtarza się aŜ do momentu, w którym kolejka zostanie całkowicie opróŜniona lub gdy wystąpi wcześniej błąd pobierania. Podejście
takie ma na celu zasymulowanie sytuacji, w której Ŝądania te byłyby wysyłane podczas
wyszukiwania wykonywanego manualnie przez uŜytkownika. Nie gwarantuje ono jednak
pełnego wyeliminowania moŜliwości wystąpienia blokady usługi, ale powoduje dosyć skuteczne i duŜe jej opóźnienie. ChociaŜ liczba Ŝądań wysłanych w krótkim czasie moŜe wynieść maksymalnie 20 (taka jest liczba rezultatów wyświetlanych na pojedynczej stronie
tabeli), to przeprowadzone badania wykazały, Ŝe wprowadzenie opisanego obejścia jest
konieczne.
32
Innym zachowaniem, który Google określa jako niepoŜądane, jest szybkie przechodzenie pomiędzy kolejnymi stronami z rezultatami wyszukiwania. W tym przypadku usługa blokowana jest szybciej, niŜ w przypadku opisanym powyŜej. W kontekście tworzonego rozszerzenia, problem ten pojawia się w momencie pobierania listy publikacji cytujących. MoŜe ich być na tyle duŜo, Ŝe zostaną rozłoŜone na wiele stron. Z tego powodu
wprowadzone zostało ograniczenie na liczbę pobranych prac. Będzie ich maksymalnie
100. Liczba ta wynika z tego, Ŝe tyle moŜe zostać wyświetlonych wyników na jednej stronie. Domyślnie jest ich 10, a do uzyskania większej liczby wykorzystywany jest parametr
num, który naleŜy dodać do adresu URL (w tym przypadku będzie to &num=100). Takim
sposobem pobrana będzie tylko pierwsza ze stron, a kolejne zostaną pominięte.
3.5 Baza danych
Wszystkie bazy danych, wykorzystywane zarówno w samej przeglądarce Firefox, jak
i w jej rozszerzeniach, są obsługiwane przez system zarządzania bazą danych o
nazwie SQLite. Biblioteka go implementująca została napisana w języku C i zajmuje
jedynie kilkaset kilobajtów. W przeciwieństwie do innych systemów tego typu, SQLite jest
integralną częścią aplikacji, która go wykorzystuje, a nie osobnym procesem. Obsługuje on
język SQL i, pomimo swoich małych rozmiarów, zaimplementowana zastała większość
standardowych operacji, moŜliwych do wykonania w tym języku. Oprócz przeglądarek,
SQLite znalazł takŜe zastosowanie m.in. w systemach operacyjnych na urządzenia
mobilne, jak Android czy iOS.
Projektowane rozszerzenie wymaga przechowywania następujących danych:
•
Tytuł publikacji;
•
Liczba cytowań publikacji;
•
Data pobrania danych;
•
Zbiór prac, w których znajdują się cytowania.
Utworzone zostaną dwie tabele. W pierwszej z nich znajdą się dane dotyczące poszczególnych publikacji, czyli tytuł, liczba cytowań oraz data pobrania. Druga będzie zawierać prace, które cytują publikacje z pierwszej tabeli. Klucz główny pierwszej tabeli
zostanie uŜyty jako klucz obcy w drugiej. MoŜe wystąpić sytuacja, Ŝe dwie prace mają ten
sam tytuł, ale róŜnych autorów. Z tego powodu, jako wspomniany klucz główny nie zosta-
33
nie uŜyty
yty tytuł publikacji, a odnośnik
odno
do Google Scholar,, zmodyfikowany poprzez wyspecyfikowanie autora, jak przedstawione
przedstawion zostało w rozdziale 3.4.3.
Do tabeli zawierającej publikacje, wprowadzona zostanie takŜe
takŜe kolumna, zawierajązawieraj
ca odnośnik do stronyy wyszukiwania listy prac cytujących.
cytuj cych. Pozwoli ona na uniknięcie
unikni
wysyłania podwójnych Ŝądań,
Ŝądań w sytuacji, gdy wcześniej została juŜ pobrana liczba cytowań,
cytowa a
uŜytkownik chce uzupełnić dane o pozycje ze wspomnianej listy.. Pełna tabela publikacji
została przedstawiona
stawiona na rys. 3.5.
3.5 Tabela publikacji
Tabela prac cytujących
ących została przedstawiona na rys. 3.6.. Oprócz klucza obcego do
tabeli publikacji, pozostałe kolumny zawierają
zawieraj tytuły kolejnych prac i odnośniki
odno
do cyfrowych kopii dokumentów.
3.6 Tabela cytowań
Na potrzeby rozszerzenia, jedyne operacje SQL, które będą wymagane to: INSERT,
I
UPDATE oraz SELECT. Wstawianie będzie
b dzie wykonywane po pobraniu danych nowej pup
blikacji, która nie znajdowała się
si wcześniej w bazie.. Aktualizacja wartości
warto
będzie przeprowadzana jedynie w przypadku, gdy uŜytkownik
u
uŜyje
yje przycisku słuŜącego
słu
do aktualizacji cytowań pojedynczej publikacji, który znajduje się
si wewnątrz otwieranego okna.
okna Uaktualniona
alniona zostanie data oraz ewentualnie liczba cytowań.
cytowa . Pobranie danych z bazy będzie
odbywało się w dwóch przypadkach. Pierwszym z nich jest wejście
wej cie na stronę
stron z repozytorium, a powodem takiego zachowania jest konieczność
konieczno wyświetlenia
wietlenia liczby cytowań
cytowa na
dodanych
nych etykietach. Drugi przypadek występuje
wyst puje w momencie otwarcia wspomnianego
okna, aby mogło ono zostać uzupełnione o pobrane wcześniej dane.. PoniewaŜ
Poniewa raz napisane
34
publikacje nie znikną z sieci, podobnie jak jej cytowania, nie jest wymagana obsługa usuwania rekordów z bazy danych.
Komunikacja z bazą danych odbywa się za pomocą wbudowanych komponentów
XPCOM. Na listingu 3.2 przedstawiony został przykład otwarcia połączenia z bazą danych. Pierwszy komponent ("@mozilla.org/file/directory_service;1")
słuŜy do otwarcia pliku na dysku lokalnym, który przechowuje schemat bazy danych. Argument "ProfD" pozwala na uzyskanie ścieŜki do katalogu, utworzonego dla aktualnie
uŜywanego profilu przeglądarki. Przyjęło się, Ŝeby wszystkie pliki tworzone przez rozszerzenia były umieszczane właśnie tam, a dzięki podaniu takiego argumentu do metody
get(), nie jest wymagane szukanie katalogu na dysku (jego lokalizacja róŜni się, w zaleŜności od systemu operacyjnego). Po wykonaniu metody append() otwarty zostanie
plik o nazwie baza_danych.sqlite, który znajduje się we wspomnianym katalogu profilowym (zostanie on utworzony, jeśli nie istniał wcześniej). Drugi uŜyty komponent
("@mozilla.org/storage/service;1") słuŜy do uzyskania odpowiedniego serwisu, który umoŜliwia otwarcie połączenia z bazą danych, znajdującą się w podanym pliku. Na tak otwartym połączeniu moŜna wykonywać podstawowe operacje, jak utworzenie
tabeli czy wykonanie asynchronicznego zapytania. Asynchroniczność zapobiega moŜliwości zablokowania przeglądarki, w przypadku gdyby wykonanie zapytania trwało długi
czas.
var plik =
Components.classes["@mozilla.org/file/directory_service;1"]
.getService(Components.interfaces.nsIProperties)
.get("ProfD", Components.interfaces.nsIFile);
plik.append("baza_danych.sqlite");
var storageService =
Components.classes["@mozilla.org/storage/service;1"]
.getService(Components.interfaces.mozIStorageService);
var połączenie = storageService.openDatabase(plik);
Listing 3.2 Otwarcie połączenia z bazą danych
35
4 Opis implementacji
Biorąc pod uwagę wszystkie rozwiązania przedstawione w rozdziale 3, zaimplementowane zostało rozszerzenie spełniające postawione wymagania. Rozdział ten opisuje jej
kluczowe elementy, a takŜe napotkane trudności.
Rys. 4.1 Struktura rozszerzenia
Na rys. 4.1 przedstawiona jest struktura plików i katalogów, które zostały stworzone.
Logika rozszerzenia, napisana w języku JavaScript, została podzielona na kilka modułów
(plików źródłowych). KaŜdy z nich zawiera metody specyficzne dla konkretnych obszarów
działania rozszerzenia. Główny skrypt – main.js – zawiera deklarację globalnego obiektu
(nazwanego eitirepo), którego składnikami są zmienne i struktury danych, wykorzystywane w operacjach wykonywanych przez rozszerzenie, oraz metody będące łącznikami
pomiędzy modułami. Znajdują się tutaj takŜe operacje inicjujące składniki rozszerzenia po
otwarciu przeglądarki. Stworzone zostały następujące moduły:
36
•
listeners.js – Skrypt ten definiuje obiekt eitirepo.listener, który zawiera obserwatorów zdarzeń, jakie są powiązane z rozszerzeniem. Przede
wszystkim, wykrywane są kliknięcia na dodaną etykietę, czy przycisk znajdujący się w otwieranym oknie. Oprócz tego obserwowane są takŜe Ŝądania
wysyłane do repozytorium (opisane w rozdziale 4.2).
•
connection.js – Skrypt ten definiuje obiekt eitirepo.connection. Zawiera on metody słuŜące do wysyłania Ŝądań HTTP do serwera Google
Scholar, a takŜe przetwarzające otrzymane odpowiedzi.
•
db.js – Skrypt definiuje obiekt eitirepo.sqlite. Zawiera on metody
słuŜące do otwarcia połączenia z bazą danych oraz wykonywania na niej
wymaganych operacji.
•
ui.js – Skrypt definiuje obiekt eitirepo.ui. Jego głównym zadaniem jest
tworzenie oraz wyświetlanie elementów interfejsu uŜytkownika, czyli np.
dodanie etykiet do tabeli repozytorium.
•
translate.js – Skrypt definiuje obiekt eitirepo.translate. Zawiera on
tłumaczenia tekstów, uŜywanych w wyświetlanych elementach interfejsu
uŜytkownika, na wszystkie obsługiwane języki. (rozdział 4.4)
Na uwagę zasługuje katalog deafults/preferences, który nie został przedstawiony
podczas ogólnego opisu elementów rozszerzenia w rozdziale 2.2. Znajduje się tam skrypt,
który dodaje nowe preferencje do przeglądarki, wraz z ich wartościami domyślnymi. Dodawanie preferencji jest moŜliwe poprzez uŜycie następującej funkcji:
pref("nazwa.preferencji", "wartość domyślna");
4.1 Wprowadzone elementy interfejsu uŜytkownika
4.1.1 Modyfikacja interfejsu przeglądarki
Stworzone rozszerzenie wprowadza kilka modyfikacji w oryginalnym interfejsie
przeglądarki Firefox. Zmiany te zawiera dokument overlay.xul, który jest nakładką na
główne okno przeglądarki. Przede wszystkim, na pasku dodatków (kiedyś nazywanym
paskiem statusu), znajdującym się w dolnej części okna, dodana została ikona (rys. 4.2).
Informuje ona o tym, Ŝe rozszerzenie zostało zainstalowane i aktualnie działa, a takŜe
umoŜliwia uŜytkownikowi korzystanie z jego funkcji. Po kliknięciu na ikonę otwierane jest
37
menu, zawierające dwa elementy. Pierwszy z nich jest domyślnie niedostępny, ale słuŜy do
uruchomienia procesu pobierania liczby cytowań dla wszystkich publikacji ze strony.
Moment, w którym zostaje on udostępniony, został opisany w rozdziale 4.2. Kliknięcie na
drugi element powoduje otwarcie okna, które umoŜliwia zmianę opcji rozszerzenia. Ponadto, do menu „Narzędzia”, z głównego okna przeglądarki, dodany został element o etykiecie „EiTI Repository”, który zawiera podmenu takie samo, jak zostało opisane powyŜej.
Rys. 4.2 Ikona rozszerzenia na pasku dodatków
Okno opcji zostało stworzone przy uŜyciu elementu <dialog> języka XUL i
umieszczone jest w dokumencie options.xul. Jak pokazane zostało na rys. 4.3, uŜytkownik
ma moŜliwość ustawienia dwóch opcji. Pierwsza z nich dotyczy tego, co ma się wydarzyć,
gdy kliknięta zostanie dodana do tabeli repozytorium etykieta i moŜliwe są trzy przedstawione scenariusze. Druga opcja słuŜy do ustawienia adresu, serwera repozytorium. Sposób
jej wykorzystania opisany został w rozdziale 4.2. Obie opcje powiązane są z preferencjami, dodanymi przez rozszerzenie za pomocą skryptu eitirepopref.js. Po kaŜdym uŜyciu
przycisku „Zapisz”, ich wartości zostają odpowiednio zmienione i rozszerzenie od razu
będzie działać według nowych ustawień.
Rys. 4.3 Okno opcji rozszerzenia
38
4.1.2 Modyfikacja strony repozytorium
Rys. 4.4 Fragment zmodyfikowanej tabeli
Na rys. 4.4 przedstawiony został fragment tabeli z rezultatami wyszukiwania, po jej
zmodyfikowaniu przez rozszerzenie. Widoczne są nowo dodane elementy z etykietą
„cytowania(X)”. Liczba w nawiasie jest liczbą cytowań danej publikacji, natomiast znak
zapytania oznacza, Ŝe dane nie były jeszcze pobierane.
Modyfikacja zaczyna się od znalezienia wszystkich odnośników (elementów <a>)
znajdujących się na stronie. Następnie wybierane są tylko te, które prowadzą do strony
Google Scholar, a więc mają odpowiedni adres oraz etykietę „scholar”. Pod kaŜdym z
nich wstawiany jest nowy element <a> (opisany wspomnianą etykietą „cytowania(X)”).
Istnieją takie rezultaty wyszukiwania, dla których nie została zamieszczona w tabeli
wspomniana etykieta „scholar”. W takim przypadku element nie jest dodawany, czyli
takie wiersze tabeli są pomijane. Opisana operacja jest jednak poprzedzona wykonaniem
zapytania do bazy danych, które zwróci listę z liczbą cytowań i datą, dla tych z widocznych publikacji, których dane zostały juŜ pobrane. Dzięki temu moŜliwe jest natychmiastowe ustawienie odpowiedniej liczby w etykiecie dodawanego elementu. W celu usprawnienia późniejszych operacji, kaŜdy z elementów ma ustawianą jedną z dwóch klas:
eitirepo-citations, jeśli cytowania dla danej publikacji zostały juŜ pobrane, oraz
39
eitirepo-no-citations w przeciwnym wypadku. Kliknięcie na wstawiony element powoduje otwarcie okna z większą ilością informacji. Okno to zostało opisane w
rozdziale 4.1.3. Do kaŜdego elementu dodana została podpowiedź typu tooltip, dzięki
czemu, po najechaniu na niego kursorem, pojawi się informacja o dacie pobrania aktualnych danych. (rys. 4.5)
Rys. 4.5 Tooltip zawierający datę pobrania
4.1.3 Okno z listą prac cytujących
Rys. 4.6 Okno otwierane po kliknięciu na etykietę cytowań
40
Na rys. 4.6 przedstawiony został wygląd otwieranego okna, wraz z jego przykładową
zawartością. Zostało ono stworzone przy pomocy elementu języka XUL, o znaczniku
<panel>. Element ten moŜe przyjmować róŜne postacie, w zaleŜności od nadanego mu
typu (wartości atrybutu type). W tym przypadku, typem tym jest arrow, co powoduje
dodanie strzałki wskazującej na element, którego kliknięcie spowodowało otwarcie okna.
Wewnątrz okna znajduje się ramka, do której załadowany został dokument HTML, znajdujący się w pliku popup.html. Okno takie pozostaje otwarte, aŜ do momentu, gdy uŜytkownik kliknie myszką poza jego obszarem.
Po kliknięciu na etykietę, zanim okno zostanie otwarte, następuje zapytanie do bazy
danych, w celu wyszukania informacji o wybranej publikacji. Jeśli zostały one wcześniej
pobrane z serwisu Google Scholar, zapytanie zwróci odpowiednie dane, które będą mogły
zostać od razu wyświetlone uŜytkownikowi. Dane te są zapamiętywane w programie, aŜ do
otwarcia kolejnego okna. Z tego powodu, jeśli uŜytkownik będzie chciał otworzyć okno
dla tej samej publikacji dwa razy pod rząd, nie będzie konieczności wykonywania kolejnego zapytania do bazy.
Jeśli nie ma danych dotyczących wybranej publikacji oraz opcja automatycznego
pobierania została włączona, po otwarciu okna następuje wysłanie odpowiednich Ŝądań
HTTP (rozdział 3.4.3). NiezaleŜnie od tego, czy dane zostały pobrane (z bazy lub serwera),
zawartość okna zostaje odpowiednio uzupełniona. Tabela widoczna na rys. 4.6 zawiera
listę prac, które cytują wybraną publikację. W jej drugiej kolumnie znajdują się odnośniki
do cyfrowych kopii tych dokumentów. Kliknięcie na zawarty w nich tekst powoduje
otwarcie w przeglądarce nowej zakładki, ze stroną spod zadanego adresu. Na rys. 4.7 zaprezentowany został wygląd okna w przypadku, gdy pobrano dane, ale publikacja nie była
ani razu cytowana. MoŜna zauwaŜyć, Ŝe tabela z listą prac jest tworzona dynamicznie i nie
pojawia się, gdy nie ma w niej nic do wyświetlenia. Na rys. 4.8 przedstawiony został z
kolei przykład okna, które zostało otwarte dla publikacji, dla której nie pobierano jeszcze
danych.
41
Rys. 4.7 Okno otwarte dla publikacji bez cytowań
Rys. 4.8 Okno otwarte dla publikacji bez pobranych danych
4.2 Wykrycie repozytorium
Jedną z napotkanych trudności, jakie wystąpiły podczas implementacji rozszerzenia,
było wykrycie wszystkich moŜliwych sytuacji, w których powinna nastąpić modyfikacja
tabeli repozytorium. Są to: wejście na stronę z rezultatami wyszukiwania, przechodzenie
pomiędzy kolejnymi stronami tabeli oraz zmiana zakładki. Najczęściej uŜywanym, w rozszerzeniach, sposobem wykrycia wejścia na daną stronę jest obserwowanie zdarzenia load, który oznacza, Ŝe przeglądarka zakończyła ładowanie dokumentu HTML strony. Po
jego otrzymaniu wystarczy porównać adres strony, której dotyczy, z załoŜonym. Jeśli się
42
zgadzają moŜna wykonać wymagane operacje na wyświetlanym dokumencie. W przypadku tworzonego rozszerzenia, rozwiązanie takie równieŜ mogłoby zostać uŜyte, gdyby nie
to, Ŝe kolejne strony z tabeli wyszukiwania pobierane są z uŜyciem techniki AJAX. Powoduje to, Ŝe po przejściu na inną stronę tabeli, dokument jest jedynie modyfikowany, a nie
ładowany od nowa, w związku z czym przeglądarka nie wysyła zdarzenia load. Konieczne było uŜycie innego rozwiązania.
Dostępne jest kilka metod pozwalających na wykrywanie podobnych sytuacji, jednak
tą, która umoŜliwiła poprawne i łatwe spełnienie wszystkich wymagań, okazało się
obserwowanie odpowiedzi na Ŝądania HTTP, wysyłanych do serwera repozytorium.
Wykorzystany został do tego tzw. Serwis Obserwatorów (ang. Observer Service),
udostępniany w postaci komponentu XPCOM. Pozwala on na dodanie obserwatora, dla
wybranego zdarzenia, którym jest obiekt implementujący metodę observe(),
uruchamianą przy kaŜdym wystąpieniu zdarzenia. Uproszczony fragment kodu,
zawierający implementację obserwatora wykorzystywanego w rozszerzeniu, został
przedstawiony na listingu 4.1. Zdarzenie otrzymania odpowiedzi HTTP ma identyfikator
http-on-examine-response.
var observerService =
Components.classes["@mozilla.org/observer-service;1"]
.getService(Ci.nsIObserverService);
observerService.addObserver(responseObserver,
"http-on-examine-response", false);
responseObserver : {
observe : function(aSubject, aTopic, aData) {
if (aTopic == "http-on-examine-response") {
aSubject.QueryInterface(Ci.nsIHttpChannel);
var url = aSubject.URI.spec;
var reg = new RegExp
(/repo\.pw\.edu\.pl\/resultList.seam/);
if (reg.exec(url) != null) {
//adres zgodny z załoŜonym
var newListener = new ResponseListener();
aSubject.QueryInterface(
Components.interfaces.nsITraceableChannel);
newListener.originalListener =
aSubject.setNewListener(newListener);
}
}
}
}
Listing 4.1 Fragment obserwatora zaimplementowanego w rozszerzeniu
43
Z powodu tego, Ŝe obserwowane są odpowiedzi na kaŜde Ŝądanie wysyłane przez
przeglądarkę, konieczne jest ich filtrowanie, które pozwoli na wydzielenie tylko tych dotyczących repozytorium (obsługa wszystkich odpowiedzi będzie niepotrzebnie obciąŜać
przeglądarkę i spowolni jej działanie). Odbywa się to na zasadzie porównywania adresu,
na które wysłane zostało Ŝądanie, z tym, jaki został zdefiniowany przez uŜytkownika w
opcji dotyczącej adresu serwera repozytorium. Interesująca z punktu widzenia rozszerzenia
jest jedynie strona, która zawiera tabele wynikową wyszukiwania, a jej URL wygląda następująco: repo.pw.edu.pl/resultList.seam. MoŜliwe jest zatem zlikwidowanie konieczności
obsługi nieistotnych Ŝądań wysyłanych do repozytorium, poprzez dodawanie tekstu:
/resultList.seam, do adresu wyspecyfikowanego przez uŜytkownika (w przedstawionym
przykładzie jest to repo.pw.edu.pl).
Niestety, uŜycie tylko przedstawionego obserwatora nie jest wystarczające. Metoda
observe() jest bowiem uruchamiana w momencie, gdy otrzymany zostanie jedynie nagłówek odpowiedzi. Przeglądarka nie otrzymała jeszcze oczekiwanej zawartości dokumentu, więc nie jest moŜliwe jego zmodyfikowanie. PoniewaŜ czas, po jakim cała zawartość
odpowiedzi zostanie odebrana jest niedeterministyczny (szczególnie zaleŜy on od szybkości łącza i czasu odpowiedzi serwera), ustawienie jedynie odpowiedniego opóźnienia nie
wystarczy. Sposobem na ominięcie tego problemu jest uŜycie komponentu XPCOM, który
implementuje interfejs nsITraceableChannel, tak jak zostało to przedstawione na
listingu 4.1, wewnątrz drugiego bloku if. Obiekt klasy ResponseListener, który jest
uŜyty jako argument metody setNewListener(), musi implementować dwa interfejsy: nsIStreamListener oraz nsIRequestObserver. Pierwszy z nich posiada
metodę onDataAvailable(), która jest wywoływana po otrzymaniu kaŜdej paczki z
zawartością, wysłaną przez serwer. Zawartość tę moŜna w tym miejscu zmodyfikować
według potrzeb. Drugi interfejs posiada metody onStartRequest() oraz onStopRequest(), które są uruchamiane odpowiednio przed otrzymaniem pierwszej paczki
oraz po ostatniej. Z punktu widzenia rozszerzenia, istotna jest jedynie metoda onStopRequest(). Oczekiwany dokument będzie w momencie jej uruchomienia juŜ w pełni
dostarczony, więc moŜliwe będzie wywołanie metody odpowiedzialnej za modyfikację
strony repozytorium. Na listingu 4.2 przedstawiony został obiekt ResponseListener.
44
function ResponseListener() {
this.originalListener = null;
}
ResponseListener.prototype = {
onDataAvailable: function(request, context,
inputStream, offset, count) {
this.originalListener.onDataAvailable(request, context,
inputStream, offset, count);
},
onStartRequest: function(request, context) {
this.originalListener.onStartRequest(request, context);
},
onStopRequest: function(request, context, statusCode) {
this.originalListener.onStopRequest(request, context,
statusCode);
//Wywołanie metody, która modyfikuje stronę
},
};
Listing 4.2 UŜycie klasy ResponseListener
Opisana powyŜej metoda pokrywa sytuacje wejścia na stronę z rezultatami
wyszukiwania oraz przechodzenia pomiędzy kolejnymi stronami tabeli. Wykrycie otwarcia
zakładki ze stroną repozytorium było mniej skomplikowanym zadaniem. Wykorzystane
zostało zdarzenie wyboru zakładki – TabSelect, wysyłane przez przeglądarkę. Po jego
odebraniu, adres URL wybranej zakładki jest porównywany z adresem pw.edu.pl. W tym
przypadku
nie
jest
moŜliwe
uŜycie
pełnego
adresu
repozytorium
(repo.pw.edu.pl/searchList.seam), poniewaŜ oczekiwany dokument moŜe znajdować się w
ramce na stronie wydziału, którego URL ma początek elka.pw.edu.pl/. Z tego powodu,
jeśli adres jest zgodny z załoŜonym, konieczne jest sprawdzenie, czy dokument HTML ze
stroną rezultatów wyszukiwania nie znajduje się w ramce i jeśli tak, konieczne jest jego
wydobycie.
Wykrycie powyŜszych sytuacji jest wymagane nie tylko ze względu na potrzebę modyfikacji strony repozytorium. Pozwala to takŜe na odblokowanie elementu menu, który
odpowiada za uruchomienie operacji pobierania liczby cytowań, dla wszystkich publikacji
ze strony. Oprócz tego, wykonana zostanie modyfikacja w interfejsie uŜytkownika. Na
pasku adresu pojawi się ikona, informująca uŜytkownika, Ŝe na obecnie przeglądanej stronie znajdują się publikacje, dla których moŜna pobrać liczbę cytowań (rys. 4.9). W przypadku opuszczenia takiej strony, zostanie ona ukryta. Kliknięcie prawym przyciskiem my-
45
szy na ikonę powoduje otwarcie takiego samego menu kontekstowego, jakie zostało przedstawione w rozdziale 4.1.1.
Rys. 4.9 Modyfikacja paska adresu
4.3 Pobieranie danych
Jak zostało opisane w rozdziałach 3.4.3 oraz 3.4.4, pobieranie danych z serwisu
Google Scholar moŜe być inicjowane na kilka sposobów. Najistotniejszą kwestią, jaka
wymaga przedstawienia jest to, Ŝe nie moŜe wystąpić sytuacja, w której wykonywane są
dwa pobierania naraz. NiezaleŜnie od sytuacji, w której zaczęto pobieranie, do momentu aŜ
się ono nie zakończy, zablokowana zostanie moŜliwość uŜycia odpowiednich przycisków
(w menu oraz oknie), a takŜe wyłączona zostanie opcja automatycznego pobierania po
otwarciu okna. W przypadku pobierania danych pojedynczej publikacji stanie się to na tyle
szybko, Ŝe uŜytkownik nie odczuje tego ograniczenia. Jednak pobieranie liczby cytowań,
dla wszystkich publikacji ze strony, moŜe trwać na tyle długo, Ŝe konieczne jest poinformowanie o tym fakcie. Dokonywane jest to za pomocą zmiany ikon na paskach dodatków
oraz adresu, jak przedstawione zostało na rys. 4.10 oraz 4.11. Pozostaną one takie do momentu, aŜ pobieranie się zakończy, kiedy to ich wygląd powróci do oryginalnego.
Rys. 4.10 Ikona pobierania na pasku adresu
Rys. 4.11 Ikona pobierania na pasku dodatków
NajwaŜniejsze decyzje implementacyjne, podjęte w kontekście pobierania plików:
•
Pobranie automatyczne po otwarciu okna następuje jedynie w przypadku, gdy
dane dla publikacji nie były pobierane wcześniej. W przypadku gdy uŜytkownik wybierze opcję pobrania pełnych danych, a w bazie znajduje się juŜ
sama liczba cytowań, wtedy jest wysyłane tylko jedno Ŝądanie. Pobrana tym
sposobem będzie jedynie lista publikacji cytujących (oczywiście tylko jeśli
liczba cytowań jest większa od zera), co zlikwiduje nadmiarowe Ŝądania. Po46
nadto, pobieranie automatyczne następuje dopiero po otwarciu i uzupełnieniu
okna, które potem jest aktualizowane.
•
Opóźnienie pomiędzy kolejnymi Ŝądaniami, w przypadku pobierania liczby
cytowań, dla kaŜdej publikacji ze strony, będzie generowane dwuetapowo.
Najpierw wylosowane zostaną dolne i górne przedziały, spomiędzy których
losowana będzie ostateczna liczba milisekund. Ostatecznie, dolny przedział
moŜe wahać się, w sekundach, od 1 do 5, natomiast górny od 5 do 15.
•
KaŜde pobranie, niezaleŜnie, czy nowych danych, czy aktualizacja istniejących, kończy się odpowiednim zapisaniem rezultatu do bazy danych.
•
Po pobraniu danych, aktualizowana będzie takŜe liczba cytowań znajdująca
się w etykiecie, dodanej do tabeli repozytorium elementu. W szczególności,
przy pobieraniu masowym, wszystkie znaki zapytania zostaną zamienione na
odpowiednie liczby.
4.3.1 Obsługa błędów pobierania
Podczas pobierania danych z serwisu Google Scholar moŜliwe jest wystąpienie błędu, który objawia się tym, Ŝe kodem odebranej odpowiedzi HTTP nie będzie 200 (co oznacza udane Ŝądanie). Sytuacja taka moŜe wystąpić niezaleŜnie od sposobu pobierania danych, a jej powodem najczęściej jest brak dostępu do sieci lub zablokowanie usługi Google
Scholar dla adresu IP uŜytkownika rozszerzenia. W momencie wystąpienia takiego błędu
konieczne jest odpowiednie poinformowanie o nim uŜytkownika. Przede wszystkim, podobnie jak na czas pobierania, zmieniane są ikony na paskach dodatków oraz adresu. Zostaną one w takiej postaci, aŜ do momentu, gdy uda się poprawnie pobrać dane. Na
rys. 4.12 oraz 4.13 zaprezentowano opisaną zmianę.
Rys. 4.12 Ikona na pasku adresu po błędzie
Rys. 4.13 Ikona na pasku dodatków po błędzie
47
Oprócz tego, w przypadku pobierania liczby cytowań pojedynczej publikacji, czy to
za pomocą przycisku, czy automatycznie, wyświetlona zostanie odpowiednia informacja
wewnątrz otwartego okna, jak jest przedstawione na rys. 4.14. Pobieranie masowe nie jest
powiązane z Ŝadnym oknem, dlatego konieczne było znalezienie innego miejsca, w którym
moŜna wyświetlić widoczną dla uŜytkownika informację o błędzie. UŜyty w tym celu został, wbudowany w przeglądarkę moduł JavaScript, który pozwala na wyświetlenie okna
powiadomień typu „popup”. Pojawia się ono zawsze na lewym końcu paska adresu, dzięki
czemu jest widoczne dla uŜytkownika. Na rys. 4.15 jest przedstawiony jego wygląd.
Rys. 4.14 Powiadomienie o błędzie podczas pobierania pojedynczej liczby cytowań
Rys. 4.15 Powiadomienie o błędzie podczas czasie masowego pobierania
4.4 Obsługa języków
W trakcie pisania tej pracy, repozytorium obsługiwało dwa języki: polski oraz
angielski i takie teŜ są zaimplementowane obecnie w rozszerzeniu. W przypadku
elementów dodanych do interfejsu przeglądarki, wszystkie znajdujące się tam teksty i ich
tłumaczenia obecne są w sekcji locale, w pakiecie chrom rozszerzenia. Dokładnie są to
pliki eitirepo.dtd z katalogów locale/pl-PL oraz locale/en-US i zawierają one odpowiednio
48
polskie oraz angielskie teksty. Wyborem, które mają zostać aktualnie wyświetlone,
zarządza przeglądarka na podstawie ustawionego przez uŜytkownika języka.
Języki pozostałych tekstów, wyświetlanych przez rozszerzenie (np. tych wewnątrz
okna, czy we wstawianych do tabeli elementach), są określane na innej zasadzie. Opierają
się one na języku, w jakim uŜytkownik uŜywa repozytorium. Adres URL repozytorium
zawiera parametr lang, który determinuje ustawiony język (jeśli parametru tego nie ma –
repozytorium jest w języku polskim). Przed wykonaniem modyfikacji strony, parametr ten
jest odczytywany i zapisywany do odpowiedniej zmiennej. Znajduje się ona w obiekcie
eitirepo.translate (obiekt ten zdefiniowany jest w skrypcie translate.js) i nazywa
się lang. Na listingu 4.3 przedstawiony został fragment tego obiektu.
eitirepo.translate = {
lang : "pl",
"pl" : {
"html.title.info" : "Tytuł publikacji:",
"html.date.info" : "Ostatnie pobranie cytowań:"
},
"en" : {
"html.title.info" : "Publication title:",
"html.date.info" : "Last update:"
}
};
Listing 4.3 Fragment obiektu eitirepo.translate
Zmienna ta jest uŜywana do wyboru odpowiedniego obiektu (w tym przypadku są to
"pl" lub "en"), który zawiera tłumaczenia tekstów. Tłumaczenia te występują w formie
identyfikator – tekst. Identyfikator musi być taki sam dla kaŜdego języka, natomiast tekst
się róŜni. Podany fragment kodu zawiera dwie takie pary. W celu dodania obsługi kolejnego języka, naleŜy utworzyć nowy obiekt, np. "es" dla języka hiszpańskiego, który zawiera wszystkie zdefiniowane wcześniej identyfikatory wraz z tłumaczeniami. Przykład uŜycia obiektu eitirepo.translate wygląda następująco:
eitirepo.translate[eitirepo.translate.lang]["html.title.info"]
PowyŜsza instrukcja zwraca tekst „Tytuł publikacji:” lub „Publication title:”, w zaleŜności od ustawionego języka. Wprowadzenie takiego rozwiązanie pozwoliło na zredukowanie liczby wykonywanych operacji oraz objętości kodu. Aktualny język jest ustawiany tylko raz na stronę i nie jest wymagane sprawdzanie warunku przed kaŜdym wyświetla49
nym tekstem. Poza tym, dodanie nowego języka jest łatwe i szybkie. Na rys. 4.16 przedstawiono zrzut ekranu takiego samego okna, jak na rys. 4.7, jednak w tym przypadku z
repozytorium uruchomionym w języku angielskim.
Rys. 4.16 Okno w angielskiej wersji językowej
4.5 Testy
Przeprowadzane testy rozszerzenia miały na celu, przede wszystkim, weryfikację
poprawności działania metod wykonujących postawione wymagania funkcjonalne. Podczas trwania prac, kaŜda z dodanych metod była na bieŜąco testowana. Pozwoliło to na
wyeliminowanie pomniejszych błędów na wczesnym etapie i zapobiegnięciu ich kumulacji, w miarę rozrastania się oprogramowania. Oprócz testów jednostkowych, kaŜda najwaŜniejsza funkcja miała przewidziany własny scenariusz testowania, których pełen zestaw był wykonywany po kaŜdej większej zmianie w rozszerzeniu. Poza opisanymi testami, przeprowadzone zostały takŜe takie, które miały na celu weryfikację spełnienia wymagań niefunkcjonalnych, przede wszystkim wydajnościowych.
4.5.1 Scenariusze testowania
Scenariusz 1
Pierwszy ze scenariuszy zakłada przetestowanie poprawności nastę-
pujących elementów: modyfikacji strony repozytorium, wyświetlenia okna, pobrania danych z uŜyciem przycisku znajdującego się w oknie oraz zapisanie ich do bazy danych.
1. Wejście na stronę repozytorium: repo.pw.edu.pl.
50
2. Przeprowadzenie wyszukiwania, z warunkami, które pozwolą na zwrócenie
przynajmniej dwóch rezultatów.
3. Sprawdzenie, czy odpowiednia komórka w tabeli, dla kaŜdego rezultatu wyszukiwania, została poprawnie zmodyfikowana poprzez wstawienie elementu
z etykietą „cytowania(X)”.
4. Wybranie publikacji, dla której nie została jeszcze pobrana liczba cytowań
(etykieta „cytowania(?)”) i otwarcie dla niej okna poprzez kliknięcie na etykietę.
5. Sprawdzenie poprawności wyświetlanych danych i uŜycie przycisku „Aktualizuj cytowania”.
6. Po pobraniu danych, oraz ich wyświetleniu, manualne wyszukanie
odpowiedniej frazy w serwisie Google Scholar i porównanie otrzymanych
informacji.
7. Pomocnicze kliknięcie na inną etykietę, w celu zresetowania zawartości okna.
8. Powtórzenie przeprowadzonego wyszukiwania w repozytorium. Po uzyskaniu strony z rezultatami, otwarcie okna dla tej samej publikacji, która została
wybrana w punkcie 4.
9. Porównanie wyświetlonych danych, z tymi, które widoczne były w punkcie
6. Jeśli się zgadzają, zapis do bazy danych się powiódł.
Scenariusz 2
Kolejny scenariusz zakłada przetestowanie poprawności ustawienia
oraz realizacji opcji automatycznego pobrania danych pojedynczej publikacji, uruchamianego po kliknięciu na etykietę. W przypadku opcji pobierania pełnych danych zostały
przewidziane dwie sytuacje. Pierwsza zakłada uzyskanie jedynie brakującej listy prac cytujących dla publikacji, która miała juŜ wcześniej pobraną samą liczbę cytowań. Druga natomiast dotyczy zwykłego pobrania pełnych danych.
1. Wejście na stronę repozytorium: repo.pw.edu.pl.
2. Wyszukanie dwóch publikacji, które w serwisie Google Scholar są cytowane
przynajmniej raz, ale dane dla nich nie były dotąd pobierane.
3. Ustawienie opcji pobierania samej liczby cytowań przy otwieraniu okna.
51
4. Otwarcie okna dla pierwszej z publikacji. Weryfikacja poprawności pobranych i wyświetlonych danych.
5. Zmiana opcji na pobranie pełnych danych przy otwieraniu okna.
6. Ponowne otwarcie tego samego okna i weryfikacja poprawności pobranych
danych, wyświetlonych w tabeli.
7. Otwarcie okna dla drugiej publikacji. Weryfikacja poprawności pobranych i
wyświetlonych pełnych danych.
Scenariusz 3
Scenariusz ten zakłada przetestowanie masowego pobierania liczby
cytowań, dla kaŜdej publikacji znajdującej się na aktualne stronie. Sprawdzone zostaną
takŜe: blokowanie moŜliwości rozpoczęcia kolejnego pobierania, zanim nie skończy się
poprzednie, oraz odpowiednia zmiana ikon na paskach dodatków i adresu. Do pełnego
przeprowadzenia testu konieczne jest zainstalowanie dodatku o nazwie Tamper Data, który pozwala na oglądanie Ŝądań wysyłanych przez przeglądarkę. Rozszerzenie moŜe być
pobrane ze strony: https://addons.mozilla.org/pl/firefox/addon/tamper-data/
1. Wejście na stronę repozytorium: repo.pw.edu.pl.
2. Przeprowadzenie wyszukiwania, które zwróci kilka rezultatów, dla których
nie zostały wcześniej pobierane dane (zalecane przynajmniej 5 takich wyników).
3. Uruchomienie rozszerzenia Tamper Data.
4. Rozpoczęcie pobierania masowego.
5. W trakcie pobierania: weryfikacja wyglądu ikon na odpowiednich paskach
oraz próba rozpoczęcia kolejnego pobierania, które nie powinno być dostępne.
6. Po zakończeniu pobierania: weryfikacja poprawności modyfikacji etykiet dodanych elementów oraz wyglądu ikon, które powinny mieć przywrócone
pierwotną postać.
7. Przeanalizowanie przechwyconych Ŝądań przez rozszerzenie Tamper Data.
W szczególności liczbę Ŝądań wysłanych do serwera Google Scholar, która
powinna być zgodna z liczbą publikacji widocznych na stronie repozytorium.
52
8. Ponowne wyszukanie tego samego zestawu publikacji. Pozwoli to na weryfikację poprawności zapisu do bazy danych.
4.5.2 Testy wydajnościowe
Pełne przetestowanie wszystkich postawionych wymagań niefunkcjonalnych, w tym
przede wszystkim wydajności, było moŜliwe dopiero po zaimplementowaniu pełnej funkcjonalności.
Rozszerzenie zostało zainstalowane na trzech róŜnych systemach operacyjnych:
Windows 7 64-bit, Windows XP, Ubuntu 10.04 32-bit, wszystkie z zainstalowaną przeglądarką Firefox w wersji 17.0. Na kaŜdym z nich, scenariusze opisane w rozdziale 4.5.1,
zostały wykonane pomyślnie i nie zostały stwierdzone Ŝadne niepoŜądane zachowania.
W celu przetestowania wydajności rozszerzenia przeprowadzono pomiar zajętego
miejsca w pamięci. Otwarta została ta sama strona repozytorium, najpierw na przeglądarce
bez zainstalowanego rozszerzenia, a następnie z nim. Po kilku próbach, przeglądarka z
zainstalowanym rozszerzeniem zajmowała średnio o 3KB miejsca w pamięci więcej, niŜ
bez niego. Ponadto otwarcie okna z informacjami dotyczącymi publikacji wymagało takŜe
średnio 3KB miejsca w pamięci. Podczas długotrwałego uŜytkowania przeglądarki, z zainstalowanym rozszerzeniem, nie stwierdzono znaczących opóźnień przez to wywołanych.
PoniewaŜ większość operacji jest wykonywanych asynchronicznie, nie blokują one pozostałych zadań przeglądarki.
53
5 Podsumowanie
Oczekiwanym rezultatem praktycznym pracy było stworzenie rozszerzenia do przeglądarki, które pozwoli na zwiększenie funkcjonalności cyfrowego repozytorium dokumentów Wydziału Elektroniki i Technik Informacyjnych Politechniki Warszawskiej.
Głównym udoskonaleniem, jakie dodatek ten miał wprowadzać była moŜliwość pobierania
liczby cytowań dla przechowywanych publikacji. Jego odbiorcami będą przede wszystkim
pracownicy naukowi Wydziału. Zdecydowano się na stworzenie rozszerzenia do przeglądarki Mozilla Firefox, ale nie odrzucono moŜliwości stworzenia implementacji równieŜ na
inne dostępne przeglądarki.
W ramach pracy dokonano przeglądu technik dotyczących tworzenia rozszerzeń do
przeglądarki Firefox. Wskazano, przede wszystkim, ich najwaŜniejsze elementy oraz wykorzystywane technologie. NajwaŜniejszymi z nich są JavaScript, XUL oraz XPCOM.
XUL odpowiada za dostarczenie interfejsu uŜytkownika rozszerzenia, natomiast XPCOM
jest zestawem komponentów, pozwalających na wykonywanie operacji, które nie są moŜliwe domyślnie z poziomu języka JavaScript.
W pracy przedstawiono wymagania postawione tworzonemu oprogramowaniu, a
takŜe dokonano ich analizy. Podczas niej rozwiązane zostały najistotniejsze kwestie, pozwalające na poprawne spełnienie postawionych wymagań. Jedną z nich był wybór źródła,
z którego będą pobierane wymagane dane, czyli liczba cytowań publikacji, wraz z listą
prac, w których te cytowania się znajdują. Dokonany został przegląd kilku najpopularniejszych serwisów, które umoŜliwiają wyszukiwanie publikacji oraz liczby ich cytowań. Spośród nich wybrany został serwis Google Scholar. Wybór był podyktowany tym, Ŝe serwis
ten jest darmowy, a takŜe moŜliwe jest łatwe uzyskanie wymaganych danych, jedynie na
podstawie dokumentu HTML. Z drugiej strony, wprowadził on pewne ograniczenie dla
jednego z wymagań. Wymaganie to zakłada moŜliwość automatycznego pobrania danych,
dla kaŜdej publikacji znajdującej się na aktualnej stronie repozytorium, natomiast Google
Scholar nie pozwala na wysyłanie zbyt wielu Ŝądań, w zbyt krótkim czasie, do ich serwerów. Zaproponowano rozwiązanie tego problemu, które wprowadza opóźnienie pomiędzy
kolejnymi pobraniami.
Ostatecznie, w oparciu o przegląd technik tworzenia rozszerzeń oraz analizę wymagań, zaimplementowane zostało rozszerzenie. W niewielkim stopniu modyfikuje ono inter54
fejs repozytorium, dodając elementy HTML do tabeli rezultatów wyszukiwania. Elementy
te umoŜliwiają otwarcie dodatkowego okna, które zawiera bardziej szczegółowe informacje o cytowaniach. Poza tym, spełnione zostały postawione wymagania, takie jak moŜliwość ręcznego i automatycznego pobierania danych, a takŜe obsługa wielu wersji językowych repozytorium.
Stworzone rozszerzenie ma takŜe duŜo moŜliwości dalszego rozwoju. Pierwszą z
nich jest dodanie obsługi innych serwisów, które mogłyby posłuŜyć jako źródło danych.
Wymagałoby to, przede wszystkim, ich dokładnej analizy oraz znalezienia sposobu na
łatwe i szybkie uzyskanie wszystkich potrzebnych danych, a takŜe zaimplementowania
odpowiednich metod, które wykonałyby operacje do tego prowadzące. Konieczne byłoby
takŜe udostępnienie uŜytkownikowi wyboru serwisu, z którego domyślnie miałyby być
pobierane dane. Oprócz tego, niezbędna byłaby modyfikacja bazy danych rozszerzenia,
która pozwoliłaby na identyfikację źródła informacji.
Kolejną moŜliwością rozwoju jest dodanie funkcjonalności, która pozwoli na wysyłanie pobranych danych na serwer repozytorium. W chwili obecnej, wszystkie informacje
dotyczące cytowań są przechowywane w lokalnej bazie danych na dysku i uŜytkownicy
nie mają moŜliwości ich dzielenia między sobą. ZałoŜenie jest takie, Ŝeby wprowadzić
usługę logowania do zewnętrznego serwera i, tylko dla zalogowanych uŜytkowników,
umoŜliwić wspomniane wysyłanie danych. Dzięki temu uŜytkownicy nie będą zmuszeni
pobierać wielokrotnie tych samych danych. W przypadku próby zrealizowania takiego
podejścia, konieczne jest połoŜenie szczególnego nacisku na odpowiednie zabezpieczenie
poufnych danych.
MoŜliwe jest takŜe stworzenie podobnego rozszerzenia, ale przeznaczonego na inne
popularne przeglądarki, w tym przede wszystkim przeglądarkę Google Chrome.
55
6 Bibliografia
[1]
Eugene Garfield. Citation indexes for science. a new dimension in documentation through
association of ideas. Science, 122(3159):1123–1127, 1955.
[2]
J. E. Hirsch. An index to quantify an individual’s scientific research output. Proceedings of
the National Academy of Sciences of the United States of America, 102(46):16569–16572,
Listopad 2005.
[3]
J. E. Hirsch. Does the h index have predictive power? Proceedings of the National
Academy of Sciences, 104(49):19193–19198, Grudzień 2007.
[4]
Michael C. Wendl. H-index: however ranked, citations need context. Nature,
449(7161):403, 2007.
[5]
Christoph Bartneck and Servaas Kokkelmans. Detecting h-index manipulation through
self-citation analysis. Scientometrics, 87(1):85–98, Kwiecień 2011.
[6]
Leo Egghe. Theory and practise of the g-index. Scientometrics, 69(1):131–152,
Kwiecień 2006.
[7]
Dostosowywanie Firefoksa za pomocą dodatków [online]. [dostęp: 15.01.2013] Dostępny
w Internecie:
https://support.mozilla.org/pl/kb/dostosowywanie-firefoksa-za-pomocadodatkow
[8]
Install Manifests [online]. [dostęp: 15.01.2013]
https://developer.mozilla.org/en-US/docs/Install_Manifests
[9]
Rejestracja Chrome [online]. [dostęp: 15.01.2013]
https://developer.mozilla.org/pl/docs/Rejestracja_Chrome
[10]
XPCOM API Reference [online]. [dostęp: 15.01.2013] Dostępny w Internecie:
https://developer.mozilla.org/en-US/docs/XPCOM_API_Reference
[11]
A. W. Harzing i R. Van der Wal. Google Scholar: the democratization of citation analysis,
Ethics in science and environmental politics, t. 8, nr 1, ss. 61–73, 2007.
[12]
Kayvan Kousha and Mike Thelwall. Google scholar citations and google Web-URL
citations: A multi-discipline exploratory analysis. J. Am. Soc. Inf. Sci. Technol.,
58(7):1055–1065, Maj 2007.
[13]
W3C – XMLHttpRequest [online]. [dostęp: 15.01.2013] Dostępny w Internecie:
http://www.w3.org/TR/XMLHttpRequest/
[14]
Mozilla Developer Network [online]. [dostęp: 15.01.2013] Dostępny w Internecie:
https://developer.mozilla.org/en-US/
[15]
XUL School Tutorial [online]. [dostęp: 15.01.2013] Dostępny
https://developer.mozilla.org/en-US/docs/XUL/School_tutorial
56
Dostępny
Dostępny
w
Internecie:
w
Internecie:
w
Internecie:

Podobne dokumenty