AP12 Organizace souborů

Zadání

(Schémata organizace souborů. Statické organizace souborů, sekvenční soubory, indexové a přímé organizace souborů, statické hašování. Implementace souborů. Dynamické organizace souborů, dynamické hašování, B-stromy a jejich varianty. Základy teorie informace, komprese dat)

Schémata organizace souborů

Cíl = umožnit optimálně řešit operace nad záznamy souboru nezávisle na konkrétním fyzickém zařízení vnější paměti
Schéma organizace souborů = způsob, jak jsou zakódovaná data počítačem uložená do paměti. Schéma organizace souboru je popis logické paměťové struktury, do níž lze zobrazit logický soubor, spolu s algoritmy operací nad touto strukturou. Ta je obvykle tvořena z logických stránek (bloků pevné délky) a může popisovat více provázaných log. souborů, z nichž primární soubor je ten, který obsahuje uživatelská data. Operace definované nad schématem org. souboru jsou kromě operací nad soubory ještě build, reorganization, open a close.

Proti němu stojí fyzické schéma souboru - struktura nad fyzickými soubory, nejblíže hardwaru je implementační schéma souboru.

Zajištění Vyváženosti struktury znamená zajištění omezení cesty při vyhledávání nějakým výrazem (zaručení asymptotické složitosti), navíc zaručení rovnoměrnosti zaplnění struktury - faktor naplnění stránek. Schémata, která splňují obě podmínky, se nazývají dynamická, ostatní jsou označována jako statická.
Logické schéma souboru – Obsahuje primární soubor a pomocné soubory (indexy, rejstříky…). Výběrem vhodného logického schématu souboru se snažíme dosáhnout minimalizace počtu přístupů do sekundární paměti (na disky) – ideální stav je 1 požadavek = 1 přístup.
Fyzické schéma souboru – Zobrazuje logické soubory do paměťových jednotek konkrétního použitého typu paměti.
Implementační schéma – Popisuje rozmístění dat na konkrétním uchovávacím médiu. Standardně řeší OS nezávisle na aplikacích

Statické organizace souborů

  • homogenní soubor – hodnoty položek jsou primitivní typy, všechny záznamy jsou jednoho typu
    • je deklarovatelný formou S(A1:D1,…,An:Dn), kde Ax je jméno atributu a Dx je doména hodnot
  • nehomogenní soubor – hodnoty položek jeho záznamů nejsou primitivní typy nebo záznamy nejsou jednoho typu

Do statické organizace souborů patří:

  • hromada (neuspořádaný sekvenční soubor)
    • Hromada (heap) je nejjednodušší schéma organizace souboru, kdy jsou záznamy v souboru jen náhodně naházeny za sebou. Časová složitost vyhledávání je O(n) (lineární), pokud n je počet záznamů. Jde o nehomogenní soubor, kde záznamy obvykle nemají pevnou délku.
  • neuspořádaný sekvenční soubor
    • homogenní soubor
    • sekvenční přístup
    • homogenní obdoba hromady

  • uspořádaný sekvenční soubor
    • V uspořádaném sekvenčním souboru jsou záznamy řazeny podle vyhledávacího klíče. Aktualizované záznamy se umístí do zvláštního souboru a až při další operaci reorganization jsou přidány do primárního souboru. Složitost nalezení záznamu je také O(n) (lineární), ale pokud se hledá podle klíče, podle kterého jsou záznamy seřazeny, a navíc je soubor na médiu s přímým přístupem, sníží se na O(log n) (logaritmická).
    • Primární soubor + soubor aktualizací (dodatečných změn)
    • Soubor aktualizací nebývá seřazený (dopisuje se na konec)
    • Reorganizace: seřadíme soubor aktualizací + zatřídíme s primárním souborem do nového primárního souboru
    • nevýhody primárního souboru – při vkládání je nutná náročná reorganizace
    • keysort – snižuje náklady na reorganizaci – udržuje se soubor (nemusí být seřazený) + index (je vždy seřazený)
    • řetězené struktury – řetězení usnadní následná vkládání a rušení záznamů

