Zkušenosti s TypeScriptem

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Zkušenosti s TypeScriptem
« Odpověď #45 kdy: 28. 03. 2020, 21:53:19 »
Nestalo se mi, že by mě obtěžovalo napsání Typové signatury. Zato se mi bolestně běžně stává, že mi absence typů schází. Čímž se kruhem dostáváme k tomu, že někdy to fakt záleží na preferencích. Pro někoho napsání těch několika málo typů může být stopka.

Nechápeš to. Nejde jen o to, že musíš napsat anotaci, ale že tě statické typy hrubě omezují v návrhu programu. Je to neflexibilní, a jakákoliv snaha dostat do návrhu flexibilitu je těžkopádná  a zkostnatělá. 

Ukaž příklad, jinak se o tom nemá smysl bavit.


A nechápeš to proto, že prostě neumíš myslet v dynamicky typovaném jazyku, neumíš myslet dynamicky. Proto ti v něm chybí statické typy, bez nich neumíš dobře programovat a naopak neumíš využít výhod jazyku dynamického.

Ezoterika, jasný.


qelurg

  • ****
  • 372
    • Zobrazit profil
    • E-mail
Re:Zkušenosti s TypeScriptem
« Odpověď #46 kdy: 28. 03. 2020, 22:17:18 »
Jo, to je ta samá esoterika, jako když někdo neumí myslet ve scheme/haskellu, prologu nebo smalltalku, abychom vytáhli nějaké ikonické jazyky, zastupující různá paradigmata, tedy způsoby myšlení.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Zkušenosti s TypeScriptem
« Odpověď #47 kdy: 28. 03. 2020, 22:38:19 »
Jo, to je ta samá esoterika, jako když někdo neumí myslet ve scheme/haskellu, prologu nebo smalltalku, abychom vytáhli nějaké ikonické jazyky, zastupující různá paradigmata, tedy způsoby myšlení.

Ezoterika to není proto, že tak člověk musí umět myslet. Ezoterikou to nazývám proto, protože to neumíš vysvětlit.

Smalltalk je třeba typickej příklad jazyka, který jsem pochopil, ale který mi nesedl. Pas de problem.

Strkat Scheme do stejné kategorie jako Haskell, no...

Ani u jednoho ze zmíněných jazyků bych neměl nějaký kardinální problém vysvětlit, vo co de (netvrdím, že by mi to nějak zvlášť šlo, ale základní principy bych snad dal). Dokážeš to samé jako obhájce a evidentně zkušený a zapálený vývojář v dynamických jazycích? A budu tolerantní - pokud nebudeš šermovat vatou "to bys' nepochopil". (Ve skutečnosti by mě to opravdu zajímalo.)

qelurg

  • ****
  • 372
    • Zobrazit profil
    • E-mail
Re:Zkušenosti s TypeScriptem
« Odpověď #48 kdy: 28. 03. 2020, 22:43:53 »
Nestalo se mi, že by mě obtěžovalo napsání Typové signatury. Zato se mi bolestně běžně stává, že mi absence typů schází. Čímž se kruhem dostáváme k tomu, že někdy to fakt záleží na preferencích. Pro někoho napsání těch několika málo typů může být stopka.
Nechápeš to. Nejde jen o to, že musíš napsat anotaci, ale že tě statické typy hrubě omezují v návrhu programu. Je to neflexibilní, a jakákoliv snaha dostat do návrhu flexibilitu je těžkopádná  a zkostnatělá. 
Ukaž příklad, jinak se o tom nemá smysl bavit.

Základní princip je, že s proměnnými pracuji abstraktně. V následujícím příkladu pracuji se třemi prvky, řádkem, elementem řádku a indexem. Proto používám tři tomu odpovídající proměnné.

