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í
×
dnes 14:22 | Zajímavý projekt

GitHub v příspěvku na svém blogu představil GitHub Sponsors. Jedná se o další z možností, jak finančně podpořit vývojáře open source softwaru. Podrobnosti v často kladených dotazech (FAQ).

Ladislav Hagara | Komentářů: 8
dnes 13:44 | Zajímavý software

Společnost Feral Interactive zabývající se vydáváním počítačových her pro operační systémy macOS a Linux vydala počítačovou hru Total War: Three Kingdoms (Wikipedie) pro Linux. Koupit ji lze za 59,99 €. Tentokrát byla verze pro Linux vydána ve stejný den jako verze pro Microsoft Windows.

Ladislav Hagara | Komentářů: 0
dnes 10:00 | Nová verze

Po téměř 11 měsících vývoje od vydání verze 5.28 byla vydána nová stabilní verze 5.30 programovacího jazyka Perl. Do vývoje se zapojilo 58 vývojářů. Změněno bylo přibližně 620 tisíc řádků v 1 300 souborech. Přehled novinek a změn v podrobném seznamu.

Ladislav Hagara | Komentářů: 1
včera 16:44 | Nová verze

Bylo vydáno openSUSE Leap 15.1. Přehled novinek v nejnovější verzi této linuxové distribuce v oznámení o vydání a v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
včera 11:55 | Nová verze

Byla vydána verze 3.14 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Přehled změn v příslušném seznamu. Tor Browser byl aktualizován na verzi 8.5. Řešeno je také několik bezpečnostních chyb. Především bezpečnostní chyby v procesorech Intel.

Ladislav Hagara | Komentářů: 1
včera 11:33 | Nová verze

Byla vydána nová verze 2019.2 průběžně aktualizované linuxové distribuce navržené pro digitální forenzní analýzu a penetrační testování Kali Linux (Wikipedie). Přehled novinek v seznamu změn. Současně byl ve verzi 2019.2 vydán také Kali Linux NetHunter (Wikipedie), tj. obrazy s nástroji z Kali Linuxu pro chytré telefony a tablety.

Ladislav Hagara | Komentářů: 0
včera 11:22 | Nová verze

Vyšel webový prohlížeč Tor Browser, založený na Firefoxu (60.7) a zaměřený na ochranu soukromí, ve verzi 8.5. Mění vzhled, zlepšuje přístupnost a nově je prohlášen za stabilní na Androidu.

Fluttershy, yay! | Komentářů: 0
21.5. 16:11 | Nová verze

Byl vydán Mozilla Firefox 67.0. Přehled novinek v poznámkách k vydání a na stránce věnované vývojářům. Zdůraznit lze blokování těžby kryptoměn a otisku prohlížeče, viditelnější účet Firefoxu nebo rychlý přístup ke správci hesel.

Ladislav Hagara | Komentářů: 7
21.5. 03:33 | Komunita

Rozšířená podpora operačního systémy Microsoft Windows 7 skončí 14. ledna 2020. Poté je možné využít placené podpory, přejít na Windows 10 nebo prostě na Linux. Vláda Jižní Koreje zkouší Linux. Přechod na Linux včetně nákupu nových počítačů by ji měl vyjít na 655 milionů dolarů.

Ladislav Hagara | Komentářů: 33
21.5. 02:22 | IT novinky

CZ.NIC ODVR (Otevřené DNSSEC Validující Resolvery) nově podporují vedle DNS-over-TLS (DoT) také DNS-over-HTTPS (DoH). DoH lze vyzkoušet ve Firefoxu od verze 62, Chrome od verze 66 nebo Bromite od verze 67.

Ladislav Hagara | Komentářů: 0
GPU kterého výrobce aktuálně preferujete pro provoz Linuxu?
 (48%)
 (25%)
 (24%)
 (2%)
Celkem 337 hlasů
 Komentářů: 28, poslední 21.5. 04:02
Rozcestník

Několik krátkých skriptů v Ruby

24.4. 10:05 | Přečteno: 1624× | Programování | poslední úprava: 24.4. 09:59

Skript načte všechny řádky a vypíše je. ARGF je obdobou diamond operátoru v Perlu, takže pokud je argumentem skriptu (ARGV[0]) soubor, řádky se čtou z něj. Pokud je ARGV[0] prázdné, řádky se zadají z klávesnice.
lines = ARGF.readlines
puts lines
Metoda readlines vrací pole řetězců.



Obdobný příklad s tím rozdílem, že soubor otevírá metoda open. Na konci bloku se soubor automaticky uzavře.
file = "data"

lines = File.open(file) {|f| f.readlines }
puts lines


Skript vypisuje počet stejných řádků. Jako klíč v hashi slouží samotný řádek a hodnoty jsou počty řádků.
seen = Hash.new(0)

ARGF.each {|line| seen[line] += 1 }

seen.each {|k,v| print "#{v} #{k}" }


3 Hello World!
1 Bye Bye! 


Skript vytvoří 676 složek od aa do zz, tedy aa, ab, ac...
a = ('a'..'z').to_a 

a.each do |x|
  a.each {|y| Dir.mkdir(x+y) }
end


Skript vymaže ve složce a všech podsložkách všechny soubory zakončené .avi nebo .wmv. Rekurzivní průchod složek provádí metoda find ze standardní knihovny.
require 'find'

Find.find("directory_name") do |path|
  File.delete(path) if path =~ /\.(avi|wmv)$/
end


