Jak spouštět grafické programy na DietPi, část 1

tl;dr: X11 forwarding je cool a dovolí spouštět vzdáleně programy z RPi bezešvě (třeba) na Windows. Ale v základní konfiguraci to není vhodné pro provozování grafických programů na pozadí.

DietPi je lehká distribuce bez grafického rozhraní pro jednodeskové počítače. Jejich repozitář obsahuje slušnou porci optimalizovaných programů, většinou s webovým rozhraním. Ale co když je třeba nějaký program, vyžaduje grafické rozhraní?

V mém případě to bylo nějaké stahovátko typu Freerapid Downloader – bohužel dále nevyvíjené, takže jsem sáhl po dalším programu takového zaměření, kterým je JDownloader. Oba programy spojuje, že jde o grafické aplikace psané v Javě, které se nedají provozovat jen z příkazové řádky. A zároveň nevím o ničem, co by fungovalo stejně a šlo rozumně rozběhat na RPi.

Začal jsem tedy zkoumat, jak by se daly tyto programy spustit na DietPi. Z letmého pátrání my vypadly dva způsoby:

  1. Instalace desktopového prostředí (pravděpodobně) a přístup přes VNC
  2. Instalace X serveru a přístup přes X11 forwarding

VNC jsem dříve používal pro ovládání původním Raspbianu, ale nelíbila se mi myšlenka instalace desktopového prostředí. Začal jsem tedy zkoumat druhou možnost.

Spoiler alert: Tato část bude o X11 forwardingu, následující díl pravděpodobně o VNC.

Takže prvně jsem si nainstaloval Xserver do RPi s DietPi

$ sudo apt install xorg

Poté Javu

$ sudo apt install default-jre

Na dalším počítači jsou Windows. Tam je potřeba VcXsrv X Server (nezapomeňte povolit komunikaci v síti, ve které se chcete spojit s RPi)

Teď už stačí jen spustit XcXsrv

A připojit se přes SSH (já používám Putty) s X11 forwardingem.

A teď se už stačí nalogovat a spustit aplikaci z terminálu

java -jar /mnt/disk/dietpi_userdata/jdownloader/JDownloader.jar

A hle, na ploše máte okno aplikace, která ale běží na jiném stroji (všimněte si podpory náhledů oken na liště ve Windows – wow!)

Má to ale malý háček. Pokud zavřete aplikaci na klientském (Windows) systému, dojde k jejímu ukončení i na hostitelském (RPi). Takže pokud chceme stahovat na pozadí, musíme na to trochu jinak.

A o tom zase někdy příště.

NextCloud připojení ke kalendáři (kontaktům a poznámkám)

tl;dr: Nastavení > Zabezpečení > Vytvořit nové heslo aplikace

Používal jsem NextCloud od Wedosu (Wedos CD) pro synchronizaci kalendáře přes CalDav, přihlašoval jsem se stejnými údaji jako na webu. Ale od jisté doby mi klient začal vyhazovat chybu. Jelikož jsem se v té době vrtal v nastavení, asi jsem přepsal přihlašovací údaje. Jenže když jsem se to pokoušel opravit, údaje byly správné.

Nakonec jsem na to přišel. Pro připojení přes CalDav je třeba vytvořit „nové heslo aplikace“. Je to unikátní uživatelské jméno a heslo pro danou aplikaci. V podstatě skvělá věc, ale dobrat se k tomu…

Dělá se to v nastavení

Sekci zabezpečení

Kde je třeba vyplnit název aplikace (libovolné). A potom se ukáže dialog s uživatelským jménem a heslem. Pozor, jméno a heslo se zobrazí pouze jednou. Pokud ho zapomenete, je potřeba jej smazat a vytvořit znovu.

Automate (by Llama Labs) na Android TV (Xiaomi TV Stick 4k)

Pouze v rychlosti. Bude zapotřebí adb (Android Debug Bridge)

  1. Zapnout „Developer Settings“ („klikat“ na kernel version)
  2. Zapnout USB Debugging
  3. (instalovat ovladače? Od Googlu? Od Xiaomi?)
  4. Připojit přes USB
  5. PowerShell.\adb.exe devices -l
  6. Powershell .\adb.exe install "com.llamalab.automate_..._apkmirror.com.apk"
  7. .\adb.exe shell pm grant com.llamalab.automate android.permission.SYSTEM_ALERT_WINDOW
  8. .\adb.exe shell pm grant com.llamalab.automate android.permission.READ_LOGS
  9. .\adb.exe shell dumpsys deviceidle whitelist +com.llamalab.automate
  10. Hotovo, Automation by mělo být nainstalované s potřebnými oprávněními.