Kód: [Vybrat]
>>> row = '1, 2, 3, 4, 5'
>>> row = row.split(',')
>>> row = [int(elm) for elm in row]
>>> for idx, elm in enumerate(row):
...     row[idx] = idx * elm
...
>>> print(sum(row))
40

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Zkušenosti s TypeScriptem
« Odpověď #49 kdy: 28. 03. 2020, 22:48:42 »
Nestalo se mi, že by mě obtěžovalo napsání Typové signatury. Zato se mi bolestně běžně stává, že mi absence typů schází. Čímž se kruhem dostáváme k tomu, že někdy to fakt záleží na preferencích. Pro někoho napsání těch několika málo typů může být stopka.
Nechápeš to. Nejde jen o to, že musíš napsat anotaci, ale že tě statické typy hrubě omezují v návrhu programu. Je to neflexibilní, a jakákoliv snaha dostat do návrhu flexibilitu je těžkopádná  a zkostnatělá. 
Ukaž příklad, jinak se o tom nemá smysl bavit.

Základní princip je, že s proměnnými pracuji abstraktně. V následujícím příkladu pracuji se třemi prvky, řádkem, elementem řádku a indexem. Proto používám tři tomu odpovídající proměnné.

Kód: [Vybrat]
>>> row = '1, 2, 3, 4, 5'
>>> row = row.split(',')
>>> row = [int(elm) for elm in row]
>>> for idx, elm in enumerate(row):
...     row[idx] = idx * elm
...
>>> print(sum(row))
40
“Hezkej” hovnokód  ::)


qelurg

  • ****
  • 372
    • Zobrazit profil
    • E-mail
Re:Zkušenosti s TypeScriptem
« Odpověď #50 kdy: 28. 03. 2020, 22:49:32 »
Jo, to je ta samá esoterika, jako když někdo neumí myslet ve scheme/haskellu, prologu nebo smalltalku, abychom vytáhli nějaké ikonické jazyky, zastupující různá paradigmata, tedy způsoby myšlení.

Ezoterika to není proto, že tak člověk musí umět myslet. Ezoterikou to nazývám proto, protože to neumíš vysvětlit.

Já to vysvětlit umím, je to záležitost způsobu myšlení. To je vysvětlení. Problém je, že to nedovedeš pochopit, protože je ti je buď cizí myšlenka, že jsou různé způsoby myšlení nebo ti nedochází důsledky. A je to platné obecně. Obecně platí, že způsob myšlení, na který jsi zvyklý a který je pro tebe proto komfortní determinuje tvé možnosti, omezuje tě.

qelurg

  • ****
  • 372
    • Zobrazit profil
    • E-mail
Re:Zkušenosti s TypeScriptem
« Odpověď #51 kdy: 28. 03. 2020, 22:52:22 »
Základní princip je, že s proměnnými pracuji abstraktně. V následujícím příkladu pracuji se třemi prvky, řádkem, elementem řádku a indexem. Proto používám tři tomu odpovídající proměnné.

Kód: [Vybrat]
>>> row = '1, 2, 3, 4, 5'
>>> row = row.split(',')
>>> row = [int(elm) for elm in row]
>>> for idx, elm in enumerate(row):
...     row[idx] = idx * elm
...
>>> print(sum(row))
40
“Hezkej” hovnokód  ::)

Zkus to tvrzení obhájit.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Zkušenosti s TypeScriptem
« Odpověď #52 kdy: 28. 03. 2020, 22:58:49 »
Jo, to je ta samá esoterika, jako když někdo neumí myslet ve scheme/haskellu, prologu nebo smalltalku, abychom vytáhli nějaké ikonické jazyky, zastupující různá paradigmata, tedy způsoby myšlení.

Ezoterika to není proto, že tak člověk musí umět myslet. Ezoterikou to nazývám proto, protože to neumíš vysvětlit.

Já to vysvětlit umím, je to záležitost způsobu myšlení. To je vysvětlení. Problém je, že to nedovedeš pochopit, protože je ti je buď cizí myšlenka, že jsou různé způsoby myšlení nebo ti nedochází důsledky. A je to platné obecně. Obecně platí, že způsob myšlení, na který jsi zvyklý a který je pro tebe proto komfortní determinuje tvé možnosti, omezuje tě.