Skript načte výpis procesů vrácený příkazem ps aux a jednotlivé řádky uloží do pole. Poté každý řádek rozdělí dle bílých znaků na 11 částí a opět je spojí tak, aby mezi každou částí byl řetězec "</td><td>" a aby každý řádek byl ohraničen "<tr><td>" a "</td></tr>". Skript nakonec vypíše procesy jako html tabulku.
processes = `ps aux`.split("\n").map do |proc|
  "<tr><td>" + proc.split(/\s+/, 11).join("</td><td>") + "</td></tr>"
end

puts "<table>"
puts processes
puts "</table>"
První prvek v poli processes vypadá takto:
<tr><td>USER</td><td>PID</td><td>%CPU</td><td>%MEM</td>
<td>VSZ</td><td>RSS</td><td>TTY</td><td>STAT</td>
<td>START</td><td>TIME</td><td>COMMAND</td></tr>
Metoda map vrací pole se změněnými prvky, například:
old = [1, 2, 3, 4, 5]

new = old.map {|x| x*2 }

print new
[2, 4, 6, 8, 10]
Návratová hodnota bloku je poslední výraz, tedy x*2. Existuje i metoda map!, která mění přímo objekt (receiver).



Skript načítá data ze souboru ve formátu csv. Prohodí první a čtvrtý prvek, převede znaky na velká písmena a zapíše data do jiného souboru.
require 'csv'


if ARGV.size != 2
  puts "Usage: #{$0} csvfile newfile"
  exit
end

table = CSV.read(ARGV[0])

newtable = table.map do |row| 
  row[0],row[3] = row[3],row[0]
  row.map {|w| w.upcase } 
end

CSV.open(ARGV[1], "w") do |f|
  newtable.each {|row| f << row }
end
Metoda CSV.read vrací pole polí řetězců:
[["c", "c++", "go", "rust"],
 ["php", "ruby", "shell", "awk"],
 ["html", "css", "javascript", "mysql"]]
file1
c,c++,go,rust
php,ruby,shell,awk
html,css,javascript,mysql

file2
RUST,C++,GO,C
AWK,RUBY,SHELL,PHP
MYSQL,CSS,JAVASCRIPT,HTML
       

Hodnocení: 67 %

        špatnédobré        

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

Komentáře

Vložit další komentář

24.4. 12:15 debian+
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
Uz C sa nevenujes a presedlal si na Ruby?
24.4. 13:00 sad
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
Céčko mě baví pořád, ale beru ho spíše jako koníček, protože bych s ním asi moc nevydělal. Takže se učím i ostatní jazyky, abych měl větší rozhled, a Ruby je na linuxové skriptování docela efektivní, navíc mi dost vyhovuje.

Dalo by se říct, že umím od všeho trochu, ale nic pořádně.
24.4. 19:09 Ariczek | skóre: 5
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
Céčko ... spíše jako koníček, protože bych s ním asi moc nevydělal.
Zajímavé. Kolik je cca představa o "vydělávat moc"? Viz třeba tohle (byť přes 2 roky staré).
xkucf03 avatar 27.4. 10:58 xkucf03 | skóre: 47 | blog: xkucf03
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby

Ten výzkum je trochu podivný. Např. dělení na C a C/C++, protože céčko je víceméně podmnožina C++. A u té Javy mi taky dělení na EE a SE nedává moc smysl. Máš i juniorní EE pozice, kde ale boucháš jen nějaká REST rozhraní podle šablony, takže to zvládne i čerstvý absolvent. Naopak i v SE se dají řešit i složité úlohy vyžadující zkušenost. Spíš by to tedy měly být juniorní a seniorní pozice, ale ten přechod je plynulý, takže to nejde moc rozdělit (serióznější průzkumy se ptají mj. na počet let praxe s danou technologií + obor).

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, Relational pipes (AWK)
27.4. 11:18 trekker.dk | skóre: 71
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
Např. dělení na C a C/C++, protože céčko je víceméně podmnožina C++
Ehm, programoval jste v těch jazycích někdy?
Quando omni flunkus moritati
xkucf03 avatar 27.4. 11:32 xkucf03 | skóre: 47 | blog: xkucf03
Rozbalit Rozbalit vše C vs. C/C++

Ano. A píši „víceméně“ – přestože tam jsou nějaké1 rozdíly, tak většina C kódu je zároveň validní C++ kód. Sice se dá říct, že některé věci z C bys jako C++ programátor nemusel umět, ale z hlediska toho průzkumu mi přijde relevantnější spíš to, že abys mohl psát v C++, musíš (až na nějaké detaily) umět i C.

Kromě toho ten průzkum nerozlišuje kategorie „C“ a „C++“, ale „C“ a „C/C++“.

[1] viz např. Where is C not a subset of C++?

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, Relational pipes (AWK)
27.4. 13:08 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: C vs. C/C++
Uz jsem s tebou nesouhlasil v ledascems, ale ze budu muset nesouhlasit i s tvym pojetim mnozin, to bych asi nikdy pred tim nerekl.

Ale: Pro jednoduchost predpokladejme, ze C je ostra podmnozina C++ (protoze C++ z C vychazi). Obracene to ale neplati, C++ neni ostrou podmnozinou C (protoze pridava celou radu vlastnosti), takze nelze dat rovnost mezi C a C++.

Takze pokud mas programatory pisici v C, neda se rict, ze by umeli i C++. Naopak, pokud mas programatory v C++, tak se da predpokladat, ze zvladaji i C. Takze to deleni na C a C/C++ dava docela dobre smysl.
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
xkucf03 avatar 27.4. 13:52 xkucf03 | skóre: 47 | blog: xkucf03
Rozbalit Rozbalit vše Re: C vs. C/C++

WTF? Přijde mi, že tvůj komentář vůbec nesouvisí s tím, na co reaguješ.

