Jak Whitespace tak i Piet se daji skutecne dobre pouzit pro "skryvani" kodu, ale chce to udelat malicke upravy. Hlavne u Whitespace je nevyhoda, ze reaguje na kazdou mezeru, takze nejde nacpat "nenapadne" uplne vsude. Dtto Piet rozeznava velke zmeny barev, ale tady to jde upravit, ze se bude divat napriklad jen na nejnizsi bity, kde to oko nema prakticky sanci rozeznat.
Tak jsem si konečně vzpoměl na ten pekelný jazyk, o kterém jsem se zmiňoval u minulé epizody: je to MAGENTA (https://esolangs.org/wiki/Magenta) - pozor, neplést si s projektem Magento.
Proti takovému Whitespace je Magenta opačný extrém. Jeho hlavní cíl je být navržený komisí a podporovat všechny myslitelné "kritické" featury. Prostě Enterprise jazyk par excellence.
Bohužel pro něj není implementace a tak Magenta existuje jenom ve formě specifikace. Kdo má zájem psát echt-Enterprise kód má smůlu. Nicméně i ta specifikace stojí za to. Magenta má přes 80 klíčových slov, desítky operátorů, nesmírně složitou (a výřečnou) syntax, redundantní podporu vyjímek, obzvlášť "rafinovaný" objektový model vzájemně prokombinovaný s nepoužitelnou podporou multithreadingu, mimořádně sofistikované GOTO, ale samozřejmě taky COMEFROM a i pověstné ALTER z Cobolu.
COBOL bude urcite. Fortran je skutecne fajn (kdyz pomineme ty snahy o OOP atd. :) ale stary dobry F77 nebo F90 je skutecne svym zpusobem elegantni), ale mel to ten jazyk tezky - viz Fortran Saga (http://www.fortranplus.co.uk/resources/brian_meeks_fortran_saga.pdf), je to zajimave cteni.
Ale i Fortran má (měl) krásné mouchy. Jednou z nich je, že ve Fortranu se nedeklaruje u parametrů procedur, jestli jsou vstupní nebo výstupní a kompilátor ani nemá žádnou možnost, jak to kontrolovat. Takže je možné zavolat proceduru, která používá parametr jako výstupní, a předat jí konstantu. A pokud jste takto proceduře, která vracela 2, předali jako parametr konstantu 1, tak od té doby všechny konstanty 1 v programu měly ve skutečnosti hodnotu 2. Asi si dovedete představit, jak dobře se podobné chyby hledaly.
Asi zalezi na tom, jak to bylo prelozeno a jak se to snazi reprezentovat ty obrovske integery. Na Linux Mintu a platforme x86_64 to vypada tak, ze pamet prakticky vubec neroste (mozna o par stranek) a po prvnim milionu prvocisel uz me prestalo bavit sledovat, jak ten vypocet ne a ne spadnout a jen vyzira baterku :)
Já jsem onehdá omylem vlezl na nějakou jablíčkářskou přednášku o Swiftu a oni se tam všichni nad ním docela rozplývali, jak to konečně vyřeší všemožné problémy a nepříjemnosti Objective C.
Sice znám Objective C jen z vyprávění a ze zlomyslného nahlížení přes rameno svým jablkem postiženým kolegům, ale i to málo mi stačí, abych z něj měl vždy kopřivku. Na druhou stranu ten Swift rozhodně nevypadal špatně a některé věci jsem i vcelku záviděl.
Ajo ja to z jeho vylevu pochopil mozna dost podobne:
1) today-2_roky: "Objective C je nejlepsi, vy Javisti (dopln sam dalsi) tomu proste nerozumite, ale je to naprosto genialni a proste Apple umi a jede"
2) today-1_rok: "No divej jak Apple vali, ted maji novy, lepsi, krasny jazyk Swift, jeste jsem to ale nezkouknul, ale dopredu vim, ze je to bomba:
3) today: "Ale vsak Objective C fakt stal za hovno, Swift je mnohem mnohem lepsi, odtedka zacne raj, jo a Apple proste jede"
Objective C není tak špatné (a mimochodem Apple ho používá, ale nevytvořil ho. A NeXT ho taky nevytvořil). Zato Objective C++ je paskvil století.
Ale jinak máte pravdu. Těmhle jabkářům nejde o výhody a nevýhody nějaké konkrétní technologie, ale o to, že nějak souvisí s Apple. Včera byli paf z Objective C, dneska je to Swift, který je pochopitelně tisíckrát lepši, než Rust, chachá, ačkoli o Rustu vědí p*d a kdybyste je mučili, nedokázali by vysvětlit, čím je nějaký jazyk lepší, než jiný.
Někdy si říkám, že kdyby Apple vydal MS-DOS 1.0, tak z něj budou v extázi :D
Jop, ted jsem se dival na http://www.tiobe.com/tiobe_index a tam je videt, jak ovecky poslusne prechazi z Objective C na Swift. A az Apple prohlasi neco dalsiho za "to nejlepsi pod sluncem", tak uvidime dalsi poklus o dum dal :-)
Je samozřejmě pravda, že Swift výborný jazyk skutečně je. Dle mého názoru je určitě lepší, než Go. Z té vlny nových jazyků, do které kromě Go patří i D a Rust, mi připadají jako jednoznačně nejzajímavější právě Swift a Rust. Který z nich je lepší, záleží na problému. Swift je řekněme taková mnohem lepší Java, Rust je mnohem lepší C++.
Pavle, moc dik za tento clanek
Vubec jsem netusil, ze existuje neco jako DC a pouzival jsem BC a strasne jsem na to nadaval, protoze je to na pouzivani ve scriptech naprosta silenost.
Ovsem DC vypada, ze je podstatne jednodussi, odted ho budu pouzivat misto bc
$ echo 30k10vp | dc
3.162277660168379331998893544432
Mimochodem, kdo tvrdi, ze Postscipt je esotericky jazyk by mel tisknout na posveceny papir :-) Zasobnikove jazyky jsou skvele. Jsem velkym priznivcem RPN kalkulacek. Mam ve sve sbirce 4 packardy ze "stare skoly" (hp12c, 15c, 16c a 28c) a wp34s. I proto se mi tak libi Forth a Postscript :-). Mimochodem, mezi 15c a wp34s (ktera se vyrabi z hp30b preflashovanim) je naprosto sileny rozdil rychlosti. Pocital jsem poslednich 10 mist triste iterace tetranacciho. Na hp15c z roku 1982 to trvalo asi pul hodiny. Mezitim jsem portoval program na wp34s, odladil a spustil a bylo vypocteno driv nez dobehla ta hp15c :-). Trvalo to kolem pul sekundy :-) A uz jsme zpatky u tech esoterickych jazyku - programovat tyhle kalkulacky je uz taky pekny esoterismus :-)
Mimochodem baterky v tech kalkulackach menim prumerne jednou za 5 az 10 let. Chtel bych takovej telefon co by se baterky menily jednou za 5 let...
To jste mi připomněl jedno školení MS-DOSu z 90. let. Tam nám školitel naprosto vážně tvrdil, že pipy, adresářovou strukturu atd. okopíroval UNIX z MS-DOSu (a vůbec byl podle něj ten UNIX na nic). Když jsme ho upozornili, že jeho tvrzení odporuje kauzalitě, byl nesmírně překvapen.
Multitasking by na není nutně potřeba. Dal by se prostě alokovat buffer nebo ramdisk, výstup z prvního programu uložit do něj místo na disketu, pak spustit druhý program a naservírovat mu to do stdin. Možná, že to Vilda Branka udělal takhle spíš kvůli omezené kapacitě RAM, i když je samozřejmě jasné, že 640K bude bohatě stačit každému :)
Ale v pripade zpracovani rozsahlejsich dat by to byl docela problem (mala RAM), navic DOS nemel nikde misto pro buffery, protoze daval aplikacim celou RAM od (tusim) posledni adresy command.com az po 0xa000:0000. Takze jedine pres rezidenty. Az nekdy v pozdejsich verzich s velkou slavou pridali alespon printer spooler (opet takove polovicate reseni) a diskovou cache.
Svět není jenom UNIX. Například CP/M i VMS používaly zařízení s dvojtečkou, řekněme A:, NUL: nebo SYS$SYSDEVICE:. Na VMS jste mohl mít cestu k souboru typu SYS$SYSDEVICE:[USER.DOCS]PHOTO.JPG;5. Jediné co na tom překvapí je to že to uživatelé Unixů považují za zvláštní, zatímco /dev/hda, hjkl-esc a escapování v shellu jim přijdou přirozené koncepty :)
Zajímaly by mě ale ty "prapodivné" příznaky u souborů. Co konkrétně máte na mysli?
Tak uznavam, ze zalezi na preferencich kazdeho soudruha, ostatne zarizeni (jednoznakova) mel napriklad i Atari OS a byl to na svou dobu dobry koncept (zase se ale moc neresily adresare, co taky s nimi na diskete s par desitkami kilobajtu :)
Myslel jsem priznaky (ok atributy) hidden, read-only, system a archive. Mely svuj vyznam, ale zase to bylo takove polovicate reseni (archive by spis mel byt nahrazen casem modifikace, read-only nektere DOSove prikazy ignorovaly, coz se zneuzivalo v ANSI bombach apod.)
Atribut FILE_ATTRIBUTE_HIDDEN říká, že se soubor či adresář nemá prezentovat uživateli v běžném výpisu souborů. Na Unixech děláte totéž pokud jméno souboru či adresáře začíná tečkou. Atribut mi osobně připadá vhodnější.
Atribut FILE_ATTRIBUTE_READONLY dělá zjevné, soubor nelze smazat nebo zapsat. Na FAT jiné permissions nebyly, protože single-user.
Atribut FILE_ATTRIBUTE_SYSTEM označuje soubory, které (exkluzivně) využívá systém. Například swap file.
Atribut FILE_ATTRIBUTE_ARCHIVE je celkem praktický pro zálohy. Když soubor vytvoříte nebo modifikujete, flag se nastaví. Když soubor odzálohujete, vynuluje se. Při inkrementální záloze stačí zálohovat to co má nastavený FILE_ATTRIBUTE_ARCHIVE. Čas modifikace by teoreticky šlo použít také, ale neřekne vám to co bylo už zkopírované pokud proces přerušíte.
Jj já vím, s DOSem jsem dělal dost dlouho. Jenže...toto platí teoreticky. Asi nejznámější je problém s READONLY příznakem. Mno funguje dobře pro DEL a ERASE, prostě uživateli zabrání ve smazání, což je zajisté fajn, ale z nějakého (určitě rozumného :-) důvodu například DELTREE ty atributy ignoruje a smázne všechno.
ARCHIVE má v praxi jeden zásadní problém - pokud se archivuje rozumným způsobem, tj. rotací několika pásek s různou periodou, tak nastavený bit znamená, že se na pásce s delší periodou soubor neupdatuje (protože například při denních archivacích na jinou pásku se bit nastavil). Takže v praxi se na to kašlalo a SW si to řešil jiným způsobem, checksumy apod. S modify_time by to problém nebyl.
Příkaz DELTREE byl zaveden proto aby existoval rozumný způsob, jak smazat podstrom bez ohledu na cokoliv, včetně atributu FILE_ATTRIBUTE_READONLY. Ona ta utilita může atribut FILE_ATTRIBUTE_READONLY změnit stejně jako uživatel.
FILE_ATTRIBUTE_ARCHIVE je super řešení pro jednoduché scénáře. Datum+čas modifikace se také dá použít, s tím že na FAT má přesnost jen dvě sekundy (a dá se změnit přes API, v DOSu i triviálně přímým přístupem na disk). Checksumy jsou trochu nešťastné, protože vyžadují přečtení celého souboru.
Takže defaultně to dělalo bez ptaní rm -rf :-) [btw ATTRIB dokázal, stejně jako na unixech chmod/chown/chgrp použít rekurzivní režim, když na to přijde]
S ARCHIVE je skutečně problém v tom, že jediným bitem se na filesystém zaznamená .... hmm přesně jeden bit informace ... což skutečně stačilo možná tak na nejjednodušší lineární zálohy s BACKUP/RESTORE (se všemi důsledky, protože to není moc profi řešení), ale pro nic jiného. Už jen oblíbená utilitka Make potřebuje čas modifikace, přece nebude sahat na atribut určený pro zálohovací programy. Atd.
No já myslel původní Atari OS na osmibitové mašinky. Tam bylo zařízení S: (screen), D1-D4: (disketovky 1-4), D8: (někdy RAMdisk), C: (kazeťák) a P: (printer), ale šly přidat i další. Takže například kazeťák s Turbem a správným systémem (taky TOS :D) dodal zařízení T: apod. Na systém s velikostí pouhých 16kB dost dobré..
Ale TOS, AmigaOS i RiSC OS byly taky fajn, o tom žádná.
Na tech VMSovejch cestach mi az tak divnyho nic neprijde, trochu me tam prekvapila kdysi ta verze, to je neco navic. hjkl je celkem logickej pristup v dobe terminalu bez kurzorovejch klaves. Shell bez escapovani nemuze plnohodnotne fungovat, bavit se muzem o tom, kolik escapovacich zpusobu v jenom jazyce ma smysl.
Jen nekdo, kdo naprosto ztratil smysl pro realitu (cti "MS") mohl jmena zarizeni naveky rezervovat. Pro ty, kdo se s timto fenomenem nesetkali:
1) v DOSu se sice jmena zarizeni nekdy pisou s dvojteckou na konci NUL: ale ve skutecnosti je ta dvojtecka nadbytecna, takze staci jen NUL
2) konsekvene - neni mozne, nezavisle na adresari, vytvorit soubor stejneho jmena, nikde
3) jmena zarizeni se postupne pridavala a ubirala, takze se lucebnik mohl dockat neprijemneho prekvapeni
(jo a vyuzivalo to ruzne malware, ktere nejakym primym zapisem mohlo vytvorit napriklad adresar, do ktereho uzivatel nemohl atd.)
Souhlas že je trochu nešťastné, že rezervovaná jména zařízení fungují i bez dvojtečky. Vytvoření souboru stejného jména je ale nepravděpodobné, protože soubory v DOSu (i Windows) mají typicky příponu. A rezervovaná jména zařízení jsou jen CON, PRN, AUX, NUL, COMx a LPTx, kde x je 1-9. Nevím jestli byla všechna už v DOSu 1.0, ale nepřipadá mi, že by šlo o nějaké divoké změny.
Ad vyuzivalo to ruzne malware, ktere nejakym primym zapisem mohlo vytvorit napriklad adresar, do ktereho uzivatel nemohl atd. - do takového adresáře se samozřejmě lze dostat. Není to triviální, ale když si vytvoříte na Linuxu adresář se znaky 0x0d a 0x7f, tak se s ním také budete tak trochu prát. Ještě víc se pobavíte, když ve jménu bude "správná" terminálová (ANSI/xterm) sekvence.
No, v Unixu stačí ls -b, případně find . a hned víte, co se děje. A díky skvělýmu escapeování v shellu není žádnný problém s takto pojmenovanými soubory pracovat. V MS-DOSu, pokud vám někdo podobný soubor vytvořil, jste neměl jinou šanci, jak s tím manipulovat (či jen zjistit, že to tam je), než si napsat program (opravdoví programátoři samozřejmě napsali rovnou strojový kód v debugu) a to těžko udělá běžný uživatel.
" Vytvoření souboru stejného jména je ale nepravděpodobné, protože soubory v DOSu (i Windows) mají typicky příponu. "
No problém je, že ono jde i o adresáře, a tam se přípony (většinou) nepíšou, navíc se tato věc dostala i do Windows (tam tedy mimochodem pro NTFS přidali dalších asi deset speciálních a rezervovaných názvů). Ale když se vrátíme k zařízením:
I spent a whole afternoon trying to find the problem with copying files from a Mac computer to a windows file server. After many hours searching in files permissions, windows security preferences, and all sorts of sharing options, I narrowed the problem to some specific folders named ‘aux’. Then I googled it and found this page
A proč to byl a je problém: třípísmenné zkratky jsou totiž v anglicky mluvícím světě použité v mnoha významech, takže i do těchto rezervovaných se není problém strefit při práci v úplně odlišné oblasti (plácnu - kódy letišť například). Takže program, který pro každé letiště vytváří adresář (řekněme z nějakými metainformacemi nebo mapou) zhavaruje u přistinského letiště a adminové se z toho opupínkujou.
Ad jde i o adresáře - souhlas, tam je to trochu nepříjemnost
Ad navíc se tato věc dostala i do Windows (tam tedy mimochodem pro NTFS přidali dalších asi deset speciálních a rezervovaných názvů - Windows mají z důvodu zpětné kompatibility ty samé rezervované názvy jako DOS.
Ad do těchto rezervovaných se není problém strefit při práci v úplně odlišné oblasti - existuje řada stringů, které nelze použít jako název adresáře. Pokud píšete aplikaci, je dobré si přečíst dokumentaci. A ta hovoří celkem jasně:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
Super, přesně takovou odpověď jsem čekal :-) Takže máme sice řešení na dvě věci (protože jsme při opisování z CP/M a potom z shellu moc nepřemýšleli, vic / versus -), ale tím, že se tyto issues (nic jiného to není) napíšou někam do dokumentace se to jakoby vyřeší a blbci jsou uživatelé nebo vývojáři. Díky, to už stačilo, zcela přesně to vystihuje pohled MS na svět SW :-)
Ad při opisování z CP/M a potom z shellu moc nepřemýšleli, vic / versus - - to máte na mysli tu legendu že MS opsal / jako oddělovač parametrů z CP/M, a kvůli tomu musel jako oddělovač adresářů vybrat \? Myslím že je to nesmysl. Svět není jenom Unix. Koukněte se na formáty cesty použité v různých OS:
SYS$SYSDEVICE:[USER.DOCS]PHOTO.JPG;5 -- oddělovač adresářů je '.'
%sysname#module1>SubDir>AnotherDir -- oddělovač adresářů je '>'
Macintosh HD:Documents:Letter -- oddělovač adresářů je ':'
Mimochodem ve Windows můžete jako oddělovač adresářů klidně použít /, protože API ho přeloží na \.
Ohledně rezervovaných jmen souborů: je to prostě legacy. Na Unixech máte podobné historie celý nákladní vlak. Včetně toho že na RAIDu nejde vytvořit 16 partition (ale žádná utilita neřekne proč - až v "dokumentaci" kernelu se člověk dočte o major a minor number), jména souborů mohou obsahovat netištitelné znaky a terminálové sekvence, klíčenky s unixovými FS jsou bez roota nepoužitelné díky permissions, potom třeba celé to harakiri okolo terminálů, drsné travesty show jménem X11, fakt že POSIX neobsahuje API ani pro základní operace se službami/daemons a správu síťových zařízení apod. A uživatel je ve všech těchto případech na posledním místě, jak je na Unixech dobrým zvykem :)
https://www.youtube.com/watch?v=sCNrK-n68CM
Prostě se nesmí stát, aby ses tu alespoň jednou týdně nevy...l.
"Ad při opisování z CP/M a potom z shellu moc nepřemýšleli, vic / versus - - to máte na mysli tu legendu že MS opsal / jako oddělovač parametrů z CP/M, a kvůli tomu musel jako oddělovač adresářů vybrat \? Myslím že je to nesmysl."
No a proto napriklad služba v CP/M pro tisk řetězce vypadá takto:
- číslo callu: 9
- adresa řetězce: v DE (registrový pár)
- řetězec ukončen znakem $
Podobná služba v DOSu:
- číslo callu: 9
- adresa řetězce: DS:DX (jsme na zcela odlišném CPU, takže proto)
- řetězec ukončen znakem $
No na to, že se jedná o jiné systémy na kompletně odlišnou architekturu se tedy MS trefil móc pěkně :-)
Ty náhody...
Tu legendu o / a \ jsem se dozvěděl někdy začátkem devadesátých let, kdy to byla ještě celkem čerstvá zpráva. O major a minor number jsem četl v dokumentaci M$-DOSu. Harakiri okolo terminálů jsem nezaznamenal. X11 je geniální věc z osmdesátých let, dnes trochu antika. Windows jsou geniální věc ze sedmdesátých let, pravěk. POSIX obsahuje všechno co je potřeba, tuhle jsi vychvaloval Widle že ho také splňují. Kde tam máš démony?
Mimochodem, jsi vtipný jak Petr Novotný týden před smrtí.
Je to tak. Struktura adresáře je (nebo aspoň byla) posloupnost záznamů (inode, name) kde name je ukunčené NUL, takže uvnitř NUL být nemůže (není tam žádný escapeovací mechanismus).
A lomítko je už ve voláních jádra interpretováno jako oddělovač adresářů, opět bez možnosti escapeovat.
Takže pokud do adresáře propašujete NUL, tak ho rozbijete. Pokud tam propašujete lomítko, tak vytvoříte nepřístupný záznam.
NUL jde do jména propašovat jen na filesystémech, které používají řetězce s délkou. Většina linuxových FS ovšem používá klasické céčkové zero-terminated stringy (buď ve specifikaci, nebo v implementaci).
Lomítko i NUL ale neprojde přes volání jádra, takže jediný způsob jak to tam dostat, je bez vědomí jádra (přímý přístup na disk, nebo v jiném operačním systému). Tam kde se takové znaky dají čekat, to kód filesystému v linuxovém kernelu typicky nějak řeší. (Většinou ty znaky nahradí nečím jiným).
Neni zac, jsem rad, ze se clanek libil :)
Ja dc pouzivam docela pravidelne, jsem na RPN zvyknuty. Jen me pripadne skoda, ze napriklad Forth neni vic rozsireny, zejmena v oblasti dnes tak popularnich IoT. Lidi se napriklad snazi na cip s 64kB nacpat interpret Lua nebo MicroPythonu a potom jim zbyde jen par bajtu na vlastni program. V pripade Forthu by to bylo presne naopak :)