System indywidualnych profili użytkowników w katalogu KaRo

Tomasz Wolniewicz
UMK

Wstęp

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.

Realizacja

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.

System obsługi profili

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.

Schemat LDAP opisujacy profile użytkowników

# 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
)
)