Hlavní navigace

Programovací jazyk Ada: úprava systému, porovnání prostředí a úvod do GtkAda

Jaromír Vojtaj

V minulém dílu jsme se podrobněji zabývali prostředím Eclipse a zahájili práci na úpravě GPS na nejnovější sadu nástrojů GNAT. Dnes si ukážeme, jak tuto úpravu realizovat a také si porovnáme obě popsaná vývojová prostředí. Zahájíme také popis nástrojů pro vývoj aplikací s grafickým rozhraním GtkAda.

Na úvod se pustíme do již zmíněné úpravy vývojového systému tak, aby aplikace GPS bez problémů spolupracovala s nejnovější verzí prostředí GNAT. Celou akci provedeme v několika krocích:

  1. jako administrátor smažeme celý adresář /usr/gnat/2014. Tím sice přijdeme o již instalované součásti (pokud jsme instalaci provedli) jako je ASIS atd., ale to zatím necháme stranou
  2. spustíme správce balíčků Gslapt a odinstalujeme balíček gcc-gnat. Tímto krokem zmizí systémové nástroje a knihovny Ada, na které se GPS doposud odkazovalo
  3. dříve popsaným způsobem znovu instalujeme GNAT GPL. Jediný rozdíl proti popisovanému způsobu je nastavení cílového adresáře. Tentokrát ho nastavíme na /usr/local (předtím to bylo /usr/gnat/2014). Tímto opatřením se nám všechny důležité aplikace dostanou přímo do systémových cest – adresáře /usr/local/bin, /usr/local/include, /usr/local/lib atd.
  4. smažeme jako root soubor $HOME/.bashrc
  5. otevřeme soubor /root/.bashrc a vypustíme z něj systémovou proměnnou PATH s odkazem na adresář /usr/gnat/2014/bin
  6. v souboru ponecháme pouze zbylé dvě systémové proměnné a změníme cíl, na který se odkazují:
    GPR_PROJECT_PATH=/usr/local/lib/gnat
    export GPR_PROJECT_PATH

    ADA_PROJECT_PATH=/usr/local/lib/gnat
    export ADA_PROJECT_PATH
  7. soubor uložíme a zkopírujeme do domovského adresáře uživatele příkazem:
    cp /root/.bashrc /home/$USER/.bashrc
  8. restartujeme stroj

Po restartu můžeme vyzkoušet známé příkazy:

gnatmake --version

gnatls -v

Pokud je všechno v pořádku (a není důvod, aby nebylo…), tak spustíme GPS a podíváme se na to, jak se nám nastavení změnilo. První dva obrázky v první galerii nám jasně dokazují, že změnilo, a to celkem zásadně! Na prvním obrázku je situace ihned po spuštění a na druhém po využití funkce Scan. Každopádně je zde plná cesta k nejnovější verzi GNAT s výchozím jménem, lokací a číslem verze. Také ve spodní části Details je vše v pořádku. Hlavně se ale tímto opatřením podařilo uvést do chodu prostředí GPS s nejnovější verzí GNAT, a to bez problémů s překladem a spouštěním aplikací. Dalo to sice práci, ale prostředí máme nastavené tak, jak to jenom nejlépe jde a můžeme pokračovat.

Vytvoříme nový GPS projekt s názvem GPS2, v něm pak soubor main.adb, který přidáme k projektu jako Main File. Když už máme otevřené nastavení projektu, pro jistotu překontrolujeme záložku Languages. Tam naštěstí zjistíme, že je vše v pořádku a je k dispozici GNAT 2014. Proto tuto záložku opustíme a otevřeme tu nejspodnější – Switches. Jak je vidět na třetím obrázku první galerie, je zde několik dalších záložek – Pretty Printer, Builder, Ada, Binder a Ada Linker.

Pretty Printer

Zde je možné nastavit chování GPS ve smyslu formátování textu. Není nutné asi zatím nic měnit, nicméně stojí za vyzkoušení např. Casing → Keyword pro nastavení velikosti písmen u klíčových slov (Lower, Upper), Extra → Separate line for LOOP and THEN nebo USE nebo názvy příkazů.

Builder