Ukázka uspořádaného sekvenčního souboru – keysort:
 Uspořádaný sekvenční soubor -- keysort Ukázka uspořádaného sekvenčního souboru – řetězené struktury:
 Uspořádaný sekvenční soubor -- řetězené struktury

  • index-sekvenční soubor
    • části: primární soubor, index a oblast přetečení
    • primární soubor je seřazený podle primárního klíče, ke kterému je vytvořena struktura indexů
    • 2 možné přístupy – indexový i sekvenční
    • Indexem se vymezuje oblast stránek v primárním souboru, kde záznam může ležet, tato oblast se prohlíží sekvenčně
    • buckety pro přesahy, nutná občasná reorganizace

  • indexovaný soubor
    • seřadí se index, primární soubor se záznamy je neseřazený
    • Indexovaný soubor znamená primární soubor plus indexy pro různé vyhledávací klíče. Neindexují se už stránky, ale přímo záznamy, a proto primární soubor nemusí být nutně seřazený. Index může být podobný jako u index-sekvenčního souboru, pro záznamy se stejným klíčem je ale vhodné, aby byly na všech úrovních indexu kromě poslední sloučené. Při aktualizaci se nepoužívá oblast přetečení, mění se pouze index.

  • soubor s přímým přístupem (tak kdyz je tam hash tak to asi patri do dynamickych struktur)
    • algoritmická transformace vyhledávacího klíče na adresu záznamu
    • hašování

Indexování v souborech

  • procházení přímo záznamů je při operacích velice pomalé – indexy mají řádově menší velikost než samotné záznamy a jejich prohledávání je výrazně rychlejší
  • díky menší velikosti je možné indexy držet v operační paměti bez nutnosti přístupu na disk
  • často stačí pro vyřešení některých dotazů zpřístupnit pouze malou část záznamů – na základě indexů je možné efektivně provádět filtrování
  • forma indexu: { vyhledávací klíč ; ukazatel na záznam }
  • typy indexů:
    • řádné, lineární indexy – v tabulce uspořádané dvojice { vyhledávací klíč ; ukazatel na záznam } podle hodnoty vyhl. klíče
    • hašované indexy – využití hašovací funkce vyhledávacího klíče
    • stromové indexy – využití grafové struktury strom
    • indexové bitové mapy – pozice bitů v bitovém vektoru určují lokality záznamů
  • indexy mohou být víceúrovňové – „index do indexu“ – nejnižší úroveň může být přímo primární soubor, výše jsou řídké indexy

Řádné indexy

Obvykle pokud se mluví o indexech, jsou myšleny řádné.
Dělení 1

  1. primární index – podle jeho klíče je uspořádán primární soubor se záznamy; může být hustý nebo řídký
  2. sekundární index – určený pro dotazy založené na jiném vyhledávacím klíči než na primárním; musí být hustý

Dělení 2 hustý – indexový záznam pro každou hodnotu vyhledávacího klíče. Typicky bývá uspořádán podle hodnoty klíče
řídký – indexový záznam pouze pro některé hodnoty vyhledávacího klíče; použitelné pouze v případě, kdy je soubor podle tohoto klíče uspořádán

Příklad

Uložený soubor se záznamy:
ID (2B) Jméno (20B) Rok narození (2B) Místo narození (16B) Telefon (4B) Bydliště (16B)
1 Bílá Alena 1972 Ostrava xxxxxxxx Brno
2 Novák Jan 1952 Praha 123456789 Kladno
3 Novotný Tomáš 1987 Brno 565656565 Vyškov
4 Procházka Petr 1964 Brno 100001011 Řestoky

Hustý index pro atribut jméno:

Jméno ID
Bílá Alena1
Novák Jan2
Novotný Tomáš3
Procházka Petr4

Pokud chceme vyhledat místo narození Tomáše Novotného, pak je při sekvenčním prohledávání nutné načíst 2 · (2 B + 20 B + 2 B + 16 B + 4 B + 16 B) + 2 B + 20 B + 2 B + 16 B = 160 B. Při použití hustého indexu stačí načíst 3 · (20 B + 2 B) + 2 B + 20 B + 2 B + 16 B = 106 B. Pokud je index uložen v operační paměti, pak v obou případech stačí pouze jeden přístup na disk, avšak v prvním případě bude třeba číst výrazně více dat.

Řídký index pro atribut jméno:

Jméno ID
Bílá Alena1
Novotný Tomáš3

Pokud je požadavek na vyhledání například Jana Nováka, nalezne se poslední záznam v uspořádání před ním (Alena Bílá) a dál se postupuje sekvenčně.

