Macro Team LibreOffice

macro.png Macro Team LibreOffice přináší zprávu o činnosti, v níž shrnuje pokrok v podpoře maker v LibreOffice za poslední dobu.  

Pokročilí uživatelé LibreOffice často ve své práci využívají makra. Ta pomáhají automatizovat běžné úkoly v LibreOffice. Makra zůstávala dlouhou dobu poněkud stranou zájmu nadace TDF. Ta však v posledních letech na situaci adekvátně zareagovala.

Založení makro týmu

V září 2019 nadace TDF oznámila založení specializovaného týmu, jehož úkolem bylo vylepšit makra, používaná komunitou uživatelů LibreOffice. Nový tým dostal název LibreOffice Macro Team. Členy skupiny pod vedením Ilmariho Lauhakangase byli:

  • Andreas Heinish, který již předtím vylepšil uživatelské rozhraní pro úpravu maker,

  • Tomoyuki Kubota, který po dobu jednoho a půl roku opravoval chyby a vytvořil systém pro čištění kódu,

  • Alain Romedenne, zkušený dokumentarista maker,

  • Luane, který se podílel na zlepšení dokumentace související s makry, vývoji rozšíření a analýze hlášení chyb souvisejících s makry.

Tým v prvé fázi upravil a vyčistil seznam reportů souvisejících s makry a následně pracoval na řadě problémů.

LibreOffice Macro Team: stav k dubnu 2021

Makro tým vydává průběžné zprávy ze své činnosti. Zatím poslední pochází z dubna tohoto roku. Blog LibreOffice přináší přehled novinek:

Implementace ScriptForge knihoven

Nejvýznamnějším počinem byla implementace ScriptForge knihoven. Knihovny ScriptForge představují rozsáhlou kolekci prostředků pro skriptování maker, jež lze volat z maker psaných v Basicu. Četné metody ScriptForge jsou organizovány v opakovaně použitelných modulech, které izolují konstrukce základního programovacího jazyka od přístupů k obsahu dokumentu ODF a funkcí uživatelského rozhraní. Bližší informace získáte na blogu nadace nebo nápovědě, která je nyní ve vývoji.

Příspěvky na wiki

Velká práce byla provedena na dokumentaci na wiki stránkách:

  • Nathan Ullberg zpracovává tématiku maker v Impressu.

  • Celia Palacios upravila část věnovanou Pythonu a do přehledu tutoriálů přidala nové. (Na wiki najdete přehled návodů pro makra pro Writer, Calc, Impress, Draw, Math a Base.)

  • Alain Romedenne připravuje diagramy syntaxe a vylepšuje a rozšiřuje průvodce Pythonem i přehledovou stránku o makrech.

  • Mauricio Baeza vylepšuje a rozšiřuje stávající články s tutoriály pro makra ve Writeru a Calcu.

  • Steve Fanning pokračuje v psaní tutoriálů pro makra v Calcu.

Příspěvky do kódu maker

Nedílnou a patrně nejdůležitější částí práce týmu pro makra jsou příspěvky do kódu maker. Zájemce odkazujeme na blog TDF, kde najdou jejich výčet.

Jak se zapojit

Zájemci o přispění (ať jde o vývoj, testování či dokumentaci) mohou kontaktovat vedoucího týmu Ilmariho Lauhakangase na e-mailové adrese ilmari.lauhakangas@libreoffice_org.

Víno z blízka

Komentáře