Zde je možné nastavit automatický překlad pokud dojde k nějaké změně v této sekci nastavení projektu, víceprocesorový překlad, přidání informací pro ladění atd. Zde můžeme klidně nastavit počet procesorů na 4, které má náš virtuální stroj.

Ada

Zde se dají nastavit parametry pro optimalizaci kódu, chybová hlášení, typová kontrola při běhu a hlavně verze jazyka Ada kvůli ověřování syntaxe. My zde volíme Syntax → Ada 2012 mode

Poslední dvě záložky jsou zatím nezajímavé, takže je vynecháme. Co je ale třeba zmínit je fakt, že při najetí myší na nějakou položku se objeví krátká nápověda, která může pomoci při detailnějším nastavování parametrů projektu. Udělali jsme tedy dvě změny v nastavení a můžeme je potvrdit tlačítkem OK. Pak provedeme pomocí ikony ještě aktualizaci projektu a přes menu Project → Save All změny definitivně uložíme. Nyní můžeme otevřít soubor GPS2.gpr. Jak ukazuje čtvrtý obrázek první galerie, je zde opět o něco více textu, než bychom asi čekali. Je to samozřejmě dáno tím, že jsme provedli změnu nastavení (přepínačů), která se v hlavním souboru projektu musela zákonitě projevit.

Pokud si dobře všimnete, tak byl obrázek „vystřižen“ o něco větší, než by bylo nutné. Má to ale svůj důvod! Možná si také všimnete (asi ano, když na to upozorníme…), že v pravé sekci ikon je jich místo původních 6 celých 7. GPS totiž umožňuje nastavit viditelnost některých položek hlavního menu. Proto nám vlevo od funkce Check Semantic přibyla nová ikona, pod kterou se skrývá funkce Check Syntax. Pokud bychom chtěli menu upravit, stačí z toho hlavního spustit Build → Settings → targets a objeví se formulář, který je vidět na pátém obrázku v první galerii. Pokud bychom si dali chvíli práci, tak zjistíme dvě věci:

  • většina položek se dá ještě dále upravovat a nastavovat
  • prováděcí příkazy jsou tvořené pomocí základních utilit systému GNAT s příslušnými parametry
  • pomocí ikon v levém horním rohu je možné položky přidávat, mazat a klonovat. K tomu by ale byla nutná velmi dobrá znalost celého prostředí GNAT, a proto jenom ukážeme další obrázek, který ukazuje možnosti při vytváření nové položky

Nastavení zatím necháme být a do vytvořeného souboru main.adb přidáme pár jednoduchých příkladů, uložíme změny, přeložíme a spustíme aplikaci. Výsledek je vidět na sedmém obrázku v první galerii. Asi se ostatně nedalo nic moc jiného čekat, že? Provedeme tedy velmi jednoduchou změnu a výsledek vidíme na posledním obrázku první galerie. Opět to nevypadá nijak světoborně, to je jasné. Uvádíme zde tento příklad proto, že jsme při práci s konzolovým systémem narazili na problém s diakritikou. Pokud totiž byly nějaké texty „s nabodeníčky“, tak je systém okázale ignoroval! V GPS se navíc nechá nastavit sada znaků v menu Edit → Preferences → General. Jenom upozorním na to, že operační systém má locale nastaveno na en_US a klávesnice je česká.

O možnostech nastavení GPS by se dalo psát velmi dlouho a obšírně, ale pro naše základní účely už toho bylo v množství docela přiměřeném. Proto se vrátíme na začátek a zkusíme se podívat na základní rozdíly mezi Eclipse a GPS. Jak už bylo řečeno, je GPS (už podle názvu…) zaměřeno hlavně na vývoj v jazyce Ada. Pokud se ale podíváme do parametrů projektu, tak mezi Languages nalezneme jazyky jako C, C++, Assembler, C#, Fortran, HTML, Java, Javascript, Pascal, Perl, Python, Tcl, Xml a další. Nic z toho nebylo a v rámci naší série ani nebude vyzkoušeno, ale možnosti tady jsou.