Sekundární index pro atribut místo narození:

Místo narození ID
Brno3,4
Ostrava1
Praha2

Implementace souborů

Definice

soubor 1 = pojmenovaná kolekce souvisejících záznamů
soubor 2 = logická paměťová jednotka zobrazovaná operačním systémem do fyzického paměťového zařízení
záznam = kolekce atributů charakterizujících jistý objekt
adresář = kolekce dat obsahující informace o souborech uchovávaných na disku (jméno, typ, adresa, délka, maximální délka, čas posledního přístupu…)

Možná formátování

  1. volné formátování – sekvenčně řazené záznamy pevné i proměnlivé délky
  2. komplexní formátování – soubor obsahuje vhodné řídící struktury nebo se k záznamům přistupuje přes přístupové funkce (B-stromy, haše…)

Uložení souborů na disku

  1. souvislá alokace datových bloků
    • soubor je na disku uložen v souvislé posloupnosti datových bloků
  2. alokace datových bloků pomocí zřetězeného seznamu
    • každý datový blok obsahuje data a ukazatel na následující datový blok
  3. alokace datových bloků pomocí tabulky
    • alokace datových bloků je založená na zřetězeném seznamu, ale ukazatele na následující datový blok jsou uloženy v tabulce FAT
  4. i-nodes
    • i-node je struktura, která obsahuje jak atributy souboru, tak adresy datových bloků, ve kterých je uložen obsah souboru

Dynamické organizace souborů

Motivace: změny dat neznamenají velké (globální) reorganizace, které jsou drahé, ale spíše reorganizace lokální.

  1. B-strom
  2. dynamický haš soubor
    • založený na rozšiřitelném hašování nebo lineárním hašování

Hašování

Definice

hašovací funkce (obecně) = převedení libovolně dlouhého vstupu na výstup pevné délky
hašovací funkce (ve smyslu organizace souborů) = funkce řešící přístup k záznamům souboru s konstantní složitostí
kolize = situace, kdy je pro více záznamů spočítána stejná adresa
  • obvykle se řeší pomocí bucketů – každé paměťové místo má předepsanou kapacitu záznamů, ve které se následně vyhledává lineárně

Perfektní hašovací funkce – hašovací funkce h, která je prostá.
Požadované vlastnosti hašovací funkce:

  • je deterministická
  • je rychlá
  • vypočítává se z hodnot všech nebo alespoň většiny bitů klíče
  • pokrývá cílový prostor rovnoměrně

Statické hašování

  • používá se u souborů, které procházejí jen minimem změn
  • případné změny mohou negativně ovlivnit efektivitu hašování – pokud se sejde na stejné adrese více záznamů než je kapacita bucketu, vyhledávání v rámci těchto záznamů má lineární složitost

Dynamické hašování

  • k výpočtu adresy se používá pouze prvních i bitů z výstupu hašovací funkce; toto i se dynamicky mění – pokud je potřeba více adres, tak se zvyšuje, naopak při malém počtu se i zmenšuje
  • používá se u souborů s proměnným počtem záznamů
  • buckety jsou naplněné rovnoměrně – pokud jsou plné, tak se štěpí, pokud jsou prázdné, tak se spojují
  • Druhy:
    • rozšiřitelné hašování

  • hašovací funkce rozmisťuje záznamy do kapes (kapsa = záznamy s jistou podmnožinou klíčů, vymezuje je hašovací funkce)
  • jako index v adresáři kapes se používá dynamicky určovaný prefix výsledku hašovací funkce h(k)
  • délku indexu vymezuje globální hloubka adresy kapsy
  • štěpení
    • globální hloubka > lokální hloubka – na blok ukazuje více ukazatelů, jednoduše se rozdělí na dva
    • globální hloubka = lokální hloubka – musí vzniknout nová kapsa a také se zdvojnásobí rozměr adresáře kapes

  • lineární hašování

  • řeší nedostatky rozšiřitelného hašování za cenu vyšší režie dané manipulací s přetokovými kapsami
  • počet kapes udržuje tak, aby byly naplněny z např. 80 %
  • rozdíl oproti rozšiřitelnému hašování: nemusí se vytvářet ani udržovat adresář kapes, přesto počet kapes roste lineárně.

B stromy a jejich varianty

Definice

