A když si omylem smažete data, nezapomeňte si smazat i zálohu

Odešel mi počítač. Tedy – čistě technicky – on vlastně vůbec neodešel. Odešel totiž jen jeho pevný disk. Počítač (notebook, abych byl přesný) je jinak v poměrně dobrém stavu. Pomineme-li skutečnost, že některé klávesy vypadávají a jiné vydávají zvuk jak psací stroj. A také USB konektory jsou za ty roky docela vyviklané. A pochopitelně, baterka už slouží spíš jenom jako těžítko, aby notebook neklouzal po stole. A obrazovka má rozlišení menší, než podprůměrný smartphone.

Zkrátka a dobře, notebook je spíše jen zastaralý morálně, než že by byl reálně nefunkční. A že mi po téměř 10 letech přišel pomalý, bylo zapříčiněno z naprosto drtivé většiny pouze a jenom tím, že pro mě je zcela běžné mít trvale otevřený prohlížeč s desítkami záložek/stránek (tabů, rozumíme si?). A takové množství stránek s logicky nemá šanci vejít najednou do RAM, a tudíž si systém většinu z nich musí trval odkládat na pevný disk. A nasávat stovky megabytů dat z HDD (ano HDD, notebook je 10 let starý, vzpomínáte?) při každém přepnutí záložky pak prostě trvá. (A pokud člověk kromě prohlížeče otevřel i něco jiného, často se do paměti nevešel web ani jeden, a dlouhé čekání tak nastávalo pokaždé při přepnutí okna.)

Obrazovka notebooku s rozepsaným článkem
Notebook ještě zvládl napsání tohoto článku, i když v značně improvizovaných podmínkách

Když jsem jej, z důvodů, které budu vysvětlovat v následujících odstavcích, nastartoval z flash disku (pomocí live instalačního disku distribuce xubuntu), ukázalo se, že vlastně šlape celkem slušně. Nemít paměť trvale obsazenou desítkami prohlížečových záložek, a nutnost téměř trvale přelévat stovky megabytů mezi pamětí a diskem, vlastně vyřešilo ten hlavní problém s výkonem. Dokonce jsem byl vyloženě překvapen, odhlášení a znovupřihlášení (které si vyžádala nějaká změna nastavení), celé proběhlo jen v mžiku oka (včetně zavření a znovuotevření spuštěných aplikací).

Když on vlastně při zavření prohlížeče vůbec nebyl pomalý. Chvíli mi fakt bylo líto, že bude muset odejít do křemíkového nebe.

Ale já se dnes nechci chlubit tím, jak jsou operační systémy s linuxovým jádrem skvělé, svižné a nenáročné. To konekoneckonců velmi výstižně zvládl sám jeho autor. Chtěl bych vám tady povědět příběh o zálohování, o strachu z jeho nedostatečnosti a tom, jaké fatální následky to nakonec vlastně může mít. Jak již totiž bylo zmíněno, odešel mi disk, a to je přesně ten moment, kdy se člověk modlí k bohu Gigovi, tedy patronovi všech záloh.

Správce úloh: Procesor: 3%, Paměť: 35%, SWAP: 0%.
Při otevření jen několika málo stránek v prohlížeči si najednou počítač brumlá na volnoběh.

Zálohuješ? Ano, jistě, samozřejmě, …

Trocha teorie na úvod: zálohování má jedno jedinné pravidlo: Zálohujete nedostatečně. Nezálohujete dostatečně často, nezálohujete všechno potřebné, nemáte zálohy záloh a jejich zálohy (a nebo jejich zálohy) a další hromada neduhů, která by vydala na samosatný článek. To na úvod víme asi tak všichni.

Já, člověk, který obecně nerad kupuje jak hardware, tak i software, a tudíž vlastním pouze jeden externí disk a žádné placené cloudové uložiště, mám tedy poměrně svázané ruce se zálohováním svého počítače. Moje zálohování tak vlastně obnáší jen čas od času disk připojit a spustit skriptík, který rsync -cuje vybrané složky z počítače na něj. (Pochopitelně, některé kriticky důležité věci mám i porůznu v cloudech, ale to je spíše důsledek než záměr.) A to s tím, že tuto zálohu jsem prováděl obzvláště, když jsem věděl, že mám na disku provedené větší množství změn (např. vytřídění fotek, dokončení nějakého mého projektíku a podob.).

A pak to přišlo. Skoro

Tento systém fungoval poměrně bezproblémově (to česky řečeno znamená, že nebyla potřeba ze zálohy nic obnovovat, takže systém, který je jinak poměrně nedostatečný, neměl příležitost své slabiny ukázat světu). Změna nastala někdy před Vánoci, když se mi, poté, co pár dní pár věcí v počítači nefungovalo úplně jak mělo, objevila v konzoli při některé z činností hláška: „File system is read only“.

Bylo mi celkem jasné o co jde: Disk, nejslabší článek řetězu mého počítače, začíná selhávat. Poučen minulostí jsem systém restartoval a nastartoval z flashky výše zmíněné xubuntu. Tím pádem je možné celý disk „odmountovat“ (softwarově odpojit) a provést na něm kontrolu a opravu chyb. A samozřejmě, ještě předtím zazálohování – pro případ, že by se nezadařilo.

Takovou zvláštní vlastností linuxových systémů je, že vy si klidně můžete smazat celý disk (pro zájemce: sudo rm -rf /) a počítač poměrně vesele poběží dál. Takže se vám klidně může stát, že vám odejde disk a vy to zjistíte až po pár dnech.

Oprava disku proběhla celkem bez problémů. A jak se ukázalo, problém se s periodou několika málo týdnů vracel zpět. To znamenalo přesně dvě věci: Zaprvé, přeinstalování softwarových balíků, které se při opravě poškodily, jsem si zautomatizoval do jednoduchého skriptíku, takže oprava disku se posléze stala celkem rutinnou („restartuj, spusť jeden příkaz, restartuj, spusť druhý příkaz, přihlaš se a funguj jak normálně“). A zadruhé: začal jsem uvažovat o koupi nového počítače.

Ale pak to spadlo úplně

Chtěl jsem si proto rychle dokončit pár rozpracovaných věcí a ze stavu „uvažuji o koupi nového počítače“ se překlopit do stavu „jsem rozhodnutý koupit si nový počítač“ a následně „kupuji si nový počítač“. A stejně jako v Jak jsem (nena)psal bakalářku: To se nakonec nikdy nestalo.

A tak jsem, konkrétně (a zcela přesně) před provedením git commit opět uviděl onu hlášku o uzamčení souborového systému. Tentokrát se oprava nespokojila s prostým proběhnutím a odstraněním nepoužívaných inod. Nyní se na disku objevilo dokonce i několik konfliktů (tj. jeden soubor byl zapsán na dvě místa či naopak – jedno místo na disku se tváří, že obsahuje vícero souborů).

A zde začíná série špatných rozhodnutí a chyb, která vyústila ve ztrátu značného množství dat.

Proč v reálném životě sakra nefunguje Ctrl+Z?

Vystrašen tím, že můj systém (a data v něm) teď aktuálně mohou vypadat asi jako slepenec Arnoldů J. Rimmerů z nepovedené snahy o vytvoření ohromného množství kopií sebe sama, rozhodl jsem se zůstat nastartovaný v systému z flashky, abych zabránil dalším škodám a provést finální zálohu. Vlastně se tím připravit na to, že disk může kdykoliv odejít. (Jinými slovy, přestat jej úplně používat, aby nebylo nic, co bych jeho nečekaným selháním ztratil.)

Nicméně, při dalším průzkumu se ukázalo, že to byla poměrně zbytečná obava; vetšina konfliktů znamenala pouze a jen to, že číslo inod některých souborů se nastavil na nulu či jedničku, a soubory, kterých se to týkalo byly vesměs buďto jen manuálové soubory a nebo soubory v koši. (To se poté později potvrdilo: po restartu zpět do „mého“ systému na disku, naběhl bez sebemenších problémů, dokonce i bez potřeby opravovat poškozené balíky.)

Fantóm Opery

Každopádně, tohoto krizového režimu jsem využil k tomu, abych provedl rozsáhlejší zálohu obsahu disku. Bohužel, jedny z nejdůležitějších dat, která jsem chtěl zazálohovat, byly právě ty ony otevřené (a v poslední době navštívené) stránky v prohlížeči, které dozajista nemalou měrou přispěly k uspíšenému konci životnosti disku. A to je věc, která prostým překopírováním souborů prostě udělat nejde. (I když, je fakt, že kdybych si do nového počítače – či jen do xubuntu – překopíroval celou složku s daty prohlížeče a prohlížeč spustil, je docela vysoká šance, že by data načetl jako svá vlastní a můj export by bylo možné provést i tímto způsobem. Škoda, že mě to nenapadlo dřív…)

Před nějakou dobou jsem si na to vytvořil poměrně roztomilý nástroj (podrobně je popsán v: Export historie prohlížeče: proč to dělat jednoduše, když to jde složitě?). Jenže pro jeho využití je potřeba mít před sebou onen prohlížeč otevřený. A to v době, kdy jsem se připravoval na to, že disk nepřežije ani start systému, natož pak spuštění prohlížeče s desítkami záložek, nějaká snaha o provedení exportu standardní cestou nepřipadala vůbec v úvahu.

„Už dlouho jsem si neexportoval historii prohlížeče. O víkendu to musím udělat.“

já, přesně dva dny před tímto incidentem

Agent s povolením klikat

Nicméně, abych si ušetřil alespoň restart systému, vymyslel jsem trik: V systému, který běží z flashky, si vytvořím nového uživatele, ale řeknu mu, že jeho domovský adresář je totožný s domovským adresářem mého uživatele v počítači. Díky tomu se tak budu moct normálně přihlásit pod tímto novým uživatelem a pracovat s mými daty v počítači, jako byly mé vlastní – a přitom bez potřeby restartu, který by disk mohl dorazit.

Pro jistotu jsem se nového uživatele rozhodl založit přes grafické nabídky. Vypadalo to, že jde o čas a na experimenty s příkazovou řádkou nebyl čas a riziko překlepů a chyb z nepozornosti veliké. A právě proto jsem přesně jednu takovou udělal.

Jedno ze základních pravidel IT říká, že pokud nějaká činnosti či operace proběhla moc rychle, je to pozdeřelé a většinou to nevěstí nic dobrého. Většinou. Asi tak v 0,1% případů to totiž bývá přesně naopak.

Když jsem totiž zvolil domovský adresář nového uživatele, vyskočil na mě dialog o pár odstavcích, který mě varoval, že tento adresář už existuje, jestli ho opravdu chci nastavit a bla bla bla… Dialog jsem jen letmo prolétl očima a zvolil „Ano“. Poté se objevilo obligátní „vyčkejte, probíhá provádění změn“. Dávalo mi to naprostý smysl! Změnil jsem uživatele, který vlastní statisíce souborů, takže se u každého z nich musí tato informace zapsat, přece. Ne?

Ne, ne. Ten dialog se mě snažil varovat, že pokud chci takto nastavit složku novému uživateli, musí být prázdná. A pokud není, bude prázdnou učiněna. (Přiznávám, kdybych se nad tím zastavil a ten dialog si 3x po sobě přečetl, nejspíš by mi došlo, jakou možnost zvolit. Vždyť ale on ten dialog vyloženě zmiňuje „pokud se bojíte ztráty dat, zvolte raději …“, bohužel měl na mysli jiná data než já.)

Dialog varující před smazáním souborů.
Dialog varující před smazáním souborů. A jak byste jej pochopili vy?

A tak se stalo, co se stalo. Domovský adresář na mém pevném disku, tedy všechny mé soubory, byly do posledního smazány. To samo o sobě je průšvih. Existují ovšem způsoby, jak jej zvrátit. Tady se asi objevila další chyba: kdybych byl býval uživatele zakládal přes příkazovou řádku, pravděpodobně by se kromě vyprázdnění jeho domovského adresáře nevytvářely žádné další soubory. Bohužel, vytvořením uživatele přes grafické prostředí automaticky vede k vytvoření základního nastavení (vytvoření složky pro Plochu, Dokumenty a podob.). Už jen to o další malý kousek snížilo šanci, že se historii prohlížeče (ale spolu s tím spoutu dalších dat, o kterých jsem neměl ani ponětí, že bych si je měl zazálohovat) už nikdy nepodaří zachránit.

Nepropadejte panice

Zde jsem ovšem zpanikařil. Vidina toho, že všechna moje data už neexistují v mém počítači, a jedinné místo, kde jsou k nalezení, je 10 let starý externí disk, mě poměrně vyděsila a tak jsem prakticky okamžitě po tomto zjištění rozhodl začít urychleně zálohu obnovovat s vidinou: „když už jsem si smazal všechno nezazálohované, velmi nerad bych přišel i o to zazálohované“.

Že jsi celou tu dobu měl někde na novém, svižném několika terrabytovém disku několikanásobně duplikovanou bitovou kopii celého rozbitého disku, pro případ, že se něco semele, a tento příběh je jen takové veselé povídání o nezávazném experimentování, že? A nebo snad ne?

Zde se asi pro kontext hodí doplnit střípek informace, že při finálním zálohování došlo k nějaké, poměrně hrubé závadě (osobně typoval bych zaškbrtnutí v napájení disku způsobeného vadným USB konektorem či kabelem), která vyústila v to, že se – nyní už i externí – disk poškodil. A při snaze jej opravit mi systém (resp. fsck) řekl něco na způsob: „Sorry jako, tak tohle nedám. Tahle chyba je tak fatální, že to musíš připojit k nějakýmu počítači s Windows a nechat to opravit je“.

Naštěstí se mi podařilo nějaký počítač s Windows oživit a disk celkem lehce opravit. Ale jistě pochopíte, že to na stresu a strachu ze ztráty dat rozhodně neubralo. Ba naopak.

A tak jsem tedy spustil kopírování mých dat ze zálohy na externím disku zpět do počítače. Asi po půl hodině a necelé stovce GB přenesených dat mi došlo, že já bych se vlastně mohl pokusit obnovit některé ze smazaných souborů, před tím, než si je přepíši obnovením zálohy.

A tak jsem uvažoval, co bych si asi tak mohl ještě zkusit zachránit. Ale považoval jsem to za předem prohrané, protože – obnovit jde jen soubory, nikoliv složky či celou adresářovou strukturu – a já, když už bych něco potřeboval zachránit, tak by o rozhodně nebyl jeden jedinný soubor, ale celá složka. I v tom jsem nakonec chyboval.

Po asi půl hodině kopírování jsem si ještě jednou vzpomněl na můj článek o exportu historie prohlížeče. Jedna kapitola se věnuje trošku postrannímu tématu – tomu, jak vlastně celý ten složitý postup exportu je možné s určitou nepřesností obejít jedním SQL dotazem nad jedním SQLite souborem.

Vyhlašujeme pátrání po souboru neznámého jména, střední velikost, přípona žádná

A tak jsem se pustil do hledání právě tohoto souboru. Teoreticky to triviálně: spusť program foremost a s jeho pomocí vyhledej všechny obnovitelné soubory a nech je obnovit. Z nich vyber jen soubory typu „SQLite databáze“. Z nich vyber ty, které obsahují databázi požadovaného schématu (věděl jsem, že musí obsahovat tabulku „favicons“). Pomocí mého nástroje vyexportuj (alespoň část) historii z tohoto souboru. A je hotovo!

První zádrhel nastal hned v prvním kroku. Program foremost nezná soubory typu „SQLite databáze“. Ty bylo potřeba ručně dodeklarovat (naštěstí nic složitého, stačilo jen specifikovat čím soubor začíná, tj. magic number, což je veřejně známá věc).

Druhým problémem bylo, že foremost obnovuje buďto všechny soubory všech známých typů, nebo jen určité zvolené typy (JPG, docx, ZIP, …). Bohužel, možnost obnovení zvolených typů se nevztahuje na ručně deklarované typy, takže jsem musel bohužel obnovit úplně všechny soubory. S ohledem na to, že na externím disku, který byl pochopitelně jediným možným cílovým zařízením, už tak ležela záloha více než poloviny mého počítače, a k tomu ještě nějaké smetí k tomu (které fakt nebyl čas uklízet), docela jsem se toho obával. Z logiky věci – zachraňovat data z 400GB disku na disk, kde je volných necelých 100GB, matematicky nevychází i kdyby se podařilo souborů zachránit jenom čtvrtinu.

