Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
pl:dydaktyka:sbd:2009:projekty:skos-ldap:start [2010/02/11 14:55]
sbd09
pl:dydaktyka:sbd:2009:projekty:skos-ldap:start [2019/06/27 15:50] (aktualna)
Linia 66: Linia 66:
  
 [PgSQL] [PgSQL]
-Driver ​         = /​usr/​lib/​odbc/​psqlodbc.so ​            // pełna ścieżka do drivera+Driver ​         = /​usr/​lib/​odbc/​psqlodbc.so ​            pełna ścieżka do drivera
 Description ​    = Connection to LDAP/​POSTGRESQL Description ​    = Connection to LDAP/​POSTGRESQL
 Servername ​     = localhost  Servername ​     = localhost
-Port            = 5432 // domyślnie 5432+Port            = 5432 domyślnie 5432
 Protocol ​       = 6.4  Protocol ​       = 6.4
 FetchBufferSize = 99 FetchBufferSize = 99
-Username ​       = wojcieh // nazwa użytkownika bazy danych+Username ​       = wojcieh nazwa użytkownika bazy danych
 Password ​       = wojcieh9 Password ​       = wojcieh9
-Database ​       = ldap // nazwa bazy danych z tabelami LDAPa+Database ​       = ldap nazwa bazy danych z tabelami LDAPa
 ReadOnly ​       = no ReadOnly ​       = no
 Debug           = 1 Debug           = 1
Linia 80: Linia 80:
  
 [ODBC] [ODBC]
-InstallDir ​     = /​usr/​lib/​odbc // ścieżka do katalogu ze sterownikami+InstallDir ​     = /​usr/​lib/​odbc ścieżka do katalogu ze sterownikami
  
 </​code>​ </​code>​
Linia 92: Linia 92:
 [PostgreSQL] [PostgreSQL]
 Description ​    = ODBC for PostgreSQL Description ​    = ODBC for PostgreSQL
-Driver ​         = /​usr/​lib/​odbc/​psqlodbc.so ​        // ​pełne ścieżki do driverów+Driver ​         = /​usr/​lib/​odbc/​psqlodbc.so ​pełne ścieżki do driverów
 Setup           = /​usr/​lib/​odbc/​libodbcpsqlS.so Setup           = /​usr/​lib/​odbc/​libodbcpsqlS.so
 UsageCount ​     = 2 UsageCount ​     = 2
Linia 148: Linia 148:
  
 # Where the dynamically loaded modules are stored # Where the dynamically loaded modules are stored
-modulepath ​     /​usr/​lib/​ldap ​                    // ścieżka do modułów OpenLDAPa +modulepath ​     /​usr/​lib/​ldap ​                    ścieżka do modułów OpenLDAPa 
-moduleload ​     back_sql                   ​// załadowanie modułu pozwalającego na integrację bazy LDAP z bazą SQL+moduleload ​     back_sql                   ​załadowanie modułu pozwalającego na integrację bazy LDAP z bazą SQL
  
 # The maximum number of entries that is returned for a search operation # The maximum number of entries that is returned for a search operation
-sizelimit ​      ​1000 ​           // limit wyników wyszukiwania dla polecenia ldapsearch+sizelimit ​      ​1000 ​   # limit wyników wyszukiwania dla polecenia ldapsearch
  
 # The tool-threads parameter sets the actual amount of cpu's that is used # The tool-threads parameter sets the actual amount of cpu's that is used
Linia 166: Linia 166:
 # Database specific directives apply to this databasse until another # Database specific directives apply to this databasse until another
 # '​database'​ directive occurs # '​database'​ directive occurs
-database ​       sql   ​// typ bazy – sql+database ​       sql   ​typ bazy – sql
  
 # The base of your directory in database #1 # The base of your directory in database #1
Linia 173: Linia 173:
 # rootdn directive for specifying a superuser on the database. This is needed # rootdn directive for specifying a superuser on the database. This is needed
 # for syncrepl. # for syncrepl.