Jak říkám, ezoterika. Úplně klasická. Nic o co by se dalo opřít. Jen spousta třpytek a nabubřelých frází.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Zkušenosti s TypeScriptem
« Odpověď #53 kdy: 28. 03. 2020, 23:10:45 »
Nestalo se mi, že by mě obtěžovalo napsání Typové signatury. Zato se mi bolestně běžně stává, že mi absence typů schází. Čímž se kruhem dostáváme k tomu, že někdy to fakt záleží na preferencích. Pro někoho napsání těch několika málo typů může být stopka.
Nechápeš to. Nejde jen o to, že musíš napsat anotaci, ale že tě statické typy hrubě omezují v návrhu programu. Je to neflexibilní, a jakákoliv snaha dostat do návrhu flexibilitu je těžkopádná  a zkostnatělá. 
Ukaž příklad, jinak se o tom nemá smysl bavit.

Základní princip je, že s proměnnými pracuji abstraktně. V následujícím příkladu pracuji se třemi prvky, řádkem, elementem řádku a indexem. Proto používám tři tomu odpovídající proměnné.

Kód: [Vybrat]
>>> row = '1, 2, 3, 4, 5'
>>> row = row.split(',')
>>> row = [int(elm) for elm in row]
>>> for idx, elm in enumerate(row):
...     row[idx] = idx * elm
...
>>> print(sum(row))
40

Výborně. Konečně jsem dostal z dynamicky uvažujícího programátora konkrétní materiál.

Pokud to chápu dobře, tak tebe zásadně omezuje skutečnost, že za účelem čitelnosti kódu (tak chápu tu motivaci) potřebuješ možnost měnit typ té proměnné row. Správně? Je tam ještě něco, nebo to je všechno?

Jak zásadně omezující, nebo naopak tvé řešení výhodnější je toto:
Kód: [Vybrat]
row = '1, 2, 3, 4, 5'
   .split(',')
   .map(\i, x -> i * int(x))
print(sum(row))

qelurg

  • ****
  • 372
    • Zobrazit profil
    • E-mail
Re:Zkušenosti s TypeScriptem
« Odpověď #54 kdy: 28. 03. 2020, 23:12:42 »
Jo, to je ta samá esoterika, jako když někdo neumí myslet ve scheme/haskellu, prologu nebo smalltalku, abychom vytáhli nějaké ikonické jazyky, zastupující různá paradigmata, tedy způsoby myšlení.
Ezoterika to není proto, že tak člověk musí umět myslet. Ezoterikou to nazývám proto, protože to neumíš vysvětlit.

Já to vysvětlit umím, je to záležitost způsobu myšlení. To je vysvětlení. Problém je, že to nedovedeš pochopit, protože je ti je buď cizí myšlenka, že jsou různé způsoby myšlení nebo ti nedochází důsledky. A je to platné obecně. Obecně platí, že způsob myšlení, na který jsi zvyklý a který je pro tebe proto komfortní determinuje tvé možnosti, omezuje tě.

Jak říkám, ezoterika. Úplně klasická. Nic o co by se dalo opřít. Jen spousta třpytek a nabubřelých frází.

Jsi jak malé děcko, když něco nechápeš, vyleješ si to na tom, koho nechápeš. Nepřekvapuje mě, že člověk neschopný myslet v dynamický jazycích, je omezený i v jiných směrech. Máš se o co opřít, jen to nevidíš. Zkus tohle https://wikisofia.cz/wiki/Pojet%C3%AD_my%C5%A1len%C3%AD_v_psychologii._Teorie_my%C5%A1len%C3%AD. Ale nedávám ti příliš velkou šanci. Dovolím si ocitovat jednu podstatnou informaci "Vyšší úrovně myšlení jsou úzce spjaty s jazykem." Zkus přemýšlet o důsledcích pro jazyky programovací.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Zkušenosti s TypeScriptem
« Odpověď #55 kdy: 28. 03. 2020, 23:22:18 »
Jo, to je ta samá esoterika, jako když někdo neumí myslet ve scheme/haskellu, prologu nebo smalltalku, abychom vytáhli nějaké ikonické jazyky, zastupující různá paradigmata, tedy způsoby myšlení.
Ezoterika to není proto, že tak člověk musí umět myslet. Ezoterikou to nazývám proto, protože to neumíš vysvětlit.

Já to vysvětlit umím, je to záležitost způsobu myšlení. To je vysvětlení. Problém je, že to nedovedeš pochopit, protože je ti je buď cizí myšlenka, že jsou různé způsoby myšlení nebo ti nedochází důsledky. A je to platné obecně. Obecně platí, že způsob myšlení, na který jsi zvyklý a který je pro tebe proto komfortní determinuje tvé možnosti, omezuje tě.