strom = souvislý orientovaný acyklický (jednoduchý) graf
B strom = m-ární vyhledávací strom s omezujícími podmínkami (viz dále)
B+ strom = redundantní varianta B stromu

Vyhledávací B stromy a jejich varianty se používají pro efektivní ukládání a zpětné zpřístupňování dat. Nejčastěji jsou používány v databázích. Na B+ stromech jsou také založeny například souborové systémy XFS, ReiserFS či NTFS.

B strom

  • každý uzel až na kořen a listy má aspoň \lceil m/2 \rceil potomků
  • kořen má aspoň 2 potomky, pokud není jediným uzlem stromu
  • uzel s (gm) potomky obsahuje (g − 1) vyhledávacích klíčů
  • všechny listy jsou na stejné úrovni, v listu je max. m − 1 klíčů
  • klíče se v celém stromu vyskytují právě jednou, záznamy jsou umístěny přímo v uzlech s klíči nebo jsou z nich adresované
  • vlevo od klíče je ukazatel na podstrom obsahující klíče menší než klíč v uzlu, vpravo od klíče je ukazatel na záznam a vedle něj ukazatel na podstrom obsahující klíče větší než klíč v uzlu
  • operace přidání, vyjmutí i vyhledávání prvku v B stromě probíhají v logaritmickém čase

B+ strom

  • záznamy s daty jsou adresovány pouze z listů
  • vnitřní uzly B+ stromu hrají roli indexu k listům (vytvářejí víceúrovňový řídký index listů)
  • ve vnitřních uzlech se hraniční klíče mohou opakovat
  • Výhody oproti B stromům:
    • uzly jsou menší o ukazatele dat, strom jde více do šířky, průchod stromem je rychlejší
    • vkládání a rušení záznamů je snadnější, jednodušší je celá implementace B+ stromu
    • každý list obsahuje odkaz na následující list (tedy listy jsou zřetězené) – umožňuje velice rychlé procházení celým stromem.

B* strom – Obdoba B stromu, která pracuje s uzly naplněnými minimálně do 2/3, místo 1/2 jako u klasického B stromu.

B# strom – Obdoba B+ stromu s povolenou rotací hodnot mezi sousedními uzly.
Trie – Klíče jsou uchovávány na cestách z kořene k externímu uzlu a nikoliv jako celky v jednotlivých uzlech. (Trie není m-ární vyhledávací strom.)

Základy teorie informace

Definice

Teorie informace = větev matematiky zabývající se efektivností a přesností uchovávání, přenosu a reprezentace informace
Informace = to, co přijímáme formou textů, řeči, obrazy… (zprávami)
  • informační objem zprávy je přímo úměrný entropii zprávy (méně pravděpodobná zpráva nese více informace)

1 bit = ekvivalent volby mezi dvěma stejně pravděpodobnými zprávami

Entropie

Entropie je míra neurčitosti; snížením neurčitosti získáváme informaci, množství získané informace odpovídá velikosti odstraněné neurčitosti.

Vzorec na výpočet entropie

H = - \sum^{M}_{i=1} P_{i} \log_{2} P_{i} [b/symbol]

P_{i} je pravděpodobnost výskytu symbolu s měřenou informací

M je počet symbolů

log_{2} P_{i} je překvapení z výskytu daného symbolu i

Maximální neurčitost

Při stejné pravděpodobnosti výstupu každého z M symbolů je P_{i} = \frac{1}{M} Maximální neurčitost potom je H_{max} = - \sum^{M}_{i=1} \frac{1}{M} \log_{2} \frac{1}{M} = \log_{2} M

Kódování

Kódování = nahrazování jedné posloupnosti symbolů jinou posloupností symbolů (pořizování dat, šifrování, opravné kódy, komprese…).

  • Pro zobrazení každého symbolu zprávy potřebujeme alespoň \log_{2} N bitů, pokud nechceme snížit množství informace v zobrazené zprávě.
  • Kompresní teorém: Je-li H entropie zdroje, pak lze neztrátově komprimovat zdrojový text až do vyjádření každého symbolu v průměru H bity.
  • Shannon-Fanovo kódování – využívá pravděpodobnosti výskytu jednotlivých prvků a rekurzivně rozděluje vždy na dvě skupiny s prefixem 0 či 1
  • Huffmanovo kódování – symboly s vyšší pravděpodobností výskytu mají kratší kódová slova