Eclipse je naproti tomu velmi elastické a nafukovací prostředí, kde se dá pomocí pluginů doplnit snad všechno, na co si člověk vzpomene, a někdy ještě mnohem více! V řadě případů se jedná o jakýsi „průmyslový standard“ vývojového prostředí a jeho penetrace je velmi vysoká. Zde si ale dovolím jednu malou, osobní odbočku. Já Eclipse využívám pouze tehdy, když není nějaká jiná, dostupná a lepší možnost. Konkrétně vlastně asi jenom na webový engine Vaadin, kde ostatní dvě prostředí (NetBeans, JIdea) buď nemají k dispozici nic nebo jenom v placené verzi. Na Java a JavaFX aplikace využívám mnohem raději Intelli JIdea. Jednak ze zvyku, ale hlavně proto, že má podle mého názoru mnohem lepší kontextovou nápovědu.

O této vlastnosti, která je hlavně pro začátečníky docela důležitá, jsme už mluvili. GPS má nápovědu, doplňování, nabídku funkcí, procedur, proměnných, knihoven atd. na velmi vysoké úrovni. V konkrétním případě řádově lepší, než GNATbench v Eclipse. Kromě toho se dá dobře nastavit funkčnost editoru nejen v základních věcech, jako je velikost, druh a barva písma. Zde opět nad Eclipse vítězí. Další výhodou GPS je to, že je součástí balíku GNAT a nemusí se proto extra instalovat a nezabere žádný dodatečný prostor na disku. V případě Eclipse (pokud se samozřejmě nepoužívá i k jiným účelům) + GNATbench je potřeba počítat s obsazením cca 350 + 180 MB a to je už je celkem solidní porce.

Nastavení Eclipse na nejnovější verzi GNAT je sice snadnější, než v případě GPS. Podle návodu v tomto díle to ale ani tady není neřešitelné. A navíc: pokud se v Eclipse nastaví nová verze GNAT, je problém s vytvořením projektu a sada nástrojů se musí nastavovat dodatečně. Je to sice taky řešení, ale určitě otravnější než to jednorázové pro GNAT+GPS.

Obecně se obě prostředí dají uživatelsky přizpůsobit konkrétním potřebám, V Eclipse je to určitě složitější, ale to je daň za jeho úžasnou univerzálnost. Zaměření GPS na menší úsek je v tomto případě určitě výhodou, a to hlavně pro začátečníky. Těm stačí pár ikonek v liště (slovy 10…) a mohou začít směle experimentovat.

GPS také informuje uživatele za pomoci spodních záložek o všem, co se během překladu nebo běhu děje, což zase velmi pomáhá hlavně začátečníkům. Eclipse je v tomto ohledu asi srovnatelné. Velkou výhodou GPS (opět zapřičiněnou její „monokulturou“) je systém nápovědy. Ta nabízí nejenom samotnou GPS, ale také různé součásti systému GNAT, jako je např. GtkAda, XML Ada, GNATcoll a další. Zde samozřejmě nemůže Eclipse vůbec konkurovat.

Asi nemá cenu zabíhat do ještě dalších a větších podrobností, takže bych kapitolku o porovnání GPS a Eclipse+GNATbench uzavřel takto: v rámci projektu se nebude Eclipse používat ani na vývoj aplikací v C/C++ (bude použito prostředí Qt Creator). Z tohoto a výše uvedených důvodů bude proto odstraněno z daného virtuálního stroje včetně GNATbench a pro vývoj v jazyce Ada se bude používat výhradně GPS. Ještě jednou bych chtěl zdůraznit, že toto rozhodnutí je platné pouze pro tento konkrétní projekt! Kdo by chtěl Eclipse pro svoje účely používat, třeba proto, že je na něj zvyklý, tak klidně může. Sice tím asi moc nezíská, ale je to určitě možná varianta.

Po srovnání GPS a Eclipse můžeme směle vykročit do oblasti tvorby GUI. GtkAda je kompletní nástroj pro vytváření grafických (GUI) aplikací v jazyce Ada. Je přímo součástí systému GNAT GPL, kde si ho jednak můžeme stáhnout a také si o něm přečíst další podrobnosti. Odkaz je zde: AdaCore GtkAda. Na výše uvedené stránce je možné najít jak informace, tak odkazy na další důležité součásti systému, jako je třeba GTK+, manuály a uživatelské příručky, aplikace, které GtkAda využívají atd. Krátký popis včetně jednoduchého příkladu aplikace je také zde: WikiBooks GtkAda