Jak říkám, ezoterika. Úplně klasická. Nic o co by se dalo opřít. Jen spousta třpytek a nabubřelých frází.

Jsi jak malé děcko, když něco nechápeš, vyleješ si to na tom, koho nechápeš. Nepřekvapuje mě, že člověk neschopný myslet v dynamický jazycích, je omezený i v jiných směrech. Máš se o co opřít, jen to nevidíš. Zkus tohle https://wikisofia.cz/wiki/Pojet%C3%AD_my%C5%A1len%C3%AD_v_psychologii._Teorie_my%C5%A1len%C3%AD. Ale nedávám ti příliš velkou šanci. Dovolím si ocitovat jednu podstatnou informaci "Vyšší úrovně myšlení jsou úzce spjaty s jazykem." Zkus přemýšlet o důsledcích pro jazyky programovací.

Beru na vědomí.

qelurg

  • ****
  • 372
    • Zobrazit profil
    • E-mail
Re:Zkušenosti s TypeScriptem
« Odpověď #56 kdy: 28. 03. 2020, 23:38:58 »
Nestalo se mi, že by mě obtěžovalo napsání Typové signatury. Zato se mi bolestně běžně stává, že mi absence typů schází. Čímž se kruhem dostáváme k tomu, že někdy to fakt záleží na preferencích. Pro někoho napsání těch několika málo typů může být stopka.
Nechápeš to. Nejde jen o to, že musíš napsat anotaci, ale že tě statické typy hrubě omezují v návrhu programu. Je to neflexibilní, a jakákoliv snaha dostat do návrhu flexibilitu je těžkopádná  a zkostnatělá. 
Ukaž příklad, jinak se o tom nemá smysl bavit.

Základní princip je, že s proměnnými pracuji abstraktně. V následujícím příkladu pracuji se třemi prvky, řádkem, elementem řádku a indexem. Proto používám tři tomu odpovídající proměnné.

Kód: [Vybrat]
>>> row = '1, 2, 3, 4, 5'
>>> row = row.split(',')
>>> row = [int(elm) for elm in row]
>>> for idx, elm in enumerate(row):
...     row[idx] = idx * elm
...
>>> print(sum(row))
40

Výborně. Konečně jsem dostal z dynamicky uvažujícího programátora konkrétní materiál.

Pokud to chápu dobře, tak tebe zásadně omezuje skutečnost, že za účelem čitelnosti kódu (tak chápu tu motivaci) potřebuješ možnost měnit typ té proměnné row. Správně? Je tam ještě něco, nebo to je všechno?

Jak zásadně omezující, nebo naopak tvé řešení výhodnější je toto:
Kód: [Vybrat]
row = '1, 2, 3, 4, 5'
   .split(',')
   .map(\i, x -> i * int(x))
print(sum(row))

Nechápeš to dobře. Já typ proměnné neměním, to je tvůj způsob statického uvažování. Další chyba je, že to nechápeš jako demonstrativní ukázku, která ukazuje princip, nikoliv konkrétní úkol. Zkus si to představit  jako program, který má 10 000 řádků, větvení a vícenásobné použití dat. Pořád to budeš chtít napsat jako jeden oneliner? Jestli jo, myslíš, že to bude přehlednější? A jak to budeš třeba logovat nebo krokovat a debugovat? V reálném programu také nebudeš mít data staticky deklarovaná ve zdrojovém kódu, ale obdržíš ho z nějakého vstupu, to je u mě ten první řádek, u tebe tento krok chybí, a kdybys ho aplikoval, už tam nepřiřadíš zpracovaná data. No ale nejhůř si vysvětluješ tu motivaci. Motivací je vyšší abstrakce, tedy způsob myšlení bližší normálnímu lidskému uvažování. Řádek je prostě řádek, je jedno jaký má datový formát a je lidsky naprosto nesmyslné pro to mít tři různé proměnné. Je zbytečné se o to starat, stejně jako se uživatelé vyšších programovacích jazyků už dávno nestarají o instrukční sady procesorů. Můžu ti tisíckrát říct, že jde o způsob myšlení, stejně to nepochopíš.

