Důležité upozornění!

Policie České republiky a šéfcensor Ústavu pro studium totalitních režimů Jaroslav Čvančara varují: citovat jakékoli texty z tohoto blogu způsobuje vážné risiko trestního stíhání! Četba na vlastní nebezpečí!

Počítače

Že nejdůležitějším dělítkem mezi lidmi není pohlaví, jsem tušil odedávna. Byly doby, kdy jsem měl za to, že tato pomyslná hranice vede mezi kuřáky a nekuřáky. Dnes vím, že je tomu jinak, a minimálně vzdělanější část populace se dělí na ty, kteří věří v existenci záporné nuly, a ty, kdo její existenci popírají. Sám se sice řadím vášnivě a nekompromisně mezi antiminusnulisty, avšak mám za vnitřně obohacující všímat si argumentů, s nimiž minusnulisté přicházejí a jimiž oblažují laický, jakož i pseudoodborný diskurs.

Co je podle nich minus nula? Zkuste se jich zeptat, a po chvilkovém dotazování z nich nejspíše vymámíte odpověď, že je to největší možné záporné číslo – případně takové, o kterém víme, že je ještě záporné, ale jehož absolutní hodnota je nula. Tedy ta kladná.

Což mi trochu připomíná příběh z mého (notně útlého) dětství, kdy jsem, robě již tehdy nesnesitelně zvídavé, neustále obtěžoval otce dotazy, jak se jmenují velká přirozená čísla, a když mi otec vysvětlil, co je to miliarda (milion jsem znal již dříve), bilion, biliarda, trilion, triliarda, kvadrilion, kvadriliarda, až po decilion a deciliardu, nevěda, kterak dál, pravil, že nejvyšší přirozené číslo se zove špuntilion; s čímž jsem se, nevím arci již přesně, proč, spokojil.

Minus nula je podobného druhu: tak jako u špuntilionu víme, že pro každé přirozené n platí, že n ≤ špuntilion, nemůže existovat žádné takové reálné x, aby platila nerovnost −0 < x < 0; a přitom ovšem minus nula je ostře menší než nula, protože i minusnulisté věří u nerovností v pravidlo tertium non datur. A jak podle minusnulistů k této efemerní entitě dojít? Jednoduše, stačí vynásobit např. −1 * 0 a vyjde nám: −0.

Armáda minusnulistů je silná: patří do ní kupř. všichni javisté (důkaz), a právě o minulém week-endu jsem málem učinil ústupek a přidal se k ní. Šlo o to, že v mém portfoliu drobných, původně jythonových, poté javových utilit, které jsem si kdysi napsal a používám je např. pro podepisování elektronických dokumentů nebo jejich označování razítkem Doručeno dne:, rozlišuji, od kterého okraje se má poloha bodu na stránce počítat: pokud je souřadnice kladná, počítá se v souřadném systému, který je v PDF běžný, tedy od levého dolního rohu, pokud záporná, jde se zprava nalevo, případně shora dolů: pro příklad, počáteční bod razítka na tomto dokumentu má souřadnice [−130, −30].

U původní verse programu nevznikal se zápornou nulou problém, protože kromě umístění nápisu na první stranu dokumentu nic jiného neuměla – a nápis se souřadnicemi [−0, y] nebo [x, −0] by byl neviditelný, protože by ležel mimo plochu stránky.

V nové versi jsem doplnil řadu možností, třeba kreslení obdélníka s určením, který jeho roh má být výchozí, a začal jsem minus-nulu potřebovat, pročež můj vnitřní boj za její neexistenci dostal reálnou konturu. Kdybych totiž nechal String extrahovaný z argumentů převést na float nebo double a ten pak porovnal s nulou, mohl jsem ušetřit několik řádků a můj program by byl i o pár nanosekund rychlejší. Trvám-li ideologicky a zatvrzele na tom, že záporná nula neexistuje, musím parametr extrahovat ještě jednou, jako řetězec, a zkoumat jeho první znak, zda to náhodou není minus.

Ale co: Giordana Bruna za jeho přesvědčení upálili, není proto důvodu, proč bych i já nepřinesl vědeckému pokroku nějakou tu oběť!