Další kódování: Brailovo písmo, RLE kódování (náhrada opakujících se symbolů), Aritmetické kódování (pro malé abecedy)

Komprese dat

Definice

komprese dat = proces identifikace a odstraňování redundance v datech

Cílem komprese je minimalizovat velikost komprimovaných dat, ať už pro ukládání nebo přenášení po síti.

Dělení 1

  1. neztrátová komprese – dekompresí se získají původní data (Huffmanovo kódování, Run-Length kódování…)
  2. ztrátová komprese – za cenu zefektivnění komprese se snižují nároky na přesnost rekonstrukce (MP3, JPEG…)

Dělení 2

  1. statická komprese – neměnný algoritmus, probíhá nezávisle na komprimovaných datech
  2. adaptivní komprese – dynamicky se měnící algoritmus, specifický pro komprimovaná data

Dělení 3

  1. fyzická komprese – ignoruje význam dat, odstraňuje se pouze formální redundance
  2. logická komprese – zohledňuje význam komprimovaných dat, obvykle se jedná o ztrátovou kompresi

Typy kompresních metod

  1. základní (intuitivní) technikyBraillovo písmo, Run-Length kódování…
  2. statistické metodyHuffmanovo kódování, Shannon-Fanovo kódování…
    • prvkům vstupní abecedy s větší pravděpodobností výskytu ve zprávě se přiřazují prvky výstupní abecedy kódované kratšími bitovými řetězci
    • aritmetické metody
      • každá posloupnost symbolů se reprezentuje značkou; množinou značek je interval <0;1); máme funkci, která mapuje posloupnost symbolů do tohoto intervalu
  3. slovníkové metodyLZ77, LZ78, LZW…
    • některé vzorky se vyskytují v mnoha typech dat; pokud se kóduje celý vzorek místo jednotlivých symbolů, které jej tvoří, bude kódovaný text kratší
  4. dalšíMP3, JPEG, MPEG…
    • věsměs specializované ztrátové kompresní metody na hudbu, obrázky a video

Předměty

PV062: Organizace souborů, doc. Ing. Jan Staudek, CSc.

Použitá literatura

Kam dál

Animace

Vypracuje

Otázku si přečetl pan RNDr. Vlastislav Dohnal a rámcově prošel. Jeho podněty pro doplnění textu, opravy nesrovnalostí a odstranění matoucích či k otázce se nevztahujících textů byly do otázky zaneseny. Tato kontrola je jen rámcová, stále se může stát, že v otázce zůstala zapomenutá chybka či nesrovnalost, vyučující za toto nenese odpovědnost, berte tuto rámcovou kontrolu jako formu pomoci od vyučujících pro studenty.

Diskuze

, 2008/06/09 20:30

Co je to tedy to „schéma organizace souborů“ nějak jsem toasi nepochopil? chtělo by to možná v této části otázky pár příkladů. Takže, pokud někdo víte co a jak, pls doplňte. Díky

, 2008/06/10 19:34

Diky.. :)

, 2008/06/10 21:02

neplete se tady náhodou obrázek u „uspořádaný sekvenční soubor“ s „indexovaný soubor“?

, 2008/06/10 21:58

jj.. na to uz upozornoval i pan Dohnal… zatim jsem u „usporadaneho sekvencniho souboru“ nechala ten obrazek oznaceny jako keysort, ktery je ve skriptech opravdu uveden u usporadaneho sekvencniho souboru a ktery zde v otazce puvodne byl, ale pridala jsem tam radeji i ten s oznacenim „retezene struktury“, ktery snad vice odpovida „usporadanemu sekvencnimu souboru“… a jeste to znovu resim s panem Dohnalem, jak to opravdu ma byt… brzy dam vedet vice info.

, 2008/06/11 21:19

tak ten text a struktura odrazek byla opravena, snad je to ted u usporadaneho sekvencniho souboru uz v pohode a je jasne, co je co a proc.

Jinak pan Dohnal se jeste zminil, ze by bylo dobre u linearniho hasovani napsat zakladni princip, je tam ted dopsane tak nejak vsechno kolem, jen ten hlavni princip ne. Tedy jeste jsem na jeho podnet doplnila ten rozdil oproti rozsiritelnemu hasovani, ten je podstatny.
Ja jsem koukala na ty obrazky a chapu to, ale priznam se, ze ne natolik, abych to nejak strucne a jasne vystihla – takze ten princip kdyztak doplnte, kdo vi.

