abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

    včera 12:44 | IT novinky

    Nizozemská vláda ve snaze šetřit a zvyšovat efektivitu s využitím umělé inteligence (AI) hodlá zrušit asi 25.000 pracovních míst ve státní správě. Cílem je postupně dosáhnout ročních úspor až 3,5 miliardy eur (85,2 miliardy Kč). Na konci loňského roku ve státní správě pracovalo rekordních 160.000 lidí. „Nemůžeme pokračovat v tom, co jsme dělali dosud,“ uvedl státní tajemník pro efektivní fungování vlády Eric van den Burg. „Proto

    … více »
    Ladislav Hagara | Komentářů: 8
    včera 12:00 | IT novinky

    Příspěvek na blogu PRUSA 3D představuje fotoaparát CAIM1 (Counter Artificial Intelligence Machine 1). Uměle vytvořený obsah je každým dnem těžší rozeznat od skutečných záběrů či fotografií, což podrývá důvěryhodnost žurnalistiky, archivních materiálů i každodenní tvorby obsahu. Fotoaparát CAIM1 byl vyvinut právě k tomu, aby ověřoval původ fotografií a videí přímo během jejich pořizování. Uvnitř fotoaparátu se nachází hardwarová Web3 peněženka se zabezpečovacím čipem Tropic Square TROPIC01.

    Ladislav Hagara | Komentářů: 3
    včera 00:11 | Nová verze

    Jonathan Thomas oznámil vydání nové verze 4.1 video editoru OpenShot (Wikipedie). Zdrojové kódy OpenShotu jsou k dispozici na GitHubu. Ke stažení je i balíček ve formátu AppImage. Stačí jej stáhnout, nastavit právo na spouštění a spustit.

    Ladislav Hagara | Komentářů: 0
    31.10. 23:33 | Zajímavý článek

    Při běžné migraci virtuálního stroje mezi hypervizory se jeho MAC adresa přesune na jiný leaf switch. EVPN tuto změnu distribuuje pomocí BGP Type-2 route a MAC mobility sequence number. Problém nastává, pokud útočník podvrhne zdrojovou MAC adresu jiného zařízení. Leaf může změnu interpretovat jako legitimní přesun MAC a rozšířit ji přes BGP do celé fabric. Výsledkem může být přesměrování provozu určeného původnímu zařízení. Autor článku rozebírá možnosti detekce pomocí sledování MAC moves, BGP route reflektorů a kontroly na přístupové vrstvě.

    vencour | Komentářů: 0
    31.10. 15:11 | Nová verze

    Vývojáři desktopového prostředí Enlightenment (Wikipedie) a souvisejících knihoven Enlightenment Foundation Libraries (EFL) vydali nové verze. Enlightenment byl vydán ve verzi 0.28.0 a Enlightenment Foundation Libraries ve verzi 1.29.

    Ladislav Hagara | Komentářů: 4
    31.10. 13:55 | Zajímavý článek

    Cloudflare zjistil, že některé odpovědi modelu GLM-5.3 obsahovaly části dat z předchozích požadavků jiných zákazníků. Příčinou byla kombinace chybné konfigurace a chyby v inference enginu SGLang. Model podporoval kontextové okno 1 048 576 tokenů, ale GPU KV cache pool měl kapacitu pouze 681 280 tokenů. Při překročení kapacity docházelo k nesprávnému zpracování odmítnutého požadavku. Decode část systému následně pracovala se starými

    … více »
    vencour | Komentářů: 2
    31.10. 13:00 | Zajímavý článek

    Vývojáři Knot Resolver vysvětlují, jak změnili rozhodování o tom, které DNS záznamy ponechat v cache a které odstranit. Článek obsahuje skutečná měření: devět hodin DNS provozu při 2 000 QPS, srovnání cache o velikosti 25 MB a 40 GB a také porovnání s BIND 9, kromě algoritmů obsahuje konkrétní doporučení pro konfiguraci a diagnostiku.

    vencour | Komentářů: 0
    30.10. 13:44 | IT novinky

    Největší kryptoměnová burza světa Binance se stala terčem útoku, při kterém podvodníci odcizili během několika minut kryptoměny v hodnotě přibližně 6,3 miliardy dolarů. Jedná se o největší kryptoměnovou krádež v historii, přibližně čtyřikrát větší než loňský útok na burzu Bybit. Binance se podařilo ve spolupráci s partnery zmrazit aspoň aktiva v hodnotě zhruba 3 miliard dolarů a slíbila, že veškeré ztráty pokryje z vlastních prostředků.

    Ladislav Hagara | Komentářů: 16
    30.10. 02:16 | Bezpečnostní upozornění

    Zranitelnost CVE-2026-98432 s CVSS 9.8 odhalila AI od společnosti Anthropic. Jedná se o kritickou chybu v implementaci MPTCP (multipath TCP). Debian vydal patche 16.10. a 22.10., ale např. Ubuntu je zatím bez opravy. Více informací na The Hacker News.

    Max | Komentářů: 20
    29.10. 23:22 | Zajímavý software

    Na Slovensku vznikla úplne nová rally hra, ktorá je zadarmo a funguje vo Windowse, Linuxe či na Macu. Greenie Rally má viac ako 50 tratí a vozidiel, šampionáty či turnaje. Má retro feeling a imituje automobilové hry z prelomu tisícročí. Vyskúšate prejsť všetky mapy na Škode 130RS?

    Stanislav Hoferek | Komentářů: 14
    Které desktopové prostředí na Linuxu používáte?
     (9%)
     (7%)
     (4%)
     (20%)
     (30%)
     (9%)
     (5%)
     (2%)
     (14%)
     (20%)
    Celkem 2962 hlasů
     Komentářů: 34, poslední 26.10. 08:24
    Rozcestník

    Dotaz: casting pointerů v cečku

    4.12.2021 16:51 lertimir | skóre: 64 | blog: Par_slov
    casting pointerů v cečku
    Přečteno: 680×
    ještě bych potřeboval jednu radu. na casting pointerů v Cčku. Potřebujeme pracovat s 4 rozmerným polem. rekněme A[x][y][z][n]. velikosti (kromě n) jsou vysoké stovky, cele pole je 1-2 GB, takže to nejde jako lokální proměnná v main. ale nedaří se mi vymyslet jak zkonvertuji pointr ziskaný alokací z malloc
    void * = malloc (potrebna velikost);
    na 4 dimenzionální pole.

    Řešení dotazu:


    Odpovědi

    Pendrekama do nich❗ avatar 4.12.2021 19:05 Pendrekama do nich❗ | skóre: 43 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    Rozbalit Rozbalit vše Re: casting pointerů v cečku

    buťto uděláš mockrát posobě malloc nebo strašně dlouhatatatatatatánskou jednorozměrnou nudli a k elementům pole se budeš dostávat ukazatelovovou aritmetikou :D ;D

    hele pro 3d :O ;D prostě jako ještě jeden rozměr přidáš a bude to jakoby uplně to samý :D :D ;D ;D

    5.12.2021 10:26 Vtipnéř | skóre: 39 | blog: Vtipnéřův blog | Brno
    Rozbalit Rozbalit vše Re: casting pointerů v cečku

    buťto uděláš mockrát posobě malloc nebo strašně dlouhatatatatatatánskou jednorozměrnou nudli a k elementům pole se budeš dostávat ukazatelovovou aritmetikou :D ;D

    Osobně bych asi radši použil tu dlouhou nudli. Jirka
    Opening Windows is better than washing them. Clearing Windows (e.g. erasing or deleting) is even much better.
    5.12.2021 17:08 lertimir | skóre: 64 | blog: Par_slov
    Rozbalit Rozbalit vše Re: casting pointerů v cečku
    Asi to skončí na dlouhé nudli. Není to ani tak pro mne jako pro kamaráda, který před (mnoha) lety programoval ve FORTRANu a s pointry není kamarád, ale vědecké výpočty přes C pole moc efektivní nebudou, takže se to bude muset naučit.
    Řešení 3× (Bhezret, Вheгzet, Вherzet)
    4.12.2021 19:13 z_sk | skóre: 34 | blog: analyzy
    Rozbalit Rozbalit vše Re: casting pointerů v cečku
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define ARRAY_TYPE int
    
    // return ARRAY_TYPE[s1][s2][s3][s4]
    ARRAY_TYPE ****alloc4array(size_t s1,size_t s2,size_t s3,size_t s4)
    {
    	ARRAY_TYPE ****data;
    	size_t a,b,c;
    	
    	data=(ARRAY_TYPE ****) malloc(s1*sizeof(ARRAY_TYPE***));
    	for(a=0;a<s1;a++)
    	{
    		data[a]=(ARRAY_TYPE ***) malloc(s2*sizeof(ARRAY_TYPE **));
    		if(data[a] == NULL)
    			exit(1);
    		for(b=0;b<s2;b++)
    		{
    			data[a][b]=(ARRAY_TYPE **) malloc(s3*sizeof(ARRAY_TYPE *));
    			if(data[a] == NULL)
    				exit(1);
    			for(c=0;c<s3;c++)
    			{
    				data[a][b][c]=(ARRAY_TYPE *) malloc(s4*sizeof(ARRAY_TYPE));
    				if(data[a] == NULL)
    					exit(1);
    				bzero(data[a][b][c], s4*sizeof(ARRAY_TYPE));
    			}
    		}
    		
    	}
    	
    	return data;
    }
    
    int main(int argc, char **argv)
    {
    	ARRAY_TYPE ****data;
    	
    	data=alloc4array(100,100,100,100);
    	
    	printf("[0,0,0,0]: %d\n", data[0][0][0][0]);
    	
    	// plus uvolnit pole
    	
    	return 0;
    }
    
    Ak nemáš veľkú RAM, tak dobre je pri takých testov vypnúť swap. V prípade, že program spotrebuje všetku RAM, tak OS proces zabije a nezačne pomaly swapovať.
    debian.plus@protonmail.com
    4.12.2021 19:42 z_sk | skóre: 34 | blog: analyzy
    Rozbalit Rozbalit vše Re: casting pointerů v cečku
    Toto je zle riešenie, nepoužívať.

    @Вherzet Neoznačuj to ako riešenie.
    debian.plus@protonmail.com
    5.12.2021 10:28 Vtipnéř | skóre: 39 | blog: Vtipnéřův blog | Brno
    Rozbalit Rozbalit vše Re: casting pointerů v cečku
    Toto je zle riešenie, nepoužívať.
    Bylo by fajn napsat, kde je chyba. Ale našel jsem to.

    Jirka
    Opening Windows is better than washing them. Clearing Windows (e.g. erasing or deleting) is even much better.
    Pendrekama do nich❗ avatar 5.12.2021 18:29 Pendrekama do nich❗ | skóre: 43 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    Rozbalit Rozbalit vše Re: casting pointerů v cečku

    diff

    22c22
    <             if(data[a] == NULL)
    ---
    >            if(data[a][b] == NULL)
    27c27
    <                if(data[a] == NULL)
    ---
    >                if(data[a][b][c] == NULL)
    
    
    6.12.2021 19:23 Vtipnéř | skóre: 39 | blog: Vtipnéřův blog | Brno
    Rozbalit Rozbalit vše Re: casting pointerů v cečku

    diff

    22c22
    <             if(data[a] == NULL)
    ---
    >            if(data[a][b] == NULL)
    27c27
    <                if(data[a] == NULL)
    ---
    >                if(data[a][b][c] == NULL)
    
    
    Měl jsem stejný nápad. Jirka
    Opening Windows is better than washing them. Clearing Windows (e.g. erasing or deleting) is even much better.
    Řešení 2× (lertimir (tazatel), Вherzet)
    4.12.2021 19:16 z_sk | skóre: 34 | blog: analyzy
    Rozbalit Rozbalit vše Re: casting pointerů v cečku
    Tak ešte raz a správne.
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define ARRAY_TYPE int
    
    // return ARRAY_TYPE[s1][s2][s3][s4]
    ARRAY_TYPE ****alloc4array(size_t s1,size_t s2,size_t s3,size_t s4)
    {
    	ARRAY_TYPE ****data;
    	size_t a,b,c;
    	
    	data=(ARRAY_TYPE ****) malloc(s1*sizeof(ARRAY_TYPE***));
    	for(a=0;a<s1;a++)
    	{
    		data[a]=(ARRAY_TYPE ***) malloc(s2*sizeof(ARRAY_TYPE **));
    		if(data[a] == NULL)
    			exit(1);
    		for(b=0;b<s2;b++)
    		{
    			data[a][b]=(ARRAY_TYPE **) malloc(s3*sizeof(ARRAY_TYPE *));
    			if(data[a][b] == NULL)
    				exit(1);
    			for(c=0;c<s3;c++)
    			{
    				data[a][b][c]=(ARRAY_TYPE *) malloc(s4*sizeof(ARRAY_TYPE));
    				if(data[a][b][c] == NULL)
    					exit(1);
    				bzero(data[a][b][c], s4*sizeof(ARRAY_TYPE));
    			}
    		}
    		
    	}
    	
    	return data;
    }
    
    int main(int argc, char **argv)
    {
    	ARRAY_TYPE ****data;
    	
    	data=alloc4array(100,100,100,100);
    	
    	printf("[0,0,0,0]: %d\n", data[0][0][0][0]);
    	
    	// plus uvolnit pole
    	
    	return 0;
    }
    
    Ak nemáš veľkú RAM, tak dobre je pri takých testov vypnúť swap. V prípade, že program spotrebuje všetku RAM, tak OS proces zabije a nezačne pomaly swapovať.
    debian.plus@protonmail.com
    5.12.2021 17:18 z_sk | skóre: 34 | blog: analyzy
    Rozbalit Rozbalit vše Re: casting pointerů v cečku
    Ináč, použi toto riešenie a nie to, kde máš jeden malloc() s alokovaným naraz veľkého kusu pamäte. Robil som pri inom benchmark a vyšlo mi, že takto rozkúskovanej alokovanie je rýchlejšie pri spracovaní. Zrejme menej OS prepína stránky pamäte, nakoľko pri kusovom alokovaní sú dáta zaokrúhľované na veľkosť page size OS.
    debian.plus@protonmail.com
    Řešení 1× (Pendrekama do nich❗)
    5.12.2021 09:40 jiwopene | skóre: 31 | blog: Od každého trochu…
    Rozbalit Rozbalit vše Re: casting pointerů v cečku
    Nenačítáte si tam data přímo ze souboru? Pokud ano (tj. v poli je totéž co v souboru), zvažte použití mmap(3), se kterým se budou data ze souboru číst až při přístupu. Jem ožné to nastavit tak, že se data do souboru propisují, paměť je jen pro čtení, nebo je možné paměť zapisovat beze změny souboru.

    Preferuji přístup s dlouhou jednorozměrnou nudlí, protože se nemusí mnhohokrát volat malloc a namísto 4 přístupů do paměti postačí jeden.

    Ukázka:
    #include <math.h>
    #include <stdbool.h>
    #include <stdint.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    struct hypercube_entry
    {
    	uint32_t value;
    };
    
    struct hypercube
    {
    	size_t z_len, y_len, x_len, w_len;
    	struct hypercube_entry entries[];
    };
    
    struct hypercube *
    hypercube_alloc(size_t z_len,
                    size_t y_len,
                    size_t x_len,
                    size_t w_len);
    
    inline static struct hypercube_entry *
    hypercube_entry(struct hypercube *hypercube,
                    size_t z_len,
                    size_t y_len,
                    size_t x_len,
                    size_t w_len);
    
    size_t
    hypercube_sizeof(size_t z_len,
                     size_t y_len,
                     size_t x_len,
                     size_t w_len);
    
    struct hypercube *
    hypercube_alloc(size_t z_len,
                    size_t y_len,
                    size_t x_len,
                    size_t w_len)
    {
    	struct hypercube *hypercube_mem;
    	size_t hypercube_sz;
    
    	hypercube_sz = hypercube_sizeof(z_len, y_len, x_len, w_len);
    	hypercube_mem = malloc(hypercube_sz);
    	if (hypercube_mem == NULL) {
    		fprintf(stderr,
                    "Cannot allocate %lu bytes for hypercube. Aborting.\n",
    		        hypercube_sz);
    	}
    	hypercube_mem->z_len = z_len;
    	hypercube_mem->y_len = y_len;
    	hypercube_mem->x_len = x_len;
    	hypercube_mem->w_len = w_len;
    }
    
    size_t
    hypercube_sizeof(size_t z_len,
                     size_t y_len,
                     size_t x_len,
                     size_t w_len)
    {
    	return sizeof(struct hypercube)
    	       + sizeof(struct hypercube_entry) * z_len * y_len * x_len * w_len;
    }
    
    inline static struct hypercube_entry *
    hypercube_entry(struct hypercube *hypercube,
                    size_t z,
                    size_t y,
                    size_t x,
                    size_t w)
    {
    	struct hypercube_entry *entry = hypercube->entries;
    	entry += z * hypercube->y_len * hypercube->x_len * hypercube->w_len;
    	entry += y * hypercube->x_len * hypercube->w_len;
    	entry += x * hypercube->w_len;
    	entry += w;
    	return entry;
    }
    
    int
    main(void)
    {
    	size_t z_len = 100;
    	size_t y_len = 99;
    	size_t x_len = 98;
    	size_t w_len = 97;
    	struct hypercube *hypercube;
    
    	hypercube = hypercube_alloc(z_len, w_len, y_len, x_len);
    	printf("Allocated %lu bytes\n.",
    	       hypercube_sizeof(z_len, w_len, y_len, x_len));
    
    	/* Draw 4-dimensional super-ellipsoid.
    	 * Quite inefficient algorithm. */
    	for (int x = 0; x < hypercube->x_len; x++)
    	for (int y = 0; y < hypercube->y_len; y++)
    	for (int z = 0; z < hypercube->z_len; z++)
    	for (int w = 0; w < hypercube->w_len; w++) {
    		bool is_inside = .5f >= (
    			powf(((float) x - 50.f) * .02, 4.f)
    			+ powf(((float) y - 50.f) * .02, 4.f)
    			+ powf(((float) z - 50.f) * .02, 4.f)
    			+ powf(((float) w - 50.f) * .02, 4.f));
    		hypercube_entry(hypercube, z, y, x, w)->value
    			= is_inside ? 1 : 0;
    	}
    
    	/* Draw slices of it. */
    	for (int w = 10; w < hypercube->w_len - 10; w += 10) {
    		printf("w = %i\n", w);
    		for (int y = 1; y < hypercube->y_len; y += 2) {
    			for (int x = 1; x < hypercube->x_len; x++) {
    				int z = 0;
    				for (;
    				     z < hypercube->z_len
    					 && !hypercube_entry(hypercube, z, y, x, w)->value;
    				     z++);
    				if (z < 80) {
    					if (hypercube_entry(hypercube, z, y - 1, x - 1, w)
    					    ->value) {
    						putchar('*');
    					} else {
    						putchar('#');
    					}
    				} else {
    					putchar('_');
    				}
    			}
    			putchar('\n');
    		}
    		putchar('\n');
    	}
    }
    .sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
    5.12.2021 14:49 lertimir | skóre: 64 | blog: Par_slov
    Rozbalit Rozbalit vše Re: casting pointerů v cečku
    Nenačítám. Fakticky to je 3D model el pole, to co by se načítalo max jsou okrajové podmínky pro to pole a pak se iteruje do stabilního stavu.
    5.12.2021 17:01 z_sk | skóre: 34 | blog: analyzy
    Rozbalit Rozbalit vše Re: casting pointerů v cečku
    Prepis určitých bajtov v súbore nevyžaduje náhodou práva roota?
    debian.plus@protonmail.com
    7.12.2021 17:24 jiwopene | skóre: 31 | blog: Od každého trochu…
    Rozbalit Rozbalit vše Re: casting pointerů v cečku
    Proč by měl? Pokud má uživatel k souboru oprávnění pro zápis, může si ho otevřít (a nammapovat i bez MAP_PRIVATE) s možností zápisu a zapisovat do něj jak chce.
    .sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
    Řešení 1× (Pendrekama do nich❗)
    5.12.2021 10:13 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: casting pointerů v cečku

    Odpovědi typu rádoby-pole à la Java už tady zazněly, takže přidávám jednu s kompaktním 4-rozměrným polem.

    Tohle^^^, mimochodem, v dotazu chybí — jestli jsou jednotlivé dimenze stále stejně velké a pole lze tudíž alokovat naráz jedním malloc()em nebo jestli se velikost různých (pod)polí může lišit a všechno se pak musí alokovat přes další úrovně polí pointerů, jako v Javě.

    #include <inttypes.h>
    #include <stdint.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    struct A { int blah; };
    static const size_t X = 11,
                        Y = 13,
                        Z = 7,
                        N = 5;
    
    int main() {
      struct A (*const array)[Y][Z][N] =
          malloc(sizeof(struct A[X][Y][Z][N]));
    
      int counter = X * Y * Z * N / 2;
      for (size_t x = 0; x < X; ++x)
        for (size_t y = 0; y < Y; ++y)
          for (size_t z = 0; z < Z; ++z)
            for (size_t n = 0; n < N; ++n)
              array[x][y][z][n].blah = counter--;
    
      int64_t sum = 0;
      for (size_t x = 0; x < X; ++x)
        for (size_t y = 0; y < Y; ++y)
          for (size_t z = 0; z < Z; ++z)
            for (size_t n = 0; n < N; ++n)
              sum += array[x][y][z][n].blah;
    
      free(array);
      printf("%" PRId64 "\n", sum);
    }
    

    Trik je v tom, že v typu pointeru na pole array chybí první rozměr X — ten jako jediný není třeba definovat v typu, protože pointerová ařiťmetika potřebuje znát jenom ty následující rozměry. Tedy 4-rozměrné pole můžeme s klidem nechat „zkazit“ na pointer na první (tedy, nulté) 3-rozměrné (pod)pole.

    Že to vypíše nulu, to je asi jasné, leč mnohem důležitější vždycky je, co na to říká valgrind.

    5.12.2021 10:29 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: casting pointerů v cečku

    Ještě pro úplnost: To „slibované“ smrduté kazení pole na pointer se v mém příkladu vůbec neděje. Vezmu void* z malloc() a přiřadím ho rovnou do pointeru na nulté 3-rozměrné pod-pole.

    Ale kdybych kolem toho chtěl strašně moc kecat, mohlo by to vypadat třeba takhle:

    struct A (*const alloc)[X][Y][Z][N] =
          malloc(sizeof(struct A[X][Y][Z][N]));
    struct A (*const array)[Y][Z][N] = *alloc;  /* Tady! */
    /* ... */
    free(alloc);
    
    5.12.2021 10:44 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: casting pointerů v cečku

    Jo a kdo si to chce fakt zahustit, ten si může nastavit třeba:

    static const size_t X = 201,
                        Y = 201,
                        Z = 201,
                        N = 201;
    
    To^^^ pak trvá (na mém stroji) celé 1,5 (se)kundy, což už je nějaké trvání! Velikost toho pole bude 6528963204 B, takže asi 6,08 GiB.
    5.12.2021 13:34 l c mao
    Rozbalit Rozbalit vše Re: casting pointerů v cečku
    (se)kundy
    hahahahahaha nechceš být standup komik s tímhle materiálem?
    5.12.2021 17:22 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: casting pointerů v cečku

    Chtěl bych kandidovat na prezidenta, až na to budu mít věk. Zatím mám fyzicky 37 a mentálně cca 15, takže 2023 nestíhám. 2028 snad.

    Založit nové vlákno • Nahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.