Ovladače (nejsem si jistý, jestli jsou potřeba) se instalují následovně:

Doplňky prohlížeče bez kterých se to nedá (verze 2022)

Speciální host

Co dělat, když se mi video na YouTube hned zastaví (pauzne)?

tl;dr: Způsobuje to pravděpodobně (něčím skrytý) vyskakovací dotaz na souhlas s cookies a pod. Zkontrolovat, jestli nejsou blokované cookies na úrovní prohlížeče, pořídit něco na automatické odkliknutí souhlasu. (I still don’t care about cookies a Cookie AutoDelete na automatické promazávání cookies.)

Symptomy a hledání příčiny

Jednoho dne si tak vlezu na YouTube a video se mi odmítalo přehrát. Vždy se samo zapauzovalo zlomek vteřiny po pokusu o spuštění přehrávání. Zajímavé bylo, že v malém náhledu jelo normálně. Když se něco takového stane, jako první zkouším vypínat různé blokovače obsahu (uBlock Origin, Privacy Badger a uživatelské JavaScripty (usersjs) Violent Monkey). Jenže se nic nestalo.

Nebudu vás napínat, problém byl v tom, že jsem měl v prohlížeči natvrdo zakázané cookies pro youtube.com. To byl totiž nejjednodušší způsob, jak se zbavit předchozí verze vyskakovacího souhlasu. Nebyly cookies. Nebyl problém. Jenže to se změnilo.

Rozchozené video

Když jsem cookies povolil a s vypnutými blokátory načetl stránku znovu, zobrazí se otravné okno s potvrzením. Kde ať člověk klikne na cokoliv, uloží se mu do prohlížeče několik cookies. Některé z nich dělá to, že uklidní skript, který vyhazuje okno se souhlasem a pauzuje video.

V podstatě by stačilo nechat si tyto cookies a videa by měla hrát i s opětovně zapnutými blokátory obsahu. Ale… Když už si hrajeme na ochranu soukromí, tak nechceme mít v prohlížeči sušenky od Googlu, že?

Nedělejte si z mého prohlížeče skládku…

Chápu, že cookies (a podobné věci jako Web Storage) mají své opodstatnění a pokud chci po webu určitou funkčnost, bez ukládání dat na klientu to prostě rozumně nepůjde. Takže nemám problém s tím, že si stránka uloží něco důležité pro svoje fungování po dobu, co po ní brouzdám. Ale nechci, aby si z mého prohlížeče dělali odkladiště bordelu.

Na to používám Cookie AutoDelete (viz samostatný článek – bude doplněno), což je šikovný doplněk, který smaže cookies (popř. další data) chvíli po opuštění domény.

Jenže to má malý háček. Při úklidu se ztratí i to cookie, které zabraňuje vyskakování okna a pauzování videa. Co s tím?

Cookies? Nezájem!

Takže potřebujeme buď zjistit, které cookie je to, které chceme (a doufat, že zároveň není sledovací) a nebo zautomatizovat odklivávání toho otravného okna. Od toho tu byl dlouhou dobu skvělý doplněk I don’t care about cookies, jenže ten nám koupi Avast a kam vleze Avast, tam nejsou vaše data v bezpečí.

Naštěstí měl doplněk otevřený zdrojový kód, takže tu máme fork. I still don’t care about cookies. Bohužel v době psaní článku není dostupný v žádném „obchodě“ (asi nějaké licenční důvody). Takže instalace není úplně triviální (ale pořád docela jednoduché – viz článek, bude doplněn).

No a je hotovo. Cookie AutoDelete se postará o smazání cookies, když nejsou potřeba, uBlock Origin skryje otravné okno a I still don’t care about cookies ho na pozadí odklikne.

Jak vyextrahovat obrázky z PDF bez ztráty kvality

tl;dr: Stáhnout Xpdf Tools a potom: pdfimages -j zdrojove.pdf cesta_vysledneho_obrazku
(pdfimages -j c:\xyz.pdf c:\images\xyz)

Existuje plno způsobů a programů, které slibují, že dostanou obrázky z PDF. Jenže to má jednu dost podstatnou nevýhodu. Takto extrahované obrázky (většinou) ztrátovým re-enkódováním, takže dochází ke ztrátě kvality.

Přitom často jsou obrázky (např. scany) vložené v PDF jako JPG, což je naprosto běžný formát a dobrá zpráva je, že se od tam dá celkem jednoduše dostat.