, 2008/06/19 15:25

Mně osobně přijde, že je toho tady fakt halda a dá fušku najít to, co je fakt důležitý, takže osobně nejsem příznivcem dopisování čehokoliv, spíš bych byl pro odmazání :-)

, 2008/06/19 23:38

no asi to bude tim, ze tam to „fakt dulezity“ zrovna u toho linearniho hasovani chybi a proto by se to tam melo pridat ;-)

Osobne bych taky odmazavala, jenze to jen tak snadno nejde… kazdy to bude vysvetlovat po svem a to, co ty si zrovna odmazes, muze nekomu chybet a naopak (jen si vsimni, jak se treba jen my dva kolikrat u databazi neshodnem na tom, co je fakt dulezity :) ). Bohuzel tahle otazka je az moc rozsahle zadana, ale s tim uz asi nic nenadelame.

, 2008/06/20 09:24

Asi máš pravdu :-)

, 2010/01/24 15:59

Dovolil jsem si presunout „typy souboru“ o par podotazek vys. V hlave mi kompilator hlasil ze nezna pojmy homogeni a nehomogeni soubor, ptotoze tyhle pojmy byly nejprve v textu pouzivany a az pak deklarovany, tak snad je to ted trosku logictejsi. :-D

, 2010/01/24 16:40

A vubec cely text jsem trochu poprehazoval aby jedna lip odpovidal zadani otazky a jednak mi prislo ze to bylo takove rozhouskovane. Chvili se mluvilo o indexovani, pak o dynamicke organizaci a hasovani a pak zase skok zpet na indexovani a tak… Pokud to nekomu nedava smysl tak jak to je ted, tak se ozvete proc.

, 2011/06/10 15:22

nie je ne Wikipedii = neexistuje?

Ku každej otázke som si doteraz čítal články na Wikipédii a prišli mi ako veľmi dobrá pomôcka ako naozaj pochopiť látke. Ťažko sa mi učí zo skrípt, kde sú iba pojmy a definície, či príklady, a chýba širší praktický kontext. Hlavne to, kde sa konkrétna vec využíva/využívala nebýva nikde zmienené.

S touto otázkou si neviem rady. Vôbec nesedí k tomu, čo o filesystéme a súboroch zatiaľ viem. A vôbec nesedí k tomu, čo je na danú tému na wikipédii. Konkrétne som našiel iba jeden odstavec (http://en.wikipedia.org/wiki/File_format), v ktorom sú súbory rozdelené podľa štruktúry na:

- Unstructured formats (raw memory dumps) - záznamy z operačnej pamäte priamo naflákané na disk, v súčasnosti sa nepoužíva
- Chunk-based formats - dáta sú uzavreté do chlievikov, každý chlievik obsahuje informáciu o veľkosti dát a podpis dát (hash?). Široko používaný koncept, napr. JPG, PNG obrázky. Hovoria ale, že aj XML môže byť považovaný za tento typ, ale tagy sa nemapujú priamo na záznamy na disku, jedná sa teda asi o čiste logickú štruktúru (?)
- Directory-based formats - adresárová štruktúra vrámci súboru, ISO, TIFF, asi aj ZIP a podobné. Teda stromová štruktúra (?)

Nejak si dávam dokopy, že toto rozdelenie je logická štruktúra súborov. Neviem sa nikde dopátrať k informáciám, ako sa v praxy logická štruktára mapuje na fyzickú. Príklady zo skrípt mi prídu, akoby logickú štruktúru ignorovali a boli ešte z dôb keď boli aplikácie a operačné systémy pevne zviazané s hardwarom.

Nejaké názory?
Ak som len slepý, odkážte ma na nejaký materiál, ktorý to rozoberá.

, 2011/06/13 00:44

Budeš se muset spolehnout na slidy pana Staudka. Není náhodou, že se název této otázky shoduje s názvem předmětu PV062, který učí.

You could leave a comment if you were logged in.
home/prog/ap12.txt · Poslední úprava: 2020/04/12 16:56 (upraveno mimo DokuWiki)
Nahoru
CC Attribution-Noncommercial-Share Alike 4.0 International
chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0