-rootdn ​         "​cn=root,​dc=agh,​dc=edu,​c=PL"​   ​// dn administratora systemu +rootdn ​         "​cn=root,​dc=agh,​dc=edu,​c=PL"​   ​dn administratora systemu 
-rootpw ​         secret  ​                 ​// secret oznacza brak hasła, hasło można wygenerować przy pomocy polecenia ldappasswd i wkleić w to miejsce zakodowany ciąg znaków +rootpw ​         secret  ​                 ​secret oznacza brak hasła, hasło można wygenerować przy pomocy polecenia ldappasswd i wkleić w to miejsce zakodowany ciąg znaków 
-dbname ​         PgSQL           ​// nazwa określająca DBMS użyta w konfiguracji ODBC+dbname ​         PgSQL           ​nazwa określająca DBMS użyta w konfiguracji ODBC
 dbuser ​         wojcieh  dbuser ​         wojcieh
 dbpasswd ​       aghldap dbpasswd ​       aghldap
Linia 220: Linia 220:
  
 Teraz możemy, za pomocą polecenia ldapsearch wyszukać dane z linii poleceń, na przykład: Teraz możemy, za pomocą polecenia ldapsearch wyszukać dane z linii poleceń, na przykład:
-<​code>​$ ldapsearch -x -b "​dc=agh,​dc=edu,​c=PL"​ "​(&</​code>​+<​code>​$ ldapsearch -x -b "​dc=agh,​dc=edu,​c=PL"​ "​(&​{givenName=*toni}(sn=*za)(title=*dr*))"​ 
 +# extended LDIF 
 +
 +# LDAPv3 
 +# base <​dc=agh,​dc=edu,​c=PL>​ with scope subtree 
 +# filter: (&​{givenName=*toni}(sn=*za)(title=*dr*)) 
 +# requesting: ALL 
 +
 +# Antoni Lig\C4\99za + 2076, people, agh, edu, PL 
 +dn:: Y249QW50b25pIExpZ8SZemErdWlkPTIwNzYsb3U9cGVvcGxlLGRjPWFnaCxkYz1lZHUsYz1QT 
 + A== 
 +objectClass:​ inetOrgPerson 
 +objectClass:​ eduPerson 
 +objectClass:​ eduPerson 
 +objectClass:​ pleduPerson 
 +objectClass:​ pleduPerson 
 +l: C-3, II p., pok. 204 
 +cn:: QW50b25pIExpZ8SZemE= 
 +ou:: UmFkYSBXeWR6aWHFgnUgRWxla3Ryb3RlY2huaWtpLCBBdXRvbWF0eWtpLCBJbmZvcm1hdHlra 
 + ​SBpIEVsZWt0cm9uaWtp 
 +sn:: TGlnxJl6YQ== 
 +uid: 2076 
 +mail: ali@ia.agh.edu.pl 
 +mail: ligeza@agh.edu.pl 
 +title:: cHJvZi4gZHIgaGFiLiBpbsW8Lg== 
 +givenName: Antoni 
 +homePhone: (48) 12-267-44-67 
 +labeledURI: http://​galaxy.uci.agh.edu.pl/​~ligeza 
 +plposition: profesor nadzwyczajny 
 +roomNumber: II p., pok. 204 
 +description::​ R8WCw7N3bmUgbWllanNjZSBwcmFjeQ== 
 +displayName::​ QW50b25pIExpZ8SZemE= 
 +employeeNumber:​ 2076 
 +telephoneNumber:​ (48) 12-617-28-49 
 +departmentNumber::​ S2F0ZWRyYSBBdXRvbWF0eWtpOyBXeWR6aWHFgiBFbGVrdHJvdGVjaG5pa2k 
 + ​sIEF1dG9tYXR5a2ksIEluZm9ybWF0eWtpIGkgRWxla3Ryb25pa2k= 
 +homePostalAddress::​ dWwuIFphY2hvZG5pYSA1JDMwLTM1MCBLcmFrw7N3 
 +eduPersonAffiliation:​ profesorowie nadzwyczajni 
 + 
 +# search result 
 +search: 2 
 +result: 0 Success 
 + 
 +# numResponses:​ 2 
 +# numEntries: 1 
 +</​code>​ 
 + 
 +Jak widać w przypadku przeszukiwania bazy danych z linii poleceń wyświetlane dane są źle kodowane. Znacznie prostszym w obsłudze i zwracającym poprawnie kodowane znaki jest edytor graficzny GQ. 
 + 
 +Opis konfiguracji na stronie [[http://​darold.net/​projects/​ldap_pg/​HOWTO/​index.html 
 +|darold.net]]
  
 ==== 4. Konfiguracja Django w celu zarządzania bazą danych (python wersja 2.5.5, django wersja 1.1.1) ==== ==== 4. Konfiguracja Django w celu zarządzania bazą danych (python wersja 2.5.5, django wersja 1.1.1) ====
 +
 +Wymagane pakiety:
 +  * python-django,​
 +  * python-psycopg2 – moduł pythona dla PostgreSQLa
 +
 +Sprawdzamy instalację Django:
 +<​code>​$ python
 +>>>​ import django
 +>>>​ django.VERSION
 +(1, 1, 1, '​final',​ 0)</​code>​
 +
 +Po instalacji należy rozpakować archiwum zawierające pliki Django. Następnie zmieniamy niektóre linie plików:
 +  * **settings.py**
 +<​code>​
 +DEBUG = True # ważne, by przed dopuszczeniem strony do użytku publicznego zmienić na False, by uniemożliwić niepowołanym obserwację błędów i informacji o systemie, które dostarcza debugger
 +TEMPLATE_DEBUG = DEBUG
 +
 +ADMINS = (
 +    # ('Your Name', '​your_email@domain.com'​),​
 +)
 +MANAGERS = ADMINS
 +
 +DATABASE_ENGINE ​  = '​postgresql_psycopg2' ​  # nazwa modułu do obsługi bazy danych
 +DATABASE_NAME ​    = '​aghldap' ​              # nazwa bazy danych z formatowaniem utf-8
 +DATABASE_USER ​    = '​wojcieh' ​              # nazwa użytkownika bazy danych
 +DATABASE_PASSWORD = '' ​        
 +DATABASE_HOST ​    = '' ​                     # Set to empty string for localhost.
 +DATABASE_PORT ​    = '' ​                     # Set to empty string for default.
 +
 +# Absolute path to the directory that holds media.
 +# Example: "/​home/​media/​media.lawrence.com/"​
 +MEDIA_ROOT = '/​home/​wojcieh/​PostgreSQL/​Projekt/​LDAP/​django_ldap/​static'​
 +# ścieżka absolutna do plików css, js, grafiki
 +# jeśli nazwa katalogu nie będzie zmieniana część ścieżki /​django_ldap/​static pozostanie identyczna
 +
 +# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
 +# trailing slash.
 +# Examples: "​http://​foo.com/​media/",​ "/​media/"​.
 +ADMIN_MEDIA_PREFIX = '/​media/​static/'​
 +# ścieżka względna do plików css, js, dla strony administracyjnej
 +
 +TEMPLATE_DIRS = ( '/​home/​wojcieh/​PostgreSQL/​Projekt/​LDAP/​django_ldap/​templates',​
 +    # Always use forward slashes, even on Windows.
 +    # Don't forget to use absolute paths, not relative paths.
 +)
 +# ścieżka absolutna do wzorców stron
 +</​code>​
 +
 +  * **urls.py**
 +<​code>​
 +from django.conf.urls.defaults import *
 +from django.conf import settings
 +from django_ldap.views import search_form,​simple_search,​advanced_search,​advanced_search_form,​index,​contact
 +
 +# Uncomment the next two lines to enable the admin:
 +from django.contrib import admin
 +admin.autodiscover()
 +
 +urlpatterns = patterns('',​(r'​^search-form/​$',​search_form),​(r'​^simple-search/​$',​simple_search),​(r'​^advanced-search/​$',​advanced_search),​(r'​^advanced-search-form/​$',​advanced_search_form),​(r'​^main/​$',​index),​(r'​^contact/​$',​contact),​(r'​^media/​(?​P<​path>​.*)$',​ '​django.views.static.serve',​{'​document_root':​ settings.MEDIA_ROOT}),​
 +    # Example:
 +    # (r'​^django_ldap/',​ include('​django_ldap.foo.urls'​)),​
 +
 +    # Uncomment the admin/doc line below and add '​django.contrib.admindocs'​
 +    # to INSTALLED_APPS to enable admin documentation:​
 +    # (r'​^admin/​doc/',​ include('​django.contrib.admindocs.urls'​)),​
 +
 +    # Uncomment the next line to enable the admin:
 +    (r'​^admin/',​ include(admin.site.urls)),​
 +)
 +</​code>​
 +
 +W tym pliku określa się adresy stron, dla których wywoływane są określone w pliku **views.py** operacje.
 +
 +By zrozumieć zasady tworzenia stron przy pomocy Django należy posiadać podstawowe informacje na temat tego frameworka dostępne na stronie [[http://​www.djangobook.com/​en/​1.0/​|www.djangobook.com]] \\
 +W plikach umieszczono komentarze w miejscach szczególnie istotnych, gdzie wprowadziliśmy pewne metody i funkcje ułatwiające pracę z danymi.
 +
 +Warto w tym miejscu zauważyć, że framework Django został wykorzystany w dwojaki sposób tj. strona administracyjna posłużyła jako system zarządzania i administrowania bazą danych PostgreSQLa. Z kolei widoki i wzorce stron współpracują z modułem python-ldap,​ co pozwala na przeszukiwanie bazy LDAPa i wyświetlanie rezultatów na stronach.
 +
 +Strony obsługiwane są na porcie 8000, który jest defaultowym portem Django. W przypadku zmiany portu należy zmienić również numery portów w plikach katalogu //​template//​.
 +
 +Przed uruchomieniem serwera pamiętać o synchronizacji Django z bazą danych !!!
 +<​code>​$ python manage.py syncdb</​code>​
 +
 +Serwer uruchamiany jest za pomocą polecenia:
 +<​code>​$ python manage.py runserver (port)</​code>​
  
 ===== Wygląd i opis interfejsów stron obsługujących bazy danych ===== ===== Wygląd i opis interfejsów stron obsługujących bazy danych =====
 +
 ==== 1. Strona administracyjna relacyjnej bazy danych ==== ==== 1. Strona administracyjna relacyjnej bazy danych ====
 +
 +Ze względu na fakt, iż Django dostarcza bardzo dobrą, prostą w użyciu i intuicyjną stronę administracji danymi została ona przez nas wykorzystana w celu zarządzania bazą PostgreSQLa. ​
 +
 +Wygląd strony głównej:
 +
 +{{:​pl:​dydaktyka:​sbd:​2009:​projekty:​skos-ldap:​admin_main.png|}}
 +
 +Pliki odpowiedzialne za wygląd poszczególnych stron reprezentujących tabele i relacje między nimi znajdują się w katalogu //​postgresql_data//​. Za pomocą polecenia //​list_display//​ dokonujemy wyboru listy atrybutów wyświetlanych na stronie, polecenie //​search_fields//​ pozwala na wybór pól, które ​ mogą zostać przeszukane według zadanego terminu, polecenie //​ordering//​ wprowadza alfabetyczny porządek. Istnieje możliwość dodania, usunięcia, modyfikacji danych, ustalenia praw dostępu i wiele innych udogodnień pozwalających na proste i intuicyjne zarządzanie bazą danych.
 +
 +{{:​pl:​dydaktyka:​sbd:​2009:​projekty:​skos-ldap:​admin_zatrudnienie.png|}}
 +
 ==== 2. Strony wykorzystane do wyszukiwania i prezentacji wyników ==== ==== 2. Strony wykorzystane do wyszukiwania i prezentacji wyników ====
 +
 +Wygląd strony głównej:
 +
 +{{:​pl:​dydaktyka:​sbd:​2009:​projekty:​skos-ldap:​ldap_main.png|}}
 +
 +W projekcie wykorzystane są pliki //.css// i //.js// odpowiadające za wygląd i animacje niektórych elementów. Istnieją dwie możliwości przeszukiwania stron: wyszukiwanie podstawowe i zaawansowane. ​
 +
 +__Wyszukiwanie podstawowe__ polega na znajdowaniu danych wg takich atrybutów jak imię lub nazwisko, zawierających dany ciąg znaków. ​
 +
 +{{:​pl:​dydaktyka:​sbd:​2009:​projekty:​skos-ldap:​podstawowe.png|}}
 +
 +__Wyszukiwanie zaawansowane__ wprowadza kolejne pola, za pomocą których zadajemy kryteria wyszukiwania oraz mamy możliwość wyboru dodatkowych opcji wg których dany atrybut zawiera, równa się, bądź zaczyna się od zadanego ciągu znaków.
 +
 +{{:​pl:​dydaktyka:​sbd:​2009:​projekty:​skos-ldap:​zaawansowane.png|}}
 +
  
 ===== Inne opcje dostępu i wykorzystania bazy danych LDAP ===== ===== Inne opcje dostępu i wykorzystania bazy danych LDAP =====
 +
 +Bardzo dużym atutem bazy hierarchicznej LDAP jest możliwość uzyskania dostępu do danych na wiele sposobów. \\
 +Bardzo popularne jest użycie książki adresowej klienta poczty elektronicznej w celu wyświetlenia podstawowych informacji dostępnych w danej bazie serwera LDAP. Lista wyświetlanych atrybutów jest jednak bardzo ograniczona,​ dlatego też nie ujrzymy wszystkich dostępnych informacji, lecz jedynie podstawowe, które w 90 % przypadków stanowią dla nas wystarczające źródło informacji. \\
 +Przejrzysty opis konfiguracji dla klienta Mozilla Thunderbird i pochodnych jest dostępny na stronie [[http://​hep.ucsb.edu/​ldap/​|hep.ucsb.edu]]
 +
 +W przypadku naszej bazy danych pola zakładki **Ogólne** wyglądałyby następująco:​ \\
 +__Nazwa__: dowolna_nazwa1 \\
 +__Nazwa hosta__: localhost (tymczasowo) \\
 +__Bazowy DN__: dc=people,​dc=agh,​dc=edu,​c=PL \\
 +__Numer portu__: 389 \\
 +
 +Przykładowy wynik wyszukiwania:​
 +
 +{{:​pl:​dydaktyka:​sbd:​2009:​projekty:​skos-ldap:​poczta.png|}}
 +
 +Możemy również przeszukiwać bazę danych bezpośrednio za pomocą jednego z edytorów graficznych jak GQ, Java LDAP Browser, czy też Softerra LDAP browser. Mamy wtedy możliwość odczytu wszystkich atrybutów, także tych, które są dostępne w ramach danej klasy, ale nie zostały im przypisane żadne wartości.
 +
 +Przykład użycia edytora GQ:
 +
 +{{:​pl:​dydaktyka:​sbd:​2009:​projekty:​skos-ldap:​gq.png|}}
  
 ===== Import danych z istniejącego systemu SKOS do bazy LDAP ===== ===== Import danych z istniejącego systemu SKOS do bazy LDAP =====
  
-===== Problemy jakie wystąpiły w trakcie realizacji projektu, proponowane rozwiązania kierunki rozwoju =====+Ze względu na brak bezpośredniego dostępu do bazy danych systemu SKOS niezbędne okazało się sparsowanie danych umieszczonych bezpośrednio na stronach tego systemu. W tym celu zostały wykorzystane następujące moduły pythona: 
 +  * urllib – pozwalający na skopiowanie zawartości źródła strony internetowej o zadanym adresie do obiektu lub do pliku 
 +  * BeautifulSoup – rozpoznający polecenia html wycinający tekst znajdujący się między nimi
  
 +Ze względu na brak wcześniejszych doświadczeń z parsowaniem stron internetowych dane były pobierane w kolejnych krokach i ładowane do bazy. Dlatego też nie ma jeszcze opracowanych jednolitych procedur, jednak jeśli zajdzie taka potrzeba jesteśmy gotowi do stworzenia skryptu, który zintegruje kolejne etapy importu danych.
 +
 +===== Problemy jakie wystąpiły w trakcie realizacji projektu, proponowane rozwiązania i kierunki rozwoju =====
  
 +  - W punkcie pierwszym został już przedstawiony problem kodowania danych. Nie wiemy, czy jest to pewnego rodzaju anomalia związana bezpośrednio z dystrybucją linuxa, na której implementowany był serwer, czy problem ten jest powszechny. Na sieci brak jest informacji na ten temat, ze względu na fakt, iż użycie backendu umożliwiającego dostęp do bazy LDAP za pośrednictwem PostgreSQLa jest rzeczą niezwykle rzadką. Jakkolwiek stworzenie dwóch baz danych wydaje się kłopotliwe uważamy, że mamy całkiem przyzwoite rozwiązanie tego problemu. Nasz pomysł wynika z faktu, iż baza danych pracowników nie notuje dynamicznych,​ częstych zmian. Również wprowadzone zmiany nie muszą mieć natychmiastowego skutku. Należałoby stworzyć skrypt, którego zadaniem jest aktualizacji tabeli //​ldap_persons//​ w bazie **aghldap**,​ przechowującej przetworzone na podstawie widoku dane, tak by nie dochodziło do duplikowania informacji. Aktualizacja polegałaby na całkowitym wyczyszczeniu tabeli i ponownym jej uzupełnieniu. Operacja ta zajmuje około 20 – 30 sekund. Następnie skrypt usuwałby zawartość tabeli o tej samej nazwie w bazie **ldap** i kopiował dane z jednej tabeli do drugiej. Operacja aktualizacji bazy danych, na której oparty jest serwer LDAP trwałaby więc bardzo krótko. Skrypt byłby wykonywany nad ranem, każdego dnia za pomocą **crona**.
 +  - Podczas prac nie udało się wyeliminować powtórzeń stanowiących o przynależności obiektu do klas eduPerson oraz pleduPerson. Niektórzy pracownicy, po usunięciu powtarzających się informacji mają przeznaczonych nawet kilka wierszy w tabeli //​ldap_persons//​. Z niewiadomych nam przyczyn powoduje to nadmierne powtarzanie informacji.\\ {{:​pl:​dydaktyka:​sbd:​2009:​projekty:​skos-ldap:​gq_powtorzenia.png|}}
 +  - Numery ID pracowników w tabeli //​ldap_person//,​ a co za tym idzie i w widoku ldap_entries zaczynają się od wartości 1000. Powodem takiego rozwiązania jest fakt, iż ID < 1000 pozostawiliśmy dla obiektów klasy organizationlUnit – tj. jednostki AGH, które można by w przyszłości również scharakteryzować za pomocą atrybutów klas protokołu LDAP i udostępnić dane z nimi związane.
 +  - Dobrym posunięciem byłoby stworzenie nowego schematu z klasami specjalnie dla jednostki jaką jest AGH. W projekcie, przecierając nowe szlaki korzystaliśmy jedynie z powszechnie dostępnych schematów.
 +  - Wyniki wyszukiwania pojawiają się na stronie dopiero po przeszukaniu całej bazy. W przypadku zapytań, których wynikiem jest duży zbiór gromadzenie danych trwa stosunkowo długo. Dobrym pomysłem byłoby wyświetlanie wyników na bieżąco, wykonując przeszukanie fragmentów bazy za każdym razem. Rozwiązałoby to również problem przekroczenia maksymalnego limitu znalezionych rekordów.
 +  - Należałoby również sprawdzić poprawność sparsowanych danych, czy gdzieś nie doszło do poważnych błędów i przekłamań.
 +  - Najpoważniejszy problem pojawił się w przypadku pracowników posiadających dwa miejsca pracy, tzw. główne i dodatkowe miejsce pracy. W systemie SKOS mamy 30 takich pracowników. Powoduje to przypisanie atrybutom związanym z miejscem pracy, a więc //​description,​ l, departmentNumber,​ roomNumber, eduPersonAffiliation,​ plPosition//​ dwóch wartości.\\ Przykład pokazuje tabela:\\ {{:​pl:​dydaktyka:​sbd:​2009:​projekty:​skos-ldap:​tragedia.png|}} \\ Podczas testów okazało się, że dodana kolejno wartość atrybutu nie jest wstawiana na koniec listy, ale według porządku alfabetycznego. Sytuacja ta powoduje przemieszanie się ze sobą miejsc pracy, tak że nie można ich odróżnić. Nie udało nam się znaleźć nigdzie, czy można zmienić sposób, w jaki dodawane wartości atrybutów są porządkowane. Jedynym rozwiązaniem byłoby otagowanie wartości związanych z dodatkowym miejscem pracy. Aczkolwiek znacznie zmniejszyłoby to czytelność w przypadku przeglądania bazy za pomocą edytora graficznego,​ czy też książki adresowej.
  
 +===== Wykaz literatury =====
  
 +  - [[http://​www.python.org/​doc/​|www.python.org]]
 +  - [[http://​www.easysoft.com/​developer/​interfaces/​odbc/​linux.html|www.easysoft.com]]
 +  - [[http://​darold.net/​projects/​ldap_pg/​HOWTO/​index.html|darold.net]]
 +  - [[http://​www.djangobook.com/​en/​1.0/​|www.djangobook.com]]
 +  - [[http://​www.oav.net/​mirrors/​LDAP-ObjectClasses.html|www.oav.net]]
 +  - [[http://​projekt-ldap.uci.umk.pl/​raporty/​ftp/​uci/​pledu.html|projektldap.uci.umk.pl]]
 +  - [[http://​middleware.internet2.edu/​eduperson/​docs/​internet2-mace-dir-eduperson-200806.html|middleware.internet2.edu]]
 +  - Adrian Holovaty, Jacob Kaplan-Moss „The definitive guide to django web development done right”, 2nd edition, July 2009
 +  - Gerald Carter „LDAP system administration”,​ O'​Reilly,​ March 2003
  
  
pl/dydaktyka/sbd/2009/projekty/skos-ldap/start.1265896554.txt.gz · ostatnio zmienione: 2019/06/27 15:55 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0