Popíšeme si postup, jak to udělat na Windows se skvělou utilitou pdfimages z balíku Xpdf.

  • Stáhnout Xpdf command line tools pro Windows (Windows 32/64-bit (Win 7 and newer))
  • Ze staženého ZIPu budeme potřebovat pouze pdfimages.exe, který si zkopírujeme někam na disk (pro potřeby tohoto návodu do C:\Moje programy\pdfimages.exe)
  • Ve složce, kde máme PDF si otevřeme konzoli PowerShellu (Soubor > Spustit prostředí Windows PowerShell)
  • Spustíme příkaz cmd /u a potvrdíme Enterem
  • Potom stačí zadat příkaz
    „C:\Moje programy\pdfimages.exe“ -j „název_pdf.pdf“ „název_pdf“
    Kde
    • C:\Moje programy\pdfimages.exe vede tam, kde je v počítači uložený pdfimages.exe
    • název_pdf.pdf je název pdf souboru, z kterého chceme dostat obrázky
    • název_pdf je základ názvu výsledných obrázků (název_pdf-0001.jpg, název_pdf-0002.jpg…)
  • A po potvrzení enterem se ve složce s PDF objeví obrázky.

Pokud byly obrázky vložené do PDF ve formátu JPG, budou JPG. Ale taky se může stát, že budou mít jiný formát. Takové soubory půjdou otevřít a potom exportovat do požadovaného formátu pomocí GIMPu.

Instalace modu Red Alert 2: Mental Omega

tl;dr: Stáhnout, rozbalit mimo hru, zkopírovat potřebné soubory. Hrát

V roce 2021 (to jest 20 let od vydání původního Red Alerta 2!) vychází obří modifikace – datadisk Mental Omega. V dnešním článku si povíme, jak ji nainstalovat.

Předpokládám, že původní Red Alert 2 + Yuri’s Revenge máte instalovaný a opatchovaný na nejvyšší oficiálně dostupné verze (First Decade a verze z Originu se patchovat nemusí).

Prvně budeme potřebovat soubory modu. Aktuální odkazy pro stažení (vedou na ModDB) najdete v sekci Download na stránkách modifikace. V době psaní tohoto článku se jedná o:

Existují dvě možnosti, jak mod nainstalovat:

  1. (Nedoporučuji – viz níže) rozbalit zip přímo do složky s původní hrou
  2. Rozbalit zip do prázdné složky a potom tam přidat potřebné soubory z původní hry.

Přičemž pokud máte nainstalovaný jiný mod – třeba pro hraní Red Alerta online přes CnC.net podle zdejšího návodu, prvním postupem si tyto mody poškodíte!

Takže se v tomto návodu se budeme věnovat výhradně druhému (bezpečnému) postupu.

  1. Všechny stažené archívy rozbalíme do nové prázdné složky(Doporučuji složku s názvem Mental Omega vedle složky obsahující soubory původní hry.) V následujícím pořadí:
    1. Hlavní archiv modu
    2. Soundtrack 1
    3. Soundtrack 2
    4. Archív patche
  2. Zkopírujeme do stejné složky nakopírujeme i potřebné soubory z původní hry (kuk na tip pod postupem)
    • BINKW32.dll
    • BLOWFISH.dll
    • gamemd.exe
    • ra2.mix
    • ra2md.mix
    • language.mix
    • langmd.mix
  3. Hotovo, můžeme spustit MentalOmegaClient.exe

Pokud jste umístili složku modu vedle složky původní hry (tzn. pokud je cesta k původnímu exe souboru C:\Games\Red Alert 2\RA2\gamemd.exe a mod se nachází v C:\Games\Red Alert\Mental Omega\), můžete soubory z původní hry zkopírovat pomocí vložení následujících příkazů do příkazové řádky Windows spuštěné ve složce původní hry.

copy gamemd.exe "..\Mental Omega\"
copy BINKW32.DLL "..\Mental Omega\"
copy Blowfish.dll "..\Mental Omega\"
copy langmd.mix "..\Mental Omega\"
copy language.mix "..\Mental Omega\"
copy ra2.mix "..\Mental Omega\"
copy ra2md.mix "..\Mental Omega\"
echo Hotovo

Jak uložit stránku do jednoho souboru HTML

tl;dr: Doplněk SingleFile (Chrome a klony, Github, Firefox)

