System KaRo (Katalog Rozproszony
Bibliotek Polskich) działa od 2001
roku i spełnia ważną rolę informacyjną pozwalając na wyszukiwanie
pozycji bibliograficznych w ok. 70 katalogach bibliotecznych w Polsce.
System obsługuje ok. 250 tys. zapytań miesięcznie. Podstawową funkcją
KaRo jest równoczesne rozsyłanie zapytań do katalogów wybranych przez
użytkownika.
Poważnym problemem związanym z systemem
KaRo jest liczba zapytań
kierowanych do niewielkich bibliotek. Użytkownicy KaRo chętnie
zaznaczają wszystkie dostępne katalogi, w efekcie wysyłając zapytania
do katalogów, którymi w zasadzie nie są zainteresowani. Z tego powodu,
w ostaniej wersji KaRo zablokowana została możliwość prostego
zaznaczenia wszyskich katalogów na liście, co zmniejszyło uciazliwość
dla bibliotek, ale równoczesnie ograniczyło funkcjonalnośc systemu.
KaRo jest powszechnie używany przez pracowników bibliotek jako pomoc przy katalogowaniu. W takiej sytuacji użytkownik nie jest zainteresowany wyszukaniem wszystkich możliwych wystąpień szukanej pozycji, a jedynie znalezieniem opisu bibliograficznego możliwie najwyższej jakości. Najwłaściwszym sposobem przeszukania byłoby zatem sprawdzenie najważniejszych katalogów (w tym centralnego katalogu NUKat), a dopiero w przypadku niepowodzenia dokonanie szerszego przeszukania.
W miarę rozrastania się liczby
dostępnych bibliotek coraz
trudniejsze staje się nawigowanie i zaznaczanie katalogów, którymi
użytkownik jest zainteresowany. Należało zatem zmodyfikować system i
umożliwić tworzenie zindywidualizowanej listy ulubionych katalogów.
Te wszystkie argumenty jednoznacznie wskazywały na konieczność
wyposażenia KaRo w system tworzenia profili użytkownika. Korzystanie z
profili cechuje duża przewaga operacji odczytu nad operacjami
modyfikacji. Jest to typowe założenie dla usług katalogowych i dlatego
jako najwłaściwszą platformę do przechowywania profili wybrano bazę
LDAP. Poza profilami, w bazie LDAP przechowywać można również "schowki"
użytkowników, w których mogą przechowywać wybrane opisy
bibliograficzne.
W załączonej prezentacji
zamieszczone są zrzuty ekranowe
przedstawiające różne fazy operowania profilem użytkownika i wpływ
ustawień na wyglad interfejsu.
System KaRo jest napisany w językach
Perl i PHP, które są wyposażone
w interfejs obsługi bazy LDAP. Rozbudowa systemu o profile użytkowników
wymagała modyfikacji oprogramowania KaRo oraz dobudowania systemu
tworzenia i modyfikacji profili. Konieczne było również wbudowanie
systemu zawiadamiania użytkownika o dopisaniu nowych pozycji do listy
katalogów, tak by mógł podjąć decyzję, czy dopisać je do listy
ulubionych. Dodanie funkcji przeszukiwania dwustopniowego (najpierw w
katalogach priorytetowych, a w przypadku niepowodzenia w pozostałych)
wymagało znaczącej modyfikacji kodu KaRo.
Z punktu widzenia projektu LDAP
najważniejszym zadaniem było
określenie schematu profilu użytkownika i wykonanie oprogramowania
zarządzania profilem. Użycie bazy LDAP pozwoli w przyszłości na bardzo
proste dodawanie nowych opcji konfiguracyjnych do profilu.
Obecnie profil zawiera następujące atrybuty:
Ponadto w ramach profilu przechowywany jest stempel czasowy
odpowiadający momentowi modyfikacji danych użytkownika.
W poprzednich wersjach KaRo stosowany
był uproszczony system profili
polegający na zapamiętaniu niektórych wartości domyślnych w postaci
tzw. cookie. Jeżeli taki stary profil jest obecny, to system proponuje
dokonanie jego konwersji do profilu nowej postaci. W takim przypadku
przy tworzeniu profilu użytkownik musi dokonywać tylko niewielkiej
liczby poprawek.
Utworzenie profilu jest bardzo proste. Użytkownik rozpoczyna od
określenia identyfikatora. System przeszukuje bazę LDAP i sprawdza, czy
identyfikator nie jest już zajęty. Jeżeli identyfikator jest wolny, to
użytkownik musi określić hasło, z którego będzie w przyszłości
korzystał przy modyfikacjach profilu. Może również określić, czy życzy
sobie, aby jego identyfikator został zapamiętany w postaci cookie w
przeglądarce i w konsekwencji logowanie odbywało się całkowice
automatycznie. Użytkownik może również podać nazwę profilu, z którego
chce skopiować domyślne ustawienia. Tę opcję stworzono na użytek
jednostek zatrudniających własnych informatyków (np. bibliotekarzy
systemowych w bibliotekach), którzy mogą przygotować profile
najbardziej odpowiednie dla swojej grupy użytkowników. Użytkownicy mogą
wówczas korzystać z takiego profilu grupowego poprzez skopiowanie jego
zawartości i ew. minimalne modyfikacje na własne potrzeby.
Po określeniu tych wstępnych warunków
użytkownik otrzymuje głowny
ekran konfiguracyjny, na którym ustawia wszystkie parametry, a
nastepnie zachowuje dane w bazie LDAP. Modyfikacja istniejącego profilu
odbywa się praktycznie identycznie, po wprowadzeniu identyfikatrora i
hasła dostępu.
Przy każdym dostępie do KaRo z bazy
LDAP pobierane są parametry
profilu, w szczególności czas ostatniej modyfikacji profilu. Ten czas
jest porównywany z czasem ostaniej modyfikacji listy katalogów i jeżeli
okazuje się, że modyfikacja katalogów odbyła się później niż
modyfikacja profilu, to na ekranie użytkownika pojawia się informacja,
że powinien dokonać modyfikacji profilu, bo dodano nowe pozycje. Na
ekranie modyfikacji profilu nowo dodane katalogi są zaznaczone kolorem
czerwonym.
# karoProjectOID 1.3.6.1.4.1.13685.1.1.1.3
objectIdentifier karoInternal 1.3.6.1.4.1.13685.3.4
objectIdentifier karoInternalObjectClas karoInternal:1
objectIdentifier karoInternalAttributeType karoInternal:2
attributetype ( karoInternalAttributeType:1
NAME 'karoSelectedLib'
DESC 'katalog wybrany do przeszukania'
SUP name
)
attributetype ( karoInternalAttributeType:2
NAME 'karoVisibleLib'
DESC 'katalog należacy do ulubionych'
SUP name
)
attributetype ( karoInternalAttributeType:21
NAME 'karoPriorityLib'
DESC 'katalog priorytetowy'
SUP name
)
attributetype ( karoInternalAttributeType:3
NAME 'karoSearchTimeout'
DESC 'limit czasu na przeszukanie rozproszone'
EQUALITY integerMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
SINGLE-VALUE
)
attributetype ( karoInternalAttributeType:4
NAME 'karoScreenLength'
DESC 'maksymalna liczba rekordów na jednym ekranie'
EQUALITY integerMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
SINGLE-VALUE
)
attributetype ( karoInternalAttributeType:5
NAME 'karoFirstSearchTerm'
DESC 'indeks w pierwszym polu przeszukania'
SUP name
SINGLE-VALUE
)
attributetype ( karoInternalAttributeType:6
NAME 'karoSecondSearchTerm'
DESC 'indeks w drugim polu przeszukania'
SUP name
SINGLE-VALUE
)
attributetype ( karoInternalAttributeType:7
NAME 'karoThirdSearchTerm'
DESC 'indeks w trzecim polu przeszukania'
SUP name
SINGLE-VALUE
)
attributetype ( karoInternalAttributeType:8
NAME 'karoPreferredFullRecordView'
DESC 'prezentacja wyniku: bibliographic, opac, marc'
EQUALITY integerMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
SINGLE-VALUE
)
attributetype ( karoInternalAttributeType:10
NAME 'karoDistributedResultsFormat'
DESC 'wyniki w postaci scalonej, albo w porz±dku otrzymania'
EQUALITY integerMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
SINGLE-VALUE
)
attributetype ( karoInternalAttributeType:11
NAME 'karoBinaryMarcEncoding'
DESC 'encoding of saved marc records'
EQUALITY caseIgnoreMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
SINGLE-VALUE
)
attributetype ( karoInternalAttributeType:12
NAME 'karoTimestamp'
DESC 'znacznik czasowy modyfikacji'
EQUALITY generalizedTimeMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
SINGLE-VALUE
)
attributetype ( karoInternalAttributeType:14
NAME 'karoPriorityFirst'
DESC 'właczone przeszukiwanie katalogów priorytetowych'
EQUALITY integerMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27
SINGLE-VALUE
)
attributetype ( karoInternalAttributeType:15
NAME 'karoCatalogGroup'
DESC 'przypisanie katalogu do grupy zapisywane jako id:nr_grupy'
EQUALITY caseIgnoreMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
)
attributetype ( karoInternalAttributeType:16
NAME 'karoGroupLabel'
DESC 'Etykieta grupy zapisywana jako nr_grupy:etykieta'
EQUALITY caseIgnoreMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
)
objectclass ( karoInternalObjectClass:1
NAME 'karoUser'
SUP top
MUST (
uid
)
MAY (
karoTimestamp $
userPassword $
mail $
karoSelectedLib $
karoVisibleLib $
karoPriorityLib $
karoSearchTimeout $
karoScreenLength $
karoFirstSearchTerm $
karoSecondSearchTerm $
karoThirdSearchTerm $
karoPreferredFullRecordView $
karoDistributedResultsFormat $
karoBinaryMarcEncoding $
karoPriorityFirst $
karoCatalogGroup $
karoGroupLabel
)
)