Pro jednoduchost predpokladejme, ze C je ostra podmnozina C++ (protoze C++ z C vychazi).

Hodně zjednodušeně ano, ale ostrá podmnožina to není (ne každý C kód je i platným C++ kódem).

Obracene to ale neplati, C++ neni ostrou podmnozinou C (protoze pridava celou radu vlastnosti), takze nelze dat rovnost mezi C a C++.

To jsem nikdy netvrdil. Píši tam:

céčko je víceméně podmnožina C++

Což znamená, že striktně vzato to podmnožina není, ale z praktického hlediska lze říct, že většinou to platí. A hlavně z pohledu toho průzkumu píši:

Sice se dá říct, že některé věci z C bys jako C++ programátor nemusel umět, ale z hlediska toho průzkumu mi přijde relevantnější spíš to, že abys mohl psát v C++, musíš (až na nějaké detaily) umět i C.

S čímž, zdá se, souhlasíš:

Naopak, pokud mas programatory v C++, tak se da predpokladat, ze zvladaji i C.

A zpět k mému prvnímu komentáři: ten průzkum tvrdí, že C programátoři jsou ohodnoceni výrazně lépe, než C/C++ programátoři, což mi nedává moc smysl vzhledem k tomu, že C/C++ programátor musí být zároveň i C programátorem.

Když se podívám např. na Stack Overflow’s annual Developer Survey 2019 (což je průzkum na výrazně větším vzorku respondentů a zjevně s propracovanější metodikou), tak podle něj jsou C++ programátoři platově ohodnoceni lépe než C programátoři (kategorii C/C++ tam nemají), ale rozdíl mezi nimi není moc velký – 55:52 ve prospěch C++. Zatímco ten průzkum ITTalents.cz uvádí poměr 60:50 ve prospěch C. Ano, trh v ČR by mohl být trochu specifický, ale spíš to na mě působí spíš jako nějaký shluk víceméně náhodných čísel než nějaký seriózní průzkum.

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, Relational pipes (AWK)
27.4. 14:09 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: C vs. C/C++
Pro jednoduchost predpokladejme
Prosim te, muzes mi vysvetlit, co jsi nepochopil na obratu pro jednoduchost predpokladejme?
Obracene to ale neplati, C++ neni ostrou podmnozinou C (protoze pridava celou radu vlastnosti), takze nelze dat rovnost mezi C a C++.
To bylo konstantovani faktu, ze ktereho plyne smysluplnost rozlisovani mezi C a C/C++, nad cimz ses tu pozastavoval.
A zpět k mému prvnímu komentáři:
Např. dělení na C a C/C++, protože céčko je víceméně podmnožina C++.
Sorry, ale z toho komentare jsem opravdu nepochopil, ze mluvis, o vysledcich a ne jen rozdeleni do kategorii.

Jinak ty hodnoty pro C a C/C++ ti mohou vyjit prirozene jine. Protoze s C se dneska da setkat v jinych oblastech nez v C/C++. Pokud nekdo dela v C vetsinou je to systemove programovani. Pokud nekdo dela C++, tak to u rady firem pokryva i vyvoj bezneho aplikacniho software.

Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
Josef Kufner avatar 27.4. 15:05 Josef Kufner | skóre: 68
Rozbalit Rozbalit vše Re: C vs. C/C++
Jak už bylo řečeno, C není podmnožinou C++, i když překryv tam je velmi velký – je jen pár věcí v C, které nejsou platné v C++. Ale o to nejde. Rozdíl mezi těmito dvěma jazyky je hlavně ve stylu programování a typem řešených úloh. C programátor se pravděpodobně bude zabývat low-level záležitostmi, ke kterým potřebuje značné znalosti hardwaru a možná i elektroniky. Takový programátor pak bude placen mnohem lépe než někdo, kdo jen lepí enterprise klikátko v C++.
Hello world ! Segmentation fault (core dumped)
xkucf03 avatar 27.4. 15:21 xkucf03 | skóre: 47 | blog: xkucf03
Rozbalit Rozbalit vše Re: C vs. C/C++

O to mi právě šlo – vážně je trh v ČR tak jiný nebo ten průzkum neodpovídá realitě? V USA totiž podle toho průzkumu StackOverflow jsou C a C++ programátoři placeni stejně a celosvětově jsou podle něj lépe placeni C++ programátoři.

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, Relational pipes (AWK)
Josef Kufner avatar 27.4. 15:39 Josef Kufner | skóre: 68
Rozbalit Rozbalit vše Re: C vs. C/C++
Pokud ten český průzkum byl jen od jedné agentury, tak je možné, že tam mají více průmyslových firem, kde jsou právě ti dobře placení low-level programátoři, kteří naopak moc nelezou na StackOverflow, neboť tam mnoho odpovědí na své probémy nenajdou (přecijen to je spíš aplikačně zaměřené).
Hello world ! Segmentation fault (core dumped)
2.5. 17:57 oryctolagus | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: C vs. C/C++
A zpět k mému prvnímu komentáři: ten průzkum tvrdí, že C programátoři jsou ohodnoceni výrazně lépe, než C/C++ programátoři, což mi nedává moc smysl vzhledem k tomu, že C/C++ programátor musí být zároveň i C programátorem.
Teoreticky ano, prakticky ne. Styl programování v C je o hodně jiný, zejména v porovnání s moderním C++. Např. standardní knihovna C je mnohem menší než C++, nemá např. ani max funkci, natožpak třeba datové struktury. V C si musíš mnoho věcí řešit sám a jinak než v C++.