user avatar Michal Vašut
Odpovědět
Macro Team LibreOffice
30. 04. 2021, 10:32:13
Za python chválím, Basic je mor a měli by se toho zbavit. (já vím, nemůžou :-()
user avatar neutr
Odpovědět
Re:Macro Team LibreOffice
30. 04. 2021, 12:17:51
Já celkem souhlasím. Problém s naším StarBasicem dostává různé rozměry. Přirozený "pure StarBasic" už to není, UNO je nezávislý jazyk - coby zprostředkovatel - je nutné ho alespoň trošku znát, nyní se do našeho Basicu cpe VBA - to už chápu pramálo - (Microsift od něho postupně upouští), nyní se objevuje ještě varianta ScriptForge library jako součást (podknihovna) "Makra a dialogová makra Libre office", která jsou na stejné úrovni s Bean Sheel, JavaScript a Python. Zatím tato knihovna ScriptForge library vypadá, že by byla schopná pojmout vše z původního StarBasicu i VBA. Tím by se vše sjednotilo.


Osobně bych preferoval konvergenci k JavaScriptu typu GoogleScript spíš nežli k Python.
user avatar kamlan
Odpovědět
Re:Macro Team LibreOffice
30. 04. 2021, 12:23:19
Proč je podle vás Basic mor? A proč je podle vás nasazení Pythonu v LibreOffice chvályhodné? Mohl byste se prosím rozepsat? Věru rád si na téma výhody/nevýhody Basicu/Pythonu v Libreoffice počtu; + byl bych docela zvědav, podle čeho všeho (podle jakých "kritérií") jste ke svému strohému "zhodnocení" dospěl :-).
user avatar Michal Vašut
Odpovědět
Re:Re:Macro Team LibreOffice
30. 04. 2021, 19:27:29
Kamlan: python je strašně jednoduchý (vhodný i pro začátečníky a výuku) a mocný jazyk s velkým množstvím knihoven a velkou a aktivní komunitou. Můžete toto říct o Basicu a jeho odnožích (VBA, Star)?
Navíc python se prokázal jako vhodný na rozšiřování dalšího software (jako jazyk na vyvoj pluginů jej používá např. Blender, ale i jiné 3D nastroje, Gimp,...)

Oprori tomu Basic vidím jako jazyk, který má své nejlepší léta za sebou a už jen to, že má tolik odnoží je celkem problém. Tak samo v dostupnosti zdrojů informací a komunity.
user avatar Michal Vašut
Odpovědět
Re:Re:Re:Macro Team LibreOffice
30. 04. 2021, 20:30:04
Navíc bych dodal, že do Pythonu nedávno začal investovat i Microsoft - čím dál lepší podpora v VSCode, navíc teď pod MS pracuje i autor Pythonu (s tím, že mu do vyvoje jazyka nebude MS kecat).
Samozřejmě jsou i další kvalitní vývojové prostředí (např. Pycharm).

Jako určitě i javascript je dobrá volba. Ale prostě k Basicu mám od jisté doby, co jsem v něm něco dělal celkem odpor.
user avatar kamlan
Odpovědět
Re:Re:Re:Re:Macro Team LibreOffice
1. 05. 2021, 14:25:41
Pokud se budeme bavit o vlastnostech jednotlivých jazyků (jak jste nastínil: Python je strašně jednoduchý, mocný jazyk, spoustu knihoven atd.), tak můžeme sáhodlouze diskutovat a porovnávat - ale troufám si tvrdit, že nám to bude k ničemu. Jsme totiž v určité specifické oblasti a tou je použití těch jazyků v LibreOffice. Takže dále to bude o tom, jaké vnímám výhody a nevýhody právě při nasazení v LibreOffice.


1) Editor + debugger, správce modulů/knihoven. Pro Basic v LibreOffice je to zabudované. To samé se správcem modulů/knihoven. Pro Python se musí nainstalovat rozšíření ASPO. To má v sobě správce knihoven a jak jsem nedávno zjistil i degugger, ale nikoliv editor skriptů. Ovšem tím deguggerem nelze krokovat rozšíření, což vnímám jako značné mínus :-(, přeci jen se člověk těžko vyhne zkoumání děl jiných autorů. Chybějící editor je nutné nahradit nějakým externím a ten "propojit" s LibreOffice, aby se dala krokovat i rozšíření. Povedlo se mi to u editoru Pyzo - ovšem s tím, že se do něj pro inspektor proměnných (alá XRay nebo Mri) musí přidat ještě nástroj Workspace - byť jde jen o nakopírování jednoho adresáře do jednoho adresáře editoru.
Propojení editoru s Libre také není samozřejmostí - Libre se musí spustit s parametry (např. pod Win: soffice.exe --blablabla). Pak editor spolupracuje s Libre a dají se krokovat i rozšíření.

Zkoušel jsem i Pycharm, ale v návodu na wiki byly printskrýny ze staré verze a novější verzi Pycharmu kde byl navíc řádek k cestě k nějakému env (jakémusi virtuálnímu prostředí) jsem prostě nerozchodil. Netvrdím že to env bude něco těžkého, ale již jen to, že instalačka Pycharmu měl asi 360MB a editor se spouštěl mnohem déle než Pyzo, tak jsem to dál nezkoumal.

Tohoto všeho "vomrdu" je Basic prost. Byť když se tím člověk prokouše (mě to trvalo slabší 2 odpoledne :-)), tak to již nejspíš nebude vnímáno jako takový "vomrd". Nicméně prostě na to co automaticky zvládá Basic editor, je pro Python v Libre potřeba udělat několik úkonů navíc. No a je pak rozdíl v tom jak se dostat k nějakým vlastnostem třeba dokumentu když je Libre spuštěno s parametry pro spolupráci s externím editorem, nebo když jsou .py skripty spouštěny přímo z Libre. V Basicu použijete třeba vlastnost ThisComponent, v Pythonu se právě dle toho jak to celé spouštíte k pythonovské obdobě ThisComponent musíte dostat poněkud odlišnými způsoby.