Na dalším odkazu je možné stáhnout balíček s několika složitějšími příklady, které je možné analyzovat, případně využít k dalšímu experimentování: GtkAda příklady. K dispozici je i poměrně slušně obsáhlá „oficiální“ nápověda: GtkAda nápověda. Zde se mimo jiné dočteme, že nejnovější verze GtkAda používá systémovou knihovnu GTK+3 a je kompatibilní s verzemi 3.8.x. Není to sice úplně nejnovější verze GTK, ale pro dané účely je dostatečná. Asi nemá smysl se dále zabývat podrobnostmi, protože knihovna GTK+ je dostatečně známá hlavně z projektu Gnome a dalších. Pustíme se tedy rovnou do instalace. Zde si ukážeme, jak je možné GtkAda nainstalovat a nastavit tak, aby fungovalo vše kolem projektů v GPS. Otevřeme tedy známou stránku na AdaCore a stáhneme si GtkAda GPL 2014 pro x86–64 GNU Linux, konkrétně soubor gtkada-gpl-3.8.2-src.tgz. Ve stejném úseku se nachází ještě balíček GTK+ ve verzi 3.8.4. Bylo by možné ho také využít pro instalaci, ale v našem konkrétním případě to nebude nutné. To si ale ukážeme za chvíli. Jako root rozbalíme stažený soubor do adresáře /opt/gtkada-3.8.2-src. Pořád jako root přejdeme do nově vzniklého adresáře a spustíme příkaz:

./configure

Mohli bychom použít další parametr –prefix=/adresar/ a instalovat GtkAda do vybraného adresáře, ale tentokrát necháme instalaci proběhnout do standardních cílových adresářů. To je do podadresářů v /usr/local. Konfigurace je rychlá a proběhne bez zádrhelů. Pak by bylo možné přejít k dalšímu příkazu, který se logicky nabízí. My to ale neuděláme. Tento příkaz trvá totiž poměrně dost dlouho a navíc – neproběhne úplně bez chyb. Hlášené chyby sice nemají vliv na konečnou instalaci, ale přesto si něco málo řekneme o jejich odstranění. Otevřeme tedy soubor /opt/gtkada-3.8.2-src/testgtk/create_css_editor.adb a najdeme řádky od 41 do 62, o kterých nás systém informuje:

     &" * appearance of this Window." & ASCII.LF
     &" * Be careful, if you screw it up, nothing might be visible" & ASCII.LF
     &" * anymore. :)" & ASCII.LF
     &" */" & ASCII.LF & ASCII.LF

     &"/* This CSS resets all properties to their defaults values" & ASCII.LF
     &" * and overrides all user settings and the theme in use */" & ASCII.LF
     & ASCII.LF

     &"/* Set a very futuristic style by default */" & ASCII.LF & ASCII.LF

     &"* {" & ASCII.LF
     &"  color: green;" & ASCII.LF
     &"  font-family: Monospace;" & ASCII.LF
     &"  border: 1px solid;" & ASCII.LF
     &"}" & ASCII.LF

     &"/* Make sure selections are visible */" & ASCII.LF
     &":selected {" & ASCII.LF
     &"  background-color: darkGreen;" & ASCII.LF
     &"  color: black;" & ASCII.LF
     &"}";

Pro odstranění nahlášené chyby stačí na začátku všech řádků vložit mezeru mezi znaky & a ". Podobný problém je i v souboru /opt/gtkada-3.8.2-src/testgtk/create_print.adb na řádku 130:

Set_Line_Width (Cr, 1.0/16.0);

Zde opět stačí vložit mezeru před a za znak pro dělení čísel. Nyní už konečně můžeme spustit další příkaz:

make

Oba výše uvedené soubory už v chybovém hlášení nefigurují, přesto ale příkaz neskončí úplným úspěchem. Podobně by dopadl i volitelný příkaz

make tests

