<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>ERROR</title>
    <link>http://blog.jpleva.cz/</link>
    <description>notes, hints, tech</description>
    <pubDate>Fri, 31 Jul 2026 23:19:56 +0200</pubDate>
    <item>
      <title>Kam s poznámkami?</title>
      <link>http://blog.jpleva.cz/kam-s-poznamkama</link>
      <description>&lt;![CDATA[Pokud je klíčovými atributy pro poznámkovou aplikaci&#xA;jednoduchost bez zbytečných klikátek, a funkcí&#xA;markdown formátování, bez dalších zbytečností&#xA;zálohování offline, synchronizace lokální složky či rovnou do cloudu&#xA;opensource&#xA;multiplatformní pro Android, iOS, Mac, Linux, Windows&#xA;&#xA;pak bych tu měl jeden tip&#xA;!--more--&#xA;Aplikaci Joplin používám už docela dost dlouho a funguje naprosto skvěle. Rozhodně bych ji dal alespoň šanci. K dalším vychytávkám, které jsem si oblíbil a používám jsou například profily, import/export všemožných formátů, nebo pokud budete používat nativní Joplin server pro synchronizaci (ať už selfhosted, nebo hosted u autora), můžete poznámku i veřejně publikovat. Díky @archos@mastodon.arch-linux.cz a Oscloud.cz pak může nasdílet svoji poznámku komukoli. Možnost zašifrování synchronizovaných poznámek je samozřejmostí. &#xA;&#xA;image&#xA;&#xA;A pokud jde o hostování Joplin serveru a nechcete zaplatit pár korun autorovi, ale rádi byste si funkce serveru vyzkoušeli a nemáte možnosti nebo znalosti hostovat vlastní, můžete požádat na Oscloud.cz o účet zdarma. Za mě palec nahoru za to, co dělají a pokud byste byli spokojeni, bylo by fajn, jim na provoz nějakou tou korunou i přispět. &#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Pokud je klíčovými atributy pro poznámkovou aplikaci
– <strong>jednoduchost</strong> bez zbytečných klikátek, a funkcí
– <strong>markdown</strong> formátování, bez dalších zbytečností
– <strong>zálohování</strong> offline, synchronizace lokální složky či rovnou do cloudu
– <strong>opensource</strong>
– <strong>multiplatformní</strong> pro Android, iOS, Mac, Linux, Windows</p>

<p>pak bych tu měl jeden tip

Aplikaci <a href="https://joplinapp.org/">Joplin</a> používám už docela dost dlouho a funguje naprosto skvěle. Rozhodně bych ji dal alespoň šanci. K dalším vychytávkám, které jsem si oblíbil a používám jsou například profily, import/export všemožných formátů, nebo pokud budete používat nativní Joplin server pro synchronizaci (ať už selfhosted, nebo hosted u autora), můžete poznámku i veřejně publikovat. Díky <a href="http://blog.jpleva.cz/@/archos@mastodon.arch-linux.cz" class="u-url mention">@<span>archos@mastodon.arch-linux.cz</span></a> a Oscloud.cz pak může nasdílet svoji <a href="https://note.archoslinux.cz/shares/BKbww9QHgrkw5CRi2x1dQm">poznámku</a> komukoli. Možnost zašifrování synchronizovaných poznámek je samozřejmostí.</p>

<p><img src="/image/joplin.webp" alt="image"></p>

<p>A pokud jde o hostování Joplin serveru a nechcete zaplatit pár korun autorovi, ale rádi byste si funkce serveru vyzkoušeli a nemáte možnosti nebo znalosti hostovat vlastní, můžete požádat na <a href="https://docs.oscloud.cz/apps/joplin-server/">Oscloud.cz</a> o účet zdarma. Za mě palec nahoru za to, co dělají a pokud byste byli spokojeni, bylo by fajn, jim na provoz nějakou tou korunou i <a href="https://docs.oscloud.cz/podporte-nas/">přispět</a>.</p>
]]></content:encoded>
      <guid>http://blog.jpleva.cz/kam-s-poznamkama</guid>
      <pubDate>Mon, 25 Aug 2025 21:17:04 +0200</pubDate>
    </item>
    <item>
      <title>LN adresa na vlastní doméně</title>
      <link>http://blog.jpleva.cz/mate-vlastni-domenu</link>
      <description>&lt;![CDATA[Máte vlastní doménu? A na ní třeba i vlastní emailovou adresu? Tak se nabízí otázka, proč nepoužít tu stejnou adresu i pro příjem platby v bitcoinu pomocí Lighting network (dále LN), namísto vystavovaní faktury a posílání změti čísel a znaků, kolikrát v délce srovnatelné s emailovou zprávou? &#xA;!--more--&#xA;Tak hurá na svoji novou LN adresu, budeme k tomu ale potřebovat několik pomocníků.&#xA;Co potřebuji?&#xA;&#xA;1) LNURLp&#xA;Ten první krok - automatické vygenerování faktury - za nás už vyřešilo LNURL a jeho konkrétní varianta LNURpayRequest, (někdy také LNURLp). &#xA;Co to je?&#xA;Jedná se v podstatě o zakódovanou URL adresu, kde se klient (peněženka) dozví, základní informace o tom, kolik minimálně a maximálně může zaplatit, nějaké ty metainformace, kde najde potvrzení, nějakou zprávu, a hlavně na jakou URL adresu má požádat o vytvoření nové LN faktury na konkrétní částku, která pak může být zaplacena. &#xA;&#xA;Takhle nějak to vypadá ten proces komunikace:&#xA;LN Komunikace&#xA;&#xA;Tak to je skvělé! Není nad automatizaci. Namísto celé dlouhé faktury, kterou musí člověk vytvořit, už nám stačí jen jedna URL do nekonečna a na částce, faktuře ke zaplacení, a případně dalších věcech ať se domluví stroje spolu sami, mě stačí bitcoiny. &#xA;Kde to seženu?&#xA;Je potřeba mít peněženku, která ji podporuje a umí nějakou funkční vygenerovat. Je to poměrně rozšířený standard, a pokud vám na vygenerovanou LNURL půjde zaplatit, pak vám bude fungovat i platba přes email na vaší doméně díky překladu LN adresy popsanému dále. Pro vlastní hostované řešení, je pravděpodobně nejpoužívanější LNBits.&#xA;&#xA;2) Webový server obsluhující Vaši doménu&#xA;Pro překlad  LN adresy ve formě emailu budeme potřebovat webový server, na který pak půjde požadavek po zadání LN adresy v peněžence. Za tímto účelem jsem si vypůjčil přehlednou grafiku z dokumentace lighting-address, jak samotný překlad na URL vypadá a která podle mě víc vysvětlení nepotřebuje. &#xA;LN Adres overview&#xA;&#xA;Skvělé, to všechno už mám... jak to ale slepit?&#xA;Tak hurá na to. Jako první musíme dekódovat LNURL na reálnou URL, na kterou budeme přeposílat klienty jdoucí naši LN adresu (respektive na .well-known/.... URL).&#xA;&#xA;Dekódování LNURL&#xA;Budeme potřebovat rozklíčovat, na jakou URL vlastně vede naše LNURL adresa. Je to adresa, která po dotázání vrátí základní podrobnosti o platbě v podobě LNURL Pay JSONu. V dokumentaci se můžeme dočíst, že jde o zakódování URL pomocí bech32 a je tam i ukázka kódu v Scala a JavaScriptu. Nejjednodužší je prostě copy/pasta buď do nějakého online nástroje pro testovaní, například JSFiddle (javascript) nebo Scastie (nicméně bývají problém s přímým importem), nebo využít vlastní dev/IDE prostředí. Já osobně jsem si to nechal pomocí AI přepsat do Pythonu, který už mám nainstalovaný a bylo to pro mě nejjednodužší řešení a hned po pár iteracích jsem se dopracoval až tomuto kódu:&#xA;python3&#xA;import bech32&#xA;import sys&#xA;&#xA;def decodelnurl(url):&#xA;    &#34;&#34;&#34;&#xA;    Decodes a bech32 encoded LNURL string.&#xA;&#xA;    Args:&#xA;        url (str): The bech32 encoded LNURL.&#xA;&#xA;    Returns:&#xA;        str: The decoded URL.&#xA;    &#34;&#34;&#34;&#xA;    # The &#39;bech32decode&#39; function correctly handles the full bech32 string.&#xA;    # It returns the human-readable part (hrp) and the data part as 5-bit integers.&#xA;    hrp, data = bech32.bech32decode(url)&#xA;    if data is None:&#xA;        raise ValueError(&#34;Invalid bech32 string&#34;)&#xA;&#xA;    # The &#39;convertbits&#39; function converts from 5-bit data to 8-bit data.&#xA;    decodedbytes = bech32.convertbits(data, 5, 8, False)&#xA;&#xA;    # The resulting bytes are then decoded into a UTF-8 string.&#xA;    return bytes(decodedbytes).decode(&#39;utf-8&#39;)&#xA;&#xA;--- Main execution block ---&#xA;if name == &#34;main&#34;:&#xA;    # sys.argv is a list of command-line arguments.&#xA;    # sys.argv[0] is the script name itself.&#xA;    # sys.argv[1] is the first argument.&#xA;    if len(sys.argv) &lt; 2:&#xA;        print(&#34;Usage: python yourscriptname.py bech32encodedurl&#34;, file=sys.stderr)&#xA;        # Exit with a non-zero status code to indicate an error&#xA;        sys.exit(1)&#xA;&#xA;    # Get the LNURL from the first command-line argument&#xA;    bech32lnurl = sys.argv[1]&#xA;&#xA;    try:&#xA;        # It&#39;s good practice to uppercase the input as bech32 is case-insensitive&#xA;        # but decoders often expect uppercase for validation.&#xA;        decodedurl = decodelnurl(bech32lnurl.upper())&#xA;        print(f&#34;Decoded URL: {decodedurl}&#34;)&#xA;    except (ValueError, TypeError) as e:&#xA;        print(f&#34;Error decoding LNURL: {e}&#34;, file=sys.stderr)&#xA;        sys.exit(1)&#xA;&#xA;pak už jen stačilo nainstalovat bech32 modul, dát jako parametr zakódovanou LNURL a vyplivlo mi to, co jsem potřeboval.&#xA;python3 -m venv bech32&#xA;source bech32/bin/activate&#xA;python3 -m pip install bech32&#xA;python3 bech32encode.py &#34;LNURL1DP68GURN8GHJ7UM9WFMXJCM99E3K7MF0V9CXJ0M385EKVCENXC6R2C35XVUKXEFCV5MKVV34X5EKZD3EV56NYD3HXQURZEPEXEJXXEPNXSCRVWFNV9NXZCN9XQ6XYEFHVGCXXCMYXYMNSERXFQ5FNS&#34;&#xA;&#xA;Decoded URL: https://service.com/api?q=3fc3645b439ce8e7f2553a69e5267081d96dcd340693afabe04be7b0ccd178df&#xA;&#xA;NOTE: Pokud by jste chtěli nahlédnout na LN fakturu, LNURL JSON, ale bez těch &#34;tanečků&#34; okolo, můžete použít Lighting decoder.&#xA;&#xA;Nastavení HTTP serveru&#xA;Tady je situace asi nejsložitější, protože zavisí na způsobu řešení. Pokud sami hostujete službu poskytující LNURL endpoint (např. LNBits), pravděpodobně vám bude stačit přidat už jen rewrite pravidlo pro danou korektní LNURL:&#xA;VirtualHost :443&#xA;    ServerName domain.com&#xA;    # SSL konfigurace&#xA;    SSLEngine on&#xA;    #....&#xA;    &#xA;    # Proxy pro /lnurlp requests na backend server&#xA;    ProxyPreserveHost On&#xA;    ProxyPass /lnurlp/ http://10.1.1.2:5000/lnurlp/&#xA;    ProxyPassReverse /lnurlp/ http://10.1.1.2:5000/lnurlp/&#xA;    &#xA;    # Rewrite pravidlo pro Lightning address&#xA;    RewriteEngine On&#xA;    RewriteRule ^/\.well-known/lnurlp/username$ /lnurlp/3fc3645b439ce8e7f2553a69e5267081d96dcd340693afabe04be7b0ccd178df [L]&#xA;    #....&#xA;/VirtualHost&#xA;&#xA;Pokud jde o LNURL třetí strany, použije se přímý redirect na danou dekódovanou URL:&#xA;VirtualHost :443&#xA;&#x9;ServerName domain.com&#xA;&#x9;# ...&#xA;&#x9;# Redirect pravidlo pro Lightning address - přesměruje na API endpoint&#xA;    RewriteEngine On&#xA;    RewriteRule ^/\.well-known/lnurlp/username$ https://service.com/api?q=3fc3645b439ce8e7f2553a69e5267081d96dcd340693afabe04be7b0ccd178df [R=302,L]&#xA;&#x9;# Alternativně, presmeruj &#34;bitlifi@domain.com na wallet u bitlifi na tel. cislo do 90-tek.&#xA;&#x9;RewriteRule ^/\.well-known/lnurlp/bitlifi$ https://bitlifi.com/.well-known/lnurlp/420609112567 [R=302,L]&#xA;    # ...&#xA;/VirtualHost&#xA;&#xA;V extrémním případě je možné vrátit i ručně editovany JSON soubor. Určitě to není ideální, ale funguje to, pokud bude endpointURL dostupná a souhlasit atributy očekávané faktury.&#xA;&#xA;S přepisem do jiných webových serverů případně může pomoci AI.&#xA;&#xA;Testování&#xA;Nejjednodušší je prostě zkusit curl na náš nový rewrite:&#xA;curl -s https://domain.com/.well-known/lnurlp/username&#xA;&#xA;někdy je potřeba si explicitně vyžádat JSON, &#xA;například v případě Bitlifi nebo Wallet of Satoshi&#xA;curl -s -X GET \&#xA;-H &#34;Accept: application/json&#34; \&#xA;-H &#34;Content-type: application/json&#34; \&#xA;https://bitlifi.com/.well-known/lnurlp/TELEFONICISLO&#xA;&#xA;pro hezky formátovaný JSON se dá využít pipe do jq:&#xA;curl -s -X GET \&#xA;-H &#34;Accept: application/json&#34; \&#xA;-H &#34;Content-type: application/json&#34; \&#xA;https://bitlifi.com/.well-known/lnurlp/TELEFONICISLO | jq -r&#xA;a v idelaním případě bychom měli dostat odpověd podobnou tomuto JSON formátu (mohou tam být i políčka navíc, záleží na implementovaných specifikacích)&#xA;{&#xA;  &#34;tag&#34;: &#34;payRequest&#34;,&#xA;  &#34;callback&#34;: &#34;https://service.com/lnurlp/api/v1/lnurl/cb/3fc3645b439ce8e7f2553a69e5267081d96dcd340693afabe04be7b0ccd178df&#34;,&#xA;  &#34;minSendable&#34;: 1000,&#xA;  &#34;maxSendable&#34;: 100000,&#xA;  &#34;metadata&#34;: &#34;[[\&#34;text/plain\&#34;, \&#34;Platba\&#34;], [\&#34;text/identifier\&#34;, \&#34;username@domain.com\&#34;]]&#34;,&#xA;  &#34;commentAllowed&#34;: 300&#xA;}&#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Máte vlastní doménu? A na ní třeba i vlastní emailovou adresu? Tak se nabízí otázka, proč nepoužít tu stejnou adresu i pro příjem platby v bitcoinu pomocí Lighting network (dále LN), namísto vystavovaní faktury a posílání změti čísel a znaků, kolikrát v délce srovnatelné s emailovou zprávou?

Tak hurá na svoji novou <a href="https://lightningaddress.com/">LN adresu</a>, budeme k tomu ale potřebovat několik pomocníků.</p>

<h2 id="co-potřebuji" id="co-potřebuji">Co potřebuji?</h2>

<h3 id="1-lnurlp" id="1-lnurlp">1) LNURLp</h3>

<p>Ten první krok – automatické vygenerování faktury – za nás už vyřešilo <a href="https://docs.lightning.engineering/the-lightning-network/payment-lifecycle/understanding-lightning-invoices#lnurl">LNURL</a> a jeho konkrétní varianta <a href="https://github.com/lnurl/luds/blob/luds/06.md">LNURpayRequest</a>, (někdy také LNURLp).</p>

<h4 id="co-to-je" id="co-to-je">Co to je?</h4>

<p>Jedná se v podstatě o zakódovanou URL adresu, kde se klient (peněženka) dozví, základní informace o tom, kolik minimálně a maximálně může zaplatit, nějaké ty metainformace, kde najde potvrzení, nějakou zprávu, a hlavně na jakou URL adresu má požádat o vytvoření nové LN faktury na konkrétní částku, která pak může být zaplacena.</p>

<p>Takhle nějak to vypadá ten proces komunikace:
<img src="image/bba1e3f985121e46747a050e1295de67.png" alt="LN Komunikace"></p>

<p>Tak to je skvělé! Není nad automatizaci. Namísto celé dlouhé faktury, kterou musí člověk vytvořit, už nám stačí jen jedna URL do nekonečna a na částce, faktuře ke zaplacení, a případně dalších věcech ať se domluví stroje spolu sami, mě stačí bitcoiny.</p>

<h4 id="kde-to-seženu" id="kde-to-seženu">Kde to seženu?</h4>

<p>Je potřeba mít peněženku, <a href="https://coincharge.io/en/lnurl-for-lightning-wallets/#wallet">která ji podporuje</a> a umí nějakou funkční vygenerovat. Je to poměrně rozšířený standard, a pokud vám na vygenerovanou LNURL půjde zaplatit, pak vám bude fungovat i platba přes email na vaší doméně díky překladu LN adresy popsanému dále. Pro vlastní hostované řešení, je pravděpodobně nejpoužívanější <a href="https://lnbits.com/">LNBits</a>.</p>

<h3 id="2-webový-server-obsluhující-vaši-doménu" id="2-webový-server-obsluhující-vaši-doménu">2) Webový server obsluhující Vaši doménu</h3>