Ink

  • *****
  • 654
    • Zobrazit profil
    • E-mail
Re:Zkušenosti s TypeScriptem
« Odpověď #57 kdy: 28. 03. 2020, 23:49:09 »
Základní princip je, že s proměnnými pracuji abstraktně. V následujícím příkladu pracuji se třemi prvky, řádkem, elementem řádku a indexem. Proto používám tři tomu odpovídající proměnné.

Kód: [Vybrat]
>>> row = '1, 2, 3, 4, 5'
>>> row = row.split(',')
>>> row = [int(elm) for elm in row]
>>> for idx, elm in enumerate(row):
...     row[idx] = idx * elm
...
>>> print(sum(row))
40

No a ted si predstav, ze ve staticky typovanem Rustu muzes psat neco jako:

Kód: [Vybrat]
fn main() {
    let v = "Ahoj Douglasi";
    println!("{:?}", v);
    let v = 42;
    println!("{:?}", v);
}

A vis, proc tomu tak je? Protoze "v" je jenom jmeno, ktere odkazuje na konkretni hodnotu. A kompilator rozumi kontextu - tedy tomu, ze kdyz dam kdykoli v prubehu dalsi "let v", ze jsem se rozhodl, ze uz to puvodni "v" pouzivat nebudu a tak ho "zastinim" uplne jinym "v". To neni nic "dynamickeho", jde o to, ze inteligentni kompilator tuhle situaci umi resit a netrva na tom, ze "v" je jednou provzdy &str.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Zkušenosti s TypeScriptem
« Odpověď #58 kdy: 28. 03. 2020, 23:50:21 »
Nestalo se mi, že by mě obtěžovalo napsání Typové signatury. Zato se mi bolestně běžně stává, že mi absence typů schází. Čímž se kruhem dostáváme k tomu, že někdy to fakt záleží na preferencích. Pro někoho napsání těch několika málo typů může být stopka.
Nechápeš to. Nejde jen o to, že musíš napsat anotaci, ale že tě statické typy hrubě omezují v návrhu programu. Je to neflexibilní, a jakákoliv snaha dostat do návrhu flexibilitu je těžkopádná  a zkostnatělá. 
Ukaž příklad, jinak se o tom nemá smysl bavit.

Základní princip je, že s proměnnými pracuji abstraktně. V následujícím příkladu pracuji se třemi prvky, řádkem, elementem řádku a indexem. Proto používám tři tomu odpovídající proměnné.

Kód: [Vybrat]
>>> row = '1, 2, 3, 4, 5'
>>> row = row.split(',')
>>> row = [int(elm) for elm in row]
>>> for idx, elm in enumerate(row):
...     row[idx] = idx * elm
...
>>> print(sum(row))
40

Výborně. Konečně jsem dostal z dynamicky uvažujícího programátora konkrétní materiál.

Pokud to chápu dobře, tak tebe zásadně omezuje skutečnost, že za účelem čitelnosti kódu (tak chápu tu motivaci) potřebuješ možnost měnit typ té proměnné row. Správně? Je tam ještě něco, nebo to je všechno?

Jak zásadně omezující, nebo naopak tvé řešení výhodnější je toto:
Kód: [Vybrat]
row = '1, 2, 3, 4, 5'
   .split(',')
   .map(\i, x -> i * int(x))
print(sum(row))

Nechápeš to dobře. Já typ proměnné neměním, to je tvůj způsob statického uvažování. Další chyba je, že to nechápeš jako demonstrativní ukázku, která ukazuje princip, nikoliv konkrétní úkol. Zkus si to představit  jako program, který má 10 000 řádků, větvení a vícenásobné použití dat. Pořád to budeš chtít napsat jako jeden oneliner? Jestli jo, myslíš, že to bude přehlednější? A jak to budeš třeba logovat nebo krokovat a debugovat? V reálném programu také nebudeš mít data staticky deklarovaná ve zdrojovém kódu, ale obdržíš ho z nějakého vstupu, to je u mě ten první řádek, u tebe tento krok chybí, a kdybys ho aplikoval, už tam nepřiřadíš zpracovaná data. No ale nejhůř si vysvětluješ tu motivaci. Motivací je vyšší abstrakce, tedy způsob myšlení bližší normálnímu lidskému uvažování. Řádek je prostě řádek, je jedno jaký má datový formát a je lidsky naprosto nesmyslné pro to mít tři různé proměnné. Je zbytečné se o to starat, stejně jako se uživatelé vyšších programovacích jazyků už dávno nestarají o instrukční sady procesorů.
Nic z toho není problém v některém z mejch oblíbenejch staticky typovanech jazyků.

