Do prodeje jde tichá bezdrátová herní myš Logitech PRO X2 SUPERSTRIKE s analogovými spínači s haptickou odezvou (HITS, Haptic Inductive Trigger System). Cena je 4 459 Kč.
Microsoft na GitHubu zveřejnil zdrojový kód projektu LiteBox, jedná se o 'knihovní operační systém' (library OS) zaměřený na bezpečnost, využívající systémovou architekturu LVBS k ochraně jádra před útoky z uživatelského prostoru. LiteBox je napsán v Rustu a uvolněný pod licencí MIT. Projekt je teprve v rané fázi vývoje.
BreezyBox je open-source shell a virtuální terminál pro populární jednočip ESP32. Nabízí základní unixové příkazy, sledování aktuálního pracovního adresáře (CWD), jednoduchý instalátor a spouštěč aplikací v podobě ELF binárních souborů, zabudovaný HTTP server nebo třeba ovládání WiFi - ukázka použití coby 'malého osobního počítače'. Ačkoliv je BreezyBox inspirovaný BusyBoxem, oproti němu má tento projekt několik externích závislostí, zejména na ESP-IDF SDK. BreezyBox je dostupný pod licencí MIT.
Byl představen cross-assembler xa.sh, napsaný čistě v Bourne shell skriptu. Tento nástroj umožňuje zpracovávat assemblerový kód pro Intel 8080, přičemž je možné snadno přidat podporu i pro další architektury, například 6502 a 6809. Skript využívá pouze různé běžné unixové příkazy jako jsou awk, sed nebo printf. Skript si lze stáhnout z GitHubového repozitáře projektu.
Byla představena nová verze modelu Claude Opus 4.6 od společnosti Anthropic. Jako demonstraci možností Anthropic využil 16 agentů Claude Opus 4.6 k vytvoření kompilátoru jazyka C, napsaného v programovacím jazyce Rust. Claude pracoval téměř autonomně, projekt trval zhruba dva týdny a náklady činily přibližně 20 000 dolarů. Výsledkem je fungující kompilátor o 100 000 řádcích kódu, jehož zdrojový kód je volně dostupný na GitHubu pod licencí Creative Commons.
Kultovní britský seriál The IT Crowd (Ajťáci) oslavil dvacáté výročí svého prvního vysílání. Sitcom o dvou sociálně nemotorných pracovnících a jejich nadřízené zaujal diváky svým humorem a ikonickými hláškami. Seriál, který debutoval v roce 2006, si i po dvou dekádách udržuje silnou fanouškovskou základnu a pravidelně se objevuje v seznamech nejlepších komedií své doby. Nedávné zatčení autora seriálu Grahama Linehana za hatecrime však vyvolává otázku, jestli by tento sitcom v současné Velké Británii vůbec vznikl.
Společnost JetBrains oznámila, že počínaje verzí 2026.1 budou IDE založená na IntelliJ ve výchozím nastavení používat Wayland.
Společnost SpaceX amerického miliardáře Elona Muska podala žádost o vypuštění jednoho milionu satelitů na oběžnou dráhu kolem Země, odkud by pomohly zajistit provoz umělé inteligence (AI) a zároveň šetřily pozemské zdroje. Zatím se ale neví, kdy by se tak mělo stát. V žádosti Federální komisi pro spoje (FCC) se píše, že orbitální datová centra jsou nejúspornějším a energeticky nejúčinnějším způsobem, jak uspokojit rostoucí poptávku po
… více »Byla vydána nová verze 2.53.0 distribuovaného systému správy verzí Git. Přispělo 70 vývojářů, z toho 21 nových. Přehled novinek v poznámkách k vydání.
Spolek OpenAlt zve příznivce otevřených řešení a přístupu na 216. sraz, který proběhne v pátek 20. února od 18:00 v Red Hat Labu (místnost Q304) na Fakultě informačních technologií VUT v Brně na ulici Božetěchova 1/2. Tématem srazu bude komunitní komunikační síť MeshCore. Jindřich Skácel představí, co je to MeshCore, předvede nejrůznější klientské zařízení a ukáže, jak v praxi vypadá nasazení vlastního repeateru.
Zcela mimoděk jsem spáchal takový malý benchmark programovacích jazyků a jejich překladačů.
Tak jak to dělají v Nasa jsem potřeboval ověřit, že jistý kód je správně. Řekněme, že ten kód je jednoduchá funkce s(a,b,c,d), která sérií přiřazení čísla a, b, c, d uspořádá. Kód vypadá asi takto (Python):
def s(a, b, c, d):
if a > b:
temp = b
b = a
a = temp
if b > c:
temp = c
c = b
b = temp
if c > d:
temp = d
d = c
c = temp
if b > c:
temp = c
c = b
b = temp
if a > b:
temp = b
b = a
a = temp
if b > c:
temp = c
c = b
b = temp
return (a <= b) and (b <= c) and (c <= d)
No a jednoduché ověření spočívá v zavolání této funkce se všemi možnými hodnotami parametrů, řekněme v rozsahu od jedné do sto (nebuďme troškaři).
limit = 100
f = 0
for i1 in range(limit):
for i2 in range(limit):
for i3 in range(limit):
for i4 in range(limit):
if not s(i1, i2, i3, i4):
f += 1
No a pokud je na konci f rovno nule, funkce ani jednou neselhala.
Ale děti, tohle doma nezkoušejte, pokud to pustíte v Pythonu, bude to trvat dlouhé minuty. Já jsem si uvedený program kompiloval do nativního kódu pomoci Pypy, o kterém jsem tu už několikrát psal. Což mě ostatně přivedlo na myšlenku vyzkoušet tento kód i v jiných jazycích. Tak jsem zkusil originální javovský zdrojáka z Nasa a ejhle... bylo to pomalejší! Poté jsem zkusil přeložit to pomocí gcj, ale moc jsem to neurychlil. Tak jsem naštval a jal jsem se to přepisovat do čistého C a teprve tam to bylo o něco rychlejší. Nebudu zdržovat, zde jsou přesné výsledky (vizte též graf):
Verze čas [s] --------------------- C-gcc 2.69 py-gcc 3.10 java-gcj 5.61 java-sun5 5.85 py-python2.4 534.00
Pro zajímavost uvádím ještě interpretovaný běh na normálním Pythonu. Zkrátka závěr je ten, že Python kompilovaný do nativního kódu (pře zprzněné C a gcc) je skoro stejně rychlý jako normální céčkový program. (A kompilace Javy přec gcj není žádná výhra.)
Co se týče metodiky, tak jsem měřil přes normální příkaz time, takže Java je znevýhodněna startem VM. Každý pokus jsem prováděl několikrát za sebou a vybral jsem nejlepší hodnotu. Jinak časy jsou asi trojnásobné oproti uváděnému programu, protože ve skutečnosti jsem měl řadící funkce 3 (uvádím jen tu správnou
, které jsem testoval najednou.
Takový malý nereprezentativní benchmark 
Tiskni
Sdílej:
Chtěl bych z něj udělat binární balíčky pro openSUSE, ale nebude to asi úplně triviální.
Tak to dopadá, když kompilátor sám na sobě provádí globální statickou analýzu.
paskma@ares:~$ free -g
total used free shared buffers cached
Mem: 31 7 23 0 0 6
-/+ buffers/cache: 0 31
Swap: 29 0 29
cat /proc/cpuinfo a df -h
paskma@ares:~$ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 15 model : 6 model name : Intel(R) Xeon(TM) CPU 3.40GHz stepping : 8 cpu MHz : 3391.898 cache size : 16384 KB physical id : 0 siblings : 4 core id : 0 cpu cores : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 6 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm bogomips : 6789.41 processor : 1 vendor_id : GenuineIntel cpu family : 15 model : 6 model name : Intel(R) Xeon(TM) CPU 3.40GHz stepping : 8 cpu MHz : 3391.898 cache size : 16384 KB physical id : 1 siblings : 4 core id : 0 cpu cores : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 6 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm bogomips : 6783.19 processor : 2 vendor_id : GenuineIntel cpu family : 15 model : 6 model name : Intel(R) Xeon(TM) CPU 3.40GHz stepping : 8 cpu MHz : 3391.898 cache size : 16384 KB physical id : 2 siblings : 4 core id : 0 cpu cores : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 6 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm bogomips : 6783.26 processor : 3 vendor_id : GenuineIntel cpu family : 15 model : 6 model name : Intel(R) Xeon(TM) CPU 3.40GHz stepping : 8 cpu MHz : 3391.898 cache size : 16384 KB physical id : 3 siblings : 4 core id : 0 cpu cores : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 6 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm bogomips : 6783.24 processor : 4 vendor_id : GenuineIntel cpu family : 15 model : 6 model name : Intel(R) Xeon(TM) CPU 3.40GHz stepping : 8 cpu MHz : 3391.898 cache size : 16384 KB physical id : 0 siblings : 4 core id : 1 cpu cores : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 6 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm bogomips : 6783.17 processor : 5 vendor_id : GenuineIntel cpu family : 15 model : 6 model name : Intel(R) Xeon(TM) CPU 3.40GHz stepping : 8 cpu MHz : 3391.898 cache size : 16384 KB physical id : 1 siblings : 4 core id : 1 cpu cores : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 6 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm bogomips : 6783.25 processor : 6 vendor_id : GenuineIntel cpu family : 15 model : 6 model name : Intel(R) Xeon(TM) CPU 3.40GHz stepping : 8 cpu MHz : 3391.898 cache size : 16384 KB physical id : 2 siblings : 4 core id : 1 cpu cores : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 6 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm bogomips : 6783.20 processor : 7 vendor_id : GenuineIntel cpu family : 15 model : 6 model name : Intel(R) Xeon(TM) CPU 3.40GHz stepping : 8 cpu MHz : 3391.898 cache size : 16384 KB physical id : 3 siblings : 4 core id : 1 cpu cores : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 6 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm bogomips : 6783.39 processor : 8 vendor_id : GenuineIntel cpu family : 15 model : 6 model name : Intel(R) Xeon(TM) CPU 3.40GHz stepping : 8 cpu MHz : 3391.898 cache size : 16384 KB physical id : 0 siblings : 4 core id : 0 cpu cores : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 6 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm bogomips : 6783.09 processor : 9 vendor_id : GenuineIntel cpu family : 15 model : 6 model name : Intel(R) Xeon(TM) CPU 3.40GHz stepping : 8 cpu MHz : 3391.898 cache size : 16384 KB physical id : 1 siblings : 4 core id : 0 cpu cores : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 6 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm bogomips : 6783.36 processor : 10 vendor_id : GenuineIntel cpu family : 15 model : 6 model name : Intel(R) Xeon(TM) CPU 3.40GHz stepping : 8 cpu MHz : 3391.898 cache size : 16384 KB physical id : 2 siblings : 4 core id : 0 cpu cores : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 6 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm bogomips : 6783.35 processor : 11 vendor_id : GenuineIntel cpu family : 15 model : 6 model name : Intel(R) Xeon(TM) CPU 3.40GHz stepping : 8 cpu MHz : 3391.898 cache size : 16384 KB physical id : 3 siblings : 4 core id : 0 cpu cores : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 6 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm bogomips : 6783.26 processor : 12 vendor_id : GenuineIntel cpu family : 15 model : 6 model name : Intel(R) Xeon(TM) CPU 3.40GHz stepping : 8 cpu MHz : 3391.898 cache size : 16384 KB physical id : 0 siblings : 4 core id : 1 cpu cores : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 6 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm bogomips : 6783.09 processor : 13 vendor_id : GenuineIntel cpu family : 15 model : 6 model name : Intel(R) Xeon(TM) CPU 3.40GHz stepping : 8 cpu MHz : 3391.898 cache size : 16384 KB physical id : 1 siblings : 4 core id : 1 cpu cores : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 6 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm bogomips : 6783.28 processor : 14 vendor_id : GenuineIntel cpu family : 15 model : 6 model name : Intel(R) Xeon(TM) CPU 3.40GHz stepping : 8 cpu MHz : 3391.898 cache size : 16384 KB physical id : 2 siblings : 4 core id : 1 cpu cores : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 6 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm bogomips : 6783.36 processor : 15 vendor_id : GenuineIntel cpu family : 15 model : 6 model name : Intel(R) Xeon(TM) CPU 3.40GHz stepping : 8 cpu MHz : 3391.898 cache size : 16384 KB physical id : 3 siblings : 4 core id : 1 cpu cores : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 6 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc pni monitor ds_cpl vmx est tm2 cid cx16 xtpr lahf_lm bogomips : 6783.34 paskma@ares:~$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda5 184M 114M 70M 62% / udev 10M 100K 10M 1% /dev devshm 16G 0 16G 0% /dev/shm df: `/proc/bus/usb': Permission denied /dev/sda3 89M 26M 59M 31% /boot /dev/sda11 69G 4.2G 65G 6% /home /dev/sda10 4.7G 1.5G 3.3G 31% /tmp /dev/sda6 14G 3.2G 11G 23% /usr /dev/sda7 14G 1.4G 13G 10% /var /dev/sda9 1.8G 1.5G 210M 88% /var/cache/openafs AFS 8.6G 0 8.6G 0% /afs paskma@ares:~$Ad ty disky: ono je to napojeno na nějaký globální AFS (řádově terabajty), které tu nevidím. A ty procesory jsou s HT, takže je jich tam ve skutečnosti polovina.
(Ak vas utiahne grafika
)
(define (test a b c d)
(let ((a (if (> a b) b a))
(b (if (> a b) a b)))
(let ((b (if (> b c) c b))
(c (if (> b c) b c)))
(let ((c (if (> c d) d c))
(d (if (> c d) c d)))
(let ((b (if (> b c) c b))
(c (if (> b c) b c)))
(let ((a (if (> a b) b a))
(b (if (> a b) a b)))
(let ((b (if (> b c) c b))
(c (if (> b c) b c)))
(< a b c d))))))))
(define *count* 0)
(do ((i 0 (+ i 1)))
((= i 100))
(do ((j 0 (+ j 1)))
((= j 100))
(do ((k 0 (+ k 1)))
((= k 100))
(do ((l 0 (+ l 1)))
((= l 100))
(if (test i j k l)
(set! *count* (+ *count* 1)))))))
(display *count*)
Je to poněkud hnusné, poněvadž jsem chtěl, aby to Stalin zkousnul, tudíž si leccos pohodlného z Gauche nemůžu dovolit
, ale funguje to. Jinak bych si asi napsal makro pro podmíněné prohození, zvlášť, kdybych nějaký prohazovací kód měl psát často.
A použil chytřejší smyčky.
jhegenbart@dhcp57:~/stalin-0.11> time python test.py 0 real 2m43.235s user 2m35.394s sys 0m0.348s jhegenbart@dhcp57:~/stalin-0.11> time gosh test.sc 100000000 real 1m57.707s user 1m56.043s sys 0m0.456s jhegenbart@dhcp57:~/stalin-0.11> time ./test 100000000 real 0m0.676s user 0m0.632s sys 0m0.000sOčividně jsem obrátil kritérium pro čítač, ale to na věci asi moc nemění.
Jaký jsi vymyslel Cčkovský zdroják? Abych si to tu prubnul taky.
$ time python test.py python test.py 389.52s user 2.90s system 83% cpu 7:48.33 total1200MHz Thunderbird, popritom som normalne browsoval...
def s(a, b, c, d):
if a > b:
a,b = b,a
if b > c:
b,c = c,b
if c > d:
c,d = d,c
if b > c:
b,c = c,b
if a > b:
a,b = b,a
if b > c:
b,c = c,b
return (a <= b) and (b <= c) and (c <= d)
limit = 100
f = 0
for i1 in range(limit):
for i2 in range(limit):
for i3 in range(limit):
for i4 in range(limit):
if not s(i1, i2, i3, i4):
f += 1
Darwin hayek.mat.lehigh.edu 8.9.0 Darwin Kernel Version 8.9.0: Thu Feb 22 20:54:07 PST 2007; root:xnu-792.17.14~1/RELEASE_PPC Power Macintosh powerpc
hayek:~ jik$ python
Python 2.3.5 (#1, Mar 20 2005, 20:38:20)
[GCC 3.3 20030304 (Apple Computer, Inc. build 1809)] on darwin
hayek:~ jik$ time -p python test.py
real 425.76
user 421.09
sys 1.23
393.47user 2.50system 8:10.18elapsed 80%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+735minor)pagefaults 0swapsPentium III M, 1066MHz
python test.py 1039,02s user 1,06s system 99% cpu 17:21,63 totalIBM Intellistation Pro E: Pentium II / 400 MHz
python test.py 189,07s user 0,02s system 99% cpu 3:09,54 totalSun Ultra 20: Opteron 144 / 1800 MHz
python test.py 1303,05s user 2,24s system 97% cpu 22:19,12 totalSGI O2: MIPS R10k / 250 MHz
real 1h 23min 51s user 1h 21min 34s sys 0m 0.76s
real 2m44.915s user 2m30.047s sys 0m0.862sAthlon64 3000+ na necelých 2,5 GHz
[danek@localhost ~]$ time ./limit.rb real 2m40.827s user 2m39.550s sys 0m0.996sPython
[danek@localhost ~]$ time ./limit.py real 6m5.944s user 6m1.363s sys 0m3.872sZ toho mi jednoznačně vyplívá že je ruby mnohem rychlejší než python
Z toho mi jednoznačně vyplívá že je ruby mnohem rychlejší než pythonTo je taky dobrá hláška...
Coz snad znamená, že se u rychlosti ruby blízká na lepší časi.To nepochibně.
Coz snad znamená, že se u rychlosti ruby blízká na lepší časi.Možná by stálo za úvahu se aspoň občas kouknout na pravidla.cz
, dvě takové hrubky v jedné větě
...
blízká (blízko, nikoliv daleko) vs. blýská (od blesku)
časi (neexistuje) vs. časy (podle hrady)
(jinak sorry za off-topic, nemyslím to nijak zle, ale rozhodl jsem se aspoň trochu napravovat to, co flákají někteří učitelé češtiny
)