Bych čekal, že touhle dobou budou uvolněny už i 98čky, natož prapůvodní DOS (kdyby aslespoň ten poslední).
asi začnu prodávat nějaké eyeball-vložky proti krvácivým očním bulvám. Poslední dobou takových zkryplenin (ne jen číslovek) potkávám čím dál tím více.
A občas jsou to perly, že bych možná mohl prodávat s těma vložkama i nějaké podočenky, aby to ty bulvy drželo na místě, kdyby chtěly někam vyskočit.
Přitom jde o řadovou číslovku, která se standardně zapisuje tak, že se za ni dělá tečka. A to jak v římské formě (Karel IV., Josef II. ), tak i s arabskýma číslama (21. Srpen je den, kdy si připomeneme...)
Btw, nás ještě navíc učili, že číslovky do desíti se píšou jako slovo, znaky čísel se používají až výš. Vyjma panovníků, datumů a podobných blbin, samozřejmě. Ale to už by člověk chtěl opravdu moc, aby vysokoškoláci z techniky znali češtinu na úrovni maturity.
Když už si root hraje na médium, měli by místní pisálci aspoň vědět, jak se píšou čísla, co je shoda přísudku s podmětem apod. Kolikrát to člověku tak cuká očima, že je musí brzdit svěračem, aby nevylítly.
A kdyby bylo nejhůř, tak pomůže třeba https://www.mojecestina.cz/
Rozlišování "datumů" a "dat" je velice praktické. Nemůžu za to, že Ústav pro jazyk český ještě nepochopil, žev počítačovém věku už dívno dávno dávníčko nejsou data především datumy. Tedy datum je lépe brát jako mužský rod.
Mimochodem, Ústav pro jazyk český neurčuje, co je a co není správně česky. Takové postavení právně nemá. Navím by to bylo jako had Uroboros, protože Ústav se zabývá zkoumáním češtiny, jak ji lidé používají, jak se vyvíjí. Kdyby ještě navíc určoval, jak ji mají používat, nedávalo by to logický smysl.
Ten byl více použitelný. Ale MS-DOS 2 už uměl adresáře a mrňavý harddisk, navíc měl nové API, které spoustou programů bylo požadováno jako minimum až do devadesátých let. takže je to celkem základ.
U té jedničky je nejzajímavější jak byly všechny ty programy malinkaté, i když tahle verze už uměla oboustrannou disketu se 320 KB. Na to se vešla hromada VisiCalcových tabulek!
Já bych to nezatracoval. Jedná se o poctivý assembler, viz. např. formátování disku (https://github.com/Microsoft/MS-DOS/blob/master/v2.0/source/FORMAT.ASM). Jen ať se mládež podívá, jak to dříve dělalo :-)
Dnesni mladez neumi programovat ale googlit. Nasledne pouzivat CTRLC CTRLV. Bez jakychkoliv hlubsich znalosti.
PS: Mluvim jako clovek co zazil strojovy kod u pocitacu jako ZX Spectrum, Didaktik Gama, PC XT (8086), atd. Dnes jsem za to nevyslovne vdecen. Aplikace, ktere programuji dnes samozrejme ve vyssich programovacich jazycich, jsou velice rychle a pametove absolutne nenarocne a to paradoxne i v momente kdy se pracuje s velkymi daty.
To je váš subjektivní názor. Důkazy o mém tvrzení mám od nás z práce u některých čerstvých absolventů VŠ (paradoxně dost častý výskyt). Jakýkoliv framework co najde, použije, nedejbože zuby nehty prosazuje. Že je to obvykle o 150% pomalejší, než když to po něm přepíšeme buď já nebo kolega včetně testů, měření časů daných operací a důkladného logování, student na to reaguje obvykle slovy "Aháááá, tak to jsem netušil". Holt zkušenosti a praxe jsou prostě zkušenosti a praxe.
Pořád lepší pamětník, který si dokáže uvědomit jak data v paměti mohou leckdy nabobtnat, než student, který si myslí, že framework je univerzální řešení na vše. Vždyť to přeci používají na facebooku, tak to musí fakčit. Jenže my nejsme facebook.
@ted
Ano je to můj názor.
No, tak za prvé bych řekl že ani ty jsi zkušený z nebe nespadl, ale když už teda asi ano, tak za druhé teda jak to že nějakému tomu po-školákovi bobtnají data, napíše to 1,5 * pomalejší když "dnes samozrejme ve vyssich programovacich jazycich, jsou velice rychle a pametove absolutne nenarocne a to paradoxne i v momente kdy se pracuje s velkymi daty."
No přiznám že mám s "mladšími kusy" podobné problémy, ale že by jenom kopírovali z webu a dnešní programovací jazyky byly bezproblémové (bezp., optimalizace ....) bych rozhodně neřekl. spíš naopak. A kéž by ti mladí radši občas něco odněkud zkopírovali správně, než zmatlali vlastnoručně, když už neumí použít hubu na to, aby se poradili ...
Ano .. i tihle experti existují, potvrzuji. Ty to obvykle nebaví.Ale mají ego jako kráva a jsou si svým názorem naprosto jisti. Opět dokud jim není ukázáno a opakovaně změřeno, že smyčka, která dělá totéž, co napsal dotyčný expert po svém trvá 450 milisekund misto jejich 2.6 sekundy a místo 650 mega ram potřebuje jen 2.5 mega.
když "dnes samozrejme ve vyssich programovacich jazycich, jsou velice rychle a pametove absolutne nenarocne a to paradoxne i v momente kdy se pracuje s velkymi daty."
Nevím jestli jste pochopil, ale právě ta vybičovanost z dřívějšího slabého HW tehdejší doby mě (ne jim, ale mě osobně) dnes umožňuje myslet stále tak, jako by systémových prostředků bylo sakra málo a bylo potřeba neplýtvat. Ani časem, ani pamětí, ani diskem, ani sítí, ani čímkoliv.
Dnešní mládež má systémových prostředků dostatek, a tak si jich neváží. V testu s mikrodaty mu to běhá obstojně, ale jak se to pošle do produkce s mnohem většími daty, sčítá se bajt k bajtu a milisekunda k milisekundě a pak aplikace tuhne a dělá různé psí kusy, logy na serverech bobtnají, místo dochází, stroj swapuje jak o život.
Čím to je? Nikdo tyhle studenty neučí pořádně myslet do hloubky. Vše je tak nějak povrchní, látané, slepované, googlené.
Zmiňovaným průserářům samozřejmě radíme jak to udělat lépe a nezabastlit to tunou odpadu, o kterém dotyčný ani neví jak funguje, nebo na jaké konkrétní řešení daný autor daného frameworku chtěl své dílo použít, které ne až tak zcela sedí na naše potřeby. Jenže za půldenní školení nejsme placeni.
Na druhou stranu jsou i studenti, kteří s IT co se svého studia nemají vůbec nic společného, třeba jeden je stavař, ale od dětství ho to skutečně zajímá a má to jako svůj koníček. Jeho kód je mnohem pružnější než kód toho, který prošel VŠ.
@ted
No pochopil a bojuju s tím taky. Nevěř tomu, že dnes není potřeba to hlídat. Není to sice jako v časech 8-bitů s pár kilo paměti, a i s tím se lze lehce setkat i dnes, ale shodit server datovou zhovadilostí není nic tak neobvyklého - jeden k druhému, pak někdo přimatlá třetí a už to jede ... To ale není tím co jsi psal, to je osobní leností a nezájmem. Neprofesionalitou. To ano. Ale že by to dnes řešili jazyky vyšší úrovně, to neplatí ani z daleka ... Proto jsem se ozval. Fakt bych byl radši kdyby mi tu někteří výjímečníci kód zkopírovali a jazyk to dořešil za ně, ale tak to fakt nefunguje. Ve finále je za tím nezájem, lenost a hloupost - ale neřekl bych že to platí pro nějako majoritní skupinu - jsem ochoten uznat půl na půl a taky uznávám že jsem nepotkal 1/2 světa.
Osobní lenost a nezájem. Ano. Například teď řeším rekurzivní funkci po jednom borcovi s VŠ. Jedná se o PHP. V parametrech, které té funkci předává má docela hutnou datovou strukturu, mnohaúrovňové asociativní pole. Samozřejmě si ji jako parametr dáva při volání rekurze znovu a znovu.
Co se stane, když mu to vletí 150x do sebe. No octne se ta hutná struktura 150x v zásobníku.
Hele Franto, pojď sem prosímtě. Podívej se. Když před parametr v definici funkce dáš ampersand, pak předáváš jen referenci. a NE KUR*A DO HAJZ*U UZ 150x TU TVOU 15TI MEGOVOU STRUKTURU VŠECH VÝSLEDKŮ Z DB SE VŠEMI DATY, KTERÉ NAVÍC V TOMHLE ŘEŠENÍ K NIČEMU NEPOTŘEBUJEŠ. Zákazník mě (MĚ .. CHÁPEŠ .. MĚ) naposled jeb*l za to, že ten upgrade je ještě horší než před tím.
A takhle já tu občas teču :(
@ted
No to teču taky. Pár takových kusů, mladých i starších, máme taky. To se pozná rychle, otázka je co s tím. Code review zase zdržuje a obtěžuje ostatní, taky vyvolává mezi některými dokonce dlouhodobé spory. Oh, jak lidské ... A bez toho zápalu to je prostě marný, je to marný, je to marný ....
Pak je tu ale ještě množinka horlivých s velkým egem, tam to učení jde taky pomalu. Ale aspoň jde ...
Takže na zásobníku se ocitne jediný pointer na to asociativní pole. A to i bez reference.
Protože všechny proměnné jsou (jako v každém dynamicky typovaném jazyce) jen jména s jednoduchou strukturou s odkazem na hodnotu.
Navíc pokud je pole jen pro čtení, tak existuje stále jedna jediná kopie pole, ať jí předá na kolik bambiliónů míst chce. Protože pole se zkopíruje až při změně pomocí mechanismu "copy on write".
Miloslav Ponkrác: "Takže na zásobníku se ocitne jediný pointer na to asociativní pole. A to i bez reference."
Nemate pravdu.
PHP:
$t=array();
for ($i=0;$i<2000;$i++)
$t[]="fucking ".$i;
rekurze($t,0);
function rekurze($t,$level)
{
echo $level." ".memory_get_usage()."\n";
$t[]="novy prvek";
if ($level<20)
rekurze($t,$level+1);
}
php test2.php
0 503536
1 573256
2 642944
3 712632
4 782320
5 852008
6 921696
7 991384
8 1061072
9 1130760
10 1200448
11 1270136
12 1339824
13 1409512
14 1479200
15 1548888
16 1618576
17 1688264
18 1757952
19 1827640
20 1897328
Zajimave ale je ze pokud vynechame radek $t[]="novy prvek"; tedy nemodifikujeme pole, pak se alokovana pamet nemeni.
php test2.php
0 503336
1 503368
2 503368
3 503368
4 503368
5 503368
6 503368
7 503368
8 503368
9 503368
10 503368
11 503368
12 503368
13 503368
14 503368
15 503368
16 503368
17 503368
18 503368
19 503368
20 503368
s referenci:
<?
$t=array();
for ($i=0;$i<2000;$i++)
$t[]="fucking ".$i;
rekurze($t,0);
function rekurze(&$t,$level)
{
echo $level." ".memory_get_usage()."\n";
$t[]="novy prvek";
if ($level<20)
rekurze($t,$level+1);
}
?>
php test2.php
0 503560
1 503592
2 503592
3 503592
4 503592
5 503592
6 503592
7 503592
8 503592
9 503592
10 503592
11 503592
12 503592
13 503592
14 503592
15 503592
16 503592
17 503592
18 503592
19 503592
20 503592
S referenci s unikatnim prvkem
<?
$t=array();
for ($i=0;$i<2000;$i++)
$t[]="fucking ".$i;
rekurze($t,0);
function rekurze(&$t,$level)
{
echo $level." ".memory_get_usage()."\n";
$t[]="novy prvek ".$level;
if ($level<20)
rekurze($t,$level+1);
}
?>
test2.php
0 503560
1 503632
2 503672
3 503712
4 503752
5 503792
6 503832
7 503872
8 503912
9 503952
10 503992
11 504032
12 504072
13 504112
14 504152
15 504192
16 504232
17 504272
18 504312
19 504352
20 504392
Chovani hashmapy v PHP, nebo jakze se to jmenuje :)
Porad lepsi jak bez reference. :)
@t
Nenapsal jsi která verze PHP. Každopádně u PHP 7 to funguje v podstatě stejně. Když pole modifikuješ, tak se vytvoří pro danou proměnou nové a to se modifikuje. Když to uděláš pro pole které je má referenční vztah a modifikuješ ho, tak se vytvoří nové, na něj ukazuje reference a to se mění, pouze ale proty, které mají tento referenční vztah.
@t
Jinými slovy můžeš sice předávat proměnou a ona se nerozkopíruje, nicméně jakmile změníš její hodnotu tak se zkopíruje do nové, navíc ještě se scope. S použitím ampresandu se mění pro všechny které na které ukazuje, takže by se dalo říct, že se zkopíruje méněkrát. Tedy pro php 7.1:
echo 'Start:'. memory_get_usage() . "\n";
$array = array_fill(0, 100000, 'x');
echo 'Allocked:'. memory_get_usage() . "\n";
function case1($array)
{
$array[0] = 1;
echo 'Changed:'. memory_get_usage() . "\n";
return $array;
}
$array = case1($array);
echo 'End:'. memory_get_usage() . "\n";
Start:358720
Allocked:4553120
Changed:8747488
End:4553120
Pokud bude proměná vrácena z funkce do nové, 'End' bude samozřejmě 8747488. Opět přijde na zkopírování. Ale pokud je použita PHP Reference:
echo 'Start:'. memory_get_usage() . "\n";
$array = array_fill(0, 100000, 'x');
echo 'Allocked:'. memory_get_usage() . "\n";
function case2( & $array)
{
$array[0] = 1;
echo 'Changed:'. memory_get_usage() . "\n";
}
case2($array);
echo 'End:'. memory_get_usage() . "\n";
Start:353328
Allocked:4547728
Changed:4547752
End:4547752
Jak je vidět, při předávání proměných a jejich změnách, byť nepatrných může usage vyletět na násobky ...
Což je přesně to, co jsem napsal. Pokud se pole nemění, můžete si jeho kopii předat klidně miliardkrát jako parametr funkce/metody, a žádná paměť se nealokuje. Stačilo umět číst, a nemusel jste mi odporovat, abyste zjistil, že mám pravdu, a následně se mnou souhlasil.
Pro mě jsou hlavně cennou zkušeností počty plusů a mínusů pod mým příspěvkem, kde jsem to napsal. Momentálně je tam vidět, že pouze 1 (plus) člověk něco umí, a 5 (mínusů) lidí umějí kulové a neví, která v programování bije.
Vy jste nakonec zjistil, že mám pravdu.
A já vám ještě prozradím sladkou novinu, že toto zdaleka není vlastnost jen PHP. Stačilo by o tom programování něco vědět.
Ale nenechte se pánové rušit. Dále nadávejte na mladé, jak nic neumějí. Je to v kurzu. Když ještě přidáte plačky, jak jsou ženy v IT diskriminovány, a do toho si zanadáváte na Linuse Torvaldse, jak hruše se chová - tak jste zcela moderní a progresivní kousci.
Je zvláštní, kolik keců naděláte. Přitom já jsem psal průzračně a jednoduše, a nezpochybnili jste ani čárku z toho co jsem napsal. Kolik slovní vaty a slovní mlhy se snažíš vypouštět, abys to nemusel přímo napsat.
Takže se nenech rušit v nadávání na to, jak je mládež špatná v programování.
@Miloslav Ponkrác
1. Nauč se číst, já se mládeže zastal s tím, že je to o lenosti a hlouposti, nikoliv o věku, rozumbrado
2. To co jsi napsal platí jenom pro php 7+ . Pro php 5 to tak úplně neplatí protože ta používá tabulky s odkazy ta uložené proměnné, takže jakákoliv alokace způsobila nárust paměti - ne přímo o samotnou proměnou, ale o zápisy do jednotlivých tabulek - byly 2, tedy : 2 * 8 B tuším per nová proměná ... nevysvětli jsi nic krom toho že dokud proměnou nezkopíruješ tak se nevytváří nová, ale o tom jak pracuje s interními referencemi - což se liší pro php 5 a 7 jsi neplácl ani to "liší se" ... takže výsledek je akorát tvoje polomoudro které ví 3/4 programátorů které to aspoň trochu zajímá a ještě napůl správně + samozřejmě hromada keců, urážek a šťopuchanců.
3. V souvislosti se spatlanými programy nebyla řeč jenom o alokaci proměných ale absenci správných návyků vůbec.
Miloslav Ponkrác
Zpochybnil. Vy jste v prvni vete psal ze na referencich nezalezi. At tak ci tak, ze se predava vzdy pointer. A ja proste jen ukazal ze zalezi a to jako dost. Takze pouziti referenci proste znacne zmensuje uziti RAM konkretne v techto pripadech a to u jakekoliv appky je vitana vlastnost. Psal jste i o COW, coz samozrerjme taky funguje, ale nevyvraci to fakt, ze na referencich proste ZALEZI a basta fidli. Ad slovni vata. no pokud vam vadi 4 ukazky kodu, mereni a vysvetleni predrecnika, poridte si ctecku psaneho textu, ta vam to precte a nemusite cist slovni vaty. :) A nebo to proste nectete a je klid.
Jj, denšní produkti VŠ ani netuší, že třída (rep. instance objektu) má nějaký overhead v podobě tabulky metod, VMT, volitelně tabulky se jmény metod/atributů,... Pak se používá třída místo struktury a najednou se swapuje, i když je tam jenom zlomek toho, co vezmou v paměti čistý data.
2Kentan z Montargi ...
"Záleží jak kde (jazyk) se s datovými strukturami zachází ..."
"Spíš mluvíš jako zapšklý pamětník, který moc neví o dnešním programován..."
Zalezi jenom na tom, ze ten debil co ti pise o tom nema ani paru. On vubec netusi ze to neco sezere pamet. A pricina je mimo jiny prave v tech jazycich, ktery vsechno delaji "samy", takze ten patlal vubec nevi, ze to nekde alokuje pamet. Jeste horsi sou pak vytvory, ktery ani neumoznujou s tim neco udelat, protoze prece GC a dalsi krutoprisny samoserozni veci. Pak to vypada tak, ze hello world ma 8MB ... a nedelam si prdel ani trochu vyzkousej si to, nahod si posledni visualko od M$, mozna se ani do tech 8MB nevejdes. To co ve skutecnosti ani zdaleka nepotrebuje ani 1kB.
@j
IMO nemůžeš debatu o výhodách a nevýhodách vyšších programovacích jazyků, byť jenom o alokaci paměti a GC, sploštit na velikost "Hello World". To je v praxi něco jako "pokusy platné ve vakuu".
Kdybys pak takovou velikostní soutěž chtěl vyhrát, tak to napiš v asembleru a máš vyhráno - dokud v tom nebudeš muset napsat třeba web Amazonu kde se každý den věci přidávají a mění s důrazem na uživatele a výdělek, nikoliv velikost v [kB] nebo [MB] když jenom denní pohyby dat mezi uzly mají v [TB].
Automatická správa paměti má své výhody a své nevýhody, záleží na tom na co a kde to potřebuješ.
A jsou lidi s pomýlenými názory, kteří si myslí, že objekt/třída = automaticky neefektivita a overhead. I takoví se vyskytují mezi námi.
Jsou lidí, kteří si pletou syntaktický cukr programovacího jazyka (třeba třídy) a myslí si, že to automaticky povede k neefektivní binárce a velké spotřebě paměti.
Objektové programování je především programátorské paradigma, nikoli nutně neefektivní program s enormní spotřebou paměti.
To budou asi ti nezkušení a neznalí mladí programátoři, co nic neumějí...
já si zrovna nevzpomínám že bi ucitel na hodině ukazoval použití struktur párkrát se o tom sice zmínil ale příkladů na to moc nebylo obvikle to bylo stylem :
class <nazev> {
<typ> pronenna {get;set;}
...
}
zajímavé taky je že u jednoho příkladu (pohyb autíček(libovolného počtu) po dráze) jsem od učitele slišel že to nejde udelat bez listů a tríd a přitom z vlastní skušenosti vím že hodně věcí jde udělat bez struktur/tříd a to stilem:
float []polevektoru_x;
float []polevektoru_y;
...
a ten libovolnej počet jde řešit tím že naklikat tam 10000 objektů to by si komise teda dala práce aby zjistili že to spadne
Petr M. >> "Jj, denšní produkti VŠ ani netuší, že třída (rep. instance objektu) má nějaký overhead v podobě tabulky metod, VMT, volitelně tabulky se jmény metod/atributů,... Pak se používá třída místo struktury a najednou se swapuje, i když je tam jenom zlomek toho, co vezmou v paměti čistý data."
Vy z toho programování také moc neumíte, že ne?
Ve velké řadě programovacích jazyků nemá třída oproti struktuře overhead naprosto žádný, pokud se budeme bavit o datových členech (atributech). Objektové programování není primárně o neefektivitě.
Z principu, třída má vždycky overhead. Obsahuje metody (= funkce a nějakou strukturu ukazatelů na ně) a atributy (tam se to neliší od struktury s daty až na to, že je tam pár ukazatelů navíc - metody atd.). Navíc funkce, která implementuje metodu, musí mít skrytý parametr s odkazem na datovou strukturu (this v C++, self v ObjectPascalu,...).
Pokud zavedeš polymorfismus a dědění, tak se zavedou ještě tabulky VMT, reference na třídu předka apod.
Hodně z toho sice dokáže vyházet kompilátor, ale v případě, že chceš několik instancí třídy, neobejdeš se bez předávání reference na data (tam je overhead minimální - v podstatě skrytý předání parametru funkce). Pokud máš jedu instanci, je to zbytečný overhead. A pokud chceš dědit, tak jinou možnost, než přidat VMT, v podstatě nemáš (a to už je často efektivnější DI nad prostými daty).
V případě dynamické alokace třídy máš navíc k instanci ještě nějaký header na heapu, který je použitý pro správu paměti (minimálně velikost bloku + odkaz na další použitý blok), předpokládejme 16B v 64b systému. Uděláš pole[16] a máš na heapu režii 16B. Zavoláš v metodě pro init pole objeků 16x konstruktor a jdi kde? Storage třída + 16x datová třída, to je 272B jenom v režii heapu... 17x víc, než by zabralo prostý pole dané velikosti, získaný přes malloc.
A čitelnost je diskutabilní. Bez použití tříd totiž nemusím dělat override indexace pole a podobný vopičárny, jde použít přímo nativní indexování v kompilátoru, inkrement pointeru,... Prostě je to pole, použiju data[5].size a je to.
2ted: "...logy na serverech bobtnají, místo dochází, stroj swapuje jak o život."
nj, to je easy, tak se prohlasi ze za to muze ddos a jede se dal. Priklad? Co te napadne ze se stane kdyz vydas novou hru? Nj, napadne i pomerne slusnyho blbce, ze bude naval ze? A PRESNE tady je moznost vyuzit ty cmoudy. Potrebujes vykon, ale potrebujes ho na 14 dnu, mozna mesic. Ale svist to ze to nefunguje na ddos je prece jednodussi, no ne?
A cim to je? Mno on je totiz nikdo neuci myslet, ne do hloubky, ale vubec. Ale na tom se tak nejak nic nezmenilo, to neni zadna novinka, jen dneska mnohem vic lidi ceka, ze je jako v ty skole nekdo neco nauci, kdyz prave tam to ucej ti nejvetsi pitomci. Kdyby byli jini, tak prece nedelaj za 30 ucitele, kdyz muzou za 300 programovat. (BTW: chces jit ucit ucne drzet v ruce pilnik? Mno tak na to musis mit VS ... kdo toto "vymyslel" tak musel mit mist drzky opravdu velkou PYCU)
Pred tema 30+ lety zadny skoly a it/programovani/... nebyly a tudiz se kazdej musel pekne vsechno naucit sam === sam si najit informace, sam si to vyzkouset. Dokonce i kdyz si chtel hrat hru, musel si hodne veci vedet a umet. Ne jako dneska ze si kliknes na ikonu a tim koncis.
2ted: Dnesni mladez uz neumi ano guuglit napisou svuj domaci ukol sem a cekaj ze tu dostanou vysledek.
Navic naprosto netusej co vlastne dela HW, netusej ani co dela SW ... nemaj vlastne vubec paru o programovani, protoze jim voe nekdo rek ze za to voe bude skvara. Klidne se ti muze stat, ze prijde "programator" a netusi co to je smycka. Zato je schopnej se stebou dokrve hadat o tom, kterej "frejmwork" je lepsi.
Kdyby jen netušili. Oni někdy i anti-tuší. To se pak dozvíte, že procházet všechny prvky ve smyčce by bylo pomalé, takže místo toho použili Linq s .Where a jako bonus přihodili .OrderBy.
Touhle "magií jak zpracovat pole hodnot v konstantním čase" jsou prolezlí zejména uchazeči, co mají v životopise několik funkcionálních jazyků. Někteří si za tím dokonce stojí a sypou z rukávu termity jako "lazy evaluation" nebo dnes populární "paralelně".
* Zaprvé je špatná škola, což je patrné už z obvyklé mantry "ve škole nás učili, že..."
* Zadruhé jak píšete - nikdy nezpracovávali takový objem dat, aby se to projevilo.
* Zatřetí jsem za to vlastně rád. Podstatná část mé pracovní náplně spočívá v ladění výkonu aplikací. Je to rok od roku snadnější. Ne že bych se nějak extra zlepšoval, ale profilery fungují rok od roku lépe a vývojáři tam sází čím dál tím větší boty. To pak stačí třebas vyměnit List za Dictionary, report rázem místo 20 minut běží 2 minuty a já mám splněno, protože report zase dobíhá dříve, než timeout uživatele odhlásí.
Autoři by to mohli udělat také, ale prostě je to nenapadne a na 100 záznamech to funguje bleskově. Já ladím až na datech zákazníka, kde je záznamů třebas 20 milionů a místo 89 milisekund to běží čtyři hodiny. Profiler obvykle píchne prstem přesně na ten řádek, kde je problém. Kupříkladu minulý týden to byl jeden legrační substring. A ano, autor si myslel, že substring je oprace fungující v konstantním čase.
@Karel
Dovedu pochopit že člověk který na to nemá školy (třeba nadšenec), nebo je snad škola kterou má špatná jak píšeš, že si na tomto prostě musí alespoň jednou vylámat zuby. Ale zlom podle mě přichází tehdy, když se s těmito tématy onen člověk setká, vykašle se na to, nejeví zájem a patlá dál ...
No kupodivu se tomu místy dá rozumět. Zprvu mne napadlo tolik PUSH a POP namísto PUSHA, POPA..jenže rok výroby to vysvětluje :-)
.
Jinak s tím dolarem na konci stringu je to tak, že DOS pochází ze CP/Mky (tipuji 80%). A samotné CP/M vychází z DECovského OS11, který vychází z DECovského OS8 a ten měl šestibitové kódování znaků Radix50. Tedy celou velkou abecedu, cifry 0 až 9, mezeru, tečku, procento a doláč. Nic víc. A ten jediný $ se jevil na ukončení asi tak nějak nejlépe.
PUSHA/POPA existuje až od 286. Ale hlavně, PUSHA sežere mnohem více zásobníku než PUSH jen potřebných registrů. A zásobník je při API operačního systému asi ta nejkritičtější věc. Každý použitý bajt na zásobníku operačním systémem je velké, převeliké zlo, a může být tou poslední kapkou do pekla.
S tím dolarem je to tak, že dolar byl všeobecný oddělovač všude možně. Dolarem se oddělovaly v assemblerech příkazy assembleru (pseudoinstrukce) od instrukcí. V řadě databázových strojů, například MySQL je dodnes dolar jediným oddělovacím znakem, který nemusíte v identifikátorech databázových objektů (tabulek, procedur, ...) escapovat.
Fakt není třeba ze CP/M a Gary Kildalla dělat vynálezce dolaru jako terminátoru/separátoru věcí. I ten Gary Killdal to jen sprostě obšlehl třeba z kompilátoru assembleru, ve kterém napsal svůj CP/M. Každý, kdo v té době žil - včetně Billa Gatese - nasázel dolar jako terminátor/separátor na řadu míst. Dělal jsem to tak i já, a fakt jsem to neobšlehl od nějakého CP/M.
Takže když se Gary (jak tu kdosi navrhuje níže) zeptá Billa Gatese, proč řetězce v API int21h, al=9 končí dolarem, jednoduchá odpověď bude: "Protože jsem to ty kluku ušatá, Killdalová opsal z konvencí všeho kolem, stejně jako ty."
1) Prostě CP/M měl své API, a to API implementoval i QDOS a později MS-DOS. Jinak řečeno, nikdo nic neopsal, pouze se nezávisle implementovalo určité rozšířené API.
2) Řetězce ukončené nulou (ála COBOL a C) bylo tehdy revoluční rozhodnutí. Řetězce se ukončovaly namnoze jinými znaky.
Zdrojaky DOSu 6.2 vratane command.com a niektorych dalsich systemovych utililt onoho casu behali po internete a slo ich stiahnut. Mozno sa to da este aj dnes. Nic moc sa nezmenilo, je to prakticky 100% assembly.
Jediny vtipny moment sa dal zazit pri grepovani nadavok. Mari sa mi, ze v kode ovladaca konzoly / podpory ANSI sekvencii sa nachadzal komentar autora DOSu 5, ktory nadaval na to, ako ten ovladac sprasili ludia v DOSe 4.
Venoval som aj trochu casu pokusu o skompilovanie. Prilozenym prekladacom to neslo, lebo sa nedokazal spustit na nicom, co som prave vtedy mal po ruke a ten kod (resp. skor makra) neslo zasa prelozit na nijakom modernom assembleri.
Drdos uměl dobře zničit master boot hard disku. Myslím, že to umí dodnes skvěle. Drdos měl obslužné rutiny napsané v Borland Turbo C, žádný asm. Pak ale Drdos koupil Novell (přidání síťových funkcí), pak Caldera Linux nebo jak se to jmenovalo, a kdo ví kam to šlo. Drdos měl ale přístupová práva na soubory/adresáře a task switcher (jako v MS-DOS 4).
Pokud jsem potřeboval MS-DOS, tak jsem si vypreparoval ten z Windows 95. Tuším, že se hlásí jako MS-DOS 7 a umí spousty věcí navíc proti tehdejším předchozím verzím. Mimo jiné uměl FAT-32.
FreeDOS je teoreticky lepsi, ale prakticky to tak neni. Ma znatelne horsi kompatibilitu s HW nez originalni MS-DOS, coz v praxi znamena, ze obcas nejde nabootovat, protoze neco udela spatne a zasekne se; hodne je to viditelne na starsim HW, na kterem MS-DOS behal dobre. Uz jsem to dlouho nepouzival, ale snad byl treba problem s disky, ktere nepodporovali DMA; treba CF karta. Pro MS-DOS to nebyl zadny problem, ale FreeDOS, Linux i FreeBSD z takove CF karty nabootovat neslo; teda bootovat se zacalo, ale pak to zacalo vyhnivat na DMA timeouty.
Modernejsi neznamena vzdy lepsi, treba ted o vikendu me velmi neprijemne prekvapilo Ubuntu 18.04. Neumi vypalit DVD, bezny iso pro Ubuntu jsem tam nevypalil, porad mi hlasil nejake HW chyby media; zkousel jsem ruzne typy DVD, a porad to neslo. Uz jsem chtel vyhodit vypalovacku do srotu, ale v Ubuntu 16.04 probehlo vypaleni na prvni pokus; stejna DVD mechanika, takze vypalovacka i media jsou ok. Verze 18.04 je zase takova nepodarena, zustavam u 16.04 a cekam na 20.04... :-(
FreeDOS je z trojice (Drdos, Freedos, Msdos) absolutně a s přehledem nejhorší a nejméně kompatibilní.
Drdos/Novelldos/Calderados/Opendos (seznam různých názvů téhož) první co udělá je, že přepíše master boot, aby mohl hard disk zaheslovat a znepřistupnit, když neznáte heslo. Což je featura, která je spíše ke vzteku než k užitku. Ale jinak se Drdos snažil, protože se snažil vyšoupnout Msdos z PC. Sám jsem Drdos několik let používal.
Problém Msdosu je, že seznam oficiálního API je k ničemu. Byly zde stovky, možná tisíce nedokumentovaného API, které bylo široce používáno programy. Bez implementace tohoto API to řada programů a věcí nerozchodí.
Drdos a Msdos se snažily implementovat i to nedokumentované API. Msdos proto, že ho vymýšlet, Drdos proto, že chtěl Msdosu konkurovat. Freedos to implementoval jen tehdy, pokud našel popis v Ralf Brownově popisu přerušení (http://www.cs.cmu.edu/~ralf/files.html).
Ledaže by si nejdříve Bill Gates zašel do Startreku, vypůjčil si stroj času a odjel do budoucnosti kopírovat Linux.
Kromě toho Microsoft koupil unixový operační systém Xenix, který o nějakou dobu později předal SCO.
Mimochodem, víte o tom, že Linux vykradl unixové os a minix?
Tak pak ne. Microsoft si koupil skoro hotový produkt a jen na to nalepil vlastní nálepku.
Navíc z pohledu na oddělovač řádků (CR+LF) je vidět, že prapředci MS-DOSu jsou jiná vývojová větev než Unix (LF).
No a ještě ten rok vzniku, 1981. Tehdy na open source nikdo nevěřil. Vše bylo buď komerční nebo public domain.
V té době jste si OS musel koupit za drahé peníze, nebo jste ho dostal v ceně velmi drahého HW. MS-DOS byl v tomhle vlastně revolucí, protože byl v porovnání s konkurencí levný. Během jediného roku si ho licencovali desítky firem vyrábějících počítače. A v té samé době měl Microsoft i další OS, Xenix. Což byl licencovaný Unix. A dokonce se jim jeden čas dařilo být nejrozšířenější licencovanou verzí Unixu.
Free Software Foundation vznikla až o 4 roky později, v roce 1985. GPL pak ještě o další 4 roky později, v roce 1989.
Linux přišel v roce 1991, deset let po MS-DOSu.
No a Open Source Initiative vznikla až v roce 1998.
Nám to možná všechno přijde jako pravěk, ale stejně by bylo fajn pamatovat si posloupnost. To aby pak člověk nesypal kraviny typu "Microsoft ukradl OS jedenáctiletému klukovi!"