Přestaň se vztekat, a máš-li na to ponožky, tak uveď jinej, lepší příklad.


Můžu ti tisíckrát říct, že jde o způsob myšlení, stejně to nepochopíš.

Ano. Tím, že budeš tisíckrát psát, že ty to umíš, ale mě to prostě neřekneš, tak tímto způsobem to skutečně nemám šanci pochopit.

qelurg

  • ****
  • 372
    • Zobrazit profil
    • E-mail
Re:Zkušenosti s TypeScriptem
« Odpověď #59 kdy: 28. 03. 2020, 23:51:37 »
Nestalo se mi, že by mě obtěžovalo napsání Typové signatury. Zato se mi bolestně běžně stává, že mi absence typů schází. Čímž se kruhem dostáváme k tomu, že někdy to fakt záleží na preferencích. Pro někoho napsání těch několika málo typů může být stopka.
Nechápeš to. Nejde jen o to, že musíš napsat anotaci, ale že tě statické typy hrubě omezují v návrhu programu. Je to neflexibilní, a jakákoliv snaha dostat do návrhu flexibilitu je těžkopádná  a zkostnatělá. 
Ukaž příklad, jinak se o tom nemá smysl bavit.

Základní princip je, že s proměnnými pracuji abstraktně. V následujícím příkladu pracuji se třemi prvky, řádkem, elementem řádku a indexem. Proto používám tři tomu odpovídající proměnné.

Kód: [Vybrat]
>>> row = '1, 2, 3, 4, 5'
>>> row = row.split(',')
>>> row = [int(elm) for elm in row]
>>> for idx, elm in enumerate(row):
...     row[idx] = idx * elm
...
>>> print(sum(row))
40

Výborně. Konečně jsem dostal z dynamicky uvažujícího programátora konkrétní materiál.

Pokud to chápu dobře, tak tebe zásadně omezuje skutečnost, že za účelem čitelnosti kódu (tak chápu tu motivaci) potřebuješ možnost měnit typ té proměnné row. Správně? Je tam ještě něco, nebo to je všechno?

Jak zásadně omezující, nebo naopak tvé řešení výhodnější je toto:
Kód: [Vybrat]
row = '1, 2, 3, 4, 5'
   .split(',')
   .map(\i, x -> i * int(x))
print(sum(row))

Nechápeš to dobře. Já typ proměnné neměním, to je tvůj způsob statického uvažování. Další chyba je, že to nechápeš jako demonstrativní ukázku, která ukazuje princip, nikoliv konkrétní úkol. Zkus si to představit  jako program, který má 10 000 řádků, větvení a vícenásobné použití dat. Pořád to budeš chtít napsat jako jeden oneliner? Jestli jo, myslíš, že to bude přehlednější? A jak to budeš třeba logovat nebo krokovat a debugovat? V reálném programu také nebudeš mít data staticky deklarovaná ve zdrojovém kódu, ale obdržíš ho z nějakého vstupu, to je u mě ten první řádek, u tebe tento krok chybí, a kdybys ho aplikoval, už tam nepřiřadíš zpracovaná data. No ale nejhůř si vysvětluješ tu motivaci. Motivací je vyšší abstrakce, tedy způsob myšlení bližší normálnímu lidskému uvažování. Výslovně jsem to uvedl jako základní princip, ale bohužel jsi to nepochopil. Tak znovu. Řádek je prostě řádek, je jedno jaký má datový formát a je lidsky naprosto nesmyslné pro to mít tři různé proměnné. Je zbytečný se o to starat, stejně jako se uživatelé vyšších programovacích jazyků už dávno běžně nestarají o instrukční sady procesorů. Můžu ti tisíckrát říct, že jde o způsob myšlení, stejně to nepochopíš.