K mému překvapení to ovšem po pár hodinách nezhavarovalo na tom, že by se disk zaplnil zombie fotkami a tunami dávno smazaných PDFek z dob studí, nýbrž na skutečnosti, že se naplnil maximální počet souborů ve složce. Nevadí, tak u toho zkrátka budu muset sedět, sledovat to, a čas od času pomazat všechny obnovené fotky a videa, dokumenty, ZIPy, a zkrátka všechno, co nejsou databáze SQLite.

Externí disk může mít v každé složce maximálně šedesát pět tisíc pět set třicet šest souborů. Neptejte se mě jak to vím, prostě to vím.

Druhý problém, jak se ukázalo, se jala být skutečnost, že na disku je celá řada souborů, které začínají stejně jako databáze SQLite, nýbrž SQLite databází nejsou. V jednu chvíli to dokonce vypadalo, že nějaká aplikace (osobně se domnívám, že právě prohlížeč) má na každý databázový soubor jeden soubor textový, obsahující informaci o tom, v jakém formátu ta databáze je (to celkem dává smysl, než aby aplikace zkoumala co to je za typ databáze, podívá se do odpovídajícího pomocného souboru a ví to ihned).

Takže když jsem se zaradoval, že se mi podařilo zachránit již pár stovek SQLite databází během prvních pár minut, ukázalo se, že jen možná 1% jsou skutečné databázové soubory. Doplnil jsem si tedy jednoduchý filtřík, který odmazával soubory, které nejsou SQLite databáze, i když se tak pro foremost tvářily.

Z nižsích desítek opravdových SQLite databází jsem poté už jen průběžně filtroval ty, které (ne)obsahují kýženou tabulku/tabulky a dostal jsem se k jednotkám souborů. Současně jsem ale dále procházel disk a hledal další, pro případ, že by nějaký takový soubor byl umístěný někde vzadu.

Říká se, že když poskytnete skupince opic ideální podmínky k životu a do výběhu jim dáte neomezený zdroj papírů a tužek, za pár miliard let čistou náhodou sepíší celé dílo Shakespeara. Tak nějak jsem se cítil, když se mi při čtení dat z disku najednou změnil titulek okna na nějaké smetí. V těch miliardách bytů dat se totiž vyskytla escape sekvence na změnu titulku okna. Ano, někde na mém disku se nachází série znaků „\033]0;“ a „\007“.

Toto celé trvalo několik málo dní, při kterém procedura v různých stádiích spadla právě z důvodu přeplění výstupního adresáře. Takže jsem se nakonec s prohledáváním ani nedostal na úplný konec disku. Nicméně, dle prvotního průzkumu to vypadalo, že soubor, který hledám, už jsem dávno našel. Jak by si člověk domyslel – prohlížeč je jedna z prvních věcí, kterou člověk v počítači spouští, takže dává smysl, že jeho soubory budou „někde na začátku disku“, než se stihne zaplnit ostatními daty.

Na pitevně

Pátrání po zemřelém souboru jsem tedy ukončil a jal se prověřit kandidáty. Bohužel, žádný z nalezených souborů nebyl bez poškození. U jednoho namátkou vybraného jsem si vylistoval jeho obsah, a po pár megabytech dat jsem narazil na poměrně jasný a srozumitelný text nějakého konfiguračního souboru pro grafické prostředí (ale těžko říct, dost možná někde mezi těmi nečitelnými daty byl i nějaký PDF dokument z mé snahy o obnovení zálohy).

Nečitelná data SQLite souboru najednou obsahují něco, co vypadá podezřele jako konfigurační soubor
Nečitelná data SQLite souboru najednou obsahují něco, co vypadá podezřele jako konfigurační soubor

Poměrně nešťasten a vědoma toho, že je zle, jsem z povinnosti vyzkoušel pár „osvědčených“ triků, jak zachránit rozbitou SQLite databázi. Pochopitelně, žádný z nich není stavěný na to, že vám někdo přepíše kus souboru něčím úplně jiným, takže naprosto bez úspěchu.

Zkusil jsem také sáhnout po řešení ze světa Microsoft Windows. Našel jsem totiž nějaký „zaručeně 100% funkční SQLite prográmek na opravu poškozené databáze“. No, skutečnosti, že odkaz na stažení vedl na stažení úplně jiného prográmku (a ten „reálný“ odkaz byl kdesi dole v rožku malým písmem) a že po stažení a spuštění toho pravého, aplikace vypadala úplně jinak, než v návodu, přeskočím, protože na to už jsem ve světě Microsoftích technologií tak nějak zvyklý.

A jak to dopadlo? Jednoduše: Ten skvělý, profesionální a 100% funkční prográmek nedokázal z databáze vytáhnout ani seznam tabulek v ní obsažený. Tedy něco, co bez problému zvládl i výchozí klient SQLite. Na neúspěch jsem byl připravený, ale tato pointa mě vyloženě pobavila.

Na pohřbu je každý generál

A tak tu teď sedím, koukám na 8 zachráněných SQLite databází, z nichž některé patrně obsahují nějaké informace o mnou naposledy navštívených stránkách, ale notně poškozené, takže bez přímé cesty, jak z nich tyto informace dostat. Ustoupil jsem z toho, že bych rád měl kompletní zálohu celé historie prohlížeče. Stalo se pro mě přijatelné získat jen seznam naposledy navštívených stránek a data jejich posledních návštěv. Nakonec to vypadá, že – budu-li mít štěstí – podaří se mi získat alespoň pár webových adres několika navštívených webů v poslední době.

Rád bych se podíval na standart SQLite a na formát jeho databázového souboru. V ideálním případě se mi podaří přesně identifikovat přepsanou část a, řekněme, vyprázdnit ji. Sice přijdu o některá data (v ideálním případě by se však netýkala samotného sezanamu webů, ale např. cookies), ale mohlo by se mi podařit databázi zprovoznit a umožnit tak její export.

Jak je vidět, i prostý výpis poškozeného databázového souboru stále obsahuje nějaká "reálná" data (webové adresy).
Jak je vidět, i prostý výpis poškozeného databázového souboru stále obsahuje nějaká „reálná“ data (webové adresy).

Ale domnívám se, že nejspíš stejně zkončím u toho, že celý soubor prostě prohledám na výskyty všeho, co začíná znaky „http“ a to si prostě někam uložím. Operační systém unix (a to zdědil i jeho pravnuk Linux) vznikl za účelem vyhledávání textů, takže by to myslím byla celkem vkusná tečka za celým tímto příběhem.

Závěrem

Co říci závěrem? Zálohujte! A ještě bych dodal: Zálohujte! A na závěr: Zálohujte!

Tento příběh naštěstí nedopadl tak špatně. Vlastně by se dalo říci, že dopadl dobře (ale to nemohu, protože ještě zálohu nemám v novém počítači). Co jsem se tímto snažil vypíchnout je skutečnost, že i když má člověk to nejdůležitější (myšleno třeba 99%) zazálohováno, a octne se v ohrožení, že záloha ani toho jednoho procenta už nebude možná, nesmí za žádnou cenu panikařit.

Jak se ukázalo, počítač (či disk) nebyl v tak špatném stavu, aby nemohl ještě pár dní fungovat vesměs normálně dále. Měl jsem tedy (s velkou pravděpodobností) dostatek prostoru na to, si v klidu dozálohovat zbylé 1% dat. Ale šok z toho, že „počítač kleknul“ a obavy z rizika, že selže i záloha zbylých 99%, zabránily jinak běžnému odstupu, nadhledu a racionálnímu vyhodnocení situace. Je to přirozené – člověk se dostane pod palbu emocí a v takové situaci si prostě nedokáže říct: „Hm, je to blbý, ale teďka už to raděj vypnu a do zítřka promyslím, co s tím. Teďka bych určitě jen napáchal víc škody než užitku.“

A přesně na toto se snažím upozornit. Osobně doufám, že se nikdo do podobné situace nikdy nedostane, ale když už ano tak: zachovejte klid. A pokud jde opravdu o život, svěřte počítač do rukou odborníků, čím dřív, tím líp. Těch pár stovek za to přece stojí, ne? Vždyť jde přece o život.

A víte, co je na tom všem nejlepší? Že si toto někdo někdy bude číst zcela určitě poté, co do vyhledávače vložil frázi typu: „pomoc klekl mi počítač jak z něj zachránit data“ a jediné, co mu v této situaci tento článek dá bude to, že mu řekne: „jo, je to tak, jsi trouba, měl sis všechno pořádně zálohovat“.

RIP Lenovo „Lenny“ Thinkpad E520, 2012 – 2022

Export historie prohlížeče: proč to dělat jednoduše, když to jde složitě?

Stala se mi – slovy klasika – takový ošklivý a skoro bych řekl zlý, nepěkná věc. Zavřel jsem si okno prohlížeče se spoustou záložek (karet, panelů) a omylem si toto zavřené okno nahradil nově otevřeným prázdným. Po jeho zavření se tak „naposledy zavřeným“ oknem stalo toto nové, prázdné a to původní bylo nenávratně ztraceno. Leda, že bych vynalezl stroj času a vrátil se do chvíle, kdy jsem tyto mé stránky měl naposledy otevřené...