Předpokládám, že úlohu, jež dala původ nadepsanému rčení, znáte: úkolem je spojit devět bodů uspořádaných do matice 3 x 3 souvislou čarou složenou z nejvýše čtyř úseček. Je řešitelná pouze tak, že úsečky leží mimo pravoúhelník vymezený danými body, ale najít řešení je pro většinu lidí obtížné, neboť intuitivně předpokládají, že úsečky musejí ležet pouze uvnitř pravoúhelníku – ačkoli zadání o tom ničeho nepravilo.

Stereotypy a automatismy v myšlení jsou zrádné, o čemž jsem se přesvědčil naposledy během uplynulého week-endu. Pojal jsem totiž úmysl, že pro svůj (na třetím blogu traktovaný) emulátor doplním emulaci mikroprocesoru Zilog Z80. To je, myslím, jediná elektronická součástka, kterou jsem v životě opravdu miloval, a i když jsem měl původně v úmyslu omezit se na tři emulované historické stroje – PMI-80, PMD 85 a IQ 151 – mít Z80 by mi umožnilo pojmout do emulátoru i počítač Ondra, který byl hardwarově velmi zdařilým dílem a jeho většímu rozšíření zabránila pouze pro praktické používání nevhodná, příliš ořezaná klávesnice.

Domníval jsem se, že maje naemulovaný Intel8080A, nezabere mi doplnit instrukce Z80 než jeden, nejvýš dva dny. Jenže celý jeden den a spoustu nervů mi zabralo hledání chyby, kterou jsem nemusel udělat, kdybych nebyl myslel – v krabici.

Posuďte sami. Pro emulátory používám instruction exerciser (více o něm zde), který jsem si rovněž přepsal do Javy, abych mohl rychleji najít chyby implementace jednotlivých instrukcí. Pro 8080 žádný problém, ale u Z80 jsem narazil na chybu, kterou jsem nemohl a nemohl najít. Až poté, co jsem si zprovoznil emulátor CP/M, v něm druhdy slavný debugger DDT, a propadaje střídavě amoku a stavům chorobné skleslosti, jsem na to, co je problémem, nakonec přišel. A protože je to problém věru bizarní, dělím se o něj se svými milými čtenáři i zde.

Když si prohlédneme zdrojový soubor Franka D. Cringla z r. 1994, vidíme, že jádrem exerciseru jsou test cases, jejichž dlouhá řada jest popsána v makrech na ř. 194–728. Povšimněme si parametrů těchto maker: vyjma triviálních hodnot 0 a –1 jsou všechny konstanty (literály) zapsány hexadecimálně.

Až na dvě výjimky, na ř. 277 a 285, kde se stkví neobvyklý zápis 010. Když jsem ho přepisoval do Javy, automaticky jsem napsal 0x08, domnívaje se, že Frank Cringle udělal chybu a mínil zapsat 0x10 a protože si neuvědomil, že assembler takto zapsanou konstantu vyhodnotí oktalově, vyšlo mu něco, co nechtěl, ale co je s ohledem na neměnnou hodnotu CRC nutno respektovat. Pro tuto hypothesu hovořilo i to, že je v závorce za voláním makra uvedeno (1024 cycles), což odpovídá počtu jedniček v řádku – tedy deseti.

Dlouhé hodiny jsem se pak vrtal ve svém kodu a pátral, co mám špatně, protože CRC ne a ne vyjít, jak mělo. Řešení bylo arci zcela triviální, ale tak outside the box, že mě stálo dobrých deset hodin času: Protože Cringle programoval v r. 1994 a assembloval v CP/M, předvěšená nula pro assembler neznamenala, že má konstantu interpretovat jako oktalovou: tehdejší softwarové nástroje to ještě nedělaly. Assembler proto vyhodnotil jeho zápis 010 jako 10 (dekadických); vedlejším důsledkem bylo, že ve skutečnosti se neprovádí 1024, nýbrž 2048 cyklů.

Jak se to celé stalo, bych mohli zjistit asi jen od Cringla, kdybychom mu napsali a pokud si to ještě pamatuje. Moje (upgradovaná) hypothesa zní, že původně měl 0x10, ale protože si uvědomil (nebo laděním zjistil), že by instrukce CPI/CPIR vyšla (o jeden byte) mimo rozsah testovacího pole, opravil hodnotu na deset, ale zapomněl smazat nulu a nenaznal, že se mu tím změnil i počet cyklů.

Já vím, chybami se člověk učí, jen by jich, pokud bych směl prosit, mohlo být o něco méně.