2) Co se týká dalších vlastností samotných jazyků - opakuji: při nasazení v LibreOffice! - tak on ten LibreBasic na tom dle mého názoru vůbec není špatně. Byť k němu budou asi mnohem tolerantnější lidé 40+, kteří ve svých mladších letech s nějakým Basicem prostě dělali. Mě je 40 a s keply jsem začal dělat cca před 30-ti lety v kroužku programování. Právě v nějakém Basicu. Pak tehdejší "klasika", Pascal a Asm na průmyslovce, trochu C na vejšce. Pak samouk HTML/CSS/JavaScript/PHP. V posledních letech v podstatě jen makra v LibreBasicu a v posledních týdnech první "pokusy" v Pythonu pod Libre :-).

Kdybych byl mladší a začal jsem na Javascriptu nebo Pythonu, asi bych na LibreBasic nadával též, neb by mi nějaká syntaxe přišla poněkud zamotaná, zbytečně složitá, nezáživná atd. Ale spatřuji v LibreBasicu jednu základní výhodu - a tou je (byť nevím jak se to přesně nazývá) - jednodruhovost syntaxe. V Basicu je prostě pro každou věc jen jeden druh syntaxe (byť někdy je uživatelsky poněkud nepříjemná) a celkově se v tom - když si na to člověk zvykne - nakonec dost snáze orientuje. Pro zpřehlednění basicovské syntaxe (přeformátování syntaxe do "učebnicového formátu") lze použít i openoffisácké rozšíření Basic IDE Tools - které Basic editor rozšíří třeba i o hromadné zakomentování/odkomentování řádků. Kdežto "přeformátovat si na míru" Python kód je v podstatě nemožné, neb jak je to děláno přes ta pevná odsazení, tak to prostě většinou nejde. Je to jistě hodně o zvyku, ale když v Basicu zapomenu napsat End, tak to zahlásí chybu, ale když se v Pythonu uklepnu o jeden tabulátor, tak to chybu nezahlásí ale vykoná to příkaz třeba v těle If namísto až po If. To může být pro někoho kdo "vyrůstal" na Basicu/Pascalu/C až hodně nepřívětivé.

Ale příklad na vícedruhovost syntaxe pro jedno a to samé který jsem zatím objevil. Tuhle syntaxi v Basicu prostě nenahradíte jinou syntaxí, která by dělala to samé.

dim a(0) as new com.sun.star.beans.PropertyValue
a(0).Name="vlastnost" : a(0).Value=hodnota

Kdežto v Pythonu můžete udělat jednak to samé:

from com.sun.star.beans import PropertyValue

a = PropertyValue()
a.Name = 'vlastnost'
a.Value = 'hodnota'

ale i to nahradit další syntaxí:

args = PropertyValue(vlastnost1, hodnota1, vlastnost2, hodnota2)


Na jednu stranu je to pro pisatele kódu dost zjednodušující, na druhou stranu to může být pro "zkoumatele" kódu i poněkud zamotávávající, kor když to bude zanořeno do ještě více funkcí. Opět to bude sice o zvyku a čím více toho člověk v Pythonu napíše, tím méně ho to třeba někdy poněkud zmate, nicméně pokud to Pythonář použije v nějaké rozsáhlejší objektové struktuře, přeci jen to opět o něco navýší problém při vyznávání se v kódu. Nevím nakolik je ta "vícedruhovost" syntaxe pro jedno a to samé v Pythonu rozšířena, avšak určitě to nebude jak v HTML/CSS/JS kde je jedno a to samé možné udělat mnohdy více způsoby (někdy některými autory až neuvěřitelně zesložitělými/přeprasenými).