Uložit stránku do jednoho souboru není zas takový problém. Velká část prohlížečů podporuje MHTML, což je v podstatě to samé, jako když uložíte HTML s obrázky (vedle html souboru se uloží i obrázky a pod, které stránka zobrazuje, používá), jen je to celé zabalené do ZIPu. Má to jednu drobnou nevýhodu. Podporuje to totiž jen část prohlížečů. Na mobilech máte většinou smůlu.

Co ale otevře každý prohlížeč je soubor HTML. Jenže když uložíte stránku s obrázky (a pod.) a pošlete jenom HTML, nebude to vypadat, jak bylo zamyšleno.

Naštěstí existují nástroje, které dokáží odkazované soubory stáhnout a zakomponovat přímo do kódu HTML.Takový soubor pak bude celkem velký, protože tam holt musí být všechno, ale zase to otevřete všude.

Jedním z nich je doplněk pro prohlížeče Single File dostupný pro Chrome + klony a Firefox. Použití je jednoduché. Klikete na ikonu a stáhne se stránka, která má v sobě zakomponované vše důležité pro zobrazení offlline.

Samotný doplněk má spoustu nastavení, s kterým si můžete pohrát, ale na základní uložení stránky tak, jak ji vidíte bohatě stačí to základní.

Starší Excel – vektor (matice) s postupnou řadou

tl;dr: Viz vzorce dole

Mohlo by se stát, že potřebujete pro výpočet v Excelu získat vektor (matici) s hodnotami, které jdou po sobě (např 1, 2, 3, 4…), o určité délce, ale nechcete jej mít zapsaný nikde v tabulce.

Pokud máte Excel 365 nebo 2021 a novější, máte to jednoduché. Prostě použijete funkci SEQUENCE.

Pokud máte starší verzi budete si muset pomoct jinak.

Můžete na to jít hrubou silou a zadat vektor ručně jako {1;2;3;4;5} pro hodnoty pod sebou nebo {1\2\3\4\5} pro hodnoty vele sebe Pozor, zápis se liší podle jazyka, ve kterém Excel používáte! Viz moje trampoty s výpočtem polynomů vyšších řádů a použít jej v maticovém vzorci.

Složené závorky venku značí maticový vzorec (potvrzený CTRL+SHIFT+ENTER), složené závorky obalující samotný vektor jsou napsány ručně.

Ale to je škaredé řešení a selhává, pokud dopředu nevíme, kolik hodnot budeme v našem vektoru potřebovat. Nebudu vás napínat. Má to řešení. Vytvoříme maticovou funkci, která si bude brát parameter o velikosti výsledného vektoru „odjinud“.

Trik spočívá ve využití funkce ŘÁDEK. Protože když ji použijete v maticové formě na oblast buněk, vrátí matici o velikosti odkazované oblasti s hodnotami, které odpovídají řádkům příslušných buněk.

Teď by to chtělo ještě dynamicky měnit oblast, která bude předhozena funkci ŘÁDEK. To umí funkce POSUN. Takže pokud budu chtít oblast ve sloupci A s čísly řádků 1-5, použiji POSUN(A1;0;0;5). No a když budu chtít počet řádků měnit dynamicky, budu si číslo brát třeba z nějaké buňky: POSUN(A1;0;0;A2)

To už vypadá funkčně. Ale je třeba si dát pozor na jednu záludnost. Excel je tak chytrý, že automaticky mění odkazy ve vzorcích, aby odkazovaly stále na stejné buňky i když se vyjme/vloží, nebo přidají řádky. Toto chování (v 90 % případů chtěné) nám může vzorec rozbít a tato chyba se velmi špatně odhaluje.

Zkuste do sešitu, se vzorci z posledního obrázku vložit řádek nad řádek 1. Výsledek bude následující:

Možná si myslíte, že pomůže pevný odkaz (přidání $). Jen si to zkuste…

Nebudu vás napínat. Řešením na posuny odkazované buňky je funkce NEPŘÍMÝ.ODKAZ. Protože sešit vždy musí obsahovat buňku A1 a tato buňka bude vždy vlevo nahoře, můžeme se na ni odkazovat i nepřímo. Blbuvzdorný vzorec pro vektor s hodnotami pod sebou tedy vypadá následovně:

=ŘÁDEK(POSUN(NEPŘÍMÝ.ODKAZ("A1");0;0;$B$1))

Pokud bychom chtěli hodnoty vedle sebe místo pod sebou, použijeme sloupec a posun budeme roztahovat horizontálně.

=SLOUPEC(POSUN(NEPŘÍMÝ.ODKAZ("A1");0;0;1;$B$1))
Důkaz místo slibů :)