Po několikaměsíčním odložení k ledu jsem se opět pustil do svého retro emulátoru, o kterém jinak píši na svém třetím blogu, a ve snaze vyrobit screencast zjistil několik důležitých skutečností:

  1. Po 15 letech nepoužívání se molitanový protivětrový návlek na mikrofon rozpadne na těžko odstranitelné, vlezlé částice.
  2. Po 15 letech nepoužívání se i zaručeně neroztekutelná AAA baterie v mikrofonu rozteče, zvlášť není-li značková, ale původní nekvalitní, kterou k zařízení, ušetřivši tak několik promile jeho ceny, dodalo české zastoupení Sony.
  3. Zvláštní odporou hmotu, která z baterie vytekla a krystalisovala, a kterou se z úcty ke svým čtenářům zdráhám pojmenovat chemickým názvoslovím, lze přesto částečně odškrabat, částečně rozpustit v isopropanolu, a cca po hodině práce je mikrofon opět plně funkční.
  4. Když to uděláte, záhy zjistíte, že váš notebook má stejně společný jack pro mikrofon a sluchátka a konvertor nemáte, proto musíte použít vestavěné mikrofony, relativně kvalitní, ale přesto rušené větrákem.
  5. Vyrobit screencast, u kterého by divák neusnul, není žádná legrace.
  6. Generálský efekt se vždy dostaví; tentokrát vznikl někde mezi knihovnami OpenGL a driverem grafické karty v notebooku.

Výsledek je zde:

Uplynulo půldruha roku od chvíle, co jsem se, tak trochu proti své vůli, začal učit Javu, a mám-li vyjádřit své rozpoložení lapidárně, rozpaky nepolevují, ba místy přecházejí do stavu tichého zoufalství. Stále mám pocit, že je to spíš náboženství než programovací jazyk, a zklámání se svou četností rozhodně vyrovnají příjemným překvapením.

Sony Vaio Pro 13

Muselo to přijít: po dvou letech cohabitation froide jsem se včera v pozdních večerních hodinách rozloučil s operačním systémem Windows 8, který mi jako své kukaččí vejce zanechal Microsoft na notebooku a který jsem nedobrovolně zaplatil v jeho ceně.

Stalo se to náhle. Nejprve se windowsy s rostoucí vehemencí dotazovaly, zda si přeji upgradovat na versi 8.1. Pokusil jsem se o to, avšak byl jsem upozorněn, že nejprve musím odřadit šifrovací nástroj BitLocker, do čehož se mi nechtělo, proto jsem upgrade odložil. Microsoft však byl neodbytný, a když jsem asi třikrát odpověděl, že si opravdu nepřeji tento upgrade provést (Windows jsou na můj vkus dost špatné už v osmičkách, tak k čemu upgrade?), pokusil se o něj sám, bez mého souhlasu a vědomí, zcela v duchu tradiční microsoftské filosofie, že uživatel je tím posledním, kdo by měl rozhodovat o tom, co se s jeho počítačem bude dít.

Upgrade se evidentně nezdařil – ovšemže, kvůli šifrování –, což mi systém s obvyklou vřelostí intimoval, avšak když jsem se poté pokusil znovu počítač spustit, BitLocker mne požádal o jakýsi zvláštní kod, odlišný od hesla, neboť se prý změnila konfigurace počítače (což je v chápání oné zlořečené korporace nejhorší zločin: považte, ten darebák si obměnil svůj počítač, a nám za to nic nezaplatil!). Což se přirozeně nestalo, ale v danou chvíli jsem měl Microsoftu právě dost a odmítl s jeho produktem další komunikaci. Číše mé nespokojenosti se naplnila a přetekla.

Protože jsem na počítači neměl žádná cenná a/nebo nezálohovaná data, bylo řešení jednoduché a přímočaré: na disk putovala Fedora 22. Byl bych tam Linux instaloval už v době, kdy byl stroj nový, avšak tehdejší Fedora neuměla v nativní konfiguraci pracovat s daným wi-fi, a nutnost problém řešit mne vedl k rozhodnutí nějakou dobu je na stroji, který mám hardwarově za skutečně zdařilý kousek (hmotnost 1,0 kg, výkon více než dostatečný), tolerovat. Tato doba však skončila.

Instalace byla blesková, a s potěšením jsem seznal, že wifi už jede sama od sebe, takže, budete-li mne potkávat usměvavého a spokojeného, obtížena pomenší šedou kabelou, důvodem bude právě dovršený shora popsaný rozchod.