Nahlášenou chybu (která se týká neprovedeného příkazu linkeru LD z GCC a parametru -lgtkada_gl) nebudeme dál ani rozebírat ani řešit. Nemá totiž žádný vliv na úspěšnou instalaci (chyba se projeví pouze při snaze o instalaci testovacích procedur a neovlivní nijak instalaci jádra balíku GtkAda), kterou provedeme příkazem

make install

Pokud by ale někdo z pozorných čtenářů znal řešení této mírné komplikace, bylo by laskavé, kdyby se s námi o svou zkušenost podělil.

Instalace je tedy hotová a nezbývá, než provést nastavení systému tak, aby byly potřebné knihovny a aplikace viditelné a dostupné. Je to podobné, jako v minulých dílech popisované nastavení GPS. Pro jeho doplnění musíme provést tři kroky:

  1. přejít do adresáře /root (pořád z terminálu administrátora!) a spustit příkaz
    ldconfig
  2. v tomto adresáři otevřít soubor /root/.bashrc a za již obsažené dvě deklarace systémových proměnných doplnit tři další
    LD_LIBRARY_PATH=/usr/local/lib/
    export LD_LIBRARY_PATH
    
    ADA_OBJECTS_PATH=/usr/local/include/gtkada/
    export ADA_OBJECTS_PATH
    
    ADA_INCLUDE_PATH=/usr/local/include/gtkada/
    export ADA_INCLUDE_PATH
  3. zkopírovat doplněný a vytvořený soubor do uživatelského adresáře (pokud by bylo v tomto souboru uživatelů ještě něco jiného, tak kopírovat pouze nově doplněné příkazy!) příkazem
    cp .bashrc /home/$USER/.bashrc
    a restartovat virtuální stroj.

Nyní už máme celý balík GtkAda nainstalovaný a pomocí nových systémových proměnných by měl být také funkční. Funkčnost vyzkoušíme velmi jednoduchým způsobem, kdy za pomoci GPS vytvoříme jednoduchý projekt. Jenom upozorním na jednu důležitou věc: ukázkový projekt GtkAda – Simple window je v GPS k dispozici standardně, ihned po instalaci systému GNAT. Tedy rozumí se i bez ohledu na to, jestli je instalován balík GtkAda či není. Bez jeho instalace samozřejmě nebude možné tento projekt založit a už vůbec ne přeložit!

Otevřeme si GPS a zkusíme založení nového projektu pomocí volby menu Project → New from Template. V okně s možnostmi (Create Project from Template) pak uvidíme, že je k dispozici projekt GtkAda – Simple window – viz první obrázek druhé galerie. A když už ho v nabídce máme, tak ho zkusíme vybrat a vytvořit. Danou volbu tedy vybereme a klikneme na tlačítko Continue se zelenou šipkou. Objeví se nám další okno, kde jsou tři parametry nového projektu – jeho název, jméno hlavního souboru a umístění projektu v adresářové struktuře. Základní nastavení je vidět na druhém obrázku druhé galerie. Třetí obrázek pak ukazuje nově zadaný název projektu a jeho umístění do předem připraveného separátního adresáře. Vytvoření projektu ukončíme tlačítkem Apply. Následně v projektu nastavíme dříve uvedeným způsobem dva přepínače – verze Ada 2012 a 4 procesory. Nebudeme si zatím podrobněji ničeho všímat a zkusíme projekt přeložit a spustit. Provedeme kontrolu nastavení projektu a zjistíme, že Main files je správně nastavené a můžeme postupně provést akce Build Main: main.adb a Run Main: main. První akce proběhne bez problémů a pomocí správce souborů můžeme zjistit, že se v adresáři ..\obj objevil spustitelný soubor main. Aplikace se nám spustila a objevilo se jednoduché okno s názvem main, které obsahuje klasické tři ikony na manipulaci s oknem a nápis Hello world. Na 4. – 10. obrázku druhé galerie je pak možné postupně vidět obsah souboru main.adb, obsah souboru gtkada1.gpr před změnou nastavení přepínačů a po ní, nastavení projektu Main files, zprávy překladače po spuštění příkazu Build Main, okno spuštěné aplikace a obsahy všech příslušných adresářů a podadresářů. Obrázky zatím necháme stranou a zaměříme se na kód, který nám ukázková aplikace vytvořila. Ten je samozřejmě v souboru main.adb a má celkem 35 řádků, z toho 27 jich obsahuje nějaký kód:

with Gtk.Box;         use Gtk.Box;
with Gtk.Button;      use Gtk.Button;
with Gtk.Label;       use Gtk.Label;
with Gtk.Widget;      use Gtk.Widget;
with Gtk.Main;
with Gtk.Window;      use Gtk.Window;
with Gtkada.Handlers;    use Gtkada.Handlers;

procedure main is

   Win : Gtk_Window;
   Label : Gtk_Label;
   Box : Gtk_Vbox;

begin

   -- Initialize GtkAda
   Gtk.Main.Init;

   -- Create a window with a size of 400x400
   Gtk_New (Win);
   Win.Set_Default_Size (400, 400);

   -- Create a box to organize vertically the contens of the window
   Gtk_New_Vbox (Box);

   -- Add a label
   Gtk_New (Label, " Hello world.");
   Win.Add (Label);

   -- Show the window
   Win.Show_All;

   -- Start the Gtk+ main loop
   Gtk.Main.Main;
end Main;

Bližší rozbor a komentáře k novému kódu si ponecháme do příštího dílu.

V dnešním dílu jsme si ukázali, jak upravit vývojové prostředí pro použití GPS s nejnovější verzí GNAT. Provedli jsem také krátké porovnání vývojových prostředí GSP a Eclipse s pluginem GNATbench. Zahájili jsme také popis nástrojů pro vývoj aplikací s grafickým rozhraním GtkAda včetně vytvoření první jednoduché aplikace. V příštím dílu se budeme věnovat dalším úpravám aplikace v GtkAda.

Našli jste v článku chybu?

19. 7. 2015 9:40

Díky za link, je to opravdu zajímavé a hlavně pro pedagogické účely i hodně poučné! Je ta taky asi trochu odpovědí na otázky z minulého dílu, jestli je Ada vůbec k něčemu dobrá...

16. 7. 2015 15:29

pavel (neregistrovaný)

Protože je to v Adě a GTK, mohl by se možná nějakému adaři hodit tenhle odkaz: http://sourceforge.net/projects/aicwl/ respektive http://www.dmitry-kazakov.de/ada/aicwl.htm . Jsou tam různé pěkné widgety jako budíky, teploměry, různé číselníky atd. Narazil jsem na to náhodou, když jsem hledal nějakou sadu widgetů v GTK pro vizualizaci průmyslových procesů. Adařům to tiše závidím, pro C, C++ jsem nic podobného nenašel...

DigiZone.cz: Je tu první sportovní přenos přes mobily

Je tu první sportovní přenos přes mobily

Lupa.cz: Kdo pochopí vtip, může jít do ČT vyvíjet weby

Kdo pochopí vtip, může jít do ČT vyvíjet weby

Podnikatel.cz: V restauraci bez cigaret? Sněmovna kývla

V restauraci bez cigaret? Sněmovna kývla

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Podnikatel.cz: Udávání kvůli EET začalo

Udávání kvůli EET začalo

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Měšec.cz: Air Bank zruší TOP3 garanci a zdražuje kurzy

Air Bank zruší TOP3 garanci a zdražuje kurzy

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Podnikatel.cz: Udávání a účtenková loterie, hloupá komedie

Udávání a účtenková loterie, hloupá komedie

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Vitalia.cz: Když přijdete o oko, přijdete na rok o řidičák

Když přijdete o oko, přijdete na rok o řidičák

120na80.cz: Na ucho teplý, nebo studený obklad?

Na ucho teplý, nebo studený obklad?

120na80.cz: Co všechno ovlivňuje ženskou plodnost?

Co všechno ovlivňuje ženskou plodnost?

DigiZone.cz: Rádio Šlágr má licenci pro digi vysílání

Rádio Šlágr má licenci pro digi vysílání

Vitalia.cz: Spor o mortadelu: podle Lidlu falšovaná nebyla

Spor o mortadelu: podle Lidlu falšovaná nebyla

Vitalia.cz: Proč vás každý zubař posílá na dentální hygienu

Proč vás každý zubař posílá na dentální hygienu