<p>Pro překlad  LN adresy ve formě emailu budeme potřebovat webový server, na který pak půjde požadavek po zadání LN adresy v peněžence. Za tímto účelem jsem si vypůjčil přehlednou grafiku z <a href="https://github.com/andrerfneves/lightning-address">dokumentace lighting-address</a>, jak samotný překlad na URL vypadá a která podle mě víc vysvětlení nepotřebuje.
<img src="image/2c8b154b52d0464f8ec78da6325cd6b6.png" alt="LN Adres overview"></p>

<h2 id="skvělé-to-všechno-už-mám-jak-to-ale-slepit" id="skvělé-to-všechno-už-mám-jak-to-ale-slepit">Skvělé, to všechno už mám... jak to ale slepit?</h2>

<p>Tak hurá na to. Jako první musíme dekódovat LNURL na reálnou URL, na kterou budeme přeposílat klienty jdoucí naši LN adresu (respektive na .well-known/.... URL).</p>

<h3 id="dekódování-lnurl" id="dekódování-lnurl">Dekódování LNURL</h3>

<p>Budeme potřebovat rozklíčovat, na jakou URL vlastně vede naše LNURL adresa. Je to adresa, která po dotázání vrátí základní podrobnosti o platbě v podobě LNURL Pay JSONu. V <a href="https://github.com/lnurl/luds/blob/luds/01.md">dokumentaci</a> se můžeme dočíst, že jde o zakódování URL pomocí bech32 a je tam i ukázka kódu v Scala a JavaScriptu. Nejjednodužší je prostě copy/pasta buď do nějakého online nástroje pro testovaní, například <a href="https://jsfiddle.net/">JSFiddle</a> (javascript) nebo <a href="https://scastie.scala-lang.org">Scastie</a> (nicméně bývají problém s přímým importem), nebo využít vlastní dev/IDE prostředí. Já osobně jsem si to nechal pomocí AI přepsat do Pythonu, který už mám nainstalovaný a bylo to pro mě nejjednodužší řešení a hned po pár iteracích jsem se dopracoval až tomuto kódu:</p>