Takže pro pisatele kódu v Pythonu zjednodušení, pro čitatele kódu který na to není zvyklý to může být poněkud nevýhodné.

A takový závěr co se týká té "jednodruhovosti" syntaxe Basicu. Na keplu platí, že všechno co má kepl udělat se mu musí přesně zadat. Ač LibreBasic má pro některé definice" poněkud zdlouhavou a nezáživnou syntaxi, celkově má těch "dílčích druhů syntaxe" dost málo a naučit se psát i vyznat se v samotném kódu Basicu je nakonec dost jednoduché - když to tedy někdo nepřežene s objekty v módu Option ClassModule -> čehož je za mě poněkud odstrašujícím případem právě nová knihovna ScriptForge, kde podrobnější vysvětlení pro začátečníky proč je něco tak objektově jak je a jak to vlastně správně používat, by bylo jistě přínosem (byť si jsem vědom toho, že nedostatečné znalosti OOP jsou třeba mým osobním deficitem).


3) Další věcí je nasazení jazyka právě na potřebné vlastnosti LibreOffice. V tom bývá LibreBasic jednodušší. Pro Python je potřeba se mnohem více dívat do SDK dokumentace a jak jsem zaznamenal u některých vývojářů - s konstatováním "Good luck!" (Hodně štěstí!) - mám chuť napsat i 'oprávněným konstatováním', neb SDK dokumentace je stále taková poněkud divočejší a dost strohá.

Pro LibreBasic je charakteristické že neumí naimportovat rozhraní (interface), takže je potřeba najít nějakou službu (service) která nějaké potřebné vlastnosti zahrnuje (což mnohdy docela jde díky těm IDL diagramům v SDK dokumentaci) -> a mnohdy pak pomocí createUnoService("com.sun.star...") vytvořit danou službu a už se "jen" proklikávat vlastnostmi v Xray nebo Mri.
Kdežto v příkladech pro Python jsem objevil právě import rozhraní, které je pak někam předáváno kde se použijí funkce z něj.


from com.sun.star.awt import XDialogEventHandler

class Console(unohelper.Base, XDialogEventHandler):
#a zde použít vlastnosti z XDialogEventHandler


No a to kam předat rozhraní aby se využili funkce z něj už dokáže být dost složitá záležitost, kde aby to člověk zvládl, tak je potřeba zpythonovávat ukázkové kódy z C++ :-). To už není moc lahůdka :-).


4) Nyní k rychlosti zpracování některých operací. Třeba operace s řetězci bývají v Basicu dost rychlé, i když v Pythonu jsou třeba ještě rychlejší. Co je však v Basicu tristní jsou operace s většími poli. Pro pole do 10tis. položek je to celkem jedno, ale třeba pro 20tis.+ položek už Basic v rychlosti řazení polí fakt kulhá. To Python to zvládne mnohem mnohem rychleji, i když přímo přes Calc je třeba zrovna tohle beztak nejrychlejší.


5) Jsou věci které v Basicu již nejdou, neboť Basic nemá přímé ovládání potřebných Uno komponent/listenerů atd. To Python to umožňuje. Ovšem již to není nic pro začátečníky a dokáže to motat hlavu i pokročilým uživatelům. Příkladů na to dost málo, můžete zkusit třeba rozšíření Cadlo nebo BookmarksMenu -> Cadlo třeba v Drawu udělá "interaktivní" textbox v liště, BookmarksMenu (podobně jako ASPO, jsou ostatně o jednoho autora) umožňuje vytvořit další nezávislé LibreOkno s menu, ikonkami, textovými podokýnky atd.
Další příklad může být třeba ComplexToolbar [https://github.com/marklh9/ExtendingLibreOffice/tree/fa04acbf465ef7e124fc9f2f411f01e71955800a/src/ComplexToolbar] -> do lišt s ikonami přidat combobox, dropdownbox atd. Tohle již v Basicu nejde. Jenže rozchodit to i s listenery pro stisk kláves - to se mi zatím nepovedlo, na to příklady v Pythonu chybí, anebo jsou součástí dost obsáhlého kódu jako třeba ve zmíněných doplňcích :-(.


6) Množství příkladů které se dají najít pro Basic a Python se nedá srovnat. V LibreBasicu je toho spoustu, strašně moc za ty roky na AOO fóru, ale ani Ask nebo Libre Native fórum na tom není špatně. Nehledě na různé blogy různých nadšenců které občas gůgl vypíše. Nebo se vyplatí přímo prohledat Github či Gitlab na položku "libreoffice".