A tak jsem začal bádat, jak z prohlížeče Opera vydolovat historii v nějakém rozumném, tedy strojově čitelném formátu. První myšlenka byla prohledat domovský adresář a hledat vše, co by mohlo mít co dočinění s Operou (tedy ~/.config/opera a ~/.cache/opera ), jestli tam třeba nenajdu soubor history.xml. Bohužel nic takového a googlení mě akorát přivedlo k myšlence, že něco takového dost dobře není možné. (Fail #1: V závěru se ukázalo, že to tak úplně není pravda, ale k tomu se dostaneme.)

Prohlížeč Opera je vlastně Chromium. Teoreticky by tak mnohé z toho, zde uvedeného, mohlo fungovat i v Chromiu a tudíž i v Google Chrome a snad dokonce možná i v Microsoft Edge.

Pár sekund jsem také uvažoval o tom, že by to mohl umět nějaký plugin. Prohlížečové pluginy obecně ale nemám zrovna v lásce, kromě blokování reklamy (což ovšem Opera dělá nativně), mám pocit, že jen prohlížeč zbytečně zpomalují. Navíc je to další potencionálně škodlivý (resp. děravý či napadnutelný) kód, ještě navíc přímo v prohlížeči.

Trocha Javascriptu ještě nikdy nikoho nezabila …

Navíc, možná proto jsem inspirován youtubery jako colinfurze nebo Michael Reeves (#karanténa) začal uvažovat o nějakém šíleném a bláznivém řešení. Navíc, jsem (si) chtěl ukázat, že se Tom Scott mýlí a hackovat jde stejně dobře i na Linuxu. A v momentě, kdy jsem zjistil, že historie v Opeře je jen další „HTML stránka“, bylo rozhodnuto: Trocha Javascriptu ještě nikdy nikoho nezabila! (Upřímně se obávám, že asi ano, tím si ale nekažme tuhle chytlavou frázi.)

historie v Opeře
Historie v Opeře je jen speciální stránka

Verze 1.0: vize

Moje myšlenka byla tedy jednoduchá – budu-li si chtít zazálohovat historii prohlížeče, otevřu „stránku“ historie (dostoupnou mj. pod url about://history), otevřu vývojářskou konzoli (tu vám na této stránce Opera oficiálně neumožní rozbalit, ale Ctrl+Shift+I funguje), vložím tam nějaký kus kódu, odentruju – a pár vteřin či desítek vteřin počkám. (Fail #2: Je zajímavé, že mě celou dobu nenapadlo prostě pomocí Ctrl+S celou stránku uložit a pak si ji někde v klidu zpracovat.)

Samotný kód pak měl za úkol projít celou stránku, sesbírat záznamy historie a „uložit je“. Nastala tedy otázka, jak/kam data „uložit“. Prohlížečový Javascript nemá moc možností jak ukládat data – ten nejzákladnější, tj. localStorage, se v Opeře sype do nějakých „data“ souborů kdesi v konfiguraci. Navíc bych si troufl říct, že by na této stránce ani nefungoval.

Prohlížečový javascript
Původní myšlenka byla o tom, že uživatel do prohlížeče nakopíruje nějaký kód a zmáčkne Enter

A tak jsem si řekl, že když už bude nějaký Javascriptový kód běžet v prohlížeči, proč rovnou nevytvořit jednoduchou node.js webovou službu, které bude prohlížečový skript data posílat? Taková služba pak může data sypat třeba do sqlite databáze. #Too_much_javascript_to_handle

Tak třeba by nikoho nezabilo ani trochu víc Javascriptu …

Já o pár vteřin později

Teoreticky. Pustil jsem se tedy do toho. Hned první drobný zádrhel byl, že Opera záznamy v historii zobrazuje (resp. načítá a zobrazuje nové a nové) postupně jak člověk scrolluje dolů stránkou (ne moc překvapivě). Nestačilo tak pouze otevřít stránku a vyextrahovat záznamy – bylo nutné odscrollovat postupně až dolů a nechat postupně načíst všechny záznamy.

Verze 1.1: první krůčky

Řekl jsem si, že než listovat celou stránkou úplně dolů a pak odesílat na node.js službu tisíce záznamů, mohl bych sledovat změny ve stránce a „reportovat“ průběžně všechny přidané záznamy. Pochopitelně s automatickým scrollováním, jakmile by byly všechny nově přidané záznamy bezpečně zpracovány.

Dalo se totiž očekávat, že Opera nebude úplně nadšená z toho, že někdo listuje historií až na úplné dno. Dle mých odhadů se mohlo jednat klidně o 10 tisíc záznamů (Fail #3: aktuální odhad mám cca 100 stránek za den, za rok a kousek tedy téměř 50 tisíc) a s ohledem na to, jak titěrně vypadal posuvník (scrollbar) už po prvních pár scrollech dolů, kdy jsem projel historii za poslední dva dny, dalo se tušit, že to bude záhul. (Fail #4: Při hlubším zkoumání vyprodukované databáze, jsem zjistil, že scrollování se vždy zastavilo asi na 95. dnu a další historie už se nenačítala. Podařilo se mi dohledat, že Opera si totiž pamatuje historii jen asi tři měsíce zpětně. Ve výsledku tak stránka byla asi 10x menší, než jsem očekával.)

Vytvořil jsem tedy skriptík, který monitoroval změny v dokumentu a reportoval nově přidané záznamy. S ohledem na to, že záznamy se přidávají po určitém počtu (konkrétně po stovce) a nikoliv po celých dnech, bylo potřeba sledovat i to (záznamy jednotlivých dnů Opera zobrazuje na oddělených panelech, takže přibývají jak dny v panelu posledního dne, tak i nové panely se svými záznamy).

Přidal jsem i automatické scrollování po skončení zpracování (a pro jistotou i nějaké čekání, přecijen natažení a zobrazení stovky záznamů vteřinku, dvě, pět zabere). Vše fungovalo naprosto skvěle, jen s jedním drobným zádrhelem – po asi třech odscrollováních došlo k zřejmě internal erroru v Opeře (prostě spadl kód, který měl renderovat HTML na základě dat z backendu) a stránka přestala na scrollování reagovat. Vlastně se tak trochu celá rozbila a přestala reagovat tak nějak všeobecně.

Verze 1.2: jeden krok vpřed, dva vzad

To mi docela zhatilo plány a vzhledem k tomu, že nepomohlo ani navýšení čekání (pro případ, že by šlo o souběh) či trochu efektivnější/efektnější způsob zpracování přidaných záznamů, musel jsem se s tímto poměrně elegantním řešením rozloučit.

Došlo to tak daleko, že jsem se chvíli dokonce hrabal zdrojovými kódy Opery, snažil jej zprvu debuggovat a po neúspěchu studovat, jak vyvolat načítání nových záznamů ručně, tj. bez scrollování. To se mi nepodařilo, zato jsem našel přímo modul implementující dotazování nad historií. Tedy něco, co by mi vracelo záznamy přímo jako Javascriptové objekty, bez nutnosti parsování HTML, resp. proházení stromu dokumentu!

Funguje to perfektně, až na to, že vlastně vůbec…

Bohužel, ani to se mi, zcela nepřekvapivě, nepodařilo rozchodit (povětšinou jsem byl poslán do oněch partií různými vrstvami bezpečnostní politiky) (dává to smysl, kdyby si jen tak nějaký Javascript mohl takhle hrát s interními věcmi prohlížeče, asi by prohlížeč brzo doprohlížečoval) . Koneckonců, v jednu chvíli jsem si říkal, že dost možná i proto mi můj skriptík padal – Opera zkrátka možná blokovala automatizované zpracování stránky. (Když nad tím tak přemýšlím, tak to je asi hloupost, padalo to na něčem ohledně stylů, což moc nevypadá jako úmysl.)

Dospělo to až tak daleko, že jsem chvíli koukal na stránku dokumentace k Browser History API pro vývojáře pluginů. Ani pořádně nevím, jak jsem se tam vlastně dostal, ale s ohledem na to, že jsem si plugin nechtěl instalovat jako uživatel, natož si jej přímo vyvíjet, stránku i celou myšlenku jsem rychle opustil a lehce ustoupil z mých požadavků.

Verze 1.3: Tak už to zmáčkni!

Rezignovaně jsem opustil představu, že celý problém vyřeší jedna nodej.js služba a jeden kód prostě vložený do konzole prohlížeče, a vytáhl bazuku. Sáhl jsem totiž po prográmku xdotool, který emuluje, resp. „fejkuje“ primitivní akce uživatele, tj. pohyb nebo klikání myší a stisky kláves.

Scrollování jsem tedy vyřešil jednoduchým Bashovým skriptíkem, který do svého ukončení prostě pořád dokolečka mačká Page Down (pochopitelně, opět, s nějakým čekáním). Spolu s tím jsem také z mého prohlížečového kódu vyhodil celý ten problematický monitoring stránky a prostě jej nechal staticky a jednorázově projít celou stránku a naposílat všechny nalezené záznamy.

Tohle celé jsem zabalil do jednoduchého skriptu, který:

  1. Požádá uživatele, aby otevřel v prohlížeči historii (to by samozřejmě šlo udělat jedním příkazem, ale myslím, že to celému skriptu přidává na „dramatičnosti“)
  2. Řekne mu, aby si otevřel vývojářské nástroje (opět, i to by šlo udělat pomocí xdotools, ale chtěl jsem ponechat co nejvíc kontroly uživateli)
  3. Spustí skript na scrollování dolů
  4. Jakmile stránka dojede dolů (nebo kdykoliv si uživatel usmyslí), má jej ukončit
  5. Nahodí se node.js služba, založí se databázový soubor, vytvoří tabulka
  6. Uživateli je předložen částečně minimizovaný (tj. bez nadbytečných bílých znaků) Javascriptový kód, který má spustit v prohlížeči
  7. Po doběhnutí uživatel dá pokyn k odpojení od databáze a zrušení služby
  8. Na závěr je jen pro kontrolu vypsán počet záznamů v databází a skript končí.

Nezbývalo, než to celé spustit. Všechno klapalo, dokonce i reportování node.js službě. Akorát to spadlo po pár sekundách, protože prohlížeč nedokázal udržet tolik otevřených spojení současně – XHR požadavky se totiž v základu posílají asynchronně, tedy se nečeká na dokončení předešlého a tudíž je prohlížeč chtěl poslat prakticky všechny v jeden okamžik. Opraveno a nyní už celý skript proběhl a nasbíral skutečná data. Jenže …

insufficient resources, moc současných spojení
UUUPS! Opera evidentně nezvládne víc, než pár tisíc současných spojení …

Verze 1.4: Zrychlujeme

… jenže stále tam bylo několik „ale“. Tak zaprvé, kód, který měl uživatel zkopírovat do prohlížeče, jen slepě odstraňoval nadbytečné bílé znaky. Což, jak jsem záhy zjistil, mělo nedozírné důsledky v případě, že v kódu byl někde jednořádkový komentář. V takovém případě tedy zakomentoval zbytek celého kódu. Oukej, nějakým způsobem jsem tam doplnil odstraňování jednořádkových (a když už, tak už i víceřádkových (bo minimizace!)) komentářů.

Další problém, který mě trápil, byla rychlost nahrávání. Nebylo nijak zvlášť překvapivé, že vzít jeden JSON záznam, poslat ho přes XHR na node.js server a tam ho jedním dotazem vložit do databáze bude při tisících takovýchto záznamů docela neefektivní. Přidal jsem tedy dávkové zpracování.

K mému poměrně velkému překvapení se nahrání tisíce záznamů propadlo z dvou a půl minut na 14 sekund (při posílání po 10), resp. na 6 sekund (při posílání po 20) nebo necelé tři sekundy (při posílání po 50). Musel jsem kvůli tomu ale navýšit maximální velikost požadavku na 10MB (občas bylo zřejmě některé URL příliš dlouhé) (Fail #5: zřejmě to nebylo URL, ale favicona ve formátu data:uri). Nakonec jsem tedy nechal velikost dávky na 20 (při 50 by se zvyšovala šance že node.js odmítne celý balík 50 záznamů, o které bych tak přišel).

Pak už jen drobnosti jako odpojit se korektně od databáze při ukončování, a doplnit trošku informativních výpisů (jak do konzole v prohlížeči, tak při běhu hlavního skriptu).

Mimochodem, shruba v této době (když jsem při jednom testování nechápavě zíral, proč se scrollování zastavilo na datu někdy v únoru – a dál ani krok) zjistil, že Opera si pamatuje historii jen tři měsíce zpětně. Na jednu stranu docela šok a zklamání, na druhou stranu motivace mít skript připravený k opětovnému použítí. Ale o tom pozděj, teď jedna odbočka.

Odbočka 1.1: Primitivní ale funkční

Dobře, ale – říkáte si, co se sesbíraným seznamem navštívených stránek? Samozřejmě, až budu mít sesbíraných víc záznamů, než poslední tři měsíce, půjdou dělat docela zajímavé statistiky. Od nenajvštěvovanějších serverů přes opakovaně navštěvované přímo konkrétní stránky, až po histogram návštěv různých webů dle denní doby/dne v týdnu. #Science

A nebo si vytvořit obrázek se faviconkami všech navštívených stránek. Tedy tak trochu něco jako reddit place nebo The Million dollar homepage – jen sestavené mnou samotným.

První verze faviconek
Prvotní verze stránky faviconek, ještě bez jednotné velikosti.

Koneckonců, z tohoto důvodu již úplně první verze exportéru historie pracovala s cestou k faviconám stránek zobrazených v historii. Myšlenka tedy byla jednoduchá – skript vezme vyexporotovanou databázi navštívených stránek a vygeneruje jednoduchou HTML stránku s obrázkem (faviconkou serveru) pro každý záznam z historie.

Teprve v tento moment jsem se hlouběji podíval na favicony získané z historie. Zjistil jsem, že to vlastně vůbec nejsou adresy reálných ikonek, nýbrž jen odkazy do interní cache favicon Opery. Tedy nepoužitelné. Použil jsem tedy starý trik, nechal jsem si vylistovat jen názvy serverů a ve stránce vyjmenoval všechny obrázky s URL https://SERVER/favicon.ico. Samozřejmě ne všechny takové existují (typicky třeba mnou docela často navštěvované mapy.cz) a tak se u nich pomocí alternativního textu zobrazil křížek. (Asi by šlo na jednotlivé servery poslat požadavky, ty zparsovat a získat přímo konkrétní adresy faviconek, předmětem tohoto skriptíku ale bylo jen rychlé a plus mínus funkční řešení.)

Na odzkoušení hypotézy celkem cool, ukázalo se, že to může fungovat. Ale jak pravil klasik – not great not terrible.

Odbočka 1.2: Hloupé, ale ještě funkčnější

Napadlo mě ale, že favicony by si prohlížeč zcela určitě měl cachovat. A taky, že (bavíme-li se stále o Opeře) – ano! V sqlite databázovém souboru ~/.config/opera/Favicons se nachází parta tabulek obsahující informace o faviconách. Pak už stačilo jen nastudovat si jejich strukturu a napsat stručný dotaz, který vylistuje URL favicon pro všechny servery. K mému překvapení, prohlížeč si pamatoval všechny favicony pro všechny servery v nedávné historii. (#Fail 6: Historii? Ano, cache favicon je vlastně také historie. Pamatuje si seznam navšítených adres (pro každou z nich i faviconku) a datum a čas posledního přístupu. Nevýhodou ale je, že si u každé stránky pamatuje vždy jen poslední přístup. Teoreticky by to ale jako jednoduchá strojově čitelná historie mohlo postačovat.)

Tentokrát už by mi obyčejný Bashový skript nestačil, takže jsem sáhl po Pythonu. Prostě si pro každý záznam v historii pomocí jeho serveru najde odpovídající URL favicony a tu vypíše jako obrázek. Protože ale mám k dispozici informací víc, každá faviconka je klikatelná (vede přímo na patřičnou stránku) a s popiskem (tooltipem) (titulek stránky). (Fail #7: Vzhledem k tomu, že historie a cache favicon se nacházejí v různých databázích, mám jejich „spojení“ řešené až na straně v Pythonu. Sqllite samozřejmě umí i to, pak by se skript zkrátil a většinu práce by odvedl jeden SQL dotaz. Skript by pak šel napsat i přímo v Bashi bez nutnosti Pythonu.)

faviconky!
Faviconky! (výřez!)

Tento skriptík je tedy trochu víc promakanější, ale hlavně – zobrazí favicony všechny (pochopitelně, pokud v mezičase některá nebyla přesunuta), a to včetně tooltipů a vlastně i konkrétních URL (po přejetí nad odkazem se jeho adresa zobrazuje někde dole). Jedinou nevýhodou je, že při generování musí být zavřená Opera. Databáze je pochopitelně Operou hojně využívána a je tak tímto procesem blokovaná. To trošku kazí dojem z vygenerované webové stránky, ale myslím, že přínosy jasně vedou.

Verze 1.5: budoucnost

Dobře, ale zpět k exportéru historie. Jak jsem zmiňoval, nyní už je dokončen a plně funkční, aktuálně se již jen dolaďují některé detaily, které usnadní dlouhodobější používání.

Jeden z nich by určitě mělo být nevkládání duplicitních záznamů (když budu zálohovat každý měsíc, předposlední a předpředposlední měsíc budu vždycky dvakrát). S tím souvisí, že skript by neměl vyžadovat neexistenci databázového souboru při spuštění a – nejlépe cestu k němu nemít zadrátovanou napevno, ale na vyžádání od uživatele.

Také s ohledem na zkušenosti získané tvorbou generátoru stránky s faviconkami, odebrat z exportu favicony. Je to hodnota nicneříkající a tudíž zbytečná. Obdobně, datum a čas návštěvy stránky by asi taky bylo rozumné ukládat jako datum a čas a ne jako text natvrdo vystřižený ze stránky.

Zapracovat by se dalo i na generátoru stránky s faviconkami. Například ikonky rozházet, a zobrazovat jejich velikost podle návštěvnosti daného serveru (tj. něco jako tag cloud). Nebo je prostě a jednoduše jen náhodně zamíchat.

Závěr

Závěrem bych tradičně jen uvedl odkaz na GitHub projektu (pokud odkaz nefunguje, pak ještě nebyla dokončena verze 1.5). Nepředpokládám, že by se našel někdo, kdo si jej stáhne či na něm nedejbože bude dělat úpravy.

Vlastně celý tento článek vznikl jen jako výpis strastí, se kterými se člověk může při takovém tom domácím hackování setkat. Dá se očekávát, že s prvním redesignem Opery se minimálně ta prohlížečová část celá rozsype, ale třeba do té doby nasbírám alespoň nějaké informace o mé aktivitě na internetu. A nebo třeba ne. Možná mě přestane bavit pokaždé nechat dlouhé minuty (kolik je to celkem se mi ještě nepodařilo přesně určit, celkový export jsem spouštěl vždycky přes noc) čekat, než se odscrolluje stránka s historií.

A nebo se mi podaří dopátrat alespoň některé ze ztracených záložek (stránek, panelů, karet), kvůli kterým tohle celé vzniklo. Ale musím se přiznat, že na to jsem v průběhu vývoje tohoto udělátka úplně zapomněl.

Disketo: úklid fotek

Tento článek navazuje na předcházející článek, ve kterém jsem představil prográmek disketo. Ten slouží k vyhledávání souborů a složek na základě rozličných kritérií, jako je název složek či souborů v nich obsažených, počet souborů určitého typu, nebo počet shodných souborů ve dvou (a více) různých složkách.

V tomto článku se podíváme na trochu reálnější použití disketa – a to úklid ve fotkách. Fotek totiž často bývá hodně, bývají z různých zařízení – a často od různých lidí. Některé jsou poctivě roztříděné, některé méně, některé jen tak narychlo zkopírované. Občas je na čase sednout a projít si všechny místa, kde se fotky nacházejí (počítače, flashky, externí disky, paměťovky, cloudy, …) – a udělat v nich pořádek. Sesypat do jedné složky, smazat ty které už mezitím byly roztříděny a naopak případně roztřídit ty, které roztříděné nejsou.

Disketo může být v mnohém z toho poměrně nápomocné. Umožní vám najít celkem očividně zapomenuté či neroztříděné fotky – a to dokonce bez toho, aniž byste vůbec museli vidět jedninou fotku. Chcete to zkusit? Pojďme se do toho pustit.

Ještě než se do toho radostně pustíte, jen bych připomněl, že disketo asi není prográmek pro běžného uživatele. Pro jeho používání je vyžadována pokročilá znalost práce s počítačem na úrovni ovládání příkazové řádky a základů programování či skriptování.

Složky s fotkami (první způsob)

Základem každého třídění je sesbírat si všechny možné složky ze všech možných míst. Vezmeme disketo a vylistujeme se všechny složky, jež se jmenují např. foto či fotky. Jak už víme, disketo pracuje s regulérními výrazy, takže je možné názvy zkombinovat. Je tak možno použít např. vzor fot(o|ky). Pozor však na malá a velká písmena, ty disketo rozlišuje.

Předchozí vzory nám vylistují všechny složky, odpovídající (jejiž celá cesta odpovídá) zadanému vzoru. Tedy všechny složky foto a fotky a to včetně podsložek. Můžete se tak přesvědčit, jak strašně velké množství složek s fotkami doma máte. Nás ale na úvod bude zajímat jen ty samotné složky foto či fotky, bez jejich podsložek. Toho se naštěstí dá v disketu dosáhnout docela snadno, stačí říct, že cesta musí textem foto nebo fotky končit, tedy fot((o)|(ky))/?$ (volitelné lomítko na konci je jen pro jistotu).

Pak už stačí složky jen vypsat. Disketo skript slozky-s-fotkami-1.ds tedy bude vypadat následovně:

Skript spustíme se seznamem všech našich uložišť (v mém případě složky obrazky a zaloha přímo v počítači):

Složky s fotkami (druhý způsob)

Pokud však máte ve fotkách totální chaos a nemůžete ani říct, jak se vlastně jmenují všechny složky s fotkami, je tu druhá možnost. Můžete zkusit vyhledat složky obsahující fotky, tedy JPG soubory. Takových bude ovšem hromada (JPG soubory jsou jeden ze základních formátů obrázku, takže i bez fotek jich v počítači budete mít tisíce).

Prostý vzor (.*)\.jpg by tak našel zbytečně moc souborů. Lepší by bylo použít vzor například PICT_[0-9]{7}\.JPG, pokud váš foťák produkuje soubory ve formátu PICT_1234567.JPG. Samozřejmě, i zde se vzory dají kombinovat, takže můžete vytvořit vzor třeba (PCIT_[0-9]{7}\.JPG)|(Photo[0-9]+.jpg)|(fotka \([0-9]+\).jpg). Stejně jak v minulém případě je rozumné ukončit vzor znakem $ (lomítko už nyní opravdu nehrozí; pokud tedy nemáte na disku složku s názvem odpovídající vzoru).

Použijeme skript slozky-s-fotkami-2.ds, který prvně vyfiltruje podle názvu adresáře (podobně jako v předešlém případě, ale mírněj). To se může hodit např. pro vyloučení složky Windows, resp. omezení vyhledávání jen na uživatelské adresáře, ale není nic špatného nastavit tento parametr na (.*) (nebo rovnou celý řádek vypustit).

Dále provede filtraci podle souborů. A to tak, že sítem projdou všechny složky, které obsahují soubory dle vzoru výše, a to, pokud jich obsahuje alespoň uvedený počet. My tuto volbu ponecháme na uživateli. Čím nižší číslo, tím více falešně pozitivních složek disketo najde (např. grafika k programům), naopak čím vyšší, tím víc skutečných složek s fotkami bude ignorováno. Bude to chtít trochu experimentování, proto jej necháme uživateli zadat až při spuštění. Tedy:

A spustíme (budeme hledat složku s alespoň dvěma fotkami):

Zajímavostí je, že nyní jsme našli i fotky školního projektu, které nám předchozí skript nenalezl.

Jen tak mimochodem, při velmi vysokém čísle (stovky či třeba tisíc) pak můžete obdržet složky, které obsahují enormní množství fotek. Získáte tak přehled – jednak o tom na jaké akci (či v jakém časovém úseku) jste opravdu hodně fotili – ale zřejmě také o tom, která složka pravděpodobně obsahuje nevytříděné a nepromazané fotky.

Hledání duplicit – složky

Výborně, máme tedy seznam všech složek obsahující fotky. Ze by bylo fajn si jej ručně projít a zkontrolovat. Přecijen, v počítači můžete mít různé složky a vzoru tak může odpovídat i například složka Xbfotoxb20am, která ale zřejmě nebude obsahovat fotky.

Také se ukázalo rozumným shromáždit si všechny složky s fotkami na jedno místo. Založte si složku třeba UKLID_FOTKY a všechny si tam nakopírujte/přesuňte. Zjednoduší to práci i vám i disketu, který nebude muset pořád dokola prohledávat všechna uložiště (bohužel, disketo je v tomhle poněkud hloupý a tak prohledává pokaždé vše, bez ohledu na to, jestli se něco změnilo či ne).

Máte? Výborně. (Já tento krok v rámci jednoduchosti vynechávám.) Nyní se jen tak pro kontrolu podíváme, jestli některou ze složek s fotkami nemáte dvakrát (či dokonce vícekrát). Přecijen – často člověk zálohuje až moc – a některé zcela totožné fotky může mít na více místech – i když jsou to pokaždé tytéž. Necháme disketo, ať vám vyhledá duplicitní složky (v první fázi pouze takové, které mají shodný název). Použijeme následující skript:

Disketo vám vypíše všechny složky, které mají nějaké „dvojče“ (tj. jinou složku se stejným názvem). Jak si vypsat, která (či které, pokud je jich víc) to je, si povíme za chvíli.

V mém případě však žádné duplicitní složky nenalezl, takže jdeme pátrat dál.

Hledání duplicit – soubory

Když dva dělají totéž není to totéž – a stejně tak, když se dvě složky jmenují stejně, neznamená to, že jsou si věrnou kopií. Složky s názvem „dovolená u moře“ „vánoce u Nováků“ či „šedesátiny“ by mohly vyprávět.

Pomocí disketa můžeme i tyto hříšníky odhalit. Použijeme skript pro vyhledání složek s duplicitními soubory. Skript porovná všechny složky (včetně jejich obsahů) mezi sebou navzájem a pokud najde shodu (složka obsahuje víc než zadaný počet shodných souborů), složku vypíše.

A podle čeho je bude porovnávat? Nejjednodušší je porovnávání podle názvů souborů. Takový disketo skript bude vypadat následovně:

Pro případ, že by název souboru nebyl dostatečný (např. pokud foťák čísluje vždy od nuly a stejné názvy souborů by se tak často opakovaly) je možné porovnávat nejen podle názvu souborů, ale také podle velikosti. Minimálně u fotek je poměrně nepravděpodobné, že by dvě fotky měly stejný název i stejnou velikost. V takovém případě se namísto filter_directories_with_common_file_names použije filter_directories_with_common_file_names_with_size.

Teoreticky by také bylo možné porovnávat podle data poslední změny či vytvoření souboru. To však u souborů, které vznikly zkopírováním moc nedává smysl (soubor kopie vzniká až při kopírování, nemá tedy stejný čas vzniku jako původní soubor), takže v disketu není implementován a musel by se naprogramovat ručně (což ovšem není nemožné, disketo s tím tak trochu počítá).

Každopádně, my se budeme držet původního porovnávání dle jména souboru. Skript nám vypsal, které složky mají nějaké „dvojče“, ale nevíme jaké:

Abychom to zjistili, budeme změnit způsob, kterým se vypisují nalezené složky, tj. poslední příkaz našeho skriptu. Bohužel, teď už se neobejdeme bez aktivního programování, je potřeba naprogramovat vlastní „vypisovač“, tedy subrutinu, která vypíše, co přesně potřebujeme. V našem případě chceme vypsat u každého nalezené složky také ty, které jsou jejími dvojčaty (opět, může jich být víc). Bez dalšího vysvětlování:

Výsledek je mnohem informativnější (pro lepší přehlednost doporučuji zkrátit cesty, tj nahradit např. /home/martin/obrazky za O a /home/martin/zaloha za Z):

Vidíme tedy, které složky obsahují podezřele společné soubory. Je tu jistá šance, že se jedná o kopii téhož obsahu – v našem případě složka nafoceny-projekt poměrně pochopitelně obsahuje také soubory ze složky s fotkami, proto se nám vypsala. Často ale jen narazíme na složku, která jen obsahuje neprotříděné či nepromazané soubory oproti jiné – a přitom se nám vypíše jako duplicita.

Tomu asi úplně nejde zabránit, nicméně mohli bychom si vypsat, kolik souborů obsahuje první složka, kolik druhá – a kolik z nich mají společné. (Šlo by vypsat soubory všechny, ale to by bylo poněkud nepřehledné.) Něco takového najdeme v souboru scripts/find-common-directories.ds. Ten nám vypíše (první číslo je počet souborů složky na začátku řádku, druhé číslo počet společných souborů a třetí číslo počet souborů v druhé složce):

Pokud jsou všechna tři čísla stejná, pak jsou obsahy obou složek (zřejmě) totožné. Než ale jednu z nich smažete raději si je obě otevřete a obsahy zkontrolujte (jak jsem psal, porovnáváme pouze na základě názvů souborů).

Další poměrně pozitivní případ je typu 120/49/49 (a pochopitelně tedy i zrcadlový), tedy že všechny soubory z druhé složky se dají najít také v první složce. Soubory v druhé složce tak nejspíš oproti té první prošly promazáním či roztříděním. (A nebo se naopak část z nich ztratila při překopírování!)

Pokud budou čísla zcela rozdílná, pak se bude jednat o naprostý mišmaš a fotky bude bohužel potřeba projít ručně.

Hon na Otesánka

Máte-li odebrány všechny duplicitní fotky a stále máte pocit, že vám moc místa na disku neubylo? Můžete se zkusit poohlédnout po největších žroutech místa na disku. V případě fotek to budou pravděpodobně videa. Dost možná tam někde máte dvouminutový záběr vaší kamarádky, jak tančí v temném baru na stole. Ano, přesně ten typ videí, kde není absolutně nic vidět, zato je tam slyšet celá hospoda. Pominu-li fakt, že takováto videa by vůbec neměla vznikat, natož se dostat až do rodinného alba, tak mohou být taky poměrně pěkný Otesánek – jedno takové video vydá klidně z pár desítek fotek.

S odhalením podobných souborů může pomoct například unixový prográmek baobab, neboli Analyzátor využití disku, nicméně podobnou službu nám s trochou snahy poskytne také disketo. Začneme tím, že použijeme skriptík pro vypsání souborů fotek s jejich velikostí. Například skript:

Vypíše u každé fotky její velikost v (kilo)Bajtech:

A teď trocha hrátek s unixovým shellem. Následující příkaz spustí disketo s předchozím skriptem, u výpisu prohodí sloupce (aby byla velikost první), seřadí (tedy podle velikosti) a vypíše prvních 5 souborů:

Já ve složkách žádná videa nemám, ale je vidět, že fotky z loňska jsou víc, než dvakrát větší, než ostatní. Kdybych tedy potřeboval uvolnit místo, už bych věděl, na které fotky sáhnout jako první.

Kontrola zálohy

Posledním, co si ukážeme, je jednoduchá analýza záloh. To se může hodit třeba v případě, že někde najdete zapomenutou a dost možná nekompletní zálohu, a budete potřebovat zjistit, jestli náhodou neobsahuje nějaké cenné či ztracené soubory.

Vlastně je to docela jednoduché – pomocí disketa si vylistujeme všechny soubory jak na aktuálním, tak na záložním uložišti a oba seznamy souborů vypíšeme do souboru. Pak už jen soubory porovnáme, nejjednoduššeji pomocí comm (graficky pak např. pomocí meld). Pro vylistování souborů použijeme následující disketo skript:

a poté (sed je použit pro odstranění společné části cest):

vypíše soubory, které jsou ve složce se zálohou, avšak nikoliv ve složce obrazky.

Porovnání složek graficky pomocí aplikace meld

Závěrem

Jak je vidět, disketo dokáže být celkem užitečná hračka. Samozřejmě opravdový potenciál tohoto pidiprográmku ocení asi jen programátor na linuxu, který si rád hraje s příkazovou řádkou, ale třeba se jednou dokopu, dopíšu dokumentaci a přidám i dummy verzi pro běžného smrtelníka.

Udělejte si pořádek v PC s nástrojem disketo!

Víte, co udělá programátor, když si musí roztřídit fotky? Správně, napíše si na to program. A víte, co udělá informatik, když si musí roztřídit fotky? Navrhne si framework a spolu s ním i vlastní skriptovací jazyk. A napíše si na to program.

Co je to Disketo_Framework?

A teď vážně. Disketo_Framework, neboli zkráceně prostě disketo, je nástroj pro, řekněme pokročilé prohledávání diskových uložišť. Tedy všech pevných, nepevných, externích i interních disků, flash disků, pamětových karet a já-nevím-čeho-ještě. Zkrátka všeho, co obsahuje soubory a složky.

A proč? Nu, protože občas je nutné všechna tato uložiště projít a udělat si v nich pořádek. Ano, mluvím na vás, jež shraňují data roky, a pak jednou za čas, když jim začne docházet místo, tak vymýšlí co smažou. Ano, přesně na vás, jež jednou za dva roky zkopírují celý obsah svého počítače někam na externí disk a nazývají to záloha. Ano, na ty, co data ukládají raděj i vícekrát, a pak mají počítač přehlcený duplicitními daty.

Zkrátka asi na každého z nás, protože jen opravdu málo lidí se o svou IT techniku stará skutečně precizně. A takový člověk musí jednou za čas sednout, posbírat všechny externí disky, paměťové karty a flash disky a udělat si v nich pořádek. Vzít staré zálohy, a zálohy záloh, zálohy zálohy záloh, a buďto smazat, případně zaktualizovat. Vzhledem k tomu, že místa na disku je vždycky nedostatek, tak zálohy jsou stejně nekompletní a případně končí slovy: „no co, tak fotky jsem zálohoval loni a tak v nejhorším přijdu o fotky za letošek“.

Disketo neřeší žádný z uvedených problémů, to říkám rovnou. Ale může vám s nimi alespoň pomoct. Pomocí disketa si totiž můžete vyhledat
(a to je taky vlastně jediné, co disketo umí) různé soubory a složky podle různých kritérií.

A teď trochu techničtěji …

Aby člověk mohl disketo požívat musí se nejdříve ujasnit některé technické záležitosti. Disketo totiž původně tak trochu vzniklo pro programátory, protože některé věci si zkrátka naprogramovat musíte vy, i když chcete aplikaci jen používat. Ale v základu jej určitě může ovládat i trochu víc technicky zdatný uživatel.

Disketo je totiž kromě toho hodně orientován na linuxové operační systémy. To znamená jednak to, že se spouští z příkazové řádky, ale také to, že se nesnaží problémy vyřešit přímo, ale poskytnout data ve strojovém formátu, aby je mohly zpracovat další unixové nástroje jako např. less, grep, sed, find – nebo třeba i excel.

V neposlední řadě, pořád je disketo také programátorská platforma – chcete-li – knihovna, kterou je možné použít a dále její funkcionalitu rozvíjet. V takovém případě se očekává skutečně aktivní znalost Perlu. Ano, Perlu!

Základní myšlenka

Celé disketo totiž stojí na tom, že pro vyhledávání „problémových“ souborů či složek je třeba disketu říct, co hledáte. Na úvod třeba všechny složky, které obsahují fotky. Dále například všechny složky, které v názvu obsahují záloha a obsahují více než 90% shodných souborů. Nebo všechny páry složek, které mají alespoň jeden (dva, tři, …) společné wordovské dokumenty. A nebo prostě a jednoduše všechny složky, ze všemožných disků, flashek, cloudů a paměťovek, které obsahují něco, co se týká bakalářky.

Jak toho dosáhnout? Jednoduše a přitom složitě. Disketo toho umí relativně dost, ale je potřeba mu říct, co přesně je potřeba, aby našel. Na začátku (resp. na konci, ale k tomu se dostaneme) je vždycky seznam tzv. kořenových složek. Tedy složek, které chcete prohledávat. V praxi to většinou jsou přímo kořenové složky všech disků či uložišť (tj. na Windows C:\, D:\ a podob.). Samozřejmě, pokud hledáte třeba všechny fotky z léta 2016, asi nebudete nechávat disketo prohledat celý počítač, bohatě postačí jen Obrázky\fotky\.

Výstup z disketa může být zobrazen třeba ve formě adresářového stromu

Dalším krokem, je potřeba ujasnit si, co vlastně hledám. Hledám složky podle názvu? Hledám složky s určitými soubory? Hledám duplicity? A nebo ještě něco jiného? Operace je samozřejmě možné kombinovat. A k tomu slouží tzv. disketo skripty.

Disketo skripty

Disketo skript pak není nic jiného, než seznam právě těchto operací, příkazů, úkolů. Tak například příkaz filter_directories_of_same_name ze seznamu všech složek vyškrtne ty, které jsou v něm jen jednou. Jinými slovy, nechá jen ty složky, které jsou v uložišti dvakrát. Samozřejmě, asi bude vhodné nejdřív vybrat jen složky, které nás zajímají, tedy: filter_directories_by_pattern.

Tento příkaz vyžaduje uvést, jaké složky se mají ponechat a jaké vyhodit – na základě názvu, pochopitelně. Tedy například "fotky", "škola" nebo "zaloha". Je také možné uvést $$, v takovém případě bude hodnota zadána až při spuštění. To se hodí pro opakovatelně použitelné disketo skripty s jinak stejnou konfigurací.

Na závěr je slušnost přeživší složky vypsat – tedy příkaz print_directories_simply. Výsledný skript by pak vypadal následovně (první a druhý příkaz byly prohozeny, je rozumné nejdříve vyřadit složky, které nepasují názvem, až pak ty, které se neopakují):

Takto připravený skript uložíme do souboru, třeba slozky.ds a můžeme spustit. Protože obsahuje jedenkrát $$, bude při spuštění vyžadovat zadání jedné hodnoty – vzoru pro filtrování složek.

Spouštění

Disketo se spouští pomocí tzv. interpretu disketo skriptů, tedy prográmku run-disketo-script.pl. Jeho použití je následující:

Jeho prvním argumentem je název (cesta) souboru disketo skriptu. Následují argumenty skriptu a na konci je pak seznam (kořenových) složek, které má disketo prohledávat.

Vezměme si náš disketo skript slozky.ds. Budeme chtít prohledat složky skola a zaloha, a hledat v nich všechny duplicitní složky s názvem statnice. Spuštění se provede následujícím příkazem:

Výstup bude následující:

Jak vidno, disketo nám vypsal spoustu informací. Pokud nás nezajímají informativní hlášky o průběhu (hodí se vědět, jak dlouho která operace probíhala, můžou to totiž být i hodiny), můžeme je skrýt přesměrováním standartního chybového výstupu do /dev/null:

Nyní už vidíme jen seznam tří složek, které mají v názvu (resp. v celé cestě) statnice a současně mají shodný název s některou z jiných (zde všechny tyto tři současně). Když zkusíme vyhledat prijmacky, dostaneme:

Samozřejmě, disketo vyhledává slovo od slova. Při vyhledávání statnice nenajde ani státnice ani statnicove-otazky. Obecně, s češtinou (ve smyslu diakritiky) bude mít disketo zřejmě nemalý problém. Za to se omlouvám, řešení by bylo komplikované.

Další funkce

Například následující disketo skript vyhledá všechny složky, které mají zvolený název, a které obsahují alespoň jeden wordovský dokument:

Abyste si nemuseli pamatovat, jaké hodnoty skript kde vyžaduje (obzvlášť, pokud bude skript vyžadovat parametrů více), příkaz ./run-disketo-script.pl dokumenty.ds (tedy zavolání disketa jen s názvem skriptu, bez dalších hodnot a složek) vám požadované argumenty vypíše:

Co dělá který příkaz a co znamená každý z jeho argumentů by mělo být poměrně intuitivní, takže k nim není dodávána žádná další dokumentace. Zájemci mohou konzultovat zdrojový kód modulu Disketo_Extras, kde jsou implementovány.

Pro opětovné ozkoušení, jestli jste uvedli správné hodnoty lze použít přepínač --dry-run. Ten, klasicky, spustí disketo skript s reálnými hodnotami (ať už přímo ze skriptu nebo zadané při spuštění), ale nebude prohledávat disk (což ušetří čas). Tedy:

Pokud jej necháme skutečně proběhnout (tj. bez --dry-run), vypíše nám něco následujícího:

Jak vidíte, skutečně nám vypsal všechny (složky i podsložky), které v názvu obsahují otazky (a přitom obsahují alespoň jeden dokument *.docx).

Pár poznámek

Do disketo skriptů lze vkládat komentáře. Nijak neobvykle, řádek začínající # je ignorován až do svého konce.

Přepínač --dry-run už jsem zmínil. Vypíše, jaké příkazy disketo provede a s jakými hodnotami. Seznam všech příkazů a jejich parametrů se vypíše pomocí příkazu./run-disketo-script.pl --list-functions . Bohužel, nechtělo se mi psát se s dokumentací, takže případné informace o to, co patřičný příkaz dělá, vás odkážu na modul Disketo_Extras.

Disketo ve většině případů pracuje pouze s názvem souborů či složek. Předpokládá totiž, že chceme-li hledat složky s excelovskými tabulkami, budeme hledat soubory s příponou xls nebo xlsx, při hledání fotek jpg a podob.

S tím souvisí – pokud je některý z parametrů nazván pattern, pak ve skutečnosti očekává regulérní výraz, navíc case sensitivní, tedy rozlišující velká a malá písmena. Takže např. pro vyhledání fotek (malými nebo velkými písmeny) je třeba použít [fF][oO][tT][kK][yY] popř. (fotky)|(FOTKY). Pro vyhledání „fotky nebo foto“ pak třeba fot(o|ky).

Pokud se regulérní výrazy neznáte, mělo by být možné použít namísto nich běžný text. Je tedy třeba akorát hlídat si malá a velká písmena a vyhnout se použití speciálních znaků (závorky, pomlčky) (nebo před každý z nich dát zpětné lomítko). Pokud chcete vzor, který splňuje každý text, použijte např. (.*) (to se hodí, pokud je pro vás některý z filtrů zbytečný, nebo jej chcete jen rychle deaktivovat).

Obdobně, parametry jako printer nebo matcher musí být perlovské subrutiny, tedy funkce. Díky tomu je možné doprogramovat prakticky libovolný způsob, jak porovnávat, vypisovat, či vyhledávat soubory a složky. Tak například následující skript:

Vypíše:

Na závěr už snad jen – v instalaci disketa se nachází adresář scripts, který obsahuje pár základních skriptů. Asi nebudou úplně pro přímé použití, nicméně třeba poslouží jako inspirace.

Kde a jak?

Disketo najdete na mém GitHubu, není to samostatný repozitář, je součástí mého projektíku shell-utils.

Disketo – kromě perlu, pochopitelně, nemá žádné jiné závislosti nebo požadavky. Stačí mít jen v počítači perl a spustit ./run-disketo-script.pl, popř. perl run-disketo-script.pl.

V samostatném článku pak ukážu, jak si s pomocí disketa udělat pořádek ve fotkách.

Ruští hackeři v česku? Zatím ne …

Původně tento článek měl prezentovat šokující zjištění ohledně působení (ruských) hackerů v česku. Na(ne)štěstí se ale ukázalo, že se jedná jen o neškodnou shodu náhod. I tak bych ale má zjištění označil za zajímavá.

Nedávno jsem potřeboval dokoupit nějaké ztracené náhradní díly k nábytku. To se občas stane každému, žeano.

Sedl jsem tedy ke Googlu a celkem naslepo googlil „ten prapodivný divný šroubek IKEA“ a podobné. Trošku mě překvapilo, že mě google zavedl i na stránky na webech s doménou riverfoodfestival.cz, osobnidluhy.cz či elektrofolk.cz :

Ale říkal jsem si – proč ne – třeba River Food festival dělá reklamu některému ze sponzorů, prodejci nábytku. A nebo si jen dělá legraci a článek by měl podtitulek: „Také už máte plné zuby všech těch šroubků, desek a hřebíčků z IKEI? Tak se přijďte odreagovat na náš festival!“

Stejnětak jsem si dokázal představit, že portál osobnidluhy.cz bude jako jednu ze služeb přeprodávat přeprodávat náhradní díly na nábytek od registrovaných dlužníků. Prodávat jinak korunové položky, za řekněme 100x vyšší částky s tím, že zisk z prodeje by šel na boj s dluhovými pastmi, mi přišlo vyloženě jako super nápad. No a že prodejce elektroniky elektrofolk prodává také díly na nábytek je překvapivé snad ze všeho nejméně.

Nic nemohlo být dále od pravdy. Už z prvního webu jsem vytušil, že tohle nebude ta správná cesta. Web vypadal až moc profesionálně na to, aby nabízel šroubečky a panty. Zářily na něm na mě obrázky krásného moderního nábytku, o náhradních dílech však ani stopy. Obdobná situace byla i na dalších výše jmenovaných webech.

Co mě však zaujalo víc než obskurní doménová jména byla skutečnost, že weby vypadaly … noo, tak nějak podobně. Když si byl jeden podobný druhému, říkal jsem si, že se asi jedná jen o jiný brand stejné firmy – a tudíž i web mají podobný. U třetího mi to ale přišlo podezřelé – nu posuďte sami:

První 3 stránky
Ukázky z trojce nalezených stránek.

To už mi nedalo, tak jsem se na webu krátce pozdržel. Zjistil jsem, že ať kliknu kamkoliv, jsem odsměrován vždy na tutéž stránku. Ne moc překvapivě, daná stránka nefungovala.

Weby se odkazovaly vždy na stránku enter.php, která následně přesměrovávala na ww1.nabytek-fagus.cz nebo ww1.jisknabytek.cz . Ani jedna z těchto stránek však nefungovala.

Jednou jsem byl ale namátkou (zřejmě po vypnutí adblocku) přesměrován na stránky ww31.nabytek-fagus.cz nebo ww31.jisknabytek.cz , což byly klasické zaparkované stránky s reklamami.

Doplnění: O pár týdnů později weby přesměrovávaly také na http://ww38.exoticky-nabytek.cz . Navíc, ww1.nabytek-fagus.cz mezitím začal fungovat (a zobrazovat reklamy).

V ten moment mi to přišlo úsměvné, že si někdo platí evidentně několik domén, aby mu na nich visely webové prezentace – které všechny směřují na neexistující – zřejmě – stránky skutečného prodejce.

Nicméně, já jsem pokračoval v kobercovém náletu na internet. Ve výsledcích vyhledávání jsem narazil na stránku výsledků vyhledávání v (jak se ukázalo tak – značně pochybném) vyhledávači ZapMeta . Říkal jsem si – proč ne, beztak ve výsledcích Googlu, kde se akorát pere jedna reklama přes druhou, a ta zbylá pole obsazují moderní weby moderních výrobců/prodejců moderního nábytku, bude zajímavé vyzkoušet nějaký alternativní vyhledávač. Třeba se tak dostanu na nějaký 20 let neudržovaný web dvaašedesátiletého prodejce nábytkových dílů z okrajové části města …

Od tohoto momentu už jsem nehledal náhradní díly na nábytek. Pokud mi google našel tři, čtyři pochybně podobné weby, ve výsledcích vyhledávače zapmeta to byl prakticky každý druhý. Namátkou jsem si několik takových odkazů vypsal:

  • https://www.krmivalevne.cz/clanek/nahradni-dily-pro-sedaci-soupravy
  • https://www.plzen-lekarna.cz/clanek/pojezdy-vestavene-skrine
  • https://www.tenis-sokolov.cz/_.php
  • https://www.tecard.cz/pojezdy-sk-in
  • https://www.condor-reklamy.cz/pryzove-zatky-na-nohy-od-zidle
  • https://www.3sezonyvpekle.cz/levny-polsky-nabytek
  • https://www.mssochanova.cz/levny-nabytek-za-odvoz
  • https://www.alpanharmony.cz/clanek/kancelarsky-nabytek-za-odvoz
  • https://www.allowance.cz/daruji-stary-nabytek-ostrava-zdarma-za-odvoz
  • https://www.tecard.cz/nabytek-bazar-daruji-za-odvoz-postele
  • https://www.skodaeshop.cz/telo-potrebuje-hubnuti-bez-stresu-2/
  • https://www.lekarnauhute-ostrava.cz/nabytek/za-odvoz-uherske-hradiste
  • https://www.autodilymazacitechnika.cz/inzerce-ostrava-nabytek-daruji
  • https://www.czdent.cz/barove-zidle-emilio-cerne-barove-zidle
  • https://www.autobusovadoprava-ramball.cz/nabytek-za-odvoz-teplice
  • https://www.autobusovadoprava-ramball.cz/za-odvoz-stary-nabytek
  • https://www.czdent.cz/barove-zidle-emilio-cerne-barove-zidle
  • https://www.rozvozrokytnice.cz/nabytek/za-odvoz-vysocina
  • https://www.ohrivacevody.cz/stropni-svitidla-do-kuchyn
Výsledky vyhledávání vyhledávače zampeta
Výsledky vyhledávání vyhledávače zampeta: 5x fake nábytek a jeden pochybný ruský server mezi nimi …

Vzhledem k tomu, že zde prakticky nebyl pochyb o tom, že někdo evidentně rád skupuje různé domény (a to opravdu různorodé!) aby na nich provozoval líbivé weby (bez ohledu na URL stránky!!) prodejců nábytku, nedalo mi to, a jal jsem se situaci diagnostikovat.

Další stránky
Náhoda? Nemyslím si.

Ukázalo se, že většina z těchto domén je registrovaná na jistého soudruha (sic!) Todora Dimitrova z Prahy. Kromě něj jsem ale narazil na korejce, mexičana a dokonce i slováka. Ale neprověřoval jsem všechny domény.

DNS záznamy některých z webů
DNS záznamy některých z webů

Zdá se však, že tento případ má poněkud nečekané rozuzlení. Pan „soudruh“ Dimitrov (opravdu si tak nechává říkat!) je ve skutečnosti CEO společnosti TELE3, u které, zdá se, tyto weby běží. Zřejmě se tak jedná jen o zaparkované domény bez reálných provozovatelů.

Reálné reklamní stránky (pokud zrovna fungují), cíle odkazů na "podvodných" nábytkových webech
Reálné reklamní stránky (pokud zrovna fungují), cíle odkazů na „podvodných“ nábytkových webech

Že se nejedná o žádné weby ruských hackerů dokládá i například skutečnost, že zdrojový kód stránek není nijak obfuskovaný. Ba dokonce, můžete v něm najít i komentář některého ze slovenských vývojářů:

Slovenský komentář v kódu stránky
Slovenský komentář v kódu stránky

A pak je tu ještě jedna věc. Náhodou jsem zjistil, že některé z webů obsahují v patičce odkaz na jednoho ze svých bratrů. Tedy na další takový web. Jsem-li hacker provozující síť falešných webů s nábytkem, určitě nebudu chtít, aby se mezi nimi dalo v poklidu proklikávat. Dá-li se totiž někde proklikávat, dá se to poměrně snadno zautomatizovat.

Ano, skutečně jsem si napsal skriptík, který tento řetězec webů prochází. Skript se zkrátka podívá na zadaný web a pokud obsahuje odkaz na další, následuje ho. A situace se opakuje. Bohužel, odkazy na další obsahuje ani ne polovina webů, na které jsem narazil, takže moje původní vize, že se mi podaří nasbírat všech několik stovek těchto webů a po pár hodinách načítání se octnu na výchozí stránce, byla tedy lichá. I tak se mi ale u asi tak 5 webů podařilo „proklikat“ na v průměru 5 dalších. Mám tak seznam téměř 50 stránek s neexistujícím nábytkem…

Původně jsem chtěl jít ještě dál, a to tak, že bych si naprogramoval i klienta pro vyhledávač zapmeta. Tomu bych pak už jen předhazoval rozličné vyhledávací fráze a mohl tak síť falešných webů řádově rozrůst. Bohužel ale zapmeta není zrovna dvakrát developper friendly, takže to se mi nepodařilo. Nicméně, skriptík na procházení seznamu webů mám hotový a najdete ho na mém GitHubu.

Závěr je tedy asi takový, že téměř jistě se nejedná o invazi ruských hackerů, jež se snaží vydávat za prodejce nábytku a – v asi tom nejhorším případě – pomocí phishingu získávat osobní či platební údaje našich spoluobčanů.

Zřejmě šlo jen o akci doménového spekulanta. Se zálibou v prodeji nábytku. Jinak by totiž na své nakoupené domény nasadil prosté reklamní stránky tak, jak to bývá zvykem.

Takže působí tedy v česku ruští hackeři? Samozřejmě, ale tohle není ten případ.

Ty lampo jedna pouliční!

Příběhy jsou všude kolem nás. Některé vyplouvají na povrch až po setmění. Další najdeme přímo nad našimi hlavami. A jiné …

Nenapadlo vás někdy, že ty páry pouličních lamp, co osvětlují přechody pro chodce, jsou jak mladý pár po hádce? Nemyslím teď ty staré, vysoké, oranžově svítící lampy se sodíkovými výbojkami. Mám na mysli ty menší lampy s lomeným stožárem. Přesně ty, co posledních pár let jasně bílou barvou osvětlují (obvykle z obou stran) snad všechny přechody pro chodce ve městech.

Tak přesně ty myslím. Jako kdyby se svým totálně sklopeným – avšak o to soustředěnějším pohledem – báli pohlédnout do tváře svého druha. Jakoby jejich svit byl plný výčitek, strachu a tak trochu i lítosti. Asi už se nikdy nikdo nedozvíme, co se vlastně stalo. Ostatně tak už to v životě chodí. Než se nadějete, stojíte, koukáte do země a strašně moc si přejete to vrátit zpátky.

A tak si tu, jen tak, stojí dvojice pouličních lamp. Ve dne spí, v noci bdí. Zklesle stojí, mlčky zírají do země, na onu černo-bílou pruhovanou věc, po které se však stále někdo vozí a nebo minimálně do ní pěkně z ostra šlápne.

Bolestné každé takové šlápnutí. A i přes to všechno nejsme svědky ničeho jiného, než nekonečného „nic“. Hádky, ve které nepadlo ani jedno slovo. Mlčení, a soustředěného pohledu do země, ve snaze tam něco najít. Nic víc. Jako kdyby nedokázali zvednout hlavy, podívat se sami sobě do očí, pousmát se a říct si, že to zase bude dobrý. Pro Krista pána, vždyť jsou to jen lampy, co hrozného si mohli udělat?!

Podobně si asi tak povzdechla stará lampa (ano, ta vysoká stará, co svítí oranžově, jak jsem o ni psal v úvodu). „Ach ti mladí.“ Tolik plni života – a oni jej marní zahleděním do země. Stará lampa už toho zažila hodně. Dost možná desítky letu tu stojí. Ač ji elektronika už tak neslouží, a rez už si pomalu začíná vybírat svou daň, stále ještě svému účelu slouží. Nemá sice tolik sil, jak ti dva mladí támhle dole, nicméně síly své využívá s rozvahou.

Svůj pohled neupírá rovnou do země, ale díky svému ne zcela sklopenému pohledu má možnost sledovat i to, co se děje v blízkém okolí. A to, co neví, se dozvěděla od Bláži naproti nebo Karla vlevo. Ale pokaždé, když se večer rozzáří halogeny těch dvou dole, posteskne si. Stará lampa, která toho prožila tolik, kterou už tolikrát chtěli vyměnit. Která už desítky let trpí útoky vandalů, zlodějů a sprejerů. Která pamatuje snad ještě Husáka a doby, kdy klidně půl dne nespatřila nic jiného, než Trabanta, MBéčko nebo Škodu 120. Tedy – samozřejmě kromě lidí.

Kromě lidí, těch prapodivných stvoření, které ji nějakým zvláštním způsobem přivedly na svět. Jsou to – věru – obdivuhodná stvoření. Nejen, že vytváří něco tak na pohled bezúčelného, jako jsou pouliční lampy, ale ještě se o ně starají. Jakoby něco, co celou noc zírá upřeně do země pro tyto „člověky“ mělo nějaký smysl.

Smysl – a jsme opět u toho. Co ti dva tam dole provádějí? Proč nemůžou být jak li „lidé“, radostní, šťastní, upovídaní? Co to má za smysl jen tak mlčky celou noc stát a zírat do země? Stará lampa nechápe. V tom zabzučela Karlova tlumivka, že prý toho Honzu, mladýho z druhýho konce ulice porazilo auto. Smutná to zpráva pro celou ulici. Sníh na svých zátylcích, který svým smutkem zahřívají, pomalu odkapává. Lampy v celé ulici pláčou.

Ale s těmi dvěma mladými, jako by to ani nehlo. Díky moderním technologiím výroby, jako by snad ani nedokázali plakat. Stále mlčky stojí, hledí do změti černo-bílých pruhů. Nic víc.

I ten starý moudrý a ustaraný semafor na konci ulice, který má celou ulici jako na dlani, si jen mrčí něco málo pod vousy. Že prý pamatuje doby, kdy každá lampa radostně zářila do všech stran a to. A to dokonce válka, neválka. „No co, nová doba.“ Zamručí si naposled. Blíží se půlnoc, jeho směna pomalu končí.

A ty mladé čeká další tichá noc. Kéž by se tak mohli zvednou a pohlédnout si do tváře! Alespoň maličko. Staré lampě, ale jistě všem ostatním v ulici, by se určitě ulevilo. Zvednou hlavy – tak málo by stačilo.

A teď je řada na vás. Rozhlédněte se, vlevo, vpravo. Máte na stole lampičku? Co asi tak trápí ji?

Svaz poznání: Od filozofie k matematice a zpět

Často říkám, že informatika je vlastně jen z jedné třetiny filozofie, z druhé psychologie a z té třetí matematika. Že bez matematiky se informatika neobejde asi nikoho nepřekvapí. V tomto článku bych však chtěl ukázat, že i filozofie má v informatice značný význam. A dost možná i naopak.

Každý trochu méně pasivní student informatiky na Univerzitě Palackého jistě nějakým způsobem už někdy slyšel zkratku FCA. FCA, neboli Formal Concept Analysis, česky Formální a Konceptuální analýza, Formálně-konceptuální analýza, Analýza Formálních konceptů či dokonce Formální analýza konceptů (že je ta čeština krásná, co? Raděj se budu držet anglického FCA). Tím však zřejmě znalosti této ne moc známé informatické disciplíny končí, takže mi dovolte lehký úvod do FCA.

Formálně konceptuální analýza formálních konceptů?

FCA je technika pro zpracování dat, konkrétně tzv. data-miningová, tedy technika pro tzv. dolování dat, nebo jinými slovy získávání znalostí z dat (i zde je angličtina skromná a používá souhrnně pojem data mining). To znamená, že FCA analyzuje obvykle velké množství určitých dat, o kterých toho moc nevíme, a snaží se z nich vytěžit (doslova) co nejvíce informací.

Dobře, a jak, říkáte si? Na pochopení FCA se pojďme vrátit o pár století zpět (pokud tento článek bude číst někdo za pár tisíciletí, tak se omlouvám za nepřesnost). Konkrétně do století sedmnáctého. Ještě konkrétněji, chcete-li, do jeho šedesátých let. V této době totiž tak nějak (přece jen, tehdejší publikační činnost vypadala krapet jinak, než dnes) vznikla tzv. Logika z Port-Royal, resp. Port-Royalská logika. Jedná se o filozofické dílo, resp. myšlenku, názor, či pohled na svět.

Pochopitelně, nejsem filozof, situaci značně zjednodušuji, ale základní myšlenka Port-Royalské Logiky je až děsivě jednoduchá: Svět kolem nás je tvořen různými objekty. Každý takový objekt má určité vlastnosti.

Pokud budeme schopni popsat všechny objekty v našem okolí a budeme schopni popsat jejich vlastnosti, pak získáme přehled o celém světě, univerzu, éteru, či zakouřené putyce, ve které zrovna sedíme. Pro značnou část nefilozofů další důkaz toho, že filozofie je jen smíška … objektů s vlastností „být silně zapáchající“.

Ne však pro jednoho nejmenovaného německého matematika, který přesně toto v osmdesátých letech dvacátého století popsal matematicky. Proč? Protože to byl odborník na tzv. teorii uspořádání a právě v Port-Royalské Logice našel její uplatnění. No a tak vznikla FCA.

Přicházejí kočičky

Jako vždy si odpustím padesát slajdů definice-věta-důkaz a vše osvětlím na příkladu. Představme si, že pozorujeme nějaký fiktivní svět, který je tvořen jen šesticí zvířátek (od každého jedno), jak uvádí následující tabulka:

Tabulka našeho světa

Jak je vidět, v našem světě žije pejsek, který se zcela určitě někdy napije, je to savec a má srst. Stejně tak tam žijí další dva savci – kočka a vydra. Která je spolu s rybou, žábou a kachnou vodní tvor. A tak dále. Jak bylo naznačeno, FCA analyzuje tzv. formální koncepty. Co je to ten formální koncept? No, to je tvrzení, které v našem světě platí. Tvrzení ve tvaru „nějaká zvířátka mají nějaké vlastnosti“. Tedy například „všechna zvířátka pijí„, „ryba, žába, vydra a kachna jsou vodní zvířata“ nebo například „pes, kočka a vydra jsou všichni savci se srstí„. Kteří pijí.

Všimněte si, že všechna zvířata pijí. Poté se nám zvířata dělí na savce/se srstí (to je vlastně v našem světě totéž) a na případně vodní zvěř. Vydra je jak savec se srstí, tak i vodní zvěř. Toto všechno lze graficky znázornit jako tzv. konceptuální svaz (odtud název článku). Černé puntíky znázorňují jednotlivé koncepty. Všimněte si, že čím více je v konceptu zvířátek, tím méně mají souhrnně vlastností (a naopak).

Konceptuální svaz

Bohužel, v praxi se s takto „primitivním“ světem obvykle nesetkáme. V reálném světě by byla jak tabulka, tak konceptuální svaz ji zobrazující pochopitelně vskutku obrovský. Kupříkladu, výřez ze spodní části konceptuálního svazu reálného světa by mohl vypadat například takto (za předpokladu, že v Praze žije paní Nováková a má …):

Kdesi dole ve svazu...

Můžete pozorovat, že úplně dole máme vždy jeden jediný konkrétní objekt. Například kočka Mourek paní Novákové z Prahy. O takovém objektu můžeme určit opravdu nespočet vlastností. Kromě vlastností, které mají všechny kočky paní Novákové z Prahy (a tudíž i všechny kočky z Prahy a tudíž i všechny kočky)(např. jméno majitelky, adresu bydliště, počet končetin), můžeme o Mourkovi říct, jakou má barvu srsti, kolik má let či jakou má nejraděj konzervu.

And we need to go deeper…

Dobře, to je Mourek. Ale, co když se vydáme v konceptuálním svazu směrem nahoru? Mourek je paní Novákové, je z Prahy, je to kočka, to vím. A dál? Kočka je určitě šelma a současně náš oblíbený savec. Tudíž je určitě obratlovec. A tedy i zvíře. Každé zvíře je živým tvorem. Živý tvor je něco, co najdeme v přírodě na planetě Zemi. Co najdeme v přírodě na planetě Zemi je něco, co najdeme ve Sluneční soustavě. A tak dále. Všimněte si, že jsme začali používat slovo „něco„. Neurčitost vzrostla tak vysoko, že už vlastně ani nepopisujeme žádný objekt, ale jen „něco“ splňující pár vlastností (např. nachází se na planetě Zemi, je tvořen atomy a molekulami).

Téměř celý svaz poznání

Dříve nebo později (dobře, spíš později, vzhledem k tomu, že vesmír je nekonečný), bychom se dostal k něčemu natolik obecnému, že bychom o něm nemohli říct vůbec nic konkrétního. K něčemu, co obecně nesplňuje naprosto žádnou vlastnost. (Tedy, krom jedné – že toto něco je rovno číslu čtyřicet dva.) Dostali bychom se k něčemu, co popisuje celý svět, celý vesmír, prostě úplně všechno. A tomu se, nepletu-li se, říká vyvrcholení filozofie.

Hledání nekonečna

Dobře, toť teorie. Ale k čemu je nám to v praxi? A proč je v názvu článku „svaz poznání“? Jistě, poznat celý svět a najít ono mýtické něco je snad snem kdejakého filozofa. Takže konceptuální svaz popisující celý vesmír vlastně popisuje všechno naše poznání. Ale ono je to ještě praktičtější. Tedy, pravda, pro vědce, či další profese, které produkují určité poznání.

Často se říká, že životní cyklus vědy je následující: hypotéza – teorie – experiment – vyhodnocení. Pohledem svazu poznání není věda nic jiného, než objevování nových končin právě v tomto svazu. Pravda, zjistit, že paní Nováková z Prahy má kocoura Mourka asi zrovna není téma na dizertaci. Nicméně, objevit nový druh motýla, vymyslet Eulerovu větu či zobecnit Speciální teorii relativity, to už vědou docela zavání.

Vědci totiž obvykle dělají jednu ze dvou věcí. Buďto se snaží zobecnit nějaké poznatky („co mají společného tito motýli?“, „platí Pythagorova věta pro libovolný exponent?“) nebo naopak snažit se situaci zpřesnit („všechny kovy vodí teplo, který kov nejlépe?“, „za těchto podmínek soustava nemá řešení, co když se omezíme jen na x = 0?“). Tyto postupy odpovídají hledání nového konceptu, nového puntíku ve svazu poznání, a to buď někde nad (zobecnění) nebo někde pod (zpřesnění) puntíky, které odpovídají naší teorii/hypotéze. Nemám pravdu?

Je jasné, že nikdy nepoznáme svaz celý, ale je pěkné, že někde uprostřed nekonečna se nachází malinkatý flíček, který máme zmapovaný a velmi pomalu se zvětšuje.

Programování je vlastně skoro jako vaření

Už je tomu pár let, co jsem napsal poměrně zdařilý článek srovnávající platformy Windows a „Linux“. Už pár měsíců se mi hlavou honil způsob, jak podobným způsobem běžnému smrtelníkovi popsat programování popř. obecně vývoj software. Píši proto tento článek, který by měl snad každému tátovi, každé babičce a dokonce i kdejaké knihomolce, která o programování ví asi jako křováci v Africe o Terrym Pratchettovi, co to vlastně to programování je.

Úvodem: programování vs. vývoj software

Na úvod mi dovolte jedno malé rozseknutí. Asi nikoho nepřekvapí, že jak programování, tak vývoj software jsou činnosti, na jejiž konci jsou počítačové programy, popř. software. Rozdíl mezi programováním a vývojem software však přece jen nějaký je.

Vrátíme-li se do kuchyně, můžeme říci, že programování je něco jako vaření, zatímco vývoj software příprava večeře. Příprava večeře obvykle obnáší vše od nákupu surovin, jejich přípravy (např. omytí zeleniny, rozmrazení masa), přes samotné vaření, až po úklid kuchyně a následně servírování.

Velmi podobně, vývoj software je proces, který se sestává z mnoha podkroků, mezi které patří například volba vhodných technologií, vytvoření zázemí (spuštění vývojářských serverů, instalace vývojových prostředí), přes samotné programování až po nasazení do provozu, uživatelské testování a údržbu.

V tomto článku se budu zabývat pouze samotným programováním, poněvadž fakt, že je s tvorbou software nějaká práce navíc asi nikoho až zase tak moc nepřekvapí. Naopak, programování je něco, co trápí nočními můrami už i leckteré studenty středních škol.

Vařila myšička omáčičku …

Máme tedy nachystány suroviny a jdeme vařit. Vezměme si učebnicový příklad: nějaká, téměř libovolná, omáčka. Rajská, koprovka či jakákoliv jiná. A, z druhé strany, takový typický elektronický obchod, e-shop. Ono bohužel i toto srovnání není úplně fér, vzhledem k tomu, že uvařit – byť sebepoctivější – omáčku nezabere víc, než pár hodin, zatímco nad e-shopem programátor může strávit dobrých pár týdnů. Pro ilustraci nám to ale bude stačit.

Když vidím, jakej jsem programátor, tak se bojím jít k doktorovi do kuchyně.

Jak takové vaření obvykle vypadá? Zde je první důležitý moment, protože stejně tak, jako se každá omáčka dá udělat jednoduše, rychle a obyčejně, tak i počítačový program se dá zkonstruovat méně či více propracovaně. Je rozdíl, jestli vaříte omáčku jako rychlou večeři nebo ke svátečnímu obědu pro celou rodinu. A stejně tak, e-shop prodávající jeden produkt s minimem dodatečných funkcí může být určitě vytvořen daleko snáze než propracovaný interaktivní systém s obrovským počtem uživatelů.

Jíška a vývar

Pokud omáčku budete začínat jíškou, bude vhodné si nejdříve jíšku připravit. Pokud ji budete zalévat vývarem, bylo by vhodné si nejdříve „uvařit“ vývar. Je tedy vidět, že i ve vaření se často setkáme s tím, že pro uvaření jednoho pokrmu je třeba mít uvařený nějaký/é další. Obdobně, pro vytvoření e-shopu je vhodné si nejdříve naprogramovat (samostatný/é) modul(y) – například pro připojení k databázi, přihlašování uživatelů, propojení se skladem a podob.

Stejně tak, jako se vývar dá nahradit bujónem, dá se obvykle propracovaný samostatný programový modul nahradit něčím jednodušším. Pokud si však vývar opravdu uvaříme, můžeme si část zamrazit a použít někdy příště. V oblasti vývoje software toto mívá mnohem větší význam – software se totiž nedělí ani nemrazí, ale prostě kopíruje. Takže „vývar“, který programátor jednou „uvaří“ může používat prakticky donekonečna.

Proto je víc, než jasné, že každý programátor se snaží tyto znovupoužitelné programové suroviny vytvářet jak jen to jde. Ve velkém množství případů však tyto suroviny ani nevytváří sám, ale – prostě si je koupí (popř. stáhne, pokud jsou zdarma). Na tom vlastně také není nic překvapivého: Kdo by se dnes doma mlel se strouhankou? Nebo si doma vyráběl vlastní majonézu?

Eintopf? Nein, danke!

Mimochodem, dnešní programování se dělí na dva hlavní (znepřátelené) směry: funkcionální a procedurální. Podíváme-li se na to pohledem přípravy omáčky, tak funkcionální programování vypadá asi takto: Programátor si nejdříve velmi pečlivě přichystá vše potřebné pro přípravu omáčky. Tedy jíšku i vývar, obě důkladně ochutí tak, aby s nimi pak při samotné přípravě omáčky měl minimum práce a současně nehrozilo, že mu výslednou omáčku zkazí. K tomu pak už jen přidá něco na ochucení omáčky, velmi jednoduše to smíchá dohromady a má zaručeno, že omáčka bude velmi pravděpodobně poživatelná.

Oproti tomu omáčka vařena procedurálně vypadá jako takový jeden velký eintopf. Procedurální vaření totiž připomíná spíše přípravu kouzelného lektvaru. Procedurální přístup znamená provádění jednotlivých dílčích kroků postupně za sebou. V praxi tedy jeden hrnec, do kterého se postupně přisypávají jednotlivé ingredience. I vývar by se nějak prapodivně měl vařit v hrnci, ve kterém se zvesela převaluje právě usmažená jíška. Postupným přidáváním dalších surovin by na závěr vznikla požadovaná omáčka.

Je jasné, že takovýto přístup je v praxi naprosto nepoužitelný. Funkcionální programování se zde zdá mnohem použitelnější. Z různých důvodů se však neprogramuje ani funkcionálně (protože to by například znamenalo, že jíška by se musela uvařit v kompletně svém vlastním hrnci a pak se zbytečně přelít do hrnce na omáčku), ale oba tyto přístupy se kombinují.

Málo slaná, co?

Nedílnou součástí každého vaření je ochutnávání. (Poznámka: bavíme se o ochutnávání, ale u pokrmu samozřejmě záleží také na vůni, barvě, konzistenci, palčivosti, teplotě…) Dokážete si představit, že uvaříte omáčku a ani jednou jste ji neochutnali? Bohužel, programátoři, kteří něco naprogramují a za celou dobu si nezkontrolují, že udělali všechno naprosto správně, jsou víc než běžnou záležitostí.

Zde nám trošku nahrává funkcionální programování. Pokud smícháme ingredience, které jsme důkladně ochutnali a ověřili si tak, že opravdu chutnají, jak mají, výsledný pokrm nám nezkazí. Naopak, při čistě procedurálním vaření vlastně až do poslední chvíle nemáme něco, co by stálo za to ochutnávat („není ta jíška s vývarem a kořením málo slaná?“).

Zkrátka a dobře, ochutnávání je pro vaření klíčové – a stejně tak i pro programátory. Chybička (nebo obecně cokoliv, co nezvykle ovlivní chuť) se totiž může stát vždycky. Tři malé místo dvou velkých cibulí, nezvykle silný česnek, či obvyklé „ups, asi mi trošku ujela ruka“.

Pokud se nám zdá omáčka málo slaná, dosolíme ji. Pak ji, pochopitelně, přesolíme, takže ji musíme doředit. Pak ovšem musíme přidat další koření, protože by byla slabá. Zkrátka, při každém takovém ochutnání často zjistíme, že je s omáčkou něco špatně a je potřeba to spravit. Tomu se v programování říká testování a ladění. Problém s testováním a laděním, s věčným ochutnáváním a dochucováním, je však ten, že se může opakovat velmi dlouho a pořád to není ono. Ve výsledku nám tak může vzniknout nějaký nepoživatelný paskvil, který tak akorát „za stálého míchání lijeme do hajzlu“. Bohužel i programátor se často setkává s tím, že pořád není spokojen, pořád to není ono, a tak neustále upravuje a upravuje, až mu nakonec stejně nezbude nic jiného, než to celé smazat a začít nanovo.

A to ani neříkám, že když jídlu něco schází, dá se docela snadno určit co. Sůl, koření, zahustit. Ale programátor má dost často jen informaci „je to dobrý“ a „není to dobrý“. Teprve studiem toho, co tam všechno nasypal může vyhodnotit, co asi udělal špatně.

Supermáma

Při programování se občas setkáme i s dalšími pojmy, které najdete i v kuchyni. Například synchronní a asynchronní programování. Pokud byste vařili synchronně, a věřte mi, že to tak občas určitě děláte, znamená to, že než se vám dokončí určitá část vaření, do které není potřeba zasahovat, tak stojíte u sporáku a čekáte. Až se voda ohřeje, až se máslo rozpustí, až to vychladne. Prostě stojíte a čekáte.

Oproti tomu, asynchronní programování znamená, že dáte vařit vodu, a jdete dělat něco jiného. Až bude voda uvařená, vrátíte se k ní. Logické, ne? No, bohužel, pro programátora je snažší si počkat. Už jen proto, že v momentě, kdy se voda dovaří, tak dost možná může být přerušen z nějaké činnosti, u které by neměl být rušen. Člověk při vaření na to myslí, ale – programátor za počítačem má poměrně omezené možnosti.

Spoustu legrace si také každý programátor užije při paralelním programování. Tedy, že v kuchyni není sám. Velmi často se totiž poštěstí, že se lidí po kuchyni potuluje více. A zkuste se ubránit situacím typu: „Cože, tys tu omáčku taky solil?“, „Ale já ten nůž potřebuju teď hned!“, nebo „Teď, teď jsem si tu solničku sem položil. Kdo mi ji vzal?“. Opět – v kuchyni docela humorné situace, avšak pro programátora noční můra. Omáčku osolí sotva špetičkou soli – a je přesolená. Nebo chce něco ukrojit a zjistí, že nůž na stole neexistuje. A hledejte chybu, kterou jste nezpůsobili vy.

Noční můra každého programátora? Kdyby Láďa Hruška začal programovat …

Obdobně, jako v kuchyni, i většina programátorů občas používá tzv. „hacky“. Tedy něco, co je naprosto nepřípustné, ale – ono mu to prostě extrémně zjednoduší práci. Mezi takové „hacky“ patří například zahušťování omáčky moukou namísto jíšky, nahrazení vývaru bujónem či tomatové omáčky kečupem. Ano, přesně tak, takový Jirka Babica. (Opravdu si nedokážu představit, jak by vypadal jako programátor.) Jsou to prostě věci, kterým se každý slušný programátor snaží vyhýbat jak jen to jde. Bohužel, ne vždy to jde (nebo je to vyloženě nutné).

Dobrou chuť!

Pomalu se blížíme ke konci, omáčka je téměř hotova, poslední přisolení, zamíchání a je hotovo. Můžeme servírovat, chutná skvěle. Náš e-shop je hotov a může být spuštěn. Někdo nám ale hned první den píše, že se do něj nedá přihlásit. A další. A další. Jak je to možné? Jednoduše – i ta omáčka, která nám chutnala (nebo to s ní naše chuťové pohárky prostě vzdaly a začaly našemu mozku tvrdit, že je opravdu skvělá), nemusí chutnat všem. To se tak bohužel stává. U programátora to může být tím, že po všem tom ladění a testování je prostě jen něco úplně obyčejně přehlédl. A nebo – prostě je tam něco, mezi židlí a klávesnicí, co způsobilo, že to funguje jen jemu a nikomu jinému.

Věřím, že mé srovnání programování s vařením někomu nemusí být po chuti. Je fakt, že by se dalo najít hned několik disciplín, kde se to k sobě hodí asi jak vegan a řízek. Nicméně, stále platí, že i programování, obdobně jako vaření, je prostě věda. Opravdu velká věda. Avšak pro programátora je i docela obyčejná omáčka práce na dlouhé týdny či měsíce. Tak tedy dobrou chuť všem programátorům!

Rok s androidím smartphonem: Nadávat jen tak nepřestanu

Už je to přibližně rok, co jsem odložil můj miniaturní Samsung E1070. Byl to skvělý telefon, ale výdrž baterky se při běžném používání snížila na nějaké tři, čtyři dny a hlavně, každý druhý hovor jsem byl nucen zahájit slovy: „dělej, mluv rychle, mám vybitej mobil, každou vteřinou se mi vyp….“.

Kromě toho, občas se hodí mít po ruce zařízení, co se dokáže připojit na WiFi a občas něco vyfotit. Jo a taky mít paměť na víc, než 200 SMS. Ač jakožto informatik musím neustále poslouchat věčné: „Jé, ty seš přes ty počítače, neporadil bys mi, kterej počítač/mobil/tablet je dobrej?“, sám se rozhodně neřadím mezi technologické nadšence. Koneckonců, být uživatelem mobilu se 3 pozadí plochy, displejem jehož pixely se daly počítat a baterkou, co vydrží víc než den, je v době, kdy se řeší, jestli by mobily neměly mít 4K displeje, toho docela jasným důkazem.

S ohledem na fakt, že (nově pořizovaný) mobil by pro mě měl být spíše jen zařízení vynahrazující mi počítač (pokud ho zrovna nemám po ruce), než samostatně fungující jednotka umožňující mi pohodlnou funkčnost i bez počítače, jsem ani nechtěl „žádné dělo“. Obzvláště při pohledu do mé studentské peněženky.

Čím chytřejší telefon, tím hloupější uživatel.

 — internetové rčení

Vybral jsem tedy Lenovo A1000, jak jsem pochopil, nejslabší model z nižší střední třídy. Výbavou měl být standardní, jako bonus však dualsim. Nebudu zde podrobně rozebírat technikálie, jak říkám, zaprvé tomu nerozumím a zadruhé tenhle článek má spíše shrnout mé dojmy.

Počkej, zítra mu zavolám

No, rozčarování přišlo už po prvním zapnutí. K mému nevelikému překvapení, první chybová hláška vyskočila ani ne půl minuty po spuštění. Spadl launcher (taková ta aplikace, co zobrazuje plochu). Resp. nespadl, jen pro nízký výkon telefonu měl operační systém pocit, že se zasekl a tak jej odstřelil. Jak jsem v průběhu roku zjistit, toto bude oblíbený problém. Telefon nezvládá dvě činnosti současně, takže pokud se v pozadí něco načítá, nahrává či aktualizuje, tak aplikace v popředí, se kterou je potřeba pracovat, automaticky padá s tím, že se zasekla.

Ono s rychlostí se ukázalo být docela problém tak nějak všeobecně. Modelová situace: „Připojím se na wifi, mrknu, kdy přesně, že mi to jede ten autobus, a rychle poběžím.“ v praxi vypadá obvykle takhle: „Chci se připojit na wifi, abych se podíval na autobus. Když se po pár vteřinách wifi nepřipojí, jdu se chystat. Po deseti vteřinách stále nic. Teprve v momentě, kdy rozkliknu nastavení se zázračně připojí. Spouštím aplikaci na jízdní řády, mobil mi řve, že aplikace spadla. Začnou mi vyskakovat notifikace, protože jsem konečně online a mobil zjistil, jak strašně moc jsem díky tomu oproti celému světu pozadu. Ve spěchu se překliknu a omylem jednu z notifikací rozkliknu. Začne se spouštět patřičná aplikace. I ta začne padat. Nejde ukončit a už vůbec ne se vrátit k jízdním řádům, které ještě ani nenaběhly, natož, abych v nich vyhledal kýžený spoj. Konečně. Snažím se vyťukat počáteční a cílovou stanici. Přes pomalost telefonu se napsaná slova se všemi těmi překlepy objeví až po stisku tlačítka „Vyhledej“. Snaha o navrácení se zpět pomocí hardwarového tlačítka (softwarově to ani nezkouším) je pochopena mylně jako žádost o ukončení aplikace. Opět se pokouším spustit aplikaci. Zadávám dotaz, tentokrát opatrněji a kontroluji si a opravuji překlepy. Na tlačítko „Vyhledat“ klikám už na odchodu. Načítání, načítání. Chyba spojení se serverem. Wifina se ztratila. Utíkám na autobus s několikaminutovým zpožděním a totální neznalostí konkrétního času odjezdu.

Problémů je tam více. Občas se aplikace ani neuráčí spadnout a sestřelí pro jistotu celý telefon. Například občas, pokud natáčím video. Nebo když je moc horko (typické letní venkovní teploty) či zima (typické zimní venkovní teploty). Jen zázrakem se mi ještě nerestartoval uprostřed hovoru! A víte, co je na tom nejvtipnější?

Telefon má docela malou interní paměť. Většinu z ní zabírá Android samotný, de facto zbytek pak na-něj-navázané aplikace. Všechny ostatní aplikace jsem si musel odstěhovat na paměťovou kartu. A, dle mého názoru, při spouštění telefonu se aplikace z karty načítají tak nějak nedeterministicky, takže se mi jejich ikony na plochách objeví v de facto nahodilém pořadí. Dobře, to bych ještě chápal. Ale že se mi aplikace, které moc nepoužívám, vysypou ze složek a mám tak najednou 5 ploch s ikonami aplikací, z nichž používám tak maximálně 6? A, dokonce, že se mi o jedno políčko posune ikona aplikace Fotoaparát anžto sedí (spolu s ikonou aplikace Chrome) na dolním pruhu (a obě jsou pochopitelně v paměti telefonu)? To opravdu nechápu.

Už ti píšu, zítra to bude

Není vůbec nepravda, že z mých úst často uslyšíte slova: „Zavolej mu rači ty, u mě by to bylo na hodinu“. Kromě neustálého hledání ikony aplikace na telefonování jde i o aplikaci samotnou. Zde si dovolím být trošku konkrétní a rozebrat „dvojaplikaci“, co používám na volání a SMS. Jedna z prvních aplikací, kterou jsem v Google Play hledal, byl klient Vodafone Parku (který ke konci tohoto dubna stejně končí). Nenašel jsem, místo něj jsem však objevil aplikace Call+ a Message+ od Vodafonu. Čekal jsem, že třeba budou nějak s Vodafone Parkem spolupracovat (tedy SMS do Vodafonu zdarma, synchronizace kontaktů a SMS odeslaných z internetu). Ne.

Obdržel jsem otesánka, kde volání i psaní SMS je za trest. A to od místa na kartě, přes rychlost aplikace až po efektivitu používání. Když mi někdo volá, trvá to asi tak 5 vteřin, než se vůbec načte obrazovka se jménem kontaktu a tlačítkem pro přijetí hovoru (dřív jen slyším vyzvánění a koukám na černou obrazovku). Pro volání konkrétnímu kontaktu je třeba dvou „kliknutí“ namísto očekavatelného jednoho nebo žádného (= psát jméno ihned po otevření aplikace). Každému hovoru předchází obrazovka zvaná „Připravit hovor“, která slouží jen k tomu, abych mohl volitelně (placeně pomocí SMS/MMS, samozřejmě) poslat svoje GPS souřadnice nebo selfie. Opravdu praktické. Asi jako obrazovka „Dokončit hovor“ (po nespojeném hovoru) nabádající k napsaní SMS: „Volal jsem ti, ale tys mi to nezvedl. Zavolej mi.“. To by dotyčného volaného skutečně nenapadlo.

„Proč jste postiženému nezavolal záchranku?“

„Já chtěl, jenže mobil se mi sekl, pak se dvakrát restartoval, pak mi řekl, že nelze spojit hovor a pak už se jen vybil a umřel.“

Psaní SMS je také legrace. Netuším proč, ale když píšu SMS na mobilu, tak je omezená na nějakých 86 znaků, zatímco z webu asi tak 148 (v závislosti na množství diakritiky). Ano, snad jediné pozitivum této „dvojaplikace“ je, že má webového klienta. Takže můžu psát SMS pohodlně z počítače. Jenže – podporují jen Firefox a Chrome, takže pro psaní SMS musím mít speciální okno s Firefoxem (jinak používám Operu). Navíc, celé je to stavěné tak, že se v mobilu musí povolit přístup z webu, ten se s mobilem spáruje (buďto jednorázovým heslem nebo QR kódem)(takže mobil musí být po celou tu dobu online) a webové rozhraní poté přes servery někde v Americe komunikuje s mým mobilem, co mám vedle sebe na stole. Přihlášení tak trvá v průměru 5-10 minut, protože spojení obvykle několikrát selže a celý řetězec přihlašování se přeruší a musí se začít znovu.

Další vtipností je bezesporu dualsim. Když používám jen jednu SIM kartu, tak se mi na úvodní obrazovce zobrazuje, že nebyla vložena SIM karta. Pokud používám obě, tak sice fungují obě, ale zobrazuje se mi jen ta první. Donedávna. Před pár týdny mi telefon přestal sekundární kartu i akceptovat, takže z ní nejde ani volat ani psát. No, pravda, ne, že by to nějak závratně šlo i před tím. Aplikace Call+ není na dualsim stavěná, takže dědí systémové nastavení SIM karet. Nastavil jsem si proto, aby mi to vždy dalo vybrat, kterou SIM kartu telefon má na hovor/zprávu použít. U hovorů to pochopil, u SMS nikoliv. Takže mi vesele odesílal soukromé zprávy z pracovního čísla a naopak.

To bych ještě ale pochopil. Ale, co mi vyloženě vadilo, tak, že si aplikace nikde neevidovala, na kterou SIM kartu mi bylo voláno/zaslána zpráva. Takže v momentě, kdy objevíte zmeškaný hovor z cizího čísla, tak nevíte, jestli to byl hovor soukromý či pracovní a tudíž, z jaké SIM karty volat zpět. A když už se vám podařilo hovor přijmout, tak informace o tom, na kterou zprávu vám je voláno byla napsána malým písmem nahoře, a to slovy: „Volání prostřednictvím poskytovatele [první písmeno z názvu operátora]…“. Ano, debilní (až zbytečná) hláška, která zbytečně zabere místo názvu operátora. Buďme rádi, že nemáme v česku dva operátory se stejným prvním písmenem. Ale, co kdybych měl jak soukromou, tak pracovní SIMku od stejného operátora? Zde by se označení „primární“ a „sekundární“ SIM karta víc, než hodilo. A nebo – pane bože, žijeme ve třetím tisíciletí, to by byl takový problém přiřadit k SIM kartě slovní popis?!

Když už jsem psal o omezování délky SMS, to bude zřejmě „problém“ s kódováním, které aplikace používá. Trpí tím i kontakty – mám tak v kontaktech několik jmen buďto bez diakritiky, nebo s useknutým příjmením, protože se tam prostě nevešlo. Vzpomínáte, třetí tisíciletí?

Blik, cvak, píp, hrk, prd

Foťák. Asi vás nepřekvapí, že můj stroj nebude mít foťák nijak zázračný. No, máte pravdu. Na běžné focení na fejsbůk to sice stačí, ale to je asi tak všechno. Ve tmě (i s bleskem) prakticky nepoužitelný, přibližování žádné, kvalita panoramatu mizerná, u videa se občas i restartuje. Jo a mimochodem, teprve před asi tak měsícem se mi konečně nějak podařilo vyřešit (nebo se to vyřešilo nějak samo?) problém s umlčením zvuku závěrky.

Jak jistě víte, zvuk je tvořen určitými zvukovými vlnami. Pokyn k jejich generování vydává procesor(?) telefonu do reproduktoru. Když se však opravdu hodně sekne a nestíhá ani udržet frekvenci generovaného tónu, zvuk, který vydával přejde do zvuku připomínající letící dělovou kouli či Papinův hrnec těsně před explozí. Ano, tak jsem si zase jednou zopakoval parakotoul.

— já

Vždycky jsem tak nějak předpokládal, že když si vypnu zvuky (jakože fakt všechny), tak se umlčí všechny zvuky všech aplikací. No, ne. Tak jsem si v nastavení foťáku vypnul zvuk závěrky a – ejhle ono ho to vydávalo pořád. A to i v případě, kdy opravdu bylo velmi nevhodné, aby asi tak 120 lidí vědělo, že se snažím fotit. O to horší je fakt, že hardwarové tlačítko hlasitosti slouží ve foťáku jako spoušť. Takže ve snaze o zeslabení hlasitosti mobil začal divoce fotit. Opravdu hrozná sranda.

Když už jsme u těch zvuků, osobně mi trvalo snad půl roku, než jsem pochopil, jak to vlastně funguje s vypínáním zvuků. Parádní funkce je vypnutí všech zvuků na určitou dobu. Prý včetně budíků (ale že se mi i přes to ve škole nejednou rozezněl), ale jak víme, tak to ignorují i další aplikace. Uvítal bych však, kdyby se mi po/při uplynutí nastavené doby zobrazila notifikace. Zvuky si pochopitelně vypínám vždy raději na delší než kratší dobu a pak je mám zbytečně někdy i pár hodin vypnuté jen proto, že si je zapomenu zase zapnout. Nebo mě naopak informovat, že už patřičná doba vypršela a zvuky bych si měl ještě na hodinku vypnout, je-li to nutné.

Další ukázkou toho, jak jde i banální věc totálně podělat je správa časů. Tedy hodiny, budíky, stopky a odpočet času. Uživatelské rozhraní pro každou z těchto funkcí je totálně nejednotné (a přitom odpočet času je z pohledu nastavení prakticky stejný jako budík, jen se neurčuje „v kolik“ ale „za jak dlouho“). Jednou se čas nastavuje jako na ciferníku (budík), jindy se vyťukává jak na kalkulačce (odpočet). Budíky mají názvy, proč odpočty ne? U budíku je v základním nastavení změny tónu, proč ne u odpočtu?

Ten trapný moment, kdy si vypnete budík a on vám o pět minut později začne vesele zvonit…

Navíc, budíky jsou v základu řazené podle času. Což je fajn možná tak pro pracujícího, ale ne pro vysokoškoláka, který vstává každý den v jinou hodinu. Něco jako seřazení podle názvu by nešlo? Nebo výraznější zobrazení těch, co budou zvonit v následujících 24 hodinách? Proč si můžu u každého budíku změnit délku opakovaného buzení, ale jeho interval je společný pro všechny? A už jsem říkal, že u notifikace informující, že za pár minut se mi spustí budík, tlačítko „Zrušit buzení“ funguje jen na oko?

Snahy o používání GPSky jsem taky už prakticky vzdal. Stačí pár stromů v okolí a signál se ztrácí. Nebo mě na jeden bod cesty teleportuje o pár kilometrů vedle. To se pak člověk raduje, že uběhl 15 kilometrů a maximálku měl nějakých 168km/h!

A když tohle všechno přežije, tak mi určitě nabití baterie klesne pod 50%. Asi to bude technologií baterie, ale jakmile nabití baterie klesne pod 50%, tak se vybíjí rapidně rychleji. Není výjimkou, že operace vyhledání odjezdu autobusu ze začátku tohoto článku je schopno zredukovat stavy baterky klidně o 5-10%. Pod 10% telefon navrhuje přechod do úsporného režimu. Doteď jsem nepochopil, v čem je oproti běžnému režimu rozdíl. Pomalý je pořád stejně, možná tak akorát trochu sníží jas obrazovky (a možná ubere i tak špatnému výkonu WiFi a GPS).

Shrňme to … ze stolu

Kromě toho je tu spousta dalších drobností, například pro mě, jakožto vyznavače open source, placené aplikace nebo (a to hlavně) aplikace s reklamami. Taky mi začínají odcházet hardwarová tlačítka hlasitosti a i mikroUSB konektor už začíná protestovat. Laviny notifikací po připojení k WiFi se už nejspíš taky nezbavím. Nebo, že ani po roce se mi nepodařilo nenaučit se psát „všema dvouma“ či zjistit, jak spustit foťák gestem (bez odemčení).

Chápu, že velká část problémů je spjata se samotným hardwarem. Například rychlost, občasné restartování a podob. Stejně tak, určité záležitosti zcela určitě spadají do kategorie „chyba je někde mezi židlí a klávesnicí“ – například právě psaní nebo budíky. Ale zcela bez pochyby je telefon plný naprosto fatálních softwarových prohřešků.

„Kde to jsme?“

„No, podle mýho mobilu někde uprostřed severního Atlantiku.“

Například ten, že mi už pár měsíců padá aplikace Google. Po spuštění se začne načítat, pak chce jakože vyskočit nějaký panel s novinkami a aplikace se ukončí. Žádné hlášení o chybě, aplikace prostě tiše spadne úplně sama. Když chci upravit „nastavení“ (= změnit heslo) k již uložené WiFi síti a zadám heslo moc krátké, namísto upozornění na chybný vstup uvidím jen: „síť se nepodařilo uložit“.

Ještě mě tak napadá – díky malé interní paměti bývá problém se stahováním aplikací (a občas i aktualizací). Ač paměťová karta, kde bude aplikace nainstalována, je prakticky prázdná, v paměti telefonu je posledních pár set MB a tak se aplikace nedá stáhnout (a je tak nutné vždy něco pomazat). Což mi připomíná, že snad pokaždé, když připojím mobil k počítači za účelem přenosu dat, tak mi zmizí složka s fotkami a musím fotky zachraňovat pomocí data recovery nástrojů. Za to sice dost možná může linux – ale – proč?!

Takže, mé očekávání bylo, že budu po kapse nosit přenosnou náhražku za můj notebook. V praxi něco takového sice mám, ale všechno trvá 10x dlouho, navíc to – ostatně jako každý smartphone – nevydrží dlouho bez dobíjení. A jako bonus jsem si moc nepolepšil ani co se volání a psaní SMS týče. Je to fajn, ke svému starém mobilu bych se určitě už nevrátil, ale – čekal jsem to lepší. Člověk to hold musí nějak přežít.

Nedávno jsem přemýšlel, kdybych si mohl vybrat některý z produktů Apple, co bych si vybral. Na linux nedám dopustit, tablet nepotřebuju, avšak iPhone bych za androidí mobil s radostí vyměnil.

Aktualizace

Vzhledem k tomu, že tento příspěvek způsobil na sociálních sítích docela bouřlivé reakce, tak mi dovolte shrnout, co v článku zřejmě nebylo důkladně osvětleno:

Úkolem článku nebylo nijak napadat platformu Android. Jen jsem se snažil poukázat na to, že v dnešní době není problém sehnat telefon na kterém bude tato (a myslím, že mohu s klidem říct, že i jakákoliv jiná) platforma totálně nepoužitelná. Koneckonců, proto jsem na závěr zmínil i společnost Apple, jelikož ta by si něco podobného, tedy prodat zákazníkovi něco, co je mu vlastně prakticky k ničemu, nedovolila.

Ano, dobře, přiznávám, chtěl jsem si i trochu rýpnout do Androidu. Ale protože si to zaslouží. Ne však slovy: „Android je na ho*no!“, jak to většina pochopila, ale spíše slovy: „Škoda, že si s tím nedali ještě trochu víc práce, mohl to bý bezva systém.“.

Perceptroni

Přicházíte na bar za svou přítelkyní. Potkáte ji tam s nějakým jejím kamarádem. Evidentně zrovna dostali své nápoje a chystají se jít za vámi. Slyšíte ho, jak jí říká, „Tak fajn, dlužíš mi drink.“. Načež ale zpozoruje vás a tak se otočí na vás a prohlásí: „Vlastně ne, to ty mi dlužíš drink.“.

 

Je celkem přirozené, že tento mladík jen a pouze chtěl zapůsobit jako gentleman a vaši přítelkyni na drink pozval s tím, že by bylo milé, kdybyste mu to splatili. To je přece logické, ne?

Pokud vaše první reakce byla naprosto, ale naprosto, nechápavá, nasadili jste takový ten totálně WTF výraz a vypustili ze sebe: „Coo? Prooč?!“, pak pro vás mám špatnou zprávu. Je totiž docela možné, že jste perceptron.

V poslední době jsem totiž začal pozorovat, že několik lidí, se kterými se stýkám, mají takovou zvláštní – no, ehm, vlastnost. A to mě přimělo se nad tímto zamyslet, a dokonce tuto vlastnost, resp. lidi touto vlastností disponující pojmenovat. A příznačně jsem použil pojem perceptron, pojem z oblasti artifical inteligence, neboli teorie umělé inteligence.

„Kolega včera shodil hlavní server.“

„On je hacker?“

„Ne, debil.“

Pojďme se nyní podívat na to, co právě onen „perceptron“ je. Dovolte mi drobný úvod právě z teorie umělé inteligence. Umělá inteligence je (dle jedné z mnoha definic) počítačová simulace něčeho inteligentního. Například člověka. Resp. jeho mozku (ono kupříkladu takové srdce zpravidla moc inteligentní není, spíš naopak). Nejtypičtějším způsobem, jak takovou umělou inteligenci vytvořit je pomocí umělé neuronové sítě.

Umělá neuronová síť je tedy nástroj pro zjednodušenou simulaci lidského mozku. A to, konkrétně a již dle názvu, založena na neuronech, tedy nervových buňkách. Jak jistě z přírodopisu či biologie víte, mozek vlastně není nic jiného, než síť nervových buněk, neuronů, které jsou spolu navzájem propojené určitými „vlákny“, tzv. synapsemi. Prostřednictvím synapsí se mezi neurony šíří tzv. vzruchy, tedy něco, co by se dalo považovat za nějaké signály.

A umělá neuronová síť je vlastně to samé. Tedy, soubor neuronů, které jsou navzájem popropojované synapsemi. Avšak vzhledem k tomu, že nikdy nemáme k dispozici kompletní model mozku do posledního neuronu (už jen proto, že ten se neustále vyvíjí), tak si jej pro účely počítačové simulace zjednodušujeme.

Například tak, že si stanovíme, že každý neuron má synapse vstupní a výstupní, a signály tak mohou proudit pouze stanoveným směrem. Jako další zjednodušení se používá popis toho, co neuron se vstupními vzruchy má udělat (tedy, kdy vygenerovat výstupní vzruch). Nejtypičtěji, v nějakém poměru sečte jejich hodnoty (typicky 1, pokud byl vygenerován vzruch a 0, pokud ne) a pokud tento součet překročí nějakou stanovenou (tzv. prahovou) hodnotu, dojde k vygenerování vzruchu na všechny výstupní synapse. A takto se vzruchy šíří od vstupních synapsí celé neuronové sítě (vstupní data ke zpracování, například vhodně zakódovaný obrázek) přes její neurony až na výstupní synapse (udávající např. počet obličejů na vstupním obrázku).

Složité? Netvrdím, že ne. Proto se často pro jednoduchost uvažuje neuronová síť s jedním jediným neuronem. Tedy taková, která jen zpracuje vstupní data (např. pomocí výše zmíněného váženého součtu a prahování) a výsledek pošle na výstupní synapsi (když máme jen jeden neuron, tak nám stačí jedna výstupní synapse). Takové neuronové síti se říká perceptron.

Asi vás nepřekvapí, že takový perceptron je docela hloupá „umělá inteligence“. Ano, máte pravdu. Představte si, jak by asi tak vypadal člověk, který má v mozku jeden jediný neuron. Jeden jediný. Podotýkám, že obvyklé číslo je v řádech desítek miliard. A přesně těmto lidem já říkám perceptroni.

„Proč jen jsou všichni korem tak nabrbrí?“

— z filmu Team America: světovej policajt

Abych byl ale konkrétnější, perceptroni nejsou jen lidé, kteří nejsou zrovna dvakrát inteligentní. Nebo, kteří jsou dokonce hloupí. Jsou to lidé, kteří jsou tak hloupí, až člověk žasne, že jim polovina orgánů v těle už dávno neřekla: „Tak s něčím takovým, jako je tam nahoře, odmítám spolupracovat. Sbohem a díky za všechny ty ryby.“ a následně tělo řízeně neopustila. Natož, že někdo takový dokončil základní školu, udělal maturitu a dokonce hrozí, že získá nějaký akademický titul (nebo už ho snad i má).

Abych vám to nějak připodobnil. Nulté stádium perceptronu, Winston Groom, Robert Zemeckis i Tom Hanks prominou, je kupříkladu Forrest Gump. Na Forrestovi je totiž krásně vidět jedna charakteristická vlastnost každého perceptrona. Perceptron totiž má nadání na velké věci. Podobně jako u Forresta být součástí klíčových historických událostí, tak i perceptroni se často nachomýtnou k něčemu velkému. „Bohudík“ pro Forresta, opravdový perceptron se většinou nachomýtne k něčemu špatnému. A obvykle to sám způsobil. A hlavně – dost možná si to ani neuvědomuje.

Nejhorší na tom je to, že – mozek perceptrona dokáže nahradit kdejaký kapesní kalkulátor data výroby 1972 a novější. Takže simulovat, resp. představit si, jak zareaguje na určité podněty není vůbec nic těžkého. A to je problém. Vám je totiž naprosto jasné, že bude průšvih, protože naprosto přesně víte, jak dotyčný zareaguje. Ale – nemůžete s tím nic dělat. Protože pokud se o to pokusíte, tak budete okamžitě zdementováni (jaká ironie, co?) slovy, že vše je přeci v naprostém pořádku. Jistě, zatím.

Nikdy neříkej, že něco nejde, protože vždycky se najde nějaký blbec, který neví, že to nejde a udělá to.

Další ironií je, že perceptronovi se občas poštěstí nezpůsobit průšvih, ale – právě naopak. Zatím, co vy vymýšlíte sotisfikované řešení problému, analyzujete, konzultujete, optimalizujete a kontrolujete, přijde perceptron a vychrlí řešení na úrovni mentálně postiženého brontosaura s tuctem mozkožroutů. Vyplodí něco tak příšerně debilního, že by vás to ve snu ani nenapadlo. Úplnou náhodou je však jeho řešení lepší, což je sice super, ale tak akorát se tím dostanete do průšvihu vy. Protože po roce a půl intenzivní práce přijde a z vás udělá totálního vola. A ještě se vám vysměje, že si za to můžete vlastně sami. To se prostě vašim nadřízeným nebude moc líbit.

Takže je povýšen a vy, pro změnu vy, s totálně nechápavým výrazem sedíte a koukáte, jak dál svou blbostí ohrožuje své okolí a obáváte se momentu, kdy to praskne a něco nepěkného se skutečně stane. Problém je v tom, že nestane. Takoví perceptroni už zkrátka jsou. Všechno, všechno jim prostě tak nějak od přírody vychází. Taky to znáte? Taky JE znáte?

Pokud se tento článek někoho dotknul, tak se upřímně omlouvám. Ale co – perceptron čtení článku nejspíš vzdá někde u prvního substantiva, takže tuto omluvu si zřejmě nikdy nepřečte. A ostatním je to jedno. I tak se ale omlouvám.