<pre><code class="language-python"># python3
import bech32
import sys

def decode_lnurl(url):
    &#34;&#34;&#34;
    Decodes a bech32 encoded LNURL string.

    Args:
        url (str): The bech32 encoded LNURL.

    Returns:
        str: The decoded URL.
    &#34;&#34;&#34;
    # The &#39;bech32_decode&#39; function correctly handles the full bech32 string.
    # It returns the human-readable part (hrp) and the data part as 5-bit integers.
    hrp, data = bech32.bech32_decode(url)
    if data is None:
        raise ValueError(&#34;Invalid bech32 string&#34;)

    # The &#39;convertbits&#39; function converts from 5-bit data to 8-bit data.
    decoded_bytes = bech32.convertbits(data, 5, 8, False)

    # The resulting bytes are then decoded into a UTF-8 string.
    return bytes(decoded_bytes).decode(&#39;utf-8&#39;)

# --- Main execution block ---
if __name__ == &#34;__main__&#34;:
    # sys.argv is a list of command-line arguments.
    # sys.argv[0] is the script name itself.
    # sys.argv[1] is the first argument.
    if len(sys.argv) &lt; 2:
        print(&#34;Usage: python your_script_name.py &lt;bech32_encoded_url&gt;&#34;, file=sys.stderr)
        # Exit with a non-zero status code to indicate an error
        sys.exit(1)

    # Get the LNURL from the first command-line argument
    bech32lnurl = sys.argv[1]

    try:
        # It&#39;s good practice to uppercase the input as bech32 is case-insensitive
        # but decoders often expect uppercase for validation.
        decoded_url = decode_lnurl(bech32lnurl.upper())
        print(f&#34;Decoded URL: {decoded_url}&#34;)
    except (ValueError, TypeError) as e:
        print(f&#34;Error decoding LNURL: {e}&#34;, file=sys.stderr)
        sys.exit(1)
</code></pre>

<p>pak už jen stačilo nainstalovat bech32 modul, dát jako parametr zakódovanou LNURL a vyplivlo mi to, co jsem potřeboval.</p>

<pre><code class="language-bash">python3 -m venv bech32
source bech32/bin/activate
python3 -m pip install bech32
python3 bech32encode.py &#34;LNURL1DP68GURN8GHJ7UM9WFMXJCM99E3K7MF0V9CXJ0M385EKVCENXC6R2C35XVUKXEFCV5MKVV34X5EKZD3EV56NYD3HXQURZEPEXEJXXEPNXSCRVWFNV9NXZCN9XQ6XYEFHVGCXXCMYXYMNSERXFQ5FNS&#34;

Decoded URL: https://service.com/api?q=3fc3645b439ce8e7f2553a69e5267081d96dcd340693afabe04be7b0ccd178df
</code></pre>

<p>NOTE: Pokud by jste chtěli nahlédnout na LN fakturu, LNURL JSON, ale bez těch “tanečků” okolo, můžete použít <a href="https://lightningdecoder.com/">Lighting decoder</a>.</p>

<h3 id="nastavení-http-serveru" id="nastavení-http-serveru">Nastavení HTTP serveru</h3>

<p>Tady je situace asi nejsložitější, protože zavisí na způsobu řešení. Pokud sami hostujete službu poskytující LNURL endpoint (např. LNBits), pravděpodobně vám bude stačit přidat už jen rewrite pravidlo pro danou korektní LNURL:</p>

<pre><code class="language-apache">&lt;VirtualHost *:443&gt;
    ServerName domain.com
    # SSL konfigurace
    SSLEngine on
    #....
    
    # Proxy pro /lnurlp requests na backend server
    ProxyPreserveHost On
    ProxyPass /lnurlp/ http://10.1.1.2:5000/lnurlp/
    ProxyPassReverse /lnurlp/ http://10.1.1.2:5000/lnurlp/
    
    # Rewrite pravidlo pro Lightning address
    RewriteEngine On
    RewriteRule ^/\.well-known/lnurlp/username$ /lnurlp/3fc3645b439ce8e7f2553a69e5267081d96dcd340693afabe04be7b0ccd178df [L]
    #....
&lt;/VirtualHost&gt;
</code></pre>

<p>Pokud jde o LNURL třetí strany, použije se přímý redirect na danou dekódovanou URL:</p>

<pre><code class="language-apache">&lt;VirtualHost *:443&gt;
	ServerName domain.com
	# ...
	# Redirect pravidlo pro Lightning address - přesměruje na API endpoint
    RewriteEngine On
    RewriteRule ^/\.well-known/lnurlp/username$ https://service.com/api?q=3fc3645b439ce8e7f2553a69e5267081d96dcd340693afabe04be7b0ccd178df [R=302,L]
	# Alternativně, presmeruj &#34;bitlifi@domain.com na wallet u bitlifi na tel. cislo do 90-tek.
	RewriteRule ^/\.well-known/lnurlp/bitlifi$ https://bitlifi.com/.well-known/lnurlp/420609112567 [R=302,L]
    # ...
&lt;/VirtualHost&gt;
</code></pre>

<p>V extrémním případě je možné vrátit i ručně editovany JSON soubor. Určitě to není ideální, ale funguje to, pokud bude endpointURL dostupná a souhlasit atributy očekávané faktury.</p>

<p>S přepisem do jiných webových serverů případně může pomoci AI.</p>

<h2 id="testování" id="testování">Testování</h2>

<p>Nejjednodušší je prostě zkusit <a href="https://curl.se/download.html">curl</a> na náš nový rewrite:</p>

<pre><code class="language-bash">curl -s https://domain.com/.well-known/lnurlp/username

# někdy je potřeba si explicitně vyžádat JSON, 
# například v případě Bitlifi nebo Wallet of Satoshi
curl -s -X GET \
-H &#34;Accept: application/json&#34; \
-H &#34;Content-type: application/json&#34; \
https://bitlifi.com/.well-known/lnurlp/&lt;TELEFONICISLO&gt;

# pro hezky formátovaný JSON se dá využít pipe do jq:
curl -s -X GET \
-H &#34;Accept: application/json&#34; \
-H &#34;Content-type: application/json&#34; \
https://bitlifi.com/.well-known/lnurlp/&lt;TELEFONICISLO&gt; | jq -r
</code></pre>

<p>a v idelaním případě bychom měli dostat odpověd podobnou tomuto JSON formátu (mohou tam být i políčka navíc, záleží na implementovaných specifikacích)</p>

<pre><code class="language-json">{
  &#34;tag&#34;: &#34;payRequest&#34;,
  &#34;callback&#34;: &#34;https://service.com/lnurlp/api/v1/lnurl/cb/3fc3645b439ce8e7f2553a69e5267081d96dcd340693afabe04be7b0ccd178df&#34;,
  &#34;minSendable&#34;: 1000,
  &#34;maxSendable&#34;: 100000,
  &#34;metadata&#34;: &#34;[[\&#34;text/plain\&#34;, \&#34;Platba\&#34;], [\&#34;text/identifier\&#34;, \&#34;username@domain.com\&#34;]]&#34;,
  &#34;commentAllowed&#34;: 300
}
</code></pre>
]]></content:encoded>
      <guid>http://blog.jpleva.cz/mate-vlastni-domenu</guid>
      <pubDate>Tue, 05 Aug 2025 09:30:47 +0200</pubDate>
    </item>
    <item>
      <title>Testing of allowed ports on restricted networks</title>
      <link>http://blog.jpleva.cz/testing-of-alowed-ports-on-restricted-networks</link>
      <description>&lt;![CDATA[On several (usually public) networks, i&#39;ve several times hit case, where I wasn&#39;t allowed to use all ports for connection to services, like 22 (SSH), 23(TELNET) and there has been only few whitelisted, but how to find those allowed in order to change ex. VPN or SSH port on server in order to be able to connect? &#xA;!--more--&#xA;Well, just do port scan against portquiz.net where are all ports used for serving HTTP site (so you can even give try for example portquiz.net:1234. Then you will get list of all whitelisted ports using:&#xA;netcat -vz portquiz.net 1-9999 2  &amp;1 | grep -v failed&#xA;&#xA;Reference: https://superuser.com/questions/577206/how-can-i-check-what-outbound-ports-are-allowed-in-a-network]]&gt;</description>
      <content:encoded><![CDATA[<p>On several (usually public) networks, i&#39;ve several times hit case, where I wasn&#39;t allowed to use all ports for connection to services, like 22 (SSH), 23(TELNET) and there has been only few whitelisted, but how to find those allowed in order to change ex. VPN or SSH port on server in order to be able to connect?

Well, just do port scan against <a href="http://portquiz.net">portquiz.net</a> where are all ports used for serving HTTP site (so you can even give try for example <a href="http://portquiz.net:1234">portquiz.net:1234</a>. Then you will get list of all whitelisted ports using:</p>

<pre><code>netcat -vz portquiz.net 1-9999 2&gt;&amp;1 | grep -v failed
</code></pre>

<p>Reference: <a href="https://superuser.com/questions/577206/how-can-i-check-what-outbound-ports-are-allowed-in-a-network">https://superuser.com/questions/577206/how-can-i-check-what-outbound-ports-are-allowed-in-a-network</a></p>
]]></content:encoded>
      <guid>http://blog.jpleva.cz/testing-of-alowed-ports-on-restricted-networks</guid>
      <pubDate>Thu, 08 Aug 2024 16:57:39 +0200</pubDate>
    </item>
    <item>
      <title>Emby - enable hardware acceleration in container on Synology NAS (DS218+)</title>
      <link>http://blog.jpleva.cz/enabling-hw-encoding-on-synology-nas-in-emby</link>
      <description>&lt;![CDATA[As HW performance isn&#39;t outstanding, it&#39;s good to have it enabled and available. &#xA;&#xA;!--more--&#xA;1) Create user, you are planning to use within container and ged it&#39;s UID&#xA;&#xA;root@synology:~/# id c-emby&#xA;uid=1032(c-emby) gid=100(users) groups=100(users),65538(docker),65537(video)&#xA;&#xA;2) Get GID of &#34;video&#34; group (should be group owner of /dev/dri/* devices)&#xA;&#xA;root@synology:~/# ls -la /dev/dri&#xA;total 0&#xA;crw-rw----  1 root video 226,   0 Sep 26 11:54 card0&#xA;crw-rw----  1 root video 226,  64 Sep 26 11:54 controlD64&#xA;crw-rw----  1 root video 226, 128 Sep 26 11:54 renderD128&#xA;&#xA;root@synology:~/panelacek/conf-scripts/docker# grep video /etc/group&#xA;video:x:65537:root,docker,c-emby&#xA;&#xA;3) Download container image and configure container with proper UUID / GUID and GIDLIST variables. One of GIDLIST needs to be GID of &#34;video&#34; group&#xA;&#xA;UID=1032 //container user UID (c-emby)&#xA;GID=65538 //contaner group GID (docker)&#xA;GIDLIST=65538,65537 //docker,video&#xA;&#xA;4) Map video devices to container&#xA;&#xA;--device /dev/dri/card0:/dev/dri/card0 \&#xA;--device /dev/dri/controlD64:/dev/dri/controlD64 \&#xA;--device /dev/dri/renderD128:/dev/dri/renderD128 \&#xA;&#xA;whole emby-docker-server.sh script (downloads and refresh emby server)w:&#xA;&#xA;!bin/sh&#xA;NAME=&#34;embyserver&#34;&#xA;IMAGE=&#34;emby/embyserver:latest&#34;&#xA;docker pull ${IMAGE}&#xA;docker stop ${NAME}&#xA;docker rm ${NAME}&#xA;docker run -d \&#xA;--name=${NAME} \&#xA;-e UID=1032 \&#xA;-e GID=65538 \&#xA;-e GIDLIST=100,65538,65537 \&#xA;-e TZ=Europe/Prague \&#xA;-p 32775:8096 \&#xA;-p 32768:8920 \&#xA;--privileged \&#xA;--device /dev/dri/card0:/dev/dri/card0 \&#xA;--device /dev/dri/controlD64:/dev/dri/controlD64 \&#xA;--device /dev/dri/renderD128:/dev/dri/renderD128 \&#xA;-v /volume1/docker/Emby:/config:rw \&#xA;-v /volume1/Movies:/movies:rw \&#xA;--restart unless-stopped \&#xA;--memory=4g \&#xA;--cpu-shares=90 \&#xA;${IMAGE}&#xA;`]]&gt;</description>
      <content:encoded><![CDATA[<p>As HW performance isn&#39;t outstanding, it&#39;s good to have it enabled and available.</p>



<p>1) Create user, you are planning to use within container and ged it&#39;s UID</p>

<pre><code>root@synology:~/# id c-emby
uid=1032(c-emby) gid=100(users) groups=100(users),65538(docker),65537(video)
</code></pre>

<p>2) Get GID of “video” group (should be group owner of /dev/dri/* devices)</p>

<pre><code>root@synology:~/# ls -la /dev/dri
total 0
crw-rw----  1 root video 226,   0 Sep 26 11:54 card0
crw-rw----  1 root video 226,  64 Sep 26 11:54 controlD64
crw-rw----  1 root video 226, 128 Sep 26 11:54 renderD128

root@synology:~/panelacek/conf-scripts/docker# grep video /etc/group
video:x:65537:root,docker,c-emby
</code></pre>

<p>3) Download container image and configure container with proper UUID / GUID and GIDLIST variables. One of GIDLIST needs to be GID of “video” group</p>

<pre><code>UID=1032 //container user UID (c-emby)
GID=65538 //contaner group GID (docker)
GIDLIST=65538,65537 //docker,video
</code></pre>

<p>4) Map video devices to container</p>

<pre><code>--device /dev/dri/card0:/dev/dri/card0 \
--device /dev/dri/controlD64:/dev/dri/controlD64 \
--device /dev/dri/renderD128:/dev/dri/renderD128 \
</code></pre>

<p>whole emby-docker-server.sh script (downloads and refresh emby server)w:</p>

<pre><code>#!bin/sh
NAME=&#34;embyserver&#34;
IMAGE=&#34;emby/embyserver:latest&#34;
docker pull ${IMAGE}
docker stop ${NAME}
docker rm ${NAME}
docker run -d \
--name=${NAME} \
-e UID=1032 \
-e GID=65538 \
-e GIDLIST=100,65538,65537 \
-e TZ=Europe/Prague \
-p 32775:8096 \
-p 32768:8920 \
--privileged \
--device /dev/dri/card0:/dev/dri/card0 \
--device /dev/dri/controlD64:/dev/dri/controlD64 \
--device /dev/dri/renderD128:/dev/dri/renderD128 \
-v /volume1/docker/Emby:/config:rw \
-v /volume1/Movies:/movies:rw \
--restart unless-stopped \
--memory=4g \
--cpu-shares=90 \
${IMAGE}
</code></pre>
]]></content:encoded>
      <guid>http://blog.jpleva.cz/enabling-hw-encoding-on-synology-nas-in-emby</guid>
      <pubDate>Mon, 08 Jan 2024 16:42:09 +0100</pubDate>
    </item>
    <item>
      <title>Synchronizace klíčů u Audi A4 B6 (8E) (2000 - 2006) po výměně baterie</title>
      <link>http://blog.jpleva.cz/synchronizace-klicu-u-audi-a4-b6-8e-2000-2006-po-vymene-baterie</link>
      <description>&lt;![CDATA[&#xA;Synchronizace klíčů u Audi A4 B6 (8E) (2000 - 2006) po výměně baterie&#xA;&#xA;Klasický scénář – dálkový ovladač po letech začne zlobit, takže je na čase vyměnit baterie. No, a po výměně ejhle – dálkové odemykání nefunguje.&#xA;!--more--&#xA;Je to vcelku známý problém, po výměně baterie je někdy potřeba klíč zesynchronizovat (naprogramovat). Možnosti jsou dvě – pomocí VAG nebo pomocí speciálního postupu v autě. A protože VAG nemám, probereme si tu variantu pomocí speciálního postupu.&#xA;&#xA;Jako první doporučuji ověřit, zda klíče vůbec vysílají signál. Já poměrně hodně času zabil jen tím, že jsem zkoušel synchronizovat nefungující klíč. Respektive byl nějaký zmatený. Musel jsem jej asi 6× rozebrat a složit, než začal vůbec fungovat správně (nejdříve byly kontakty vyhnuté kvůli nafouknuté původní vybité baterii, takže nefungoval vůbec. Pak klíč zase, pro změnu, generoval signál na jiné frekvenci). Každopádně poslední (asi 6.) rozborka klíče a pořádné vyčištění už pomohlo.&#xA;&#xA;Ověření funkčnosti klíče&#xA;&#xA;Klíče vysílají na frekvenci 433,910 MHz a možnosti kontroly jsou v zásadě dvě. Vysílačka/scanner (například Baofeng UV-5R za cca 500 Kč), který umožňuje nastavit danou frekvenci, nebo zakoupit DVB-T dongle s čipsetem RTL 2832 (cca 200 Kč), který je možné pak připojit k telefonu (OTG kabel) a scanovat frekvence pomocí SDR Touch aplikace.&#xA;&#xA;Pokud zmáčknete tlačítko ovladače, ve vysílačce nebo spektrálním analyzéru uslyšíte (uvidíte) výrazný signál. Pokud to &#34;něco dělá&#34;, máte vyhráno.&#xA;&#xA;Nakódování (synchronizace) klíče&#xA;&#xA;Prošel jsem hodně návodů a zkoušel hodně možností. Nakonec ověřená fungující varianta byla:&#xA;&#xA;Vložit klíč do zapalování&#xA;Otočit do rozsvícení kontrolek&#xA;Zmáčknout a držet tlačítko zamčení na klíči a zároveň zamknout v autě pomocí tlačítka na dveřích&#xA;Stejným způsobem odemknout – držet tlačítko odemknutí a odemknout vypínačem na dveřích&#xA;Vypnout zapalování a vytáhnout klíček&#xA;&#xA;Pak by mělo odemykání a zamykání zase fungovat. Je dost možné, že bude fungovat jen pomačkání tlačítek (bez zamykání na dveřích), ale tohle mám ověřené, tak můžete zkusit, ale mě fungovalo toto.]]&gt;</description>
      <content:encoded><![CDATA[<h1 id="synchronizace-klíčů-u-audi-a4-b6-8e-2000-2006-po-výměně-baterie" id="synchronizace-klíčů-u-audi-a4-b6-8e-2000-2006-po-výměně-baterie">Synchronizace klíčů u Audi A4 B6 (8E) (2000 – 2006) po výměně baterie</h1>

<p>Klasický scénář – dálkový ovladač po letech začne zlobit, takže je na čase vyměnit baterie. No, a po výměně ejhle – dálkové odemykání nefunguje.

Je to vcelku známý problém, po výměně baterie je někdy potřeba klíč zesynchronizovat (naprogramovat). Možnosti jsou dvě – pomocí VAG nebo pomocí speciálního postupu v autě. A protože VAG nemám, probereme si tu variantu pomocí speciálního postupu.</p>

<p>Jako první doporučuji ověřit, zda klíče vůbec vysílají signál. Já poměrně hodně času zabil jen tím, že jsem zkoušel synchronizovat nefungující klíč. Respektive byl nějaký zmatený. Musel jsem jej asi 6× rozebrat a složit, než začal vůbec fungovat správně (nejdříve byly kontakty vyhnuté kvůli nafouknuté původní vybité baterii, takže nefungoval vůbec. Pak klíč zase, pro změnu, generoval signál na jiné frekvenci). Každopádně poslední (asi 6.) rozborka klíče a pořádné vyčištění už pomohlo.</p>

<h2 id="ověření-funkčnosti-klíče" id="ověření-funkčnosti-klíče">Ověření funkčnosti klíče</h2>

<p>Klíče vysílají na frekvenci 433,910 MHz a možnosti kontroly jsou v zásadě dvě. Vysílačka/scanner (například <a href="https://www.aliexpress.com/wholesale?catId=0&amp;initiative_id=AS_20190331153547&amp;SearchText=walkie+talkie">Baofeng UV-5R</a> za cca 500 Kč), který umožňuje nastavit danou frekvenci, nebo zakoupit <a href="https://www.aliexpress.com/wholesale?initiative_id=SC_20190331164829&amp;SearchText=dvbt+rtl2832u&amp;g=y&amp;spellcheckPrompt=2&amp;misspellText=DVB-T+RTL2832U">DVB-T dongle s čipsetem RTL 2832</a> (cca 200 Kč), který je možné pak připojit k telefonu (OTG kabel) a scanovat frekvence pomocí <a href="http://sdrtouch.com/">SDR Touch aplikace</a>.</p>

<p>Pokud zmáčknete tlačítko ovladače, ve vysílačce nebo spektrálním analyzéru uslyšíte (uvidíte) výrazný signál. Pokud to “něco dělá”, máte vyhráno.</p>

<h2 id="nakódování-synchronizace-klíče" id="nakódování-synchronizace-klíče">Nakódování (synchronizace) klíče</h2>

<p>Prošel jsem hodně návodů a zkoušel hodně možností. Nakonec ověřená fungující varianta byla:</p>
<ol><li>Vložit klíč do zapalování</li>
<li>Otočit do rozsvícení kontrolek</li>
<li>Zmáčknout a držet tlačítko zamčení na klíči a zároveň zamknout v autě pomocí tlačítka na dveřích</li>
<li>Stejným způsobem odemknout – držet tlačítko odemknutí a odemknout vypínačem na dveřích</li>
<li>Vypnout zapalování a vytáhnout klíček</li></ol>

<p>Pak by mělo odemykání a zamykání zase fungovat. Je dost možné, že bude fungovat jen pomačkání tlačítek (bez zamykání na dveřích), ale tohle mám ověřené, tak můžete zkusit, ale mě fungovalo toto.</p>
]]></content:encoded>
      <guid>http://blog.jpleva.cz/synchronizace-klicu-u-audi-a4-b6-8e-2000-2006-po-vymene-baterie</guid>
      <pubDate>Mon, 05 Aug 2019 14:28:42 +0200</pubDate>
    </item>
  </channel>
</rss>