Pro Python těch příkladů vůbec není tolik. Na druhou stranu když se člověk naučí Python i Basic, tak si může mnohé skripty z Basicu sám přepsat do Pythonu, ale přijde mi to spíše zbytečné. Ve většině případů to stejně nic neurychlí. Ale pokud ho to bude bavit, proč ne :-).


7) Pro někoho kdo zná Basic může být docela rychlé naučit se pouštět základní skripty Pythonu a začít využívat to, co třeba Python zvládá o dost rychleji. Poněkud chápu (byť chybí nějaká osobní konverzace o tom), že někdo kdo začal s Javascriptem či Pythonem může mít k Basicu odpor, ale udělat něco složitějšího v Pythonu může být vzhledem k nedostatku příkladů dost pracné (fakt spíše nepohoda při importaci rozhraní), a ve finále možná i dost pracnější a časově náročnější než zvyknout si na LibreBasic.

Rozhodně není možné počítat s tím, že makrovat "celé" LibreOffice se člověk naučí během několika týdnů či měsíců. Je to postupná práce a i po letech člověk naráží na to, že něco je mnohem složitější než se zdá a že to bude stát mnohem více času a zkoumání, klidně i v řádu let. Mnohdy s přesahem do C++.


8) LibreBasic když zůstane takový jaký je, tak bude stejný třeba i po 20-ti letech a zůstane tak stejně přehledný (tedy přehledný pro toho kdo si na něj zvykl). Akorát se třeba zpřístupní víc funkcí z API. Další vývoj Pythonu který uvádíte z hlediska nasazení v LibreOffice třeba nemusí (a asi ani nebude) vůbec nějak podstatný - pokud by nedošlo k nějaké změně pythonovské syntaxe.


9) Co je tedy pod Libre lepší, Python nebo Basic, nebo ještě něco jiného? Jak pro koho, jak kdy, a jak pro co - bych nejspíš odpověděl :-). Já prošel prostě takovou tehdejší "programátorskou klasikou" Basic/Pascal/Asm/trochuC a mám v tomhle směru prostě "ukotvený" "způsob myšlení". Nepřijde mi jako přínos pro mě to, abych to co umím v Basicu začal dělat v Pythonu. K čemu by mi to bylo dělat to samé v něčem jiném, když to nebude ani rychlejší ani příjemnější?

Co mě však přijde přínosné je začít využívat z Pythonu to, v čem Basic pokulhává či již znatelně kulhá či čeho již není schopen. Ovšem v tomto směru mi znatelně chybí nějaké srovnávačky - třeba kdysi se to dělalo tak&tak, ale Python nověji nabízí udělat to takhle&onakhle = a to je rychlejší, svižnější, snado to umožní propojit se s tím&tím atd. Prostě dá se majít spoustu příkladů na Python samotný (z čehož se člověk třeba naučí víc pythonovskou syntaxi nebo metody, ale třeba za dost nelibé množství času); dost málo příkladů na Python v LibreOffice; ale nenašel jsem zatím nic (krom svých pár zkušeností), kde by bylo popisováno (pro LibreOffice) -> v Pythonu je právě toto výhodnější neb ... , nebo: v pythonu se to dá udělat jinak a to takto&takto a tím dojde k výhodě ...


10) No a něco jiného? Nepovažuji pro LibreOffice za přínosný ani Javascript ani BeanShell a ani Javu. Ostatně jsou v něm již dlouho zakomponované a v případě Javy došlo ke značné dejavizaci (což je podle mě dobře); na Javascript jsem za roky viděl asi dva příklady; a na BeanShell jeden pro combobox do lišty, který sice v provozu fungoval, ale po zavření Calcu spadlo celé Libre :-); navíc z kódu BeanShell jsem začínal mít jistý nástup na bolehlav :-). Javascript ani BeanShell se v Libre prostě moc nechytly. A nemyslím si, že by bylo přínosné snažit se je nějak více prosazovat. Proč jako? Aby se v nich dělalo jen to samé co v Basicu/Pythonu ale s jinou syntaxí? Šmarjá, když vidím co s Javascriptem dokázali naddoprasit všelijací vývojáři na webovkách, tak ať v Libre raději snad ani není.


Závěr) Pythonu říkám ano, ale rozhodně LibreBasic neodsuzuji, ba právě naopak - i přes jeho jistou archaičnost v něm spatřuji lecjaké výhody. Pokud se Libre dočká nějakého přímo zakomponovaného editoru pro Python jako má pro Basic, vzroste jistě i více příkladů a použití Pythonu.

Baví-li vás dělat v Pythonu pro LibreOffice, držím palce a ať se daří. Doufám, že třeba někdy brzy uvidím i nějaká vaše LibrePythonovská díla :-).
user avatar Michal Vašut
Odpovědět
Re:Re:Re:Re:Re:Macro Team LibreOffice
4. 05. 2021, 21:52:30
Oj, tak jsem se na to zběžně koukl a musím bohužel uznat, že v tomto máte pravdu... Ta podpora Pythonu v LO je tristní / skoro nulová (oproti Basicu) ...

Zkoušel jsem to v tom PyCharmu, protože v něm dělám denně a nějaký jednoduchý skriptík se mi povedlo rozjet (poté co jsem nastavil jako interpret ten python co je dodávaný s LibreOffice a nastartoval to takovým dlouhým příkazem).
Co se týče debugu, i ten tam šel "normálně" - píšu v uvozovkách, protože ty věci z UNO bridge jsou akorát nějaké obálky nad javovskými věcmi a není vidět co v nich je, takže jde zkoumat akorát vlastní kód. No a pro vypsání jednoho řádku třeba do Writeru je třeba sepsat takovou zběsilost (viz screenshot - https://ibb.co/pJVLHN6) - na screenshotu si všimněte i debugovaných věcí, kde jedinná je k něčemu akorát moje proměnná ("my_text_value").

Takže co se týče Pythonu, ten je skvělý, nicméně po této zkušenosti bych řekl, že to je takové nechtěné dítě a otloukánek v LO, oproti tomu jak se chovají k Basicu, který má veškerou péči.
user avatar Michal Vašut
Odpovědět
Re:Re:Re:Re:Re:Re:Macro Team LibreOffice
4. 05. 2021, 22:29:52
No a celkem zběsilost je vystavovat takovéto věci...

# --------------------------------

dialogModel = smgr.createInstanceWithContext("com.sun.star.awt.UnoControlDialogModel", ctx)
...
buttonModel = dialogModel.createInstance("com.sun.star.awt.UnoControlButtonModel")
buttonModel.Name = "myButtonName"
...
dialogModel.insertByName( "myButtonName", buttonModel)

# --------------------------------

Jak kdyby nemohli udělat něco jako

# --------------------------------

# ty nesmysly by měly být schované tady v knihovně
# už jen proto, že by to značně zpřehlednilo kód
# a nemusel by se u každé komponenty vypisovat cesta k java balíčku, či co to je

from uno.forms import Dialog, Button

dialog = Dialog(ctx)
...
btn = Button()
btn.name = "myButtonName" # popř. už přímo jako parametr konstruktoru
...
dialog.add(btn)

# ---------------------------------

Prostě takové nesmysly co oni tam mají vůbec nejsou v duchu pythonu a je to něco narychlo ušité, aby se mohli pochválit, že podporujou python.
user avatar Michal Vašut
Odpovědět
Re:Re:Re:Re:Re:Re:Re:Macro Team LibreOffice
4. 05. 2021, 22:37:12
Zapomněl jsem přiložit zdroj: http://christopher5106.github.io/office/2015/12/06/openoffice-libreoffice-automate-your-office-tasks-with-python-macros.html

Přidat názor

 

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích najdete v nápovědě. Diskuzi můžete sledovat pomocí RSS kanálu.

 
Petr Valach

Petr Valach

Redaktor & editor OpenOffice.cz a LinuxEXPRES.cz. Správce sociálních sítí těchto redakcí. Člen nadace The Document Foundation.

 
IT Systems - předplatné
 
 
woo jaw demo hz