Zkus si přepsat relpipes do C a uvidíš ;-)
xkucf03 avatar 2.5. 18:28 xkucf03 | skóre: 47 | blog: xkucf03
Rozbalit Rozbalit vše Re: C vs. C/C++
Zkus si přepsat relpipes do C a uvidíš

To bych asi nedal (resp. přestalo by mě to bavit), nebo minimálně ne bez dalších knihoven/frameworků (zatímco v tom C++ si vystačím s tím, co je ve standardní knihovně).

Dá se tedy asi říct, že psát v čistém C je pracnější než v čistém C++. Na druhou stranu: pokud tě v práci platí od hodiny, tak ti to může být celkem jedno – uděláš méně práce, napíšeš méně funkční software, ale to je věc té firmy – není přece důvod, proč bys za svůj čas měl dostat méně zaplaceno, ne?1

Pokud to tedy nejsou náhodná čísla nebo chyba měření, tak to asi bude tím, jak už tu někdo psal, že na těch projektech v C se asi vyžadují i nějaké jiné znalosti (HW a nízkoúrovňové programování) než u těch C++ projektů. Možná je tam příplatek i za ten „opruz s C“. Na druhou stranu jsem potkal lidi, kteří si v C libují a naopak nesnáší C++, tak nevím – jako Javista to nedokážu úplně posoudit :-D ale přijde mi, že ty věci, které jsou v C++ navíc oproti C, mi víc práce šetří než přidělávají, takže když už, tak z těchto dvou možností beru raději to C++ (nebo C/C++).

[1] leda že bys řekl, že programovat v C++ je oproti C natolik zábavné, že to lidi budou rádi dělat i za výrazně méně peněz :-)

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, Relational pipes (AWK)
2.5. 19:02 oryctolagus | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: C vs. C/C++
OMG. Ta výše té odměny za tu práci má jen málo společného s tím, jak ta práce je/není náročná, zábavná, whatever. Tu odměnu určuje nastavení trhu.

Tedy abych pravdu řekl, tohle mě fascinuje - na to, jak často tu prosazuješ velný trh, je komentář výše poněkud velmi naivní představa o jeho fungování...
xkucf03 avatar 2.5. 20:11 xkucf03 | skóre: 47 | blog: xkucf03
Rozbalit Rozbalit vše Re: C vs. C/C++
Tu odměnu určuje nastavení trhu.

Vždyť ano. Tak pokud si budu vybírat mezi dvěma pracemi, tak si vyberu buď tu zábavnější, klidnější, méně náročnou1 nebo si za tu horší nechám aspoň líp zaplatit, ne?

[1] těch kritérií bude samozřejmě víc včetně toho, jak daleko to mám od domu, jak vypadají kolegové, jaký v tom vidím smysl, osobní rozvoj atd.

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, Relational pipes (AWK)
3.5. 12:35 oryctolagus | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: C vs. C/C++
You'll get what the market demands. (Btw. ano, je to Zlý Web™, nicméně je oblíbený, a to ze stejného důvodu.)
2.5. 20:36 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: C vs. C/C++
Na druhou stranu jsem potkal lidi, kteří si v C libují a naopak nesnáší C++ ... ale přijde mi, že ty věci, které jsou v C++ navíc oproti C, mi víc práce šetří než přidělávají,
Jazyk C je pro spoustu lidi a situaci zajimavy tim, ze se jedna o jednoduchy, snadno citelny a tudiz relativne predvidatelny programovaci jazyk. Tedy vhodny pro systemove programovani, kde je zadouci, aby mel programator predstavu, jak kod a data bude mapovan na hardware. (I kdyz dnes je to spis iluze.)

Naproti tomu C++ je neuveritelne komplexni jazyk jez zvladne pobrat jen par programatoru. Tim, ze spoustu veci usnadnuje, dochazi k tomu, ze se jazyk vzdaluje od toho, aby programator alespon tusil, jak co bude mapovano na hardware, takze pro systemove programovani to neni uplne vhodna volba. Na druhou stranu, pri vysokourovnovem programovani C++ nechava spoustu technickych detailu na programatorovi, takze i v tomto smeru to neni pro radu lidi dobra volba. (I kdyz musim dodat, ze novejsi verze to hodne dohnaly.)

Jeste je tu jeden duvod, proc programatori nemaji radi C++. Dlouha leta byl problem sehnat prekladace, ktere by podporovaly standard v plne siri, takze se vyvojari museli drzet nejake arbitrarne zvolene podmnoziny jazyka. Dnes se ji drzi pro zmenu take urcite podmnoziny jazyka, protoze o nekterych starsich castech jazyka se prohlasuje, ze jsou proste fuj.
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
3.5. 10:13 oryctolagus | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: C vs. C/C++
Dnes se ji drzi pro zmenu take urcite podmnoziny jazyka, protoze o nekterych starsich castech jazyka se prohlasuje, ze jsou proste fuj.
Njn, ale tak ono když tyto některé starší části jsou např. auto_ptr nebo podobně, tak se úplně nelze divit, že jsou prohlášeny za fuj...
3.5. 11:46 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: C vs. C/C++
tak se úplně nelze divit, že jsou prohlášeny za fuj...
To by se dalo jeste pochopit, ale co treba new a delete? To je pro spoustu lidi taky fuj...
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
3.5. 11:58 oryctolagus | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: C vs. C/C++
Tak ano, delete je z hlediska moderního C++ spíše antipattern. IMO jsou pro to celkem dobré důvody. Samozřejmě vyjma těch situací, kdy není jiná dobrá možnost.
3.5. 12:51 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: C vs. C/C++
Tak ano, delete je z hlediska moderního C++ spíše antipattern.

A to je presne to, o cem mluvim. Nektere casti C++ vcetne relativne zakladnich veci jsou prohlaseny za fuj a neni radno se jich dotykat, a ze toho je. IMHO je toto solidni dukaz toho, ze C++ je FUBAR by design, i kdyz verze c++11, c++17 se to snazi docela soldine zamaskovat.
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
3.5. 13:45 oryctolagus | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: C vs. C/C++
No, IMHO C++ může nahradit C i v silně omezených prostředíCH, ale vyžaduje to, aby programátor znal fungování / cenu těch abstrakcí, které se použijou, a (ze stejného důvodu) jich nepoužíval příliš.

Co se týče té situace s new/delte, IMO to není až takový problém, koneckonců, analogie jsou i v C. Např. v soláči blahé paměti jsme měli pravidlo používat (v userspace) by default calloc() místo malloc(). malloc() byl "fuj" a jeho použití bylo potřeba zdůvodnit, myslimže na to byl i lint v buildu. Resp. ono to není ani tak, že by malloc() nebo delete byly z podstaty fuj, ale je to spíš dohoda nad rozsahem jejich použití.

Jinak celkem souhlsaim, že C++ víceméně FUBAR by design, akorát si nemyslim, že zrovna ten new/delete by byl ten problém. To spíš jiné abstrakce násilně naroubované na původní jazyk, jako např. zprasené move semantics a systém druhů hodnot z toho pošlý... to když čtu, připadám si, že taky pojdu. Taky by mě zajímalo, jestli různé pokročilejší SFINAE-based triky jako třeba enable_if apod. jsou výsledkem nějaké zralé úvahy a promyšleného návrhu, nebo toho, že někdo jedno dne řekl "Helemese, to je zajímavé, že to takhle funguje, to bychom mohli využít". Podezírám je, že spíš to druhé.
xkucf03 avatar 3.5. 13:56 xkucf03 | skóre: 47 | blog: xkucf03
Rozbalit Rozbalit vše C++ vs. D

BTW: Proč se tak málo rozšířilo D? Působí celkem dojmem jako „C++ udělané dobře“. Nebo se někde ve větší míře používá?

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, Relational pipes (AWK)
Bystroushaak avatar 3.5. 14:10 Bystroushaak | skóre: 35 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: C++ vs. D
Imho protože za ním nestojí žádná firma, protože stdlib jeden čas stála za hovno a vzniklo schizma a rozdělení na neoficiální a protože původní kompilátor snad byl nějak uzavřený. Všechno už to 10+ let není problém. Jinak imho to je C++ udělané dobře.
3.5. 15:20 oryctolagus | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: C++ vs. D
BTW: Proč se tak málo rozšířilo D? Působí celkem dojmem jako „C++ udělané dobře“. Nebo se někde ve větší míře používá?
IMO dva hlavní problémy D jsou (1) absence zaměření a (2) je lepší jen o trochu.

Ten problém (1) je vidět např. na tom použití GC+runtime. To nedává obecně smysl pro jazyk, který by měl být náhradou C++, protože tenký runtime + absence GC magie je často vůbec důvod, proč něco dělat v C++ (byť to tak nutně být nemusí). Kdyby D nabízelo nějakou skutečně dobrou možnost, jak mít volitený GC, tak by to mohlo fungovat, ale tohle je hodně těžké a D se to nepodařilo. Pro porovnání Rust na tohle rezignoval (GC byl odstraněn před verzí 1.0) a IMO to bylo dobré rozhodnutí. D mělo ambice být Rustem, Gočkem i Pythonem najednou a to je pak šance na fail hrozně vysoká (a možná to vůbec není splnitelný cíl).

Co se týče (2), D IMO nemá žádné moc výrazné fíčury, které by ho vyzdvihly nad C++. UFCS? Unicode strings? CTFE? Všechno je to hezké a je to vylepšení oproti C++, ale nestačí to. A některé velké problémy C++ to vůbec neřeší. Když nebudu používat GC v D, jaké mám možnosti memory managementu? V podstatě jsem na tom stejně jako v C++, resp. dnes vlastně i hůř - ty C++ move semantics jsou asi furt lepší než to, co je v D.
xkucf03 avatar 3.5. 15:54 xkucf03 | skóre: 47 | blog: xkucf03
Rozbalit Rozbalit vše Re: C++ vs. D

Zrovna před chvílí mi ve čtečce přistála zprávička, že nové GCC obsahuje kompilátor D :-)

Unicode strings

Už jen tohle je v C++ dost velké utrpení. std::string je ve skutečnosti posloupnost bajtů, ale historicky se tenhle typ běžně používá pro textové řetězce (i ve většině učebnic), pak je tu std::wstring a několik dalších variant… Různé knihovny používají pro řetězce různé typy, takže to mezi nimi musíš konvertovat. Přitom ale nástroje pro konverzi buď chybí nebo jsou nedokonalé nebo se nepohodlně používají. Takový wstringconvert<codecvtutf8<wchar_t>> je pro jistotu deprecated, ale náhrada za něj ve standardní knihovně zatím chybí. Práce s textovými řetězci je podle mého základní věc a do standardní knihovny jednoznačně patří. Další věc jsou vstupní/výstupní proudy, tam je podobný problém s bajty vs. znaky. Když to srovnám s Javou, tak oproti ní v tomhle C++ působí naprosto retardovaně a jako by bylo dílem někoho, kdo netuší, co dělá (chápu, že hodně z toho je dané historicky a snahou o zpětnou kompatibilitu, ale výsledek je takovýhle).

Naopak jiné věci jsem si na C++ celkem oblíbil, něco je tam lepší než v Javě (byť za cenu vyšší komplexity jazyka) a něco je prostě jinak, ale dá se s tím celkem žít (správa paměti). Ale ty řetězce a proudy mě budou štvát asi pořád. A pak je taky problém, když se sejde dědičnost, šablony, snaha o ABI kompatibilitu a správa paměti… to se pak musí různě hackovat přes vzor D-Pointer a člověk musí víc bojovat s technickými detaily, místo aby se soustředil na byznys logiku a od těch detailů mohl díky jazyku abstrahovat.

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, Relational pipes (AWK)
3.5. 16:52 oryctolagus | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: C++ vs. D
Já s tim souhlasim, že ta situace je v C++ špatná, ale budeš měnit jazyk kvůli stringům? Navíc ty stringy v C++ jsou do jisté míry řešitelné knihovnou, ačkoliv na úrovni ekosystému to řešení není. Kdybych se musel rozhodovat mezi C++ a D (tj. kdyby neexistoval Rust :-D), tak tohle by asi váhy na stranu D nepřevážilo - sice bych si usnadnil práci se stringy, ale zas bych se musel babrat s GC, přišel bych o moving, je to marginální jazyk, tj. malý ekosystém, má taky svoje nevýhody... Prostě ta změna není natolik fundamentální, aby to s tím pohlo.

Kdyby Rust neměl borrow checker (a možná nějaké další věci), dopadlo by to s ním IMO úplně stejně, přestože má velmi slušnou podporu utf-8. (A kdo ví, možná to s ním dopadne stejně i s borrow checkerem :-D)

Btw. Java má s Unicode taky problém, AFAIK má nativní podporu jen pro UCS-2.
xkucf03 avatar 3.5. 17:21 xkucf03 | skóre: 47 | blog: xkucf03
Rozbalit Rozbalit vše Re: C++ vs. D
Prostě ta změna není natolik fundamentální, aby to s tím pohlo.

Pokud jsi vyrostl na C++, tak to docela chápu, ale když někdo k C++ takový vztah nemá, tak to IMHO tak jednoznačné není.

malý ekosystém

D by mělo být s C/C++ dost kompatibilní, kombinovatelné. Ostatní jazyky na to dost kašlou (není to zrovna lehký úkol) nebo jsou propojitelné maximálně s C a to ještě většinou jen nějak nepřímo. Mimochodem, GraalVM je v tomhle celkem revoluční a unikátní.

Btw. Java má s Unicode taky problém, AFAIK má nativní podporu jen pro UCS-2.

Interní reprezentace v paměti1 je jedna věc, ale to tě nemusí moc zajímat – z pohledu programátora je daleko důležitější, jaké API máš k dispozici. A v tomhle Java oproti C++ jasně vede. Máš tam oddělené bajtové a znakové proudy. Znakový si z bajtového vyrobíš jednoduše tak, že jednu třídu (resp. instanci) obalíš jinou třídou. A jako parametr uvedeš požadované kódování (nebo neuvedeš a pak se používá místní kódování platformy). Totéž platí pro převod mezi Stringem a polem bajtů – opět si zadáš kódování jako parametr nebo necháš výchozí a jednoduše si to převedeš.

Na nějaké okrajové problémy s Unicodem můžeš narazit i v té Javě, ale to asi v každém jazyce. Každopádně se to vůbec nedá srovnávat se situací v C++.

[1] BTW: od Javy 9 už neplatí ani to UTF-16, ale od toho můžeš abstrahovat, je to implementační detail toho jazyka/platformy

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, Relational pipes (AWK)
5.5. 22:58 oryctolagus | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: C++ vs. D
Pokud jsi vyrostl na C++, tak to docela chápu, ale když někdo k C++ takový vztah nemá, tak to IMHO tak jednoznačné není.
Já vyrostl na Pascalu ;-)
D by mělo být s C/C++ dost kompatibilní, kombinovatelné.
Jistě, ale stále musí být nějaký důvod, proč to vůbec dělat. Jestli chceš používat D kvůli stringům, ale zároveň jsi ochoten používat C++ ekosystém, tak to máš IMHO opravdu rozumnější zůstat u C++ a použít na stringy knihovnu...
Mimochodem, GraalVM je v tomhle celkem revoluční a unikátní.
To se teprve uvidí... Já jsem k téhle interoperabilitě na úrovni kódu skeptický. Využivání API a datových struktur jednoho jazyka z jazyka jiného (třeba o dost) typicky znamená psát neidiomatickým stylem, řešit věci nestandardně / neintuitivně.
Interní reprezentace v paměti1 je jedna věc, ale to tě nemusí moc zajímat – z pohledu programátora je daleko důležitější, jaké API máš k dispozici. A v tomhle Java oproti C++ jasně vede.
C++ je z hlediska podpory Unicode opravdu opravdu špatné, to asi nemusíme řešit.

V Javě vidím ten problém v tom API, afaik to API stále používá datový typ char a další atavismy. Můžu si případně někde přečíst, v čem se liší nové verze Javy? Mně by jako správné řešení připadalo úplně přestat používat datový typ char (je v podstatě úplně k ničemu, resp. leda jako 16-bit integer pro nějaké specielní účely) a např. vůbec neposkytovat ty funkce typu length vracející zavádějící číslo (počet UTF-16 jednotek). To ale asi nejde úplně udělat, protože zpětná kompatibilita. (Btw. stejný problém má Qt.)
xkucf03 avatar 6.5. 21:32 xkucf03 | skóre: 47 | blog: xkucf03
Rozbalit Rozbalit vše Re: C++ vs. D
Jestli chceš používat D kvůli stringům

Ono nejde jen o ty stringy, ale o spoustu různých otravných drobností. Třeba z tohoto taky nemám radost:

void execp(const std::vector<std::string>& args) {
	const char** a = new const char*[args.size() + 1];
	for (size_t i = 0; i < args.size(); i++) a[i] = args[i].c_str();
	a[args.size()] = nullptr;

	execvp(a[0], (char*const*) a);

	delete[] a;
	throw cli::RelpipeCLIException(L"Unable to do execvp().", cli::CLI::EXIT_CODE_UNEXPECTED_ERROR);
}

asi bych to měl nějak přepsat, ale strávil jsem teď nějakou dobu hledáním doporučených řešení a nic hezkého jsem nenašel. Zatím mi to funguje takhle.

ale zároveň jsi ochoten používat C++ ekosystém

Tam jde spíš o nějaké zajímavé knihovny, kterých je v C a C++ spousta, než o to, že by si do kódu člověk dobrovolně cpal věci z C++ (jazyk, standardní knihovna).

tak to máš IMHO opravdu rozumnější zůstat u C++ a použít na stringy knihovnu...

Přejít jinam se v zásadě nechystám – to C++ jsem si vybral kvůli rozšířenosti a zralosti (jediná závislost je pak GCC případně by to mělo chodit i v jiném kompilátoru) a pořád je to o dost lepší než C. A pro ty Relační roury jsem si C++ vybral i navzdory tomu, že jako jazyk mi přijde horší než Rust nebo D.

Ale kdybych v tom měl psát něco velkého (informační systém atd. – i když ten bych asi psal spíš v Javě), tak by to chtělo vychytat buď knihovny (Qt možná dost z toho řeší, případně Boost) nebo by možná převážily výhody toho D nebo Rustu (i když tam je otázka, jak snadno by šlo napojovat knihovny z C/C++ a jaké by byly potřeba).

U malého jednoduchého programu bych si rád vystačil se standardní knihovnou. Což tedy v tom C++ jde, i když si u toho občas zanadávám :-) Jediné, co mi vyloženě nešlo, bylo zjišťování šířky znaku (při tisku na terminál – obrázkové písmo, některé emoji, rozbije výstup)… myslím, že jsem tu o tom už psal – a tohle asi v rámci standardní knihovny nemá řešení.

To se teprve uvidí... Já jsem k téhle interoperabilitě na úrovni kódu skeptický. Využivání API a datových struktur jednoho jazyka z jazyka jiného (třeba o dost) typicky znamená psát neidiomatickým stylem, řešit věci nestandardně / neintuitivně.

Já z toho mám trochu rozporuplné pocity, ale asi z jiného důvodu. Za svůj život už jsem viděl tolik rozbitých, děravých a spadlých programů, že mě to táhne spíš k tomu, abych rozdělil systém na více menších komponent, samostatných procesů a trochu víc to izoloval (třeba i pod jiné uživatelské účty nebo bezpečnostní kontexty), než aby to běželo všechno v jednom. Na druhou stranu je fascinující, že jde napsat program, kde část funkcí je v Pythonu, část v Javě a jiná třeba v Ruby a je to v podstatě jako kdybys volal metody na objektu ve svém jazyce. Kdybych to neviděl naživo, tak bych asi nechtěl věřit, že něco takového může existovat :-)

Můžu si případně někde přečíst, v čem se liší nové verze Javy?
JEP 254, baeldung.com, dzone.com
a např. vůbec neposkytovat ty funkce typu length vracející zavádějící číslo

Jde o to ujasnit si terminologii a aby se ta čísla správně interpretovala. Dneska text už bohužel není jen text a trochu se to zvrhlo, ale co se dá dělat. Délka může být: a) počet bajtů b) počet znaků (jako jakýchsi atomických jednotek písma), c) počet políček, které to zabírá při vytištění. Nejsem moc nadšený z toho, že c) vůbec existuje resp. že může být různé od b). Asi1 je to nutné kvůli nějakým východním písmům, ale nabourává to spoustu věcí. Nějaké barevné obrázky jsou pak kapitola sama pro sebe, to podle mého do textu vůbec nepatří. Nicméně ať už na to má člověk názor jakýkoli, tyhle věci nepocházejí od autorů programovacích jazyků – ti se s novinkami musí nějak poprat a skloubit to se zpětnou kompatibilitou.

[1] i když: fakt by nemohlo platit, že jeden znak zabírá jedno políčko? Vždyť takové mi jsou taky různě široké, ale jsme je schopní dát pod sebe se stejnou šířkou.

Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, Relational pipes (AWK)
7.5. 00:43 oryctolagus | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: C++ vs. D
asi bych to měl nějak přepsat, ale strávil jsem teď nějakou dobu hledáním doporučených řešení a nic hezkého jsem nenašel. Zatím mi to funguje takhle.
Mohl bys použít nějakou transformaci vectoru, např. jako je uvedená v tom Example tady (mam na mysli hlavně to druhé volání transform()).
Jediné, co mi vyloženě nešlo, bylo zjišťování šířky znaku (při tisku na terminál – obrázkové písmo, některé emoji, rozbije výstup)… myslím, že jsem tu o tom už psal – a tohle asi v rámci standardní knihovny nemá řešení.
Huh? To by neměl být problém. Emulátory termiálu to interně běžně řeší, včetně třeba Konsole (i když tam to mají zmršené právě kvůli UTF-16 v Qt). Vygoogluj si wcwidth() a nějakej kód určitě najdeš...

Mimochodem, problém jsou nejen fullwidth znaky a emotikony, ale taky znaky s nulovou šířkou (diakritika atd.).
Jde o to ujasnit si terminologii a aby se ta čísla správně interpretovala. Dneska text už bohužel není jen text a trochu se to zvrhlo, ale co se dá dělat. Délka může být: a) počet bajtů b) počet znaků (jako jakýchsi atomických jednotek písma), c) počet políček, které to zabírá při vytištění.
Fór je v tom, že String length v Javě, JS a Qt není ani jedno z toho. Nejblíže to má asi tomu počtu bajtů (je to polovina počtu bajtů, pokud nejsou použity ty Compact Strings), ale v zásadě je to víceméně náhodné číslo pocházející z implementačního detailu, které může a nemusí odpovídat počtu znaků. A není to vina emotikon, bylo to takhle už před nimi.

Jinak v kontextu Unicode stringů je délka stringu dobře definovaná: Počet Unicode code points.
Josef Kufner avatar 3.5. 11:59 Josef Kufner | skóre: 68
Rozbalit Rozbalit vše Re: C vs. C/C++
aby mel programator predstavu, jak kod a data bude mapovan na hardware. (I kdyz dnes je to spis iluze.)
V případě jednočipů to až taková iluze není a C je tam nenahraditelné. Například pokud máš jen 0.5 KB paměti a potřebuješ precizně generovat signál pomocí hardwarové PWM a ještě ten signál v reálném čase interpolovat ze vstupních dat, tak je každých pár instrukcí znát, neboť výpočty musí být synchronizovány s během PWM a s generovanými přerušeními. Na to nic lepšího než C prostě není. Ta kombinace předvídatelnosti a srozumitelnosti je opravdu unikátní a nenahraditelná.
Hello world ! Segmentation fault (core dumped)
3.5. 12:44 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: C vs. C/C++
V případě jednočipů to až taková iluze není a C je tam nenahraditelné
Tomu rozumim. Narazel jsem spis na toto.
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
27.4. 11:45 Ariczek | skóre: 5
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
Ten výzkum jsem úplně nezkoumal. Jen zběžně. Byl použit jako první odkaz z google, jako argument vůči původní myšlence, že pomocí programování v C se moc nevydělává.

Cca 6 let dělám coby programátor, převážně v C v embedded světě (kde se obecně říká, že není tolik peněz). Subjektivně si nemyslím, že vydělávám málo. Proto můj dotaz, co znamená "vydělávat moc".
xxx avatar 27.4. 19:24 xxx | skóre: 42 | blog: Na Kafíčko
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
V C je ten strop niz, nebo spis musius byt opravdu hodne uzka spicka. V Jave pokracujes nekam do enterprise sracek, kde sice delas nejaky pojebany trivalni veci, ale vzhledem k tomu jak je to obaleny zmrdikecama (si precti neco od treba od Stopky tady), tak se za to plati vic.
Please rise for the Futurama theme song.
27.4. 19:43 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
kde sice delas nejaky pojebany trivalni veci, ale vzhledem k tomu jak je to obaleny zmrdikecama (si precti neco od treba od Stopky tady), tak se za to plati vic.
Toto je priserna poza.

Kdyz clovek dela na systemove urovni v C, tak vetsina neprijemnosti plyne z toho, ze programuje proti hardware, do ktere ho neni poradne videt a malokdo ho chape jako celek; a dokumentace, kdyz vubec je, obsahuje chyby.

Kdyz clovek dela na enterprise urovni v Jave, tak vetsina neprijemnosti plyne z toho, ze programuje proti systemu, do ktere ho neni poradne videt a malokdo ho chape jako celek; a dokumentace, kdyz vubec je, obsahuje chyby.

Je jen na tobe, ktere zlo si vyberes. Ale vybirej opatrne, aby sis nevybral jeste vetsi zlo...
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
xxx avatar 27.4. 19:46 xxx | skóre: 42 | blog: Na Kafíčko
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
Acho jo. Kdyz to potrebujes napsat politicky korektne, tak rozdil plyne z toho, ze sracky v druhem pripade resis v mistech, kde je bliz k penezum.
Please rise for the Futurama theme song.
24.4. 12:36 Odin
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
Proč Ruby, když existuje Python?

To je jako jezdit Škodovkou a ne Teslou.
24.4. 13:21 sad
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
Python se na takové krátké skripty moc nehodí, protože člověk musí importovat spoustu modulů.
24.4. 13:59 sad
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
Python je pro amatérské bastliče, to už vážně raději to C.
24.4. 14:03 _
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
Zajímavé, já v tom amatérsky bastlím pro Bayer AG.
sad avatar 24.4. 14:09 sad | skóre: 8 | blog: sad
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
Tohle jsem nepsal já. A ty, drahý trole, nepoužívej, prosím, můj nick.
24.4. 17:43 sad
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
No, to je hotová NASA.
24.4. 17:44 sad
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
(pro trolla podrtžítko)
24.4. 17:47 Petr
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
Nechtěl bych rozhodovat, co je náročnější a více high-tech obor - zda kosmonautika nebo farmacie a genové inženýrství. Ty v tom ale zřejmě máš jasněji než Hurvínek.
Bystroushaak avatar 25.4. 01:49 Bystroushaak | skóre: 35 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
xsubway avatar 25.4. 06:52 xsubway | skóre: 13 | blog: litera_scripta_manet
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
:-)
25.4. 09:50 sad
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
Smetí.
sad avatar 24.4. 18:13 sad | skóre: 8 | blog: sad
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
Jako nepřihlášený jsem napsal pouze dva příspěvky. Od této chvíle píši pouze jako přihlášený, takže ostatní příspěvky od nepřihlášeného sada nejsou moje.
24.4. 22:28 sad
Rozbalit Rozbalit vše Re: Několik krátkých skriptů v Ruby
To psal falešný sad.

Založit